diff --git a/org.eclipse.mylyn.examples.monitor.study/.classpath b/org.eclipse.mylyn.examples.monitor.study/.classpath
deleted file mode 100644
index 2ee098d..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/.classpath
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
-		<accessrules>
-			<accessrule kind="accessible" pattern="**/internal/**"/>
-		</accessrules>
-	</classpathentry> 
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.mylyn.examples.monitor.study/.cvsignore b/org.eclipse.mylyn.examples.monitor.study/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/org.eclipse.mylyn.examples.monitor.study/.project b/org.eclipse.mylyn.examples.monitor.study/.project
deleted file mode 100644
index 6995b81..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.mylyn.examples.monitor.study</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.mylyn.examples.monitor.study/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.examples.monitor.study/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index aa9e9b4..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,329 +0,0 @@
-#Sat Mar 01 02:52:50 PST 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-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.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
-org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
-org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL,NORMAL
-org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX,API
-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_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_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_selector_in_method_invocation=80
-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.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=1
-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=false
-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=false
-org.eclipse.jdt.core.formatter.comment.format_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=false
-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=120
-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=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-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=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_member=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_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not 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=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=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_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_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_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_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_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.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=120
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
-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_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.examples.monitor.study/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.examples.monitor.study/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 5e70d08..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,63 +0,0 @@
-#Sat Mar 01 03:38:47 PST 2008
-cleanup_settings_version=2
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-formatter_profile=_Mylyn based on Eclipse
-formatter_settings_version=11
-internal.default.compliance=default
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=true
-org.eclipse.jdt.ui.javadoc=false
-org.eclipse.jdt.ui.keywordthis=false
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2004, 2007 Mylyn project committers and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
-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_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=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=true
-sp_cleanup.correct_indentation=true
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.make_local_variable_final=false
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-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=true
-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=true
-sp_cleanup.remove_unused_imports=false
-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=true
-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=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.examples.monitor.study/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.examples.monitor.study/.settings/org.eclipse.ltk.core.refactoring.prefs
deleted file mode 100644
index 7ab03bd..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/.settings/org.eclipse.ltk.core.refactoring.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Jun 02 15:30:09 PDT 2006
-eclipse.preferences.version=1
-org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.examples.monitor.study/.settings/org.eclipse.mylar.tasklist.prefs b/org.eclipse.mylyn.examples.monitor.study/.settings/org.eclipse.mylar.tasklist.prefs
deleted file mode 100644
index a6cf96a..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/.settings/org.eclipse.mylar.tasklist.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Fri Oct 20 16:54:30 PDT 2006
-eclipse.preferences.version=1
-project.repository.kind=bugzilla
-project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.examples.monitor.study/.settings/org.eclipse.mylyn.tasklist.prefs b/org.eclipse.mylyn.examples.monitor.study/.settings/org.eclipse.mylyn.tasklist.prefs
deleted file mode 100644
index 0a2cc0b..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/.settings/org.eclipse.mylyn.tasklist.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Jun 18 17:14:59 PDT 2007
-eclipse.preferences.version=1
-project.repository.kind=bugzilla
-project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.examples.monitor.study/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.examples.monitor.study/.settings/org.eclipse.mylyn.tasks.ui.prefs
deleted file mode 100644
index d8c6d26..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/.settings/org.eclipse.mylyn.tasks.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Jun 25 03:02:37 GMT 2007
-eclipse.preferences.version=1
-project.repository.kind=bugzilla
-project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.examples.monitor.study/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.examples.monitor.study/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index d0bb657..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,24 +0,0 @@
-#Mon May 19 18:14:28 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=2
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=2
-compilers.p.discouraged-class=2
-compilers.p.internal=1
-compilers.p.missing-bundle-classpath-entries=1
-compilers.p.missing-packages=2
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=2
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=0
-compilers.p.unknown-element=0
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=0
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.examples.monitor.study/META-INF/MANIFEST.MF b/org.eclipse.mylyn.examples.monitor.study/META-INF/MANIFEST.MF
deleted file mode 100644
index 1bd2618..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,26 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Mylyn User Study Example
-Bundle-SymbolicName: org.eclipse.mylyn.monitor.study;singleton:=true
-Bundle-Version: 1.0.0
-Bundle-Activator: org.eclipse.mylyn.examples.monitor.study.MylynUserStudyExamplePlugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.mylyn.context.core,
- org.eclipse.core.resources,
- org.eclipse.jdt.ui,
- org.eclipse.pde.ui,
- org.eclipse.ui.editors,
- org.eclipse.jdt.core,
- org.eclipse.jface.text,
- org.eclipse.ui.workbench.texteditor,
- org.eclipse.mylyn.monitor.usage,
- org.eclipse.mylyn.monitor.ui,
- org.eclipse.mylyn.monitor.core,
- org.eclipse.mylyn.commons.net,
- org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)"
-Eclipse-AutoStart: true
-Bundle-ClassPath: mylyn-study.jar 
-Export-Package: org.eclipse.mylyn.examples.monitor.study
-Bundle-Vendor: Eclipse.org
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/org.eclipse.mylyn.examples.monitor.study/build.properties b/org.eclipse.mylyn.examples.monitor.study/build.properties
deleted file mode 100644
index 2ba8ff9..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/build.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Mylyn project committers and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-###############################################################################
-bin.includes = META-INF/,\
-               doc/,\
-               plugin.xml,\
-               icons/,\
-               mylyn-study.jar
-src.includes = doc/,\
-               plugin.xml,\
-               icons/,\
-               src/
-jars.compile.order = mylyn-study.jar
-source.mylyn-study.jar = src/
diff --git a/org.eclipse.mylyn.examples.monitor.study/doc/study-ethics.html b/org.eclipse.mylyn.examples.monitor.study/doc/study-ethics.html
deleted file mode 100644
index 0efa935..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/doc/study-ethics.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<HTML>
-
-<head>
-<style>
-<!--
-	H4 {
-		font:15px/16px Verdana, Arial, Helvetica, sans-serif; 
-		color:black; 
-		font-weight:bold; 
-		margin-left: 10px;
-		line-height:140%;
-	}
--->
-</style>
-</head>
-
-<BODY>
-
-<P>
-<font size="2">Thank you for downloading the preview release of Mylar.  As you work Mylar will monitor your interaction
-with Eclipse (by logging IDs of: views, editors, commands, and preference changes along with their values).
-The log also stores information about the program elements that you edit and navigate, but removes identifying
-information about those elements by obfuscating their names and paths.  Approximately once every week you will
-be asked to confirm an upload of this interaction log to a UBC server.  Before uploading you will have a chance to 
-review the information being sent, and to answer a short questionnaire.  You will have the option to remain 
-anonymous throughout the study.</font></P>
-
-<P>	
-<font color="#999999" size="2">Details: The UBC Study title is Using Interaction History to Determine Interesting Information in a Development 
-Environment. There are no known risks associated with this study. After the study, this interaction history 
-will be stripped of all information identifying non-anonymous subjects, and we will use this data to determine 
-what Mylar views are useful, and to determine whether Mylar makes it easier to work on large systems in Eclipse. 
-We also plan on making this anonymous usage data available to other researchers interested in improving the 
-IDE user experience. Please note that the data collected will be archived for future use. This data will be 
-anonymous and not contain any identification information. This study is being conducted by Mik Kersten 
-(beatmik@cs.ubc.ca) as a part of his PhD Thesis and supervised by Dr. Gail Murphy (murphy@cs.ubc.ca). If you 
-have any questions about the data being collected or about the study in general please email us or call Mik 
-Kersten at 604-822-0193.  If you have any concerns about your treatment or rights as a research subject, you 
-may contact  Research Subject Information Line in the UBC Office of Research Services at the University of 
-British Columbia, at 604-822-8598.  If this questionnaire is completed it will be assumed that consent has 
-been given.  This study is being funded by the IBM Centre for Advanced Studies and by NSERC.
-</font>
-</P>
-
-</BODY>
-</HEAD>
diff --git a/org.eclipse.mylyn.examples.monitor.study/doc/study-info.html b/org.eclipse.mylyn.examples.monitor.study/doc/study-info.html
deleted file mode 100644
index feb1654..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/doc/study-info.html
+++ /dev/null
@@ -1,65 +0,0 @@
-<HTML>
-
-<head>
-<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
-<meta http-equiv="Content-Language" content="en-us">
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<link rel="STYLESHEET" href="book.css" charset="ISO-8859-1"
-	type="text/css">
-<title>Mylar Documentation</title>
-</head>
-
-<BODY>
-
-<table border="0" cellpadding="0" style="border-collapse: collapse" width="100%" id="table1">
-	<tr>
-		<td>
-		<p class="paragraph"><img border="0" src="images/logo-ubc.gif"></td>
-		<td>
-		<p align="right" class="smallParagraph">UBC Department of Computer 
-		Science<br>
-		201-2366 Main Mall, Vancouver, B.C., V6T 1Z4<br>
-		<a href="http://www.cs.ubc.ca" style="color: #4756AC">
-		http://www.cs.ubc.ca</a> <br>
-		Tel: (604) 822-3061 Fax: (604) 822-5485</td>
-	</tr>
-</table>
-<h4 align="center">Using Interaction History to Determine Interesting 
-Information <br>
-in a Development Environment </h4>
-<P>
-Thank you for downloading the preview release of Mylar. As you work Mylar will 
-monitor your interaction with Eclipse (by logging IDs of: views, editors, 
-commands, and preference changes along with their values). The log also stores 
-information about the program elements that you edit and navigate, but removes 
-identifying information about those elements by obfuscating their names and 
-paths. Approximately once every week you will be asked to confirm an upload of 
-this interaction log to a UBC server. Before uploading you will have a chance to 
-review the information being sent, and to answer a short questionnaire. You will 
-have the option to remain anonymous throughout the study.</P>
-
-<P>	
-<font color="#999999">Details: The UBC Study title is Using Interaction History 
-to Determine Interesting Information in a Development Environment. There are no 
-known risks associated with this study. After the study, this interaction 
-history will be stripped of all information identifying non-anonymous subjects, 
-and we will use this data to determine what Mylar views are useful, and to 
-determine whether Mylar makes it easier to work on large systems in Eclipse. We 
-also plan on making this anonymous usage data available to other researchers 
-interested in improving the IDE user experience. Please note that the data 
-collected will be archived for future use. This data will be anonymous and not 
-contain any identification information. This study is being conducted by Mik 
-Kersten (beatmik@cs.ubc.ca) as a part of his PhD Thesis and supervised by Dr. 
-Gail Murphy (murphy@cs.ubc.ca). If you have any questions about the data being 
-collected or about the study in general please email us or call Mik Kersten at 
-604-822-0193. If you have any concerns about your treatment or rights as a 
-research subject, you may contact Research Subject Information Line in the UBC 
-Office of Research Services at the University of British Columbia, at 
-604-822-8598. If this questionnaire is completed it will be assumed that consent 
-has been given. This study is being funded by the IBM Centre for Advanced 
-Studies and by NSERC.
-</font>
-</P>
-
-</BODY>
-</HEAD>
diff --git a/org.eclipse.mylyn.examples.monitor.study/doc/study-signup.html b/org.eclipse.mylyn.examples.monitor.study/doc/study-signup.html
deleted file mode 100644
index 3fc943b..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/doc/study-signup.html
+++ /dev/null
@@ -1,228 +0,0 @@
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-<title>Mylar</title>
-<!--<link rel="stylesheet" href="http://eclipse.org/proposals/eclipse-webtools/templates/eclipse/eclipse.css">
--->
-<STYLE TYPE="text/css">
-<!--
- 
-.indextop { font-size: x-large;; font-family: Verdana, Arial, Helvetica, sans-serif; font-weight: bold}
-.indexsub { font-size: xx-small;; font-family: Verdana, Arial, Helvetica, sans-serif; color: #8080FF}
- 
-	/*
-	BODY {margin-top: 15px; margin-left: 15px; margin-right: 15px;}
-	*/
-
-	A:link {
-		color:#4756AC;
-	}
-	A:visited {
-		color:#60657B;
-	}
-	A:hover {
-		color:red
-	}
-	
-	INPUT {font:12px "Courier New", sans-serif;}
-	
-	H2 {
-		font:18px/18px Verdana, Arial, Helvetica, sans-serif; 
-		color:black; 
-		font-weight:bold; 
-		margin-left: 10px;
-		line-height:110%; 
-	}
-	H3 {
-		font:17px/17px Verdana, Arial, Helvetica, sans-serif; 
-		color:black; 
-		//font-weight:bold; 
-		margin-left: 10px;
-		line-height:110%; 
-	}
-	H4 {
-		font:15px/16px Verdana, Arial, Helvetica, sans-serif; 
-		color:black; 
-		font-weight:bold; 
-		margin-left: 10px;
-		line-height:140%;
-	}
-	P {
-		font:13px/13px Verdana, Arial, Helvetica, sans-serif; 
-		margin-right: 10px;
-		margin-left: 10px;
-		line-height:130%; 
-	}
-	.paragraph {
-		font:13px/13px Verdana, Arial, Helvetica, sans-serif; 
-		margin-right: 10px;
-		margin-left: 10px;
-		line-height:130%; 
-	}
-	.smallParagraph {
-		font:11px/11px Verdana, Arial, Helvetica, sans-serif; 
-		margin-right: 10px;
-		margin-left: 10px;
-		line-height:130%; 
-	}
-	LI {
-		font:13px/13px Verdana, Arial, Helvetica, sans-serif;
-		text-align:justify; 
-		margin-right: 10px;
-		margin-left: 15px;
-		line-height:120%; 
-	}
-	/*
-	UL {
-		font:13px/13px Verdana, Arial, Helvetica, sans-serif;
-		text-align:justify; 
-		margin-right: 10px;
-		margin-left: 15px;
-		line-height:120%; 
-	}*/
-	
-	DL {
-		font:13px/13px Verdana, Arial, Helvetica, sans-serif;
-		text-align:justify; 
-		margin-right: 10px;
-		margin-left: 15px;
-		line-height:120%; 
-	}
-	B { font:13px/13px Verdana, Arial, Helvetica, sans-serif; 
-		font-weight:bold; 
-		line-height:140%;
-	}
-	.footer {
-		font:10px/10px Verdana, Arial, Helvetica, sans-serif;  
-		color:#888888; 
-		text-align:left
-	}
-	.figureTitle {
-		font:13px/13px Verdana, Arial, Helvetica, sans-serif; 
-		text-align:justify; 
-		text-align:center
-	}
-	.copyrightNotice {
-		font:10px/10px Verdana, Arial, Helvetica, sans-serif; 
-		color:#999999; 
-		line-height:110%;
-	}
-	.smallHeading {
-		font:13px/13px Verdana, Arial, Helvetica, sans-serif; 
-		font-weight:bold;
-		line-height:110%;
-	}
-	.tinyHeading {
-		font:11px/11px Verdana, Arial, Helvetica, sans-serif; 
-		font-weight:bold;
-		line-height:120%;
-	}
-	.newsText {
-		font:11px/11px Verdana, Arial, Helvetica, sans-serif; 
-		line-height:130%;
-	}
-	.smallParagraph {
-		font:11px/11px Verdana, Arial, Helvetica, sans-serif; 
-		line-height:130%;
-	}
-	.fancyHeading {
-		font:20px/20px Chantilly, Arial, Helvetica, sans-serif; 
-		margin-right: 10px;
-		color:#6f7a92;
-		margin-left: 10px;
-		line-height:130%;
-	}
- 
-		h2.title_with_border {
-			background:#D4D4D4;
-			border-top:1px solid #A3A3A3;
-			border-bottom:1px solid #A3A3A3;
-			border-left:1px solid #A3A3A3;
-			border-right:1px solid #A3A3A3;
-
-			}
--->
-</STYLE>
-
-</head>
-<body>
-
-<p align="left"><b><i><span style="background-color: #CCCCFF">consent form</span></i></b></p>
-<hr>
-
-<table border="0" cellpadding="0" style="border-collapse: collapse" width="100%" id="table1">
-	<tr>
-		<td>
-		<p class="paragraph"><img border="0" src="ubc.gif"> Page 1 of 1</td>
-		<td>
-		<p align="right" class="smallParagraph">UBC Department of Computer 
-		Science<br>
-		201-2366 Main Mall, Vancouver, B.C., V6T 1Z4<br>
-		<a href="http://www.cs.ubc.ca">http://www.cs.ubc.ca</a> <br>
-		Tel: (604) 822-3061 Fax: (604) 822-5485</td>
-	</tr>
-</table>
-<h4 align="center">Using Interaction History to Determine Interesting 
-Information <br>
-in a Development Environment </h4>
-<p align="left">Thank you for downloading the preview release of Mylar.&nbsp; As 
-you work Mylar will monitor your interaction with Eclipse (by logging IDs 
-of: views, editors, commands, and preference changes 
-along with their values). &nbsp;The log also stores information about the program 
-elements that you edit and navigate, but removes identifying information about 
-those elements by obfuscating their names and paths.&nbsp; Approximately once every week you will be asked to confirm an 
-upload of this interaction log to a UBC server.&nbsp; Before uploading you will have 
-a chance to review the information being sent, and to answer a short 
-questionnaire.&nbsp; You will have the option to remain anonymous throughout the study.&nbsp; </p>
-<p>The UBC Study title is: Using Interaction History to Determine Interesting 
-Information in a Development Environment. There are no known risks associated 
-with this study. After the study, this interaction history will be stripped of 
-all information identifying non-anonymous subjects, and we will use this data to 
-determine what Mylar views are useful, and to determine whether Mylar makes it 
-easier to work on large systems in Eclipse. We also plan on making this 
-anonymous usage data available to other researchers interested in improving the 
-IDE user experience. Please note that the data collected will be archived for 
-future use. This data will be anonymous and not contain any identification 
-information. This study is being conducted by Mik Kersten (beatmik@cs.ubc.ca) as 
-a part of his PhD Thesis and supervised by Dr. Gail Murphy (murphy@cs.ubc.ca). 
-If you have any questions about the data being collected or about the study in 
-general please email us or call Mik Kersten at 604-822-0193.&nbsp; If you have 
-any concerns about your treatment or rights as a research subject, you may 
-contact&nbsp; Research Subject Information Line in the UBC Office of Research 
-Services at the University of British Columbia, at 604-822-8598.&nbsp; If this 
-questionnaire is completed it will be assumed that consent has been given.&nbsp; 
-This study is being funded by the IBM Centre for Advanced Studies and by NSERC.</p>
-<p>By clicking &quot;I Agree&quot; below you acknowledge that you have received this 
-consent form, and are consenting to participate in the study.&nbsp; To 
-participate please fill in your name, email address, and date.&nbsp; Incomplete 
-submissions will be discarded.&nbsp; Note that your name and email address will not be 
-associated with the study ID that you are given, should you wish to remain 
-anonymous.</p>
-<form method="POST" action="--WEBBOT-SELF--">
-	<!--webbot bot="SaveResults" U-File="fpweb:///_private/form_results.csv" S-Format="TEXT/CSV" S-Label-Fields="TRUE" -->
-	<p>Your name:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <input type="text" name="T1" size="20"></p>
-	<p>Email address:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <input type="text" name="T2" size="20"></p>
-	<p>Job function:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
-	<input type="text" name="T4" size="20"> <br>
-	<span style="background-color: #CCCCFF">[choices: Application Developer, 
-	QA/Testing, Program Director, CIO/CTO, VP Development Systems Integrator, 
-	Application Architect, Project Manager, Student, Faculty, Business Analyst, 
-	Database Administrator, Other]</span></p>
-	<p>Company size:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
-	<input type="text" name="T5" size="20"><br>
-	<span style="background-color: #CCCCFF">[choices: Individual, &lt;50, 50-100, 
-	100-500, 500-1000, 1000-2500, &gt;2500]</span></p>
-	<p>Company business:&nbsp;&nbsp; <input type="text" name="T6" size="20"><br>
-	<span style="background-color: #CCCCFF">[choices: Financial 
-	service/insurance, Energy, Government, Hardware Manufacturer, Networking, 
-	Pharmaceutical/Medical, Automotive, Software Manufacturer, Communications, 
-	Transportation, Retail, Utilities, Other Manufacturing, Academic/Education]</span></p>
-	<p>Today's date:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <input type="text" name="T3" size="20"></p>
-	<p><input type="submit" value="I Agree" name="B1"> </p>
-</form>
-<hr>
-<p><i>Version: May 16, 2005</i></p>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.examples.monitor.study/icons/eview16/wizard-feedback.gif b/org.eclipse.mylyn.examples.monitor.study/icons/eview16/wizard-feedback.gif
deleted file mode 100644
index ef565b3..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/icons/eview16/wizard-feedback.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.examples.monitor.study/plugin.xml b/org.eclipse.mylyn.examples.monitor.study/plugin.xml
deleted file mode 100644
index 5659c5c..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/plugin.xml
+++ /dev/null
@@ -1,47 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-    <extension
-         name="Mylyn User Study Example"
-         point="org.eclipse.ui.startup">
-       <startup
-             class="org.eclipse.mylyn.examples.monitor.study.MylynUserStudyExamplePlugin$MylynUserStudyExampleStartup"></startup>
-    </extension>
-
-   <extension
-         point="org.eclipse.mylyn.monitor.usage.study">
-         <scripts
-         	url="http://my.server"
-         	upload="upload.cgi"
-         	userId="getUID.cgi"
-         	questionnaire="questionnaire.cgi"/>
-         <ui
-         	title="Mylyn User Study Example"
-         	daysBetweenUpload="6"
-         	questionnairePage="org.eclipse.mylyn.examples.monitor.study.QuestionnaireWizardPage"
-         	consentForm="doc/study-ethics.html"/>
-   </extension>
-   
-   <extension point="org.eclipse.ui.newWizards">
-      <wizard
-            category="org.eclipse.mylyn.ui.wizards.new"
-            class="org.eclipse.mylyn.examples.monitor.study.FeedbackWizard"
-            icon="icons/eview16/wizard-feedback.gif"
-            id="org.eclipse.mylyn.monitor.ui.ui.wizards.FeedbackWizard"
-            name="Feedback Submission">
-      </wizard>
-   </extension>
-   
-   <extension point="org.eclipse.ui.newWizards">
-      <wizard
-            category="org.eclipse.mylyn.ui.wizards.new"
-            class="org.eclipse.mylyn.internal.monitor.usage.wizards.UsageSubmissionWizard"
-            icon="icons/eview16/wizard-feedback.gif"
-            id="org.eclipse.mylyn.monitor.ui.ui.uploadStatistics.StatisticsUploadWizard"
-            name="Usage Feedback">
-      </wizard>
-   </extension>
-   
-</plugin> 
diff --git a/org.eclipse.mylyn.examples.monitor.study/scripts/getUID.cgi b/org.eclipse.mylyn.examples.monitor.study/scripts/getUID.cgi
deleted file mode 100644
index b70a409..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/scripts/getUID.cgi
+++ /dev/null
@@ -1,526 +0,0 @@
-#!/usr/bin/perl -wT
-
-use Fcntl ':flock';
-
-# START USER EDITS
-
-# absolute path to folder files will be uploaded to.
-# WINDOWS users, your path would like something like : images\\uploads
-# UNIX    users, your path would like something like : /home/www/images/uploads
-# do not end the path with any slashes and if you're on a UNIX serv, make sure
-# you CHMOD each folder in the path to 777
-
-$lockfileName = ".lock";
-$logFile = "/.../uploadLog.txt";
-$uidMapFile = "/.../mylarUidMap.txt";
-$nextUidFile = "/.../mylarNextUid.txt";
-$allConsentedUsers = "/.../mylarUsers.txt";
-
-# if you would like to be notified of uploads, enter your email address
-# between the SINGLE quotes. leave this blank if you would not like to be notified
-#$notify = '';
-
-# UNIX users, if you entered a value for $notify, you must also enter your
-# server's sendmail path. It usually looks something like : /usr/sbin/sendmail
-#$send_mail_path = "";
-
-# WINDOWS users, if you entered a value for $notify, you must also enter your
-# server's SMTP path. It usually looks something like : mail.servername.com
-#$smtp_path = "";
-
-
-####################################################################
-#    END USER EDITS
-####################################################################
-
-$OS = $^O; # operating system name
-if($OS =~ /darwin/i) { $isUNIX = 1; }
-elsif($OS =~ /win/i) { $isWIN = 1; }
-else {$isUNIX = 1;}
-	
-if($isWIN){ $S{S} = "\\\\"; }
-else { $S{S} = "/";} # seperator used in paths
-
-use CGI; # load the CGI.pm module
-my $GET = new CGI; # create a new object
-my @VAL = $GET->param; #get all form field names
-
-my($query_string) = "";
-$query_string = $ENV{'QUERY_STRING'};
-
-my($firstName);
-my($lastName);
-my($email_address);
-my($job_function);
-my($company_size);
-my($company_buisness);
-my($anonymousStr);
-my($uid) = -1;
-my($anonymous) = 0;
-my($first);
-my($second);
-my($third);
-my($fourth);
-my($fifth);
-my($sixth);
-my($seventh);
-	
-if($query_string =~ m/^(.+)\&(.+)\&(.+)\&(.+)\&(.+)\&(.+)\&(.+)$/)
-{
-	$first = $1;
-	$second = $2;
-	$third = $3;
-	$fourth = $4;
-	$fifth = $5;
-	$sixth = $6;
-	$seventh = $7;
-}
-else
-{
-	# error, query string is wrong
-	print "Content-type: text/plain", "\n";
-	print "Status: 501 Not Implemented", "\n\n";
-	exit;
-}
-
-if($first =~ m/^firstName\=(.+)$/){
-	$firstName = $1;
-}
-elsif($second =~ m/^firstName\=(.+)$/){
-	$firstName = $1;
-}
-elsif ($third =~ m/^firstName\=(.+)$/){
-	$firstName = $1;
-}
-elsif ($fourth =~ m/^firstName\=(.+)$/){
-	$firstName = $1;
-}
-elsif ($fifth =~ m/^firstName\=(.+)$/){
-	$firstName = $1;
-}
-elsif ($sixth =~ m/^firstName\=(.+)$/){
-	$firstName = $1;
-}
-elsif ($seventh =~ m/^firstName\=(.+)$/){
-	$firstName = $1;
-}
-
-if($first =~ m/^lastName\=(.+)$/){
-	$lastName = $1;
-}
-elsif($second =~ m/^lastName\=(.+)$/){
-	$lastName = $1;
-}
-elsif ($third =~ m/^lastName\=(.+)$/){
-	$lastName = $1;
-}
-elsif ($fourth =~ m/^lastName\=(.+)$/){
-	$lastName = $1;
-}
-elsif ($fifth =~ m/^lastName\=(.+)$/){
-	$lastName = $1;
-}
-elsif ($sixth =~ m/^lastName\=(.+)$/){
-	$lastName = $1;
-}
-elsif ($seventh =~ m/^lastName\=(.+)$/){
-	$lastName = $1;
-}
-
-if($first =~ m/^email\=(.+)$/){
-	$email_address = $1;
-}
-elsif($second =~ m/^email\=(.+)$/){
-	$email_address = $1;
-}
-elsif ($third =~ m/^email\=(.+)$/){
-	$email_address = $1;
-}
-elsif ($fourth =~ m/^email\=(.+)$/){
-	$email_address= $1;
-}
-elsif ($fifth =~ m/^email\=(.+)$/){
-	$email_address= $1;
-}
-elsif ($sixth =~ m/^email\=(.+)$/){
-	$email_address = $1;
-}
-elsif ($seventh =~ m/^email\=(.+)$/){
-	$email_address= $1;
-}
-
-if($first =~ m/^jobFunction\=(.+)$/){
-	$job_function = $1;
-}
-elsif($second =~ m/^jobFunction\=(.+)$/){
-	$job_function = $1;
-}
-elsif ($third =~ m/^jobFunction\=(.+)$/){
-	$job_function = $1;
-}
-elsif ($fourth =~ m/^jobFunction\=(.+)$/){
-	$job_function= $1;
-}
-elsif ($fifth =~ m/^jobFunction\=(.+)$/){
-	$job_function = $1;
-}
-elsif ($sixth =~ m/^jobFunction\=(.+)$/){
-	$job_function = $1;
-}
-elsif ($seventh =~ m/^jobFunction\=(.+)$/){
-	$job_function = $1;
-}
-
-if($first =~ m/^companySize\=(.+)$/){
-	$company_size = $1;
-}
-elsif($second =~ m/^companySize\=(.+)$/){
-	$company_size = $1;
-}
-elsif ($third =~ m/^companySize\=(.+)$/){
-	$company_size = $1;
-}
-elsif ($fourth =~ m/^companySize\=(.+)$/){
-	$company_size = $1;
-}
-elsif ($fifth =~ m/^companySize\=(.+)$/){
-	$company_size = $1;
-}
-elsif ($sixth =~ m/^companySize\=(.+)$/){
-	$company_size = $1;
-}
-elsif ($seventh =~ m/^companySize\=(.+)$/){
-	$company_size = $1;
-}
-
-if($first =~ m/^companyBuisness\=(.+)$/){
-	$company_buisness = $1;
-}
-elsif($second =~ m/^companyBuisness\=(.+)$/){
-	$company_buisness = $1;
-}
-elsif ($third =~ m/^companyBuisness\=(.+)$/){
-	$company_buisness = $1;
-}
-elsif ($fourth =~ m/^companyBuisness\=(.+)$/){
-	$company_buisness = $1;
-}
-elsif ($fifth =~ m/^companyBuisness\=(.+)$/){
-	$company_buisness = $1;
-}
-elsif ($sixth =~ m/^companyBuisness\=(.+)$/){
-	$company_buisness = $1;
-}
-elsif ($seventh =~ m/^companyBuisness\=(.+)$/){
-	$company_buisness = $1;
-}
-
-
-if($first =~ m/^anonymous\=(.+)$/){
-	$anonymousStr = $1;
-}
-elsif($second =~ m/^anonymous\=(.+)$/){
-	$anonymousStr = $1;
-}
-elsif ($third =~ m/^anonymous\=(.+)$/){
-	$anonymousStr = $1;
-}
-elsif ($fourth =~ m/^anonymous\=(.+)$/){
-	$anonymousStr = $1;
-}
-elsif ($fifth =~ m/^anonymous\=(.+)$/){
-	$anonymousStr = $1;
-}
-elsif ($sixth =~ m/^anonymous\=(.+)$/){
-	$anonymousStr = $1;
-}
-elsif ($seventh =~ m/^anonymous\=(.+)$/){
-	$anonymousStr = $1;
-}
-
-if ($anonymousStr =~ "true") {
-	$anonymous = 1;
-}
-
-open(USERS, "+<$allConsentedUsers ") || die "Can't open Log File: $!\n"; 
-seek USERS, 0, 2;
-print USERS "$firstName\t$lastName\t$email_address\t$job_function\t$company_size\t$company_buisness\n";
-close USERS;
-
-if($anonymous != 1){
-	# give them the same id as before
-	my($old) = &checkExistance($firstName, $lastName, $email_address);
-	if($old == -1){
-		$uid = &getNewUID($firstName, $lastName, $email_address);
-	}
-	else{
-		$uid = $old;
-	}
-}
-else
-{
-	$uid = &getNewUID("anonymous", "anonymous", "anonymous");
-}
-
-if($uid != -1)
-{
-	print "Content-type: text/plain", "\n";
-	print "Status: 200 OK", "\n\n";
-	print "UID: $uid" . "\n";
-	exit;
-}
-else
-{
-	print "Content-type: text/plain", "\n";
-	print "Status: 501 Not Implemented", "\n\n";
-	print "COULD NOT GET UID" . "\n";
-	exit;
-}
-
-
-#################################################################### 
-
-#################################################################### 
-
-sub send_mail {
-	my ($from_email, $from_name, $to_email, $to_name, $subject, $message ) = @_;
-	
-	if(open(MAIL, "|$CONFIG{mailprogram} -t")) {
-		print MAIL "From: $from_email ($from_name)\n";
-		print MAIL "To: $to_email ($to_name)\n";
-		print MAIL "Subject: $subject\n";
-		print MAIL "$message\n\nSubmitter's IP Address : $ENV{REMOTE_ADDR}";
-		close MAIL;
-		return(1);
-	} else {
-		return;
-	}
-}
-
-#################################################################### 
-
-#################################################################### 
-
-sub send_mail_NT {
-	
-	my ($from_email, $from_name, $to_email, $to_name, $subject, $message ) = @_;
-	
-	my ($SMTP_SERVER, $WEB_SERVER, $status, $err_message);
-	use Socket; 
-    $SMTP_SERVER = "$CONFIG{smtppath}";                                 
-	
-	# correct format for "\n"
-    local($CRLF) = "\015\012";
-    local($SMTP_SERVER_PORT) = 25;
-    local($AF_INET) = ($] > 5 ? AF_INET : 2);
-    local($SOCK_STREAM) = ($] > 5 ? SOCK_STREAM : 1);
-#    local(@bad_addresses) = ();
-    $, = ', ';
-    $" = ', ';
-
-    $WEB_SERVER = "$CONFIG{smtppath}\n";
-    chop ($WEB_SERVER);
-
-    local($local_address) = (gethostbyname($WEB_SERVER))[4];
-    local($local_socket_address) = pack('S n a4 x8', $AF_INET, 0, $local_address);
-
-    local($server_address) = (gethostbyname($SMTP_SERVER))[4];
-    local($server_socket_address) = pack('S n a4 x8', $AF_INET, $SMTP_SERVER_PORT, $server_address);
-
-    # Translate protocol name to corresponding number
-    local($protocol) = (getprotobyname('tcp'))[2];
-
-    # Make the socket filehandle
-    if (!socket(SMTP, $AF_INET, $SOCK_STREAM, $protocol)) {
-        return;
-    }
-
-	# Give the socket an address
-	bind(SMTP, $local_socket_address);
-	
-	# Connect to the server
-	if (!(connect(SMTP, $server_socket_address))) {
-		return;
-	}
-	
-	# Set the socket to be line buffered
-	local($old_selected) = select(SMTP);
-	$| = 1;
-	select($old_selected);
-	
-	# Set regex to handle multiple line strings
-	$* = 1;
-
-    # Read first response from server (wait for .75 seconds first)
-    select(undef, undef, undef, .75);
-    sysread(SMTP, $_, 1024);
-	#print "<P>1:$_";
-
-    print SMTP "HELO $WEB_SERVER$CRLF";
-    sysread(SMTP, $_, 1024);
-	#print "<P>2:$_";
-
-	while (/(^|(\r?\n))[^0-9]*((\d\d\d).*)$/g) { $status = $4; $err_message = $3}
-	if ($status != 250) {
-		return;
-	}
-
-	print SMTP "MAIL FROM:<$from_email>$CRLF";
-
-	sysread(SMTP, $_, 1024);
-	#print "<P>3:$_";
-	if (!/[^0-9]*250/) {
-		return;
-	}
-
-    # Tell the server where we're sending to
-	print SMTP "RCPT TO:<$to_email>$CRLF";
-	sysread(SMTP, $_, 1024);
-	#print "<P>4:$_";
-	/[^0-9]*(\d\d\d)/;
-
-	# Give the server the message header
-	print SMTP "DATA$CRLF";
-	sysread(SMTP, $_, 1024);
-	#print "<P>5:$_";
-	if (!/[^0-9]*354/) {
-		return;
-	}
-
-	$message =~ s/\n/$CRLF/ig;
-	
-	print SMTP qq~From: $from_email ($from_name)$CRLF~;
-	print SMTP qq~To: $to_email ($to_name)$CRLF~;
-#	if($cc){
-#		print SMTP "CC: $cc ($cc_name)\n";
-#	}
-	print SMTP qq~Subject: $subject$CRLF$CRLF~;
-	print SMTP qq~$message~;
-
-	print SMTP "$CRLF.$CRLF";
-	sysread(SMTP, $_, 1024);
-	#print "<P>6:$_";
-	if (!/[^0-9]*250/) {
-		return;
-	} else {
-		return(1);
-	}
-
-	if (!shutdown(SMTP, 2)) {
-		return;
-    } 
-}
-
-#################################################################### 
-
-#################################################################### 
-
-sub check_email {
-	my($fe_email) = $_[0];
-	if($fe_email) {
-		if(($fe_email =~ /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)|(\.$)/) ||
-		($fe_email !~ /^.+@\[?(\w|[-.])+\.[a-zA-Z]{2,3}|[0-9]{1,3}\]?$/)) {
-			return;
-		} else { return(1) }
-	} else {
-		return;
-	}
-}
-#################################################################### 
-
-#################################################################### 
-
-sub getNewUID {
-	my($firstName, $lastName, $email_address) = @_;
-
-	open(LOCKFILE, $lockfileName);
-    	flock(LOCKFILE, LOCK_EX);
-
-	open(NEXTUID, "<$nextUidFile") || die "Can't open Log File: $!\n"; 
-	my($uid) = -1;
-	my(@lines) = <NEXTUID>;
-	my($line) = "";
-	foreach $line (@lines)
-	{
-		if($line =~ m/^(\d+)$/)
-		{
-			$uid = $1;		   
-			last;
-		}
-	}		
-	close NEXTUID;
-
-	my($nextUid) = $uid + 17;
-	open(NEXTUID, ">$nextUidFile") || die "Can't open Log File: $!\n"; 
-	print NEXTUID $nextUid;		
-	close NEXTUID;
-	    	
-
-	open(UIDMAP, "+<$uidMapFile") || die "Can't open Log File: $!\n"; 	
-	seek UIDMAP, 0, 2;
-	print UIDMAP "$uid\t$firstName\t$lastName\t$email_address\n";	
-	close UIDMAP;
-
-	flock(LOCKFILE, LOCK_UN);
-	close LOCKFILE;
-	return $uid;
-
-}
-#################################################################### 
-
-#################################################################### 
-
-sub checkExistance {
-	my($firstName, $lastName, $email_address) = @_;
-	my($uid) = -1;
-
-	open(LOCKFILE, $lockfileName);
-    	flock(LOCKFILE, LOCK_EX);
-    	
-	open(UIDMAP, $uidMapFile) || die "Can't open Log File: $!\n"; 
-	my(@lines) = <UIDMAP>;
-	my($line) = "";
-	foreach $line (@lines)
-	{
-		if($line =~ m/^(\d+)\t$firstName\t$lastName\t$email_address$/)
-		{
-			$uid = $1;
-			last;
-		}
-	}
-	close UIDMAP;
-
-	flock(LOCKFILE, LOCK_UN);
-	close LOCKFILE;
-	return $uid;
-}
-
-#################################################################### 
-
-#################################################################### 
-
-sub log {
-	open(LOCKFILE, $lockfileName);
-	flock(LOCKFILE, LOCK_EX);
-    	
-	open(LOG, "+<$logFile") || die "Can't open Log File: $!\n"; 
-    
-	seek LOG, 0, 2;
-	print LOG $_[0] . "\t\t";	
-
-	my ($sec,$min,$hour,$mday,$mon,$year, $wday,$yday,$isdst) = localtime time;
-
-	# update the year so that it is correct since it perl
-	# has a 1900 yr offset	
-	$year += 1900;
-
-	# update the month since it is 0 based in perl	
-	$mon += 1;
-	
-	printf LOG "%02d/%02d/%04d %02d:%02d:%02d\n", $mday, $mon, $year, $hour, $min, $sec;
-	
-	close LOG;
-	
-	flock(LOCKFILE, LOCK_UN);
-    close LOCKFILE;
-}
diff --git a/org.eclipse.mylyn.examples.monitor.study/scripts/questionnaire.cgi b/org.eclipse.mylyn.examples.monitor.study/scripts/questionnaire.cgi
deleted file mode 100644
index a9d9c4c..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/scripts/questionnaire.cgi
+++ /dev/null
@@ -1,450 +0,0 @@
-#!/usr/bin/perl -w
-
-# START USER EDITS
-
-# absolute path to folder files will be uploaded to.
-# WINDOWS users, your path would like something like : images\\uploads
-# UNIX    users, your path would like something like : /home/www/images/uploads
-# do not end the path with any slashes and if you're on a UNIX serv, make sure
-# you CHMOD each folder in the path to 777
-
-$dir = "/.../upload";  
-$logFile =    "/.../questionnaireLog.txt";
-
-# if you would like to be notified of uploads, enter your email address
-# between the SINGLE quotes. leave this blank if you would not like to be notified
-$notify = '';
-
-# UNIX users, if you entered a value for $notify, you must also enter your
-# server's sendmail path. It usually looks something like : /usr/sbin/sendmail
-$send_mail_path = "";
-
-# WINDOWS users, if you entered a value for $notify, you must also enter your
-# server's SMTP path. It usually looks something like : mail.servername.com
-$smtp_path = "";
-
-# file types allowed, enter each type on a new line
-# Enter the word "ALL" in uppercase, to accept all file types.
-@types = qw~
-txt
-~;
-
-####################################################################
-#    END USER EDITS
-####################################################################
-
-$OS = $^O; # operating system name
-if($OS =~ /darwin/i) { $isUNIX = 1; }
-elsif($OS =~ /win/i) { $isWIN = 1; }
-else {$isUNIX = 1;}
-	
-if($isWIN){ $S{S} = "\\\\"; }
-else { $S{S} = "/";} # seperator used in paths
-
-unless (-d "$dir"){
-	mkdir ("$dir", 0777); # unless the dir exists, make it ( and chmod it on UNIX )
-	chmod(0777, "$dir");
-}
-
-
-unless (-d "$dir"){
-	# if there still is no dir, the path entered by the user is wrong and the upload will fail
-	# send back an error code
-	# unauthorized, uid not correct
-	exit;
-}
-
-use CGI; # load the CGI.pm module
-my $GET = new CGI; # create a new object
-my @VAL = $GET->param; #get all form field names
-
-foreach(@VAL){
-	$FORM{$_} = $GET->param($_); # put all fields and values in hash 
-}
-
-my @files;
-foreach(keys %FORM){
-    # check for the parameter name
-    # This must be MYLARa where is a a number
-    if($_ =~ /^MYLAR/){
-        push(@files, $_); # place the field NAME in an array
-    } else {
-	&log( "Filenamed not named MYLARa: ".$_);
-	exit;
-    }
-}
-
-
-if(!$VAL[0]){
-	# no file to upload so exit with an error
-	print "Content-type: text/plain", "\n";
-	print "Status: 501 Not Implemented", "\n\n";
-	print "Upload Failed - no file to upload","\n";
-	&log("Upload Failed - no file to upload\n");
-	exit;
-}
-
-
-my $failed; # results string = false
-my $selected; # num of files selected by user
-
-#################################################################### 
-
-#################################################################### 
-
-foreach (@files){
-	# upload each file, pass the form field NAME if it has a value
-	if($GET->param($_)){
-		# if the form field contains a file name &psjs_upload subroutine
-		# the file's name and path are passed to the subroutine 
-		$returned = &psjs_upload($_); 
-		if($returned =~ /^Success/i){
-			# if the $returned message begins with "Success" the upload was succssful
-			# remove the word "Success" and any spaces and we're left with the filename   
-			$returned =~ s/^Success\s+//;
-			push(@success, $returned);
-		} else {
-			# else if the word "success" is not returned, the message is the error encountered. 
-			# add the error to the $failed scalar
-			$failed .= $returned;
-		}
-		$selected++; # increment num of files selected for uploading by user
-	}
-}
-
-if(!$selected){
-	# no files were selected by user, so nothing is returned to either variable
-	$failed .= qq~No files were selected for uploading~;
-}
-
-# if no error message is return ed, the upload was successful
-
-my ($fNames, $aa, $bb, @current, @currentfiles );
-
-if($failed){
-
-	# file failed to upload return error
-	print "Content-type: text/plain", "\n";
-	print "Status: 501 Not Implemented", "\n\n";
-	print "Upload Failed","\n";
-	
-} else {
-	# upload was successful
-	# log the success and return success code
-	
-	# send email if valid email was entered
-	if(check_email($notify)){
-		
-		# TODO send an appropriate message
-		
-		# enter the message you would like to receive
-		my $message = qq~
-		The following files were uploaded to your server :
-		~; 
-		
-		foreach(@success){
-			$message .= qq~
-			$dir/$_	
-			~;
-		}
-		
-		if($isUNIX){
-			$CONFIG{mailprogram} = $send_mail_path;
-			# enter your e-mail name here if you like
-			# from e-mail, from name, to e-mail, to name, subject, body
-			&send_mail($notify, 'Demo Upload', $notify, 'Demo Upload', 'Upload Notification', $message);
-			
-		} else {
-			$CONFIG{smtppath} = $smtp_path;
-			&send_mail_NT($notify, 'Your Name', $notify, 'Your Name', 'Upload Notification', $message);
-		}
-	}
-	
-	# NEED TO LOG THE UPLOAD
-	foreach(@success){
-		&log("NONE" . "\t" . "$dir/$_");
-	}
-	
-	
-	print "Content-type: text/plain". "\n";
-	print "Status: 200 OK", "\n\n";
-	print "Upload Success","\n";
-}
-
-#################################################################### 
-
-#################################################################### 
-
-sub psjs_upload {
-
-	my $filename = $GET->param($_[0]); 
-	$filename =~ s/.*[\/\\](.*)/$1/; 
-	my $upload_filehandle = $GET->upload($_[0]); 
-	# if $file_type matchs one of the types specified, make the $type_ok var true
-	for($b = 0; $b < @types; $b++){
-		if($filename =~ /^.*\.$types[$b]$/i){
-			$type_ok++;
-		}
-		if($types[$b] eq "ALL"){
-			$type_ok++; # if ALL keyword is found, increment $type_ok var.
-		}
-	}
-	
-	# if ok, check if overwrite is allowed
-	if($type_ok){
-	    if(open UPLOADFILE, ">$dir/$filename"){
-
-	    	binmode UPLOADFILE; 
-
-	    	while ( <$upload_filehandle> ) 
-	    	{
-				print UPLOADFILE; 
-	    	} 
-   		    close UPLOADFILE; 
-	    }else {
-	    	return qq~Error opening file on the server~; 
-	    }
-	} else {
-		return qq~Bad file type~; 
-	}
-			
-	# check if file has actually been uploaded, by checking the file has a size
-	if(-s "$dir/$filename"){
-		return qq~Success $filename~; #success 
-	} else {
-		# delete the file as it has no content
-		# user probably entered an incorrect path to file
-		return qq~Upload failed : No data in $filename. No size on server's copy of file. 
-		Check the path entered.~; 
-	}
-}
-
-#################################################################### 
-
-#################################################################### 
-
-sub check_existence {
-	# $dir,$filename,$newnum are the args passed to this sub
-	my ($dir,$filename,$newnum) = @_;
-	
-	my (@file_type, $file_type, $exists, $bareName); 
-	# declare some vars we will use later on in this sub always use paranthesis 
-	# when declaring more than one var! Some novice programmers will tell you 
-	# this is not necessary. Tell them to learn how to program.
-	
-	if(!$newnum){$newnum = "0";} # new num is empty in first call, so set it to 0
-	
-	# read dir and put all files in an array (list)
-	opendir(DIR, "$dir");
-	@existing_files =  readdir(DIR);
-	closedir(DIR);
-	
-	# if the filename passed exists, set $exists to true or 1
-	foreach(@existing_files){
-		if($_ eq $filename){
-			$exists = 1;
-		}
-	}
-	
-	# if it exists, we need to rename the file being uploaded and then recheck it to 
-	# make sure the new name does not exist
-	if($exists){
-		$newnum++; # increment new number (add 1)
-
-		# get the extension
-		@file_type   = split(/\./, $filename); # split the dots and add inbetweens to a list
-		# put the first element in the $barename var
-		$bareName    = $file_type[0]; 
-		# we can assume everything after the last . found is the extension
-		$file_type   = $file_type[$#file_type]; 
-		# $#file_type is the last element (note the pound or hash is used)
-		
-		# remove all numbers from the end of the $bareName
-		$bareName =~ s/\d+$//ig;
-		
-		# concatenate a new name using the barename + newnum + extension 
-		$filename = $bareName . $newnum . '.' . $file_type;
-		
-		# reset $exists to 0 because the new file name is now being checked
-		$exists = 0;
-		
-		# recall this subroutine
-		&check_existence($dir,$filename,$newnum);
-	} else {
-		# the $filename, whether the first or one hundreth call, now does not exist
-		# so return the name to be used
-		return ($filename);
-	}
-}
-
-#################################################################### 
-
-#################################################################### 
-
-sub send_mail {
-	my ($from_email, $from_name, $to_email, $to_name, $subject, $message ) = @_;
-	
-	if(open(MAIL, "|$CONFIG{mailprogram} -t")) {
-		print MAIL "From: $from_email ($from_name)\n";
-		print MAIL "To: $to_email ($to_name)\n";
-		print MAIL "Subject: $subject\n";
-		print MAIL "$message\n\nSubmitter's IP Address : $ENV{REMOTE_ADDR}";
-		close MAIL;
-		return(1);
-	} else {
-		return;
-	}
-}
-
-#################################################################### 
-
-#################################################################### 
-
-sub send_mail_NT {
-	
-	my ($from_email, $from_name, $to_email, $to_name, $subject, $message ) = @_;
-	
-	my ($SMTP_SERVER, $WEB_SERVER, $status, $err_message);
-	use Socket; 
-    $SMTP_SERVER = "$CONFIG{smtppath}";                                 
-	
-	# correct format for "\n"
-    local($CRLF) = "\015\012";
-    local($SMTP_SERVER_PORT) = 25;
-    local($AF_INET) = ($] > 5 ? AF_INET : 2);
-    local($SOCK_STREAM) = ($] > 5 ? SOCK_STREAM : 1);
-#    local(@bad_addresses) = ();
-    $, = ', ';
-    $" = ', ';
-
-    $WEB_SERVER = "$CONFIG{smtppath}\n";
-    chop ($WEB_SERVER);
-
-    local($local_address) = (gethostbyname($WEB_SERVER))[4];
-    local($local_socket_address) = pack('S n a4 x8', $AF_INET, 0, $local_address);
-
-    local($server_address) = (gethostbyname($SMTP_SERVER))[4];
-    local($server_socket_address) = pack('S n a4 x8', $AF_INET, $SMTP_SERVER_PORT, $server_address);
-
-    # Translate protocol name to corresponding number
-    local($protocol) = (getprotobyname('tcp'))[2];
-
-    # Make the socket filehandle
-    if (!socket(SMTP, $AF_INET, $SOCK_STREAM, $protocol)) {
-        return;
-    }
-
-	# Give the socket an address
-	bind(SMTP, $local_socket_address);
-	
-	# Connect to the server
-	if (!(connect(SMTP, $server_socket_address))) {
-		return;
-	}
-	
-	# Set the socket to be line buffered
-	local($old_selected) = select(SMTP);
-	$| = 1;
-	select($old_selected);
-	
-	# Set regex to handle multiple line strings
-	$* = 1;
-
-    # Read first response from server (wait for .75 seconds first)
-    select(undef, undef, undef, .75);
-    sysread(SMTP, $_, 1024);
-	#print "<P>1:$_";
-
-    print SMTP "HELO $WEB_SERVER$CRLF";
-    sysread(SMTP, $_, 1024);
-	#print "<P>2:$_";
-
-	while (/(^|(\r?\n))[^0-9]*((\d\d\d).*)$/g) { $status = $4; $err_message = $3}
-	if ($status != 250) {
-		return;
-	}
-
-	print SMTP "MAIL FROM:<$from_email>$CRLF";
-
-	sysread(SMTP, $_, 1024);
-	#print "<P>3:$_";
-	if (!/[^0-9]*250/) {
-		return;
-	}
-
-    # Tell the server where we're sending to
-	print SMTP "RCPT TO:<$to_email>$CRLF";
-	sysread(SMTP, $_, 1024);
-	#print "<P>4:$_";
-	/[^0-9]*(\d\d\d)/;
-
-	# Give the server the message header
-	print SMTP "DATA$CRLF";
-	sysread(SMTP, $_, 1024);
-	#print "<P>5:$_";
-	if (!/[^0-9]*354/) {
-		return;
-	}
-
-	$message =~ s/\n/$CRLF/ig;
-	
-	print SMTP qq~From: $from_email ($from_name)$CRLF~;
-	print SMTP qq~To: $to_email ($to_name)$CRLF~;
-#	if($cc){
-#		print SMTP "CC: $cc ($cc_name)\n";
-#	}
-	print SMTP qq~Subject: $subject$CRLF$CRLF~;
-	print SMTP qq~$message~;
-
-	print SMTP "$CRLF.$CRLF";
-	sysread(SMTP, $_, 1024);
-	#print "<P>6:$_";
-	if (!/[^0-9]*250/) {
-		return;
-	} else {
-		return(1);
-	}
-
-	if (!shutdown(SMTP, 2)) {
-		return;
-    } 
-}
-
-#################################################################### 
-
-#################################################################### 
-
-sub check_email {
-	my($fe_email) = $_[0];
-	if($fe_email) {
-		if(($fe_email =~ /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)|(\.$)/) ||
-		($fe_email !~ /^.+@\[?(\w|[-.])+\.[a-zA-Z]{2,3}|[0-9]{1,3}\]?$/)) {
-			return;
-		} else { return(1) }
-	} else {
-		return;
-	}
-    }
-#################################################################### 
-
-#################################################################### 
-
-sub log {
-	open(LOG, "+<$logFile") || die "Can't open Log File: $!\n"; 
-    
-	seek LOG, 0, 2;
-	print LOG $_[0] . "\t\t";	
-
-	my ($sec,$min,$hour,$mday,$mon,$year, $wday,$yday,$isdst) = localtime time;
-
-	# update the year so that it is correct since it perl
-	# has a 1900 yr offset	
-	$year += 1900;
-
-	# update the month since it is 0 based in perl	
-	$mon += 1;
-	
-	printf LOG "%02d/%02d/%04d %02d:%02d:%02d\n", $mday, $mon, $year, $hour, $min, $sec;
-	
-	close LOG;
-}
diff --git a/org.eclipse.mylyn.examples.monitor.study/scripts/upload.cgi b/org.eclipse.mylyn.examples.monitor.study/scripts/upload.cgi
deleted file mode 100644
index d74fc2d..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/scripts/upload.cgi
+++ /dev/null
@@ -1,502 +0,0 @@
-#!/usr/bin/perl -w
-
-use Fcntl ':flock';
-
-# START USER EDITS
-
-# absolute path to folder files will be uploaded to.
-# WINDOWS users, your path would like something like : images\\uploads
-# UNIX    users, your path would like something like : /home/www/images/uploads
-# do not end the path with any slashes and if you're on a UNIX serv, make sure
-# you CHMOD each folder in the path to 777
-
-$lockfileName = "/.../.lock";
-$logFile =    "/.../uploadLog.txt";
-$uidMapFile = "/.../mylarUidMap.txt";
-
-$dir = "/isd/se2/project/mylar/userStudy/upload";  
-
-# if you would like to be notified of uploads, enter your email address
-# between the SINGLE quotes. leave this blank if you would not like to be notified
-$notify = '';
-
-# UNIX users, if you entered a value for $notify, you must also enter your
-# server's sendmail path. It usually looks something like : /usr/sbin/sendmail
-$send_mail_path = "";
-
-# WINDOWS users, if you entered a value for $notify, you must also enter your
-# server's SMTP path. It usually looks something like : mail.servername.com
-$smtp_path = "";
-
-# file types allowed, enter each type on a new line
-# Enter the word "ALL" in uppercase, to accept all file types.
-@types = qw~
-zip
-txt
-~;
-
-####################################################################
-#    END USER EDITS
-####################################################################
-
-$OS = $^O; # operating system name
-if($OS =~ /darwin/i) { $isUNIX = 1; }
-elsif($OS =~ /win/i) { $isWIN = 1; }
-else {$isUNIX = 1;}
-	
-if($isWIN){ $S{S} = "\\\\"; }
-else { $S{S} = "/";} # seperator used in paths
-
-unless (-d "$dir"){
-	mkdir ("$dir", 0777); # unless the dir exists, make it ( and chmod it on UNIX )
-	chmod(0777, "$dir");
-}
-
-
-unless (-d "$dir"){
-	# if there still is no dir, the path entered by the user is wrong and the upload will fail
-	# send back an error code
-	# unauthorized, uid not correct
-	exit;
-}
-
-use CGI; # load the CGI.pm module
-my $GET = new CGI; # create a new object
-my @VAL = $GET->param; #get all form field names
-
-foreach(@VAL){
-	$FORM{$_} = $GET->param($_); # put all fields and values in hash 
-}
-
-my($uid) = "";
-
-my @files;
-foreach(keys %FORM){
-	# check for the parameter name
-	# This must be MYLARa where is a a number
-	if($_ =~ /^MYLAR(\d+)/){
-		$uid = $1;
-		if(&checkUID($uid) == 1)
-		{
-			push(@files, $_); # place the field NAME in an array
-		}
-		else
-		{
-			# unauthorized, uid not correct
-			print "Content-type: text/plain", "\n";
-			print "Status: 401 Unauthorized", "\n\n";
-			print "UID Incorrect","\n";
-			exit;
-		}
-	}
-}
-
-
-if(!$VAL[0]){
-	# no file to upload so exit with an error
-	print "Content-type: text/plain", "\n";
-	print "Status: 501 Not Implemented", "\n\n";
-	print "Upload Failed - no file to upload","\n";
-
-	exit;
-}
-
-
-my $failed; # results string = false
-my $selected; # num of files selected by user
-
-#################################################################### 
-
-#################################################################### 
-
-foreach (@files){
-	# upload each file, pass the form field NAME if it has a value
-	if($GET->param($_)){
-		# if the form field contains a file name &psjs_upload subroutine
-		# the file's name and path are passed to the subroutine 
-		$returned = &psjs_upload($_); 
-		if($returned =~ /^Success/i){
-			# if the $returned message begins with "Success" the upload was succssful
-			# remove the word "Success" and any spaces and we're left with the filename   
-			$returned =~ s/^Success\s+//;
-			push(@success, $returned);
-		} else {
-			# else if the word "success" is not returned, the message is the error encountered. 
-			# add the error to the $failed scalar
-			$failed .= $returned;
-		}
-		$selected++; # increment num of files selected for uploading by user
-	}
-}
-
-if(!$selected){
-	# no files were selected by user, so nothing is returned to either variable
-	$failed .= qq~No files were selected for uploading~;
-}
-
-# if no error message is return ed, the upload was successful
-
-my ($fNames, $aa, $bb, @current, @currentfiles );
-
-if($failed){
-
-	# file failed to upload return error
-	print "Content-type: text/plain", "\n";
-	print "Status: 501 Not Implemented", "\n\n";
-	print "Upload Failed","\n";
-	
-} else {
-	# upload was successful
-	# log the success and return success code
-	
-	# send email if valid email was entered
-	if(check_email($notify)){
-		
-		# TODO send an appropriate message
-		
-		# enter the message you would like to receive
-		my $message = qq~
-		The following files were uploaded to your server :
-		~; 
-		
-		foreach(@success){
-			$message .= qq~
-			$dir/$_	
-			~;
-		}
-		
-		if($isUNIX){
-			$CONFIG{mailprogram} = $send_mail_path;
-			# enter your e-mail name here if you like
-			# from e-mail, from name, to e-mail, to name, subject, body
-			&send_mail($notify, 'Demo Upload', $notify, 'Demo Upload', 'Upload Notification', $message);
-			
-		} else {
-			$CONFIG{smtppath} = $smtp_path;
-			&send_mail_NT($notify, 'Your Name', $notify, 'Your Name', 'Upload Notification', $message);
-		}
-	}
-	
-	# NEED TO LOG THE UPLOAD
-	foreach(@success){
-		&log($uid . "\t" . "$dir/$_");
-	}
-	
-	
-	print "Content-type: text/plain". "\n";
-	print "Status: 200 OK", "\n\n";
-	print "Upload Success","\n";
-}
-
-#################################################################### 
-
-#################################################################### 
-
-sub psjs_upload {
-
-	my $filename = $GET->param($_[0]); 
-	$filename =~ s/.*[\/\\](.*)/$1/; 
-	my $upload_filehandle = $GET->upload($_[0]); 
-	# if $file_type matchs one of the types specified, make the $type_ok var true
-	for($b = 0; $b < @types; $b++){
-		if($filename =~ /^.*\.$types[$b]$/i){
-			$type_ok++;
-		}
-		if($types[$b] eq "ALL"){
-			$type_ok++; # if ALL keyword is found, increment $type_ok var.
-		}
-	}
-	
-	# if ok, check if overwrite is allowed
-	if($type_ok){
-	    if(open UPLOADFILE, ">$dir/$filename"){
-
-	    	binmode UPLOADFILE; 
-
-	    	while ( <$upload_filehandle> ) 
-	    	{
-				print UPLOADFILE; 
-	    	} 
-   		    close UPLOADFILE; 
-	    }else {
-	    	return qq~Error opening file on the server~; 
-	    }
-	} else {
-		return qq~Bad file type~; 
-	}
-			
-	# check if file has actually been uploaded, by checking the file has a size
-	if(-s "$dir/$filename"){
-		return qq~Success $filename~; #success 
-	} else {
-		# delete the file as it has no content
-		# user probably entered an incorrect path to file
-		return qq~Upload failed : No data in $filename. No size on server's copy of file. 
-		Check the path entered.~; 
-	}
-}
-
-#################################################################### 
-
-#################################################################### 
-
-sub check_existence {
-	# $dir,$filename,$newnum are the args passed to this sub
-	my ($dir,$filename,$newnum) = @_;
-	
-	my (@file_type, $file_type, $exists, $bareName); 
-	# declare some vars we will use later on in this sub always use paranthesis 
-	# when declaring more than one var! Some novice programmers will tell you 
-	# this is not necessary. Tell them to learn how to program.
-	
-	if(!$newnum){$newnum = "0";} # new num is empty in first call, so set it to 0
-	
-	# read dir and put all files in an array (list)
-	opendir(DIR, "$dir");
-	@existing_files =  readdir(DIR);
-	closedir(DIR);
-	
-	# if the filename passed exists, set $exists to true or 1
-	foreach(@existing_files){
-		if($_ eq $filename){
-			$exists = 1;
-		}
-	}
-	
-	# if it exists, we need to rename the file being uploaded and then recheck it to 
-	# make sure the new name does not exist
-	if($exists){
-		$newnum++; # increment new number (add 1)
-
-		# get the extension
-		@file_type   = split(/\./, $filename); # split the dots and add inbetweens to a list
-		# put the first element in the $barename var
-		$bareName    = $file_type[0]; 
-		# we can assume everything after the last . found is the extension
-		$file_type   = $file_type[$#file_type]; 
-		# $#file_type is the last element (note the pound or hash is used)
-		
-		# remove all numbers from the end of the $bareName
-		$bareName =~ s/\d+$//ig;
-		
-		# concatenate a new name using the barename + newnum + extension 
-		$filename = $bareName . $newnum . '.' . $file_type;
-		
-		# reset $exists to 0 because the new file name is now being checked
-		$exists = 0;
-		
-		# recall this subroutine
-		&check_existence($dir,$filename,$newnum);
-	} else {
-		# the $filename, whether the first or one hundreth call, now does not exist
-		# so return the name to be used
-		return ($filename);
-	}
-}
-
-#################################################################### 
-
-#################################################################### 
-
-sub send_mail {
-	my ($from_email, $from_name, $to_email, $to_name, $subject, $message ) = @_;
-	
-	if(open(MAIL, "|$CONFIG{mailprogram} -t")) {
-		print MAIL "From: $from_email ($from_name)\n";
-		print MAIL "To: $to_email ($to_name)\n";
-		print MAIL "Subject: $subject\n";
-		print MAIL "$message\n\nSubmitter's IP Address : $ENV{REMOTE_ADDR}";
-		close MAIL;
-		return(1);
-	} else {
-		return;
-	}
-}
-
-#################################################################### 
-
-#################################################################### 
-
-sub send_mail_NT {
-	
-	my ($from_email, $from_name, $to_email, $to_name, $subject, $message ) = @_;
-	
-	my ($SMTP_SERVER, $WEB_SERVER, $status, $err_message);
-	use Socket; 
-    $SMTP_SERVER = "$CONFIG{smtppath}";                                 
-	
-	# correct format for "\n"
-    local($CRLF) = "\015\012";
-    local($SMTP_SERVER_PORT) = 25;
-    local($AF_INET) = ($] > 5 ? AF_INET : 2);
-    local($SOCK_STREAM) = ($] > 5 ? SOCK_STREAM : 1);
-#    local(@bad_addresses) = ();
-    $, = ', ';
-    $" = ', ';
-
-    $WEB_SERVER = "$CONFIG{smtppath}\n";
-    chop ($WEB_SERVER);
-
-    local($local_address) = (gethostbyname($WEB_SERVER))[4];
-    local($local_socket_address) = pack('S n a4 x8', $AF_INET, 0, $local_address);
-
-    local($server_address) = (gethostbyname($SMTP_SERVER))[4];
-    local($server_socket_address) = pack('S n a4 x8', $AF_INET, $SMTP_SERVER_PORT, $server_address);
-
-    # Translate protocol name to corresponding number
-    local($protocol) = (getprotobyname('tcp'))[2];
-
-    # Make the socket filehandle
-    if (!socket(SMTP, $AF_INET, $SOCK_STREAM, $protocol)) {
-        return;
-    }
-
-	# Give the socket an address
-	bind(SMTP, $local_socket_address);
-	
-	# Connect to the server
-	if (!(connect(SMTP, $server_socket_address))) {
-		return;
-	}
-	
-	# Set the socket to be line buffered
-	local($old_selected) = select(SMTP);
-	$| = 1;
-	select($old_selected);
-	
-	# Set regex to handle multiple line strings
-	$* = 1;
-
-    # Read first response from server (wait for .75 seconds first)
-    select(undef, undef, undef, .75);
-    sysread(SMTP, $_, 1024);
-	#print "<P>1:$_";
-
-    print SMTP "HELO $WEB_SERVER$CRLF";
-    sysread(SMTP, $_, 1024);
-	#print "<P>2:$_";
-
-	while (/(^|(\r?\n))[^0-9]*((\d\d\d).*)$/g) { $status = $4; $err_message = $3}
-	if ($status != 250) {
-		return;
-	}
-
-	print SMTP "MAIL FROM:<$from_email>$CRLF";
-
-	sysread(SMTP, $_, 1024);
-	#print "<P>3:$_";
-	if (!/[^0-9]*250/) {
-		return;
-	}
-
-    # Tell the server where we're sending to
-	print SMTP "RCPT TO:<$to_email>$CRLF";
-	sysread(SMTP, $_, 1024);
-	#print "<P>4:$_";
-	/[^0-9]*(\d\d\d)/;
-
-	# Give the server the message header
-	print SMTP "DATA$CRLF";
-	sysread(SMTP, $_, 1024);
-	#print "<P>5:$_";
-	if (!/[^0-9]*354/) {
-		return;
-	}
-
-	$message =~ s/\n/$CRLF/ig;
-	
-	print SMTP qq~From: $from_email ($from_name)$CRLF~;
-	print SMTP qq~To: $to_email ($to_name)$CRLF~;
-#	if($cc){
-#		print SMTP "CC: $cc ($cc_name)\n";
-#	}
-	print SMTP qq~Subject: $subject$CRLF$CRLF~;
-	print SMTP qq~$message~;
-
-	print SMTP "$CRLF.$CRLF";
-	sysread(SMTP, $_, 1024);
-	#print "<P>6:$_";
-	if (!/[^0-9]*250/) {
-		return;
-	} else {
-		return(1);
-	}
-
-	if (!shutdown(SMTP, 2)) {
-		return;
-    } 
-}
-
-#################################################################### 
-
-#################################################################### 
-
-sub check_email {
-	my($fe_email) = $_[0];
-	if($fe_email) {
-		if(($fe_email =~ /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)|(\.$)/) ||
-		($fe_email !~ /^.+@\[?(\w|[-.])+\.[a-zA-Z]{2,3}|[0-9]{1,3}\]?$/)) {
-			return;
-		} else { return(1) }
-	} else {
-		return;
-	}
-}
-#################################################################### 
-
-#################################################################### 
-
-sub checkUID {
-	my($uid) = $_[0];
-
-	open(LOCKFILE, $lockfileName);
-    	flock(LOCKFILE, LOCK_EX);
-    	
-	open(UIDMAP, $uidMapFile) || die "Can't open Log File: $!\n"; 
-	my($found) = 0;
-	my(@lines) = <UIDMAP>;
-	my($line) = "";
-	foreach $line (@lines)
-	{
-		if($line =~ m/^$uid\t(.*)\t(.*)\t(.*)$/)
-		{
-			$found = 1;
-			last;
-		}
-	}
-	close UIDMAP;
-
-	flock(LOCKFILE, LOCK_UN);
-	close LOCKFILE;
-	return $found;
-}
-
-#################################################################### 
-
-#################################################################### 
-
-sub log {
-	open(LOCKFILE, $lockfileName);
-	flock(LOCKFILE, LOCK_EX);
-    	
-	open(LOG, "+<$logFile") || die "Can't open Log File: $!\n"; 
-    
-	seek LOG, 0, 2;
-	print LOG $_[0] . "\t\t";	
-
-	my ($sec,$min,$hour,$mday,$mon,$year, $wday,$yday,$isdst) = localtime time;
-
-	# update the year so that it is correct since it perl
-	# has a 1900 yr offset	
-	$year += 1900;
-
-	# update the month since it is 0 based in perl	
-	$mon += 1;
-	
-	printf LOG "%02d/%02d/%04d %02d:%02d:%02d\n", $mday, $mon, $year, $hour, $min, $sec;
-	
-	close LOG;
-	
-	flock(LOCKFILE, LOCK_UN);
-    close LOCKFILE;
-}
diff --git a/org.eclipse.mylyn.examples.monitor.study/src/org/eclipse/mylyn/examples/monitor/study/FeedbackWizard.java b/org.eclipse.mylyn.examples.monitor.study/src/org/eclipse/mylyn/examples/monitor/study/FeedbackWizard.java
deleted file mode 100644
index b7611a4..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/src/org/eclipse/mylyn/examples/monitor/study/FeedbackWizard.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.examples.monitor.study;
-
-import java.io.File;
-import java.lang.reflect.InvocationTargetException;
-import java.net.NoRouteToHostException;
-import java.net.UnknownHostException;
-import java.util.Calendar;
-
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.methods.PostMethod;
-import org.apache.commons.httpclient.methods.multipart.FilePart;
-import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
-import org.apache.commons.httpclient.methods.multipart.Part;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.mylyn.commons.core.DateUtil;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
-import org.eclipse.mylyn.internal.monitor.usage.wizards.UsageSubmissionWizard;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * A wizard for uploading the Mylyn statistics to a website
- * 
- * @author Shawn Minto
- * @author Mik Kersten
- */
-public class FeedbackWizard extends Wizard implements INewWizard {
-
-	private final SubmitFeedbackPage feedbackPage;
-
-	/**
-	 * Constructor for SampleNewWizard.
-	 */
-	public FeedbackWizard(UsageSubmissionWizard wizard) {
-		super();
-		setNeedsProgressMonitor(true);
-
-		feedbackPage = new SubmitFeedbackPage(wizard);
-	}
-
-	public FeedbackWizard() {
-		super();
-		setNeedsProgressMonitor(true);
-		super.setDefaultPageImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(UiUsageMonitorPlugin.PLUGIN_ID,
-				"icons/wizban/banner-user.gif"));
-		super.setWindowTitle("Mylyn Feedback");
-		feedbackPage = new SubmitFeedbackPage(null);
-	}
-
-	@Override
-	public boolean performFinish() {
-		File f = feedbackPage.createFeedbackFile();
-		if (f == null) {
-			return true;
-		}
-		upload(f, feedbackPage.getStringUid());
-		if (f.exists()) {
-			f.delete();
-		}
-		return true;
-	}
-
-	private int status;
-
-	/**
-	 * Method to upload a file to a cgi script
-	 * 
-	 * @param f
-	 *            The file to upload
-	 */
-	private void upload(File f, String uid) {
-		String uploadScript;
-
-		// XXX: unimplemented
-		uploadScript = "<unimplemented>";
-		// uploadScript =
-		// MylynUsageMonitorPlugin.getDefault().getStudyParameters().getScriptsUrl()
-		// +
-		// MylynUsageMonitorPlugin.getDefault().getStudyParameters().getScriptsQuestionnaire();
-
-		if (f.length() == 0) {
-			return;
-		}
-
-		try {
-			final PostMethod filePost = new PostMethod(uploadScript);
-
-			Part[] parts;
-			Part[] p = { new FilePart("MYLYN" + uid, UiUsageMonitorPlugin.UPLOAD_FILE_LABEL + "-"
-					+ UiUsageMonitorPlugin.VERSION + "-" + "feedback" + "-" + uid + "-"
-					+ DateUtil.getIsoFormattedDateTime(Calendar.getInstance()) + ".txt", f) };
-			parts = p;
-
-			filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));
-
-			final HttpClient client = new HttpClient();
-			UiUsageMonitorPlugin.getDefault().configureProxy(client, uploadScript);
-
-			ProgressMonitorDialog pmd = new ProgressMonitorDialog(Display.getCurrent().getActiveShell());
-			pmd.run(false, false, new IRunnableWithProgress() {
-				public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-					try {
-						status = client.executeMethod(filePost);
-						filePost.releaseConnection();
-
-					} catch (Exception e) {
-						// there was a problem with the file upload so throw up
-						// an error
-						// dialog to inform the user and log the exception
-						if (e instanceof NoRouteToHostException || e instanceof UnknownHostException) {
-							MessageDialog.openError(null, "Error Uploading",
-									"There was an error uploading the feedback" + ": \n"
-											+ "No network connection.  Please try again later");
-						} else {
-							MessageDialog.openError(null, "Error Uploading",
-									"There was an error uploading the feedback" + ": \n"
-											+ e.getClass().getCanonicalName());
-							;
-						}
-					}
-					monitor.worked(1);
-					monitor.done();
-				}
-			});
-
-			if (status == 401) {
-				// The uid was incorrect so inform the user
-				MessageDialog.openError(null, "Error Uploading", "There was an error uploading the feedback: \n"
-						+ "Your uid was incorrect: " + uid + "\n");
-			} else if (status == 407) {
-				MessageDialog.openError(null, "Error Uploading",
-						"Could not upload because proxy server authentication failed.  Please check your proxy server settings.");
-			} else if (status != 200) {
-				// there was a problem with the file upload so throw up an error
-				// dialog to inform the user
-				MessageDialog.openError(null, "Error Uploading", "There was an error uploading the feedback: \n"
-						+ "HTTP Response Code " + status + "\n" + "Please try again later");
-			} else {
-				// the file was uploaded successfully
-			}
-
-		} catch (Exception e) {
-			StatusHandler.log(new Status(IStatus.ERROR, MylynUserStudyExamplePlugin.ID_PLUGIN, "Error uploading", e));
-			// there was a problem with the file upload so throw up an error
-			// dialog to inform the user and log the exception
-			if (e instanceof NoRouteToHostException) {
-				MessageDialog.openError(null, "Error Uploading", "There was an error uploading the feedback: \n"
-						+ "No network connection.  Please try again later");
-			} else {
-				MessageDialog.openError(null, "Error Uploading", "There was an error uploading the feedback: \n"
-						+ e.getClass().getCanonicalName());
-			}
-		} finally {
-			f.delete();
-		}
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
-	 *      org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		// don't need to do any initialization
-	}
-
-	@Override
-	public void addPages() {
-		addPage(feedbackPage);
-	}
-}
diff --git a/org.eclipse.mylyn.examples.monitor.study/src/org/eclipse/mylyn/examples/monitor/study/MylynUserStudyExamplePlugin.java b/org.eclipse.mylyn.examples.monitor.study/src/org/eclipse/mylyn/examples/monitor/study/MylynUserStudyExamplePlugin.java
deleted file mode 100644
index 45f6691..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/src/org/eclipse/mylyn/examples/monitor/study/MylynUserStudyExamplePlugin.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.examples.monitor.study;
-
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
-import org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin;
-import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
-import org.eclipse.pde.internal.ui.PDEPlugin;
-import org.eclipse.ui.IStartup;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.WorkbenchPlugin;
-import org.eclipse.ui.internal.editors.text.EditorsPlugin;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * @author Mik Kersten
- */
-public class MylynUserStudyExamplePlugin extends AbstractUIPlugin {
-
-	public static final String ID_PLUGIN = "org.eclipse.mylyn.examples.monitor.study";
-
-	private static MylynUserStudyExamplePlugin plugin;
-
-	private SelectionMonitor selectionMonitor;
-
-	public MylynUserStudyExamplePlugin() {
-		plugin = this;
-	}
-
-	public static class MylynUserStudyExampleStartup implements IStartup {
-
-		public void earlyStartup() {
-			final IWorkbench workbench = PlatformUI.getWorkbench();
-			workbench.getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					MylynUserStudyExamplePlugin.getDefault().selectionMonitor = new SelectionMonitor();
-					MonitorUiPlugin.getDefault().getSelectionMonitors().add(
-							MylynUserStudyExamplePlugin.getDefault().selectionMonitor);
-
-					UiUsageMonitorPlugin.getDefault().addMonitoredPreferences(
-							WorkbenchPlugin.getDefault().getPluginPreferences());
-					// MylarUsageMonitorPlugin.getDefault().addMonitoredPreferences(
-					// MylarUiPlugin.getDefault().getPluginPreferences());
-					UiUsageMonitorPlugin.getDefault().addMonitoredPreferences(
-							JavaPlugin.getDefault().getPluginPreferences());
-					UiUsageMonitorPlugin.getDefault().addMonitoredPreferences(
-							WorkbenchPlugin.getDefault().getPluginPreferences());
-					UiUsageMonitorPlugin.getDefault().addMonitoredPreferences(
-							EditorsPlugin.getDefault().getPluginPreferences());
-					UiUsageMonitorPlugin.getDefault().addMonitoredPreferences(
-							PDEPlugin.getDefault().getPluginPreferences());
-				}
-			});
-		}
-	}
-
-	@Override
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	@Override
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-
-		MonitorUiPlugin.getDefault().getSelectionMonitors().remove(selectionMonitor);
-		UiUsageMonitorPlugin.getDefault().removeMonitoredPreferences(
-				WorkbenchPlugin.getDefault().getPluginPreferences());
-		UiUsageMonitorPlugin.getDefault().removeMonitoredPreferences(
-				ContextCorePlugin.getDefault().getPluginPreferences());
-		UiUsageMonitorPlugin.getDefault().removeMonitoredPreferences(JavaPlugin.getDefault().getPluginPreferences());
-		UiUsageMonitorPlugin.getDefault().removeMonitoredPreferences(
-				WorkbenchPlugin.getDefault().getPluginPreferences());
-		UiUsageMonitorPlugin.getDefault().removeMonitoredPreferences(EditorsPlugin.getDefault().getPluginPreferences());
-		UiUsageMonitorPlugin.getDefault().removeMonitoredPreferences(PDEPlugin.getDefault().getPluginPreferences());
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static MylynUserStudyExamplePlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given plug-in relative path.
-	 * 
-	 * @param path
-	 *            the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.mylyn.examples.monitor.study", path);
-	}
-}
diff --git a/org.eclipse.mylyn.examples.monitor.study/src/org/eclipse/mylyn/examples/monitor/study/QuestionnaireWizardPage.java b/org.eclipse.mylyn.examples.monitor.study/src/org/eclipse/mylyn/examples/monitor/study/QuestionnaireWizardPage.java
deleted file mode 100644
index 6ce2647..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/src/org/eclipse/mylyn/examples/monitor/study/QuestionnaireWizardPage.java
+++ /dev/null
@@ -1,298 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.examples.monitor.study;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.monitor.usage.AbstractStudyQuestionnairePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * A wizard for uploading the Mylyn statistics to a website
- * 
- * @author Ken Sueda
- * @author Mik Kersten
- */
-public class QuestionnaireWizardPage extends AbstractStudyQuestionnairePage {
-
-	private static final String NOT_GOOD = "Not Good";
-
-	private static final String GOOD = "Good";
-
-	private static final String NOT_WELL = "Not well";
-
-	private static final String OK = "OK";
-
-	private static final String WELL = "Well";
-
-	private static final String UNSURE = "Unsure";
-
-	private static final String SELECT = "";
-
-	private static final String EXPLORED = "Explored";
-
-	private static final String DOCUMENTED = "Documented";
-
-	private static final String TESTED = "Tested";
-
-	private static final String ADDED_NEW_FEATURES = "Added new features";
-
-	private static final String MADE_ENHANCEMENTS = "Made enhancements";
-
-	private static final String FIXED_BUGS = "Fixed bugs";
-
-	private Combo taskCombo;
-
-	private Combo mentalModelCombo;
-
-	private Combo integrateCombo;
-
-	private Combo doiCombo;
-
-	private String taskPerformedFeedback = null;
-
-	private String mentalModelFeedback = null;
-
-	private String doiModelFeedback = null;
-
-	private String integrateFeedback = null;
-
-	private String positiveFeedback = null;
-
-	private String negativeFeedback = null;
-
-	private Text positiveText = null;
-
-	private Text negativeText = null;
-
-	public QuestionnaireWizardPage() {
-		super("Questionnaire Wizard");
-		setTitle("Questionnaire");
-	}
-
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		container.setLayout(layout);
-		layout.numColumns = 1;
-		layout.verticalSpacing = 9;
-
-		// drop down box, choose from:
-		// fixed bugs, made enhancements, added new features, tested,
-		// documented, explored
-		Label label = new Label(container, SWT.NULL);
-		label.setText("What task did you primarily work on this week?");
-
-		taskCombo = new Combo(container, SWT.READ_ONLY);
-		taskCombo.setText(SELECT);
-		taskCombo.add(FIXED_BUGS);
-		taskCombo.add(MADE_ENHANCEMENTS);
-		taskCombo.add(ADDED_NEW_FEATURES);
-		taskCombo.add(TESTED);
-		taskCombo.add(DOCUMENTED);
-		taskCombo.add(EXPLORED);
-		taskCombo.add(UNSURE);
-
-		taskCombo.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				taskPerformedFeedback = taskCombo.getText();
-				getContainer().updateButtons();
-			}
-		});
-
-		// drop down box, choose from:
-		// well, ok, not well
-		label = new Label(container, SWT.NULL);
-		label.setText("How accurately did the context model match your mental model of interesting elements?");
-		mentalModelCombo = new Combo(container, SWT.READ_ONLY);
-		mentalModelCombo.setText(SELECT);
-		mentalModelCombo.add(WELL);
-		mentalModelCombo.add(OK);
-		mentalModelCombo.add(NOT_WELL);
-		mentalModelCombo.add(UNSURE);
-
-		mentalModelCombo.addSelectionListener(new SelectionAdapter() {
-
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				mentalModelFeedback = mentalModelCombo.getText();
-				getContainer().updateButtons();
-			}
-		});
-
-		// drop down box
-		// chose from: good, ok, not good
-		label = new Label(container, SWT.NULL);
-		label.setText("How effective are the Mylyn views at exposing what you are working on?");
-		doiCombo = new Combo(container, SWT.READ_ONLY);
-		doiCombo.setText(SELECT);
-		doiCombo.add(GOOD);
-		doiCombo.add(OK);
-		doiCombo.add(NOT_GOOD);
-		doiCombo.add(UNSURE);
-
-		doiCombo.addSelectionListener(new SelectionAdapter() {
-
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				doiModelFeedback = doiCombo.getText();
-				getContainer().updateButtons();
-			}
-		});
-
-		// drop down box
-		// chose from: well, ok, not well
-		label = new Label(container, SWT.NULL);
-		label.setText("How well did Mylyn integrate with your workspace and environment?");
-		integrateCombo = new Combo(container, SWT.READ_ONLY);
-		integrateCombo.setText(SELECT);
-		integrateCombo.add(WELL);
-		integrateCombo.add(OK);
-		integrateCombo.add(NOT_WELL);
-		integrateCombo.add(UNSURE);
-
-		integrateCombo.addSelectionListener(new SelectionAdapter() {
-
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				integrateFeedback = integrateCombo.getText();
-				getContainer().updateButtons();
-			}
-		});
-
-		positiveText = createTextWithLabel(container, "What worked well?");
-		negativeText = createTextWithLabel(container, "What does not work well?");
-		setControl(container);
-	}
-
-	private Text createTextWithLabel(Composite parent, String label) {
-		GridData gd = new GridData();
-		gd.horizontalAlignment = GridData.FILL;
-		gd.verticalAlignment = GridData.FILL;
-		gd.verticalSpan = 10;
-		Label searchLabel = new Label(parent, SWT.NONE);
-		searchLabel.setText(label);
-		Text t = new Text(parent, SWT.BORDER | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
-		t.setLayoutData(gd);
-		return t;
-	}
-
-	private void finishedSelected() {
-		if (this.taskPerformedFeedback == null) {
-			this.taskPerformedFeedback = FIXED_BUGS;
-		}
-		if (this.mentalModelFeedback == null) {
-			this.mentalModelFeedback = WELL;
-		}
-		if (this.doiModelFeedback == null) {
-			this.doiModelFeedback = GOOD;
-		}
-		if (this.integrateFeedback == null) {
-			this.integrateFeedback = WELL;
-		}
-		positiveFeedback = positiveText.getText();
-		if (this.positiveFeedback == null) {
-			positiveFeedback = "none";
-		}
-		negativeFeedback = negativeText.getText();
-		if (this.negativeFeedback == null) {
-			negativeFeedback = "none";
-		}
-	}
-
-	@Override
-	public File createFeedbackFile() {
-		finishedSelected();
-		IPath rootPath = ResourcesPlugin.getWorkspace().getRoot().getLocation();
-		String path = rootPath.toString() + File.separator + "questionnaire.txt";
-		File questionnaireFile = new File(path);
-
-		if (questionnaireFile.exists()) {
-			questionnaireFile.delete();
-		}
-
-		OutputStream outputStream;
-		try {
-			outputStream = new FileOutputStream(questionnaireFile);
-
-			String buffer = "Tasks: " + getTaskPerformedFeedback() + "\r\n";
-			outputStream.write(buffer.getBytes());
-			buffer = "MentalModel: " + getMentalModelFeedback() + "\r\n";
-			outputStream.write(buffer.getBytes());
-			buffer = "DOI: " + getDoiModelFeedback() + "\r\n";
-			outputStream.write(buffer.getBytes());
-			buffer = "Integrate: " + getIntegrateFeedback() + "\r\n";
-			outputStream.write(buffer.getBytes());
-			buffer = "Positive: " + getPositiveFeedback() + "\r\n";
-			outputStream.write(buffer.getBytes());
-			buffer = "Negative: " + getNegativeFeedback() + "\r\n";
-			outputStream.write(buffer.getBytes());
-			outputStream.close();
-			return questionnaireFile;
-		} catch (IOException e) {
-			StatusHandler.log(new Status(IStatus.ERROR, MylynUserStudyExamplePlugin.ID_PLUGIN, "Failed to submit", e));
-		}
-		return null;
-	}
-
-	/*******************************************************************************************************************
-	 * getters Methods
-	 ******************************************************************************************************************/
-	public String getDoiModelFeedback() {
-		return doiModelFeedback;
-	}
-
-	public String getIntegrateFeedback() {
-		return integrateFeedback;
-	}
-
-	public String getMentalModelFeedback() {
-		return mentalModelFeedback;
-	}
-
-	public String getNegativeFeedback() {
-		return negativeFeedback;
-	}
-
-	public String getPositiveFeedback() {
-		return positiveFeedback;
-	}
-
-	public String getTaskPerformedFeedback() {
-		return taskPerformedFeedback;
-	}
-
-	@Override
-	public boolean isPageComplete() {
-		if (taskCombo.getText().equals(SELECT) || doiCombo.getText().equals(SELECT)
-				|| mentalModelCombo.getText().equals(SELECT) || integrateCombo.getText().equals(SELECT)) {
-			// setErrorMessage("Must complete answers");
-			return false;
-		} else {
-			// setErrorMessage(null);
-			return true;
-		}
-	}
-}
diff --git a/org.eclipse.mylyn.examples.monitor.study/src/org/eclipse/mylyn/examples/monitor/study/SelectionMonitor.java b/org.eclipse.mylyn.examples.monitor.study/src/org/eclipse/mylyn/examples/monitor/study/SelectionMonitor.java
deleted file mode 100644
index 5802a5f..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/src/org/eclipse/mylyn/examples/monitor/study/SelectionMonitor.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-/*
- * Created on Jun 10, 2005
- */
-package org.eclipse.mylyn.examples.monitor.study;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.ui.actions.SelectionConverter;
-import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.mylyn.context.core.ContextCore;
-import org.eclipse.mylyn.context.core.IInteractionElement;
-import org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin;
-import org.eclipse.mylyn.monitor.core.InteractionEvent;
-import org.eclipse.mylyn.monitor.ui.AbstractUserInteractionMonitor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IPathEditorInput;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.part.EditorPart;
-
-/**
- * Limited to Java selections.
- * 
- * @author Mik Kersten
- */
-public class SelectionMonitor extends AbstractUserInteractionMonitor {
-
-	private static final String STRUCTURE_KIND_JAVA = "java";
-
-	private static final String ID_JAVA_UNKNOWN = "(non-source element)";
-
-	public static final String SELECTION_DEFAULT = "selected";
-
-	public static final String SELECTION_NEW = "new";
-
-	public static final String SELECTION_DECAYED = "decayed";
-
-	public static final String SELECTION_PREDICTED = "predicted";
-
-	private static final Object ID_JAVA_UNKNOW_OLD = "(non-existing element)";
-
-	private IJavaElement lastSelectedElement = null;
-
-	// private InteractionEventObfuscator obfuscator = new InteractionEventObfuscator();
-
-	@Override
-	protected void handleWorkbenchPartSelection(IWorkbenchPart part, ISelection selection, boolean contributeToContext) {
-		// ignored, since not using context monitoring facilities
-	}
-
-	@Override
-	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		String structureKind = InteractionEvent.ID_UNKNOWN;
-		// String obfuscatedElementHandle = InteractionEvent.ID_UNKNOWN;
-		String elementHandle = InteractionEvent.ID_UNKNOWN;
-		InteractionEvent.Kind interactionKind = InteractionEvent.Kind.SELECTION;
-		if (selection instanceof StructuredSelection) {
-			StructuredSelection structuredSelection = (StructuredSelection) selection;
-			Object selectedObject = structuredSelection.getFirstElement();
-			if (selectedObject == null) {
-				return;
-			}
-			if (selectedObject instanceof IJavaElement) {
-				IJavaElement javaElement = (IJavaElement) selectedObject;
-				structureKind = STRUCTURE_KIND_JAVA;
-				elementHandle = javaElement.getHandleIdentifier();
-				// obfuscatedElementHandle =
-				// obfuscateJavaElementHandle(javaElement);
-				lastSelectedElement = javaElement;
-			} else {
-				structureKind = InteractionEvent.ID_UNKNOWN + ": " + selectedObject.getClass();
-				if (selectedObject instanceof IAdaptable) {
-					IResource resource = (IResource) ((IAdaptable) selectedObject).getAdapter(IResource.class);
-					if (resource != null) {
-						elementHandle = getHandleIdentifier(resource.getFullPath());
-						// obfuscatedElementHandle =
-						// obfuscator.obfuscateResourcePath(resource.getProjectRelativePath());
-					}
-				}
-			}
-		} else {
-			if (selection instanceof TextSelection && part instanceof JavaEditor) {
-				TextSelection textSelection = (TextSelection) selection;
-				IJavaElement javaElement;
-				try {
-					javaElement = SelectionConverter.resolveEnclosingElement((JavaEditor) part, textSelection);
-					if (javaElement != null) {
-						structureKind = STRUCTURE_KIND_JAVA;
-						// obfuscatedElementHandle =
-						// obfuscateJavaElementHandle(javaElement);
-						elementHandle = javaElement.getHandleIdentifier();
-						if (javaElement.equals(lastSelectedElement)) {
-							interactionKind = InteractionEvent.Kind.EDIT;
-						}
-						lastSelectedElement = javaElement;
-					}
-				} catch (JavaModelException e) {
-					// ignore unresolved elements
-				}
-			} else if (part instanceof EditorPart) {
-				EditorPart editorPart = (EditorPart) part;
-				IEditorInput input = editorPart.getEditorInput();
-				if (input instanceof IPathEditorInput) {
-					structureKind = "file";
-					elementHandle = getHandleIdentifier(((IPathEditorInput) input).getPath());
-					// obfuscatedElementHandle =
-					// obfuscator.obfuscateResourcePath(((IPathEditorInput)
-					// input).getPath());
-				}
-			}
-		}
-		IInteractionElement node = ContextCore.getContextManager().getElement(elementHandle);
-		String delta = "";
-		float selectionFactor = ContextCore.getCommonContextScaling().get(InteractionEvent.Kind.SELECTION);
-
-		if (node != null) {
-			if (node.getInterest().getEncodedValue() <= selectionFactor
-					&& node.getInterest().getValue() > selectionFactor) {
-				delta = SELECTION_PREDICTED;
-			} else if (node.getInterest().getEncodedValue() < selectionFactor
-					&& node.getInterest().getDecayValue() > selectionFactor) {
-				delta = SELECTION_DECAYED;
-			} else if (node.getInterest().getValue() == selectionFactor
-					&& node.getInterest().getDecayValue() < selectionFactor) {
-				delta = SELECTION_NEW;
-			} else {
-				delta = SELECTION_DEFAULT;
-			}
-		}
-
-		InteractionEvent event = new InteractionEvent(interactionKind, structureKind, elementHandle, part.getSite()
-				.getId(), "null", delta, 0);
-		MonitorUiPlugin.getDefault().notifyInteractionObserved(event);
-	}
-
-	// private String obfuscateJavaElementHandle(IJavaElement javaElement) {
-	// try {
-	// StringBuffer obfuscatedPath = new StringBuffer();
-	// IResource resource;
-	// resource = (IResource) javaElement.getUnderlyingResource();
-	// if (resource != null && (resource instanceof IFile)) {
-	// IFile file = (IFile) resource;
-	// obfuscatedPath.append(obfuscator.obfuscateResourcePath(file.getProjectRelativePath()));
-	// obfuscatedPath.append(':');
-	// obfuscatedPath.append(obfuscator.obfuscateString(javaElement.getElementName()));
-	// return obfuscatedPath.toString();
-	// } else {
-	// return obfuscator.obfuscateString(javaElement.getHandleIdentifier());
-	// }
-	// } catch (JavaModelException e) {
-	// // ignore non-existing element
-	// }
-	// return ID_JAVA_UNKNOWN;
-	// }
-
-	// NOTE: duplicated from ResourceStructureBridge
-	private String getHandleIdentifier(IPath path) {
-		if (path != null) {
-			return path.toPortableString();
-		} else {
-			return null;
-		}
-	}
-
-	/**
-	 * Some events do not have a valid handle, e.g. hande is null or ?
-	 */
-	public static boolean isValidStructureHandle(InteractionEvent event) {
-		String handle = event.getStructureHandle();
-		return handle != null && !handle.trim().equals("") && !handle.equals(SelectionMonitor.ID_JAVA_UNKNOWN)
-				&& !handle.equals(SelectionMonitor.ID_JAVA_UNKNOW_OLD) && event.isValidStructureHandle();
-	}
-}
diff --git a/org.eclipse.mylyn.examples.monitor.study/src/org/eclipse/mylyn/examples/monitor/study/SubmitFeedbackPage.java b/org.eclipse.mylyn.examples.monitor.study/src/org/eclipse/mylyn/examples/monitor/study/SubmitFeedbackPage.java
deleted file mode 100644
index 542a59a..0000000
--- a/org.eclipse.mylyn.examples.monitor.study/src/org/eclipse/mylyn/examples/monitor/study/SubmitFeedbackPage.java
+++ /dev/null
@@ -1,418 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.examples.monitor.study;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
-import org.eclipse.mylyn.internal.monitor.usage.wizards.UsageSubmissionWizard;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Page to submit feedback for the user study
- * 
- * @author Shawn Minto
- * @author Mik Kersten
- */
-public class SubmitFeedbackPage extends WizardPage {
-
-	private Text firstName;
-
-	private Text lastName;
-
-	private Text emailAddress;
-
-	private Text feedback;
-
-	private Text uid;
-
-	private Button totallyAnonymous;
-
-	private Button identifiedUserStudyId;
-
-	private Button identifiedNameEmail;
-
-	private String first;
-
-	private String last;
-
-	private String email;
-
-	private String feed;
-
-	private int id;
-
-	private boolean anon;
-
-	private boolean named;
-
-	private final UsageSubmissionWizard uploadWizard;
-
-	/**
-	 * Constructor
-	 */
-	public SubmitFeedbackPage(UsageSubmissionWizard uploadWizard) {
-		super("Feedback Wizard");
-		setTitle("Submit feedback for Mylyn User Study");
-		// setDescription(QuestionnaireWizardPage.FEEDBACK_REQUEST);
-		this.uploadWizard = uploadWizard;
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		container.setLayout(layout);
-		layout.numColumns = 1;
-
-		Composite container2 = null;
-
-		if (uploadWizard == null) {
-			container2 = new Composite(container, SWT.NULL);
-			layout = new GridLayout(2, false);
-			container2.setLayout(layout);
-
-			container2 = addSubmissionStyleControls(container2);
-		} else {
-			container2 = new Composite(container, SWT.NULL);
-			layout = new GridLayout(2, true);
-			container2.setLayout(layout);
-		}
-
-		Label label = new Label(container2, SWT.NONE);
-		// HACK used to make the feedback column a nice width
-		label.setText("Feedback:                                                            ");
-		GridData gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_BOTH);
-		gd.horizontalSpan = 2;
-		label.setLayoutData(gd);
-
-		feedback = new Text(container2, SWT.BORDER | SWT.V_SCROLL | SWT.WRAP);
-		gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_BOTH | GridData.HORIZONTAL_ALIGN_FILL);
-		gd.horizontalSpan = 2;
-		gd.verticalSpan = 40;
-		feedback.setLayoutData(gd);
-		feedback.setEditable(true);
-		feedback.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				feed = feedback.getText();
-				SubmitFeedbackPage.this.setPageComplete(SubmitFeedbackPage.this.isPageComplete());
-			}
-		});
-
-		setControl(container);
-	}
-
-	private Composite addSubmissionStyleControls(Composite container) {
-		totallyAnonymous = new Button(container, SWT.RADIO);
-		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
-		totallyAnonymous.setLayoutData(gd);
-		totallyAnonymous.setSelection(false);
-		totallyAnonymous.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				if (e.widget == totallyAnonymous) {
-					anon = true;
-					named = false;
-					boolean edit = !anon;
-					firstName.setEditable(edit);
-					lastName.setEditable(edit);
-					emailAddress.setEditable(edit);
-					SubmitFeedbackPage.this.setPageComplete(SubmitFeedbackPage.this.isPageComplete());
-				}
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				// don't care about default selection
-			}
-		});
-
-		Group anonCont = new Group(container, SWT.SHADOW_ETCHED_IN);
-		GridLayout layout = new GridLayout(1, true);
-		layout.verticalSpacing = 9;
-		layout.horizontalSpacing = 4;
-		anonCont.setLayout(layout);
-		anonCont.setText("Anonymous");
-
-		identifiedUserStudyId = new Button(container, SWT.RADIO);
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
-		identifiedUserStudyId.setLayoutData(gd);
-		identifiedUserStudyId.setSelection(false);
-		identifiedUserStudyId.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				if (e.widget == identifiedUserStudyId) {
-					anon = true;
-					named = false;
-					boolean edit = !anon;
-					firstName.setEditable(edit);
-					lastName.setEditable(edit);
-					emailAddress.setEditable(edit);
-					SubmitFeedbackPage.this.setPageComplete(SubmitFeedbackPage.this.isPageComplete());
-				}
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				// don't care about default selection
-			}
-		});
-
-		Group idUserCont = new Group(container, SWT.SHADOW_ETCHED_IN);
-		layout = new GridLayout(2, true);
-		layout.verticalSpacing = 9;
-		layout.horizontalSpacing = 4;
-		idUserCont.setLayout(layout);
-		idUserCont.setText("Identified By User Study Id");
-
-		Label label = new Label(idUserCont, SWT.NULL);
-		label.setText("User Id:");
-
-		uid = new Text(idUserCont, SWT.BORDER | SWT.SINGLE);
-		gd = new GridData(SWT.FILL, SWT.FILL, true, true);
-		gd.horizontalSpan = 1;
-		uid.setLayoutData(gd);
-		uid.setEditable(false);
-		id = UiUsageMonitorPlugin.getDefault().getPreferenceStore().getInt(UiUsageMonitorPlugin.PREF_USER_ID);
-		if (id == 0) {
-			id = -1;
-		}
-		uid.setText(id + "");
-
-		identifiedNameEmail = new Button(container, SWT.RADIO);
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
-		identifiedNameEmail.setLayoutData(gd);
-		identifiedNameEmail.setSelection(false);
-		identifiedNameEmail.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				if (e.widget == identifiedNameEmail) {
-					anon = false;
-					named = true;
-					boolean edit = !anon;
-					firstName.setEditable(edit);
-					lastName.setEditable(edit);
-					emailAddress.setEditable(edit);
-					SubmitFeedbackPage.this.setPageComplete(SubmitFeedbackPage.this.isPageComplete());
-				}
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				// don't care about default selection
-			}
-		});
-
-		Group idCont = new Group(container, SWT.SHADOW_ETCHED_IN);
-		layout = new GridLayout(1, true);
-		layout.verticalSpacing = 9;
-		layout.horizontalSpacing = 4;
-		idCont.setLayout(layout);
-		idCont.setText("Identifed By Name and Email");
-
-		Composite names = new Composite(idCont, SWT.NULL);
-		layout = new GridLayout(6, true);
-		layout.verticalSpacing = 9;
-		layout.horizontalSpacing = 4;
-		names.setLayout(layout);
-
-		label = new Label(names, SWT.NULL);
-		label.setText("First Name:");
-
-		firstName = new Text(names, SWT.BORDER | SWT.SINGLE);
-		gd = new GridData(SWT.FILL, SWT.FILL, true, true);
-		gd.horizontalSpan = 2;
-		firstName.setLayoutData(gd);
-		firstName.setEditable(true);
-		firstName.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				first = firstName.getText();
-				SubmitFeedbackPage.this.setPageComplete(SubmitFeedbackPage.this.isPageComplete());
-			}
-		});
-
-		label = new Label(names, SWT.NULL);
-		label.setText("Last Name:");
-
-		lastName = new Text(names, SWT.BORDER | SWT.SINGLE);
-		gd = new GridData(SWT.FILL, SWT.FILL, true, true);
-		gd.horizontalSpan = 2;
-		lastName.setLayoutData(gd);
-		lastName.setEditable(true);
-		lastName.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				last = lastName.getText();
-				SubmitFeedbackPage.this.setPageComplete(SubmitFeedbackPage.this.isPageComplete());
-			}
-		});
-
-		label = new Label(names, SWT.NONE);
-		label.setText("Email Address:");
-
-		emailAddress = new Text(names, SWT.BORDER | SWT.SINGLE);
-		gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_BOTH);
-		gd.horizontalSpan = 5;
-		emailAddress.setLayoutData(gd);
-		emailAddress.setEditable(true);
-		emailAddress.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				email = emailAddress.getText();
-				boolean valid = vaidateEmail(email);
-				if (!valid) {
-					SubmitFeedbackPage.this.setErrorMessage("Must be a valid e-mail address");
-				} else {
-					SubmitFeedbackPage.this.setErrorMessage(null);
-				}
-				SubmitFeedbackPage.this.setPageComplete(SubmitFeedbackPage.this.isPageComplete());
-			}
-		});
-
-		if (id == -1) {
-			identifiedUserStudyId.setEnabled(false);
-			identifiedNameEmail.setSelection(true);
-		} else {
-			identifiedUserStudyId.setSelection(true);
-			firstName.setEditable(false);
-			lastName.setEditable(false);
-			emailAddress.setEditable(false);
-		}
-		return container;
-	}
-
-	private boolean vaidateEmail(String emailToVerify) {
-		if (emailToVerify.contains("@")) {
-			emailToVerify = emailToVerify.substring(emailToVerify.indexOf("@"));
-			return emailToVerify.contains(".");
-		}
-		return false;
-	}
-
-	public boolean hasAllFields() {
-		if (uploadWizard != null) {
-			return (((!firstName.getText().equals("") && !lastName.getText().equals("") && !emailAddress.getText()
-					.equals("")) || anon) && !feedback.getText().equals(""));
-		} else {
-			return !feedback.getText().equals("");
-		}
-	}
-
-	@Override
-	public boolean isPageComplete() {
-		if (hasAllFields() && this.getErrorMessage() == null) {
-			return true;
-		} else {
-			return false;
-		}
-	}
-
-	@Override
-	public IWizardPage getNextPage() {
-		return super.getNextPage();
-
-	}
-
-	/** ONLY VALID IF WIZARD NOT STARTED FROM UPLOAD WIZARD */
-	public boolean isAnon() {
-		return anon;
-	}
-
-	public int getUid() {
-		if (anon || named) {
-			return -1;
-		}
-		return id;
-	}
-
-	public String getStringUid() {
-		if (anon) {
-			return "anon";
-		} else if (named) {
-			return "named";
-		} else {
-			return "" + getUid();
-		}
-	}
-
-	/** ONLY VALID IF WIZARD NOT STARTED FROM UPLOAD WIZARD */
-	public String getEmailAddress() {
-		if (anon) {
-			return "null";
-		}
-		return email;
-	}
-
-	/** ONLY VALID IF WIZARD NOT STARTED FROM UPLOAD WIZARD */
-	public String getFirstName() {
-		if (anon) {
-			return "null";
-		}
-		return first;
-	}
-
-	/** ONLY VALID IF WIZARD NOT STARTED FROM UPLOAD WIZARD */
-	public String getLastName() {
-		if (anon) {
-			return "null";
-		}
-		return last;
-	}
-
-	/** ONLY VALID IF WIZARD NOT STARTED FROM UPLOAD WIZARD */
-	public String getFeedback() {
-		return feed;
-	}
-
-	public File createFeedbackFile() {
-		IPath rootPath = ResourcesPlugin.getWorkspace().getRoot().getLocation();
-		String path = rootPath.toString() + File.separator + "feedback.txt";
-		File feedbackFile = new File(path);
-
-		if (feedbackFile.exists()) {
-			feedbackFile.delete();
-		}
-
-		OutputStream outputStream;
-		try {
-			outputStream = new FileOutputStream(feedbackFile);
-
-			String buffer = "First Name: " + getFirstName() + "\r\n";
-			outputStream.write(buffer.getBytes());
-			buffer = "Last Name: " + getLastName() + "\r\n";
-			outputStream.write(buffer.getBytes());
-			buffer = "E-mail Address: " + getEmailAddress() + "\r\n";
-			outputStream.write(buffer.getBytes());
-			buffer = "UID: " + getUid() + "\r\n";
-			outputStream.write(buffer.getBytes());
-			buffer = "Feedback: " + getFeedback() + "\r\n";
-			outputStream.write(buffer.getBytes());
-			outputStream.close();
-			return feedbackFile;
-		} catch (IOException e) {
-			StatusHandler.log(new Status(IStatus.ERROR, MylynUserStudyExamplePlugin.ID_PLUGIN, "Failed to submit", e));
-		}
-		return null;
-	}
-
-}
diff --git a/org.eclipse.mylyn.experimental-sdk-feature/.settings/org.eclipse.mylar.tasklist.prefs b/org.eclipse.mylyn.experimental-sdk-feature/.settings/org.eclipse.mylar.tasklist.prefs
deleted file mode 100644
index 58c2077..0000000
--- a/org.eclipse.mylyn.experimental-sdk-feature/.settings/org.eclipse.mylar.tasklist.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Fri Oct 20 16:36:21 PDT 2006
-eclipse.preferences.version=1
-project.repository.kind=bugzilla
-project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.monitor-feature/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.monitor-feature/.settings/org.eclipse.jdt.core.prefs
index 8b08f1b..1314ffa 100644
--- a/org.eclipse.mylyn.monitor-feature/.settings/org.eclipse.jdt.core.prefs
+++ b/org.eclipse.mylyn.monitor-feature/.settings/org.eclipse.jdt.core.prefs
@@ -1,4 +1,4 @@
-#Thu Apr 24 21:03:23 PDT 2008
+#Tue May 12 20:42:46 PDT 2009
 eclipse.preferences.version=1
 org.eclipse.jdt.core.codeComplete.argumentPrefixes=
 org.eclipse.jdt.core.codeComplete.argumentSuffixes=
@@ -41,7 +41,7 @@
 org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
 org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
 org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
 org.eclipse.jdt.core.compiler.problem.nullReference=error
 org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
 org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
@@ -77,8 +77,8 @@
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.source=1.5
 org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
-org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL,NORMAL
-org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX,API
+org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL
+org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX
 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_enum_constant=16
@@ -124,7 +124,7 @@
 org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
 org.eclipse.jdt.core.formatter.comment.clear_blank_lines=false
 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.clear_blank_lines_in_javadoc_comment=true
 org.eclipse.jdt.core.formatter.comment.format_block_comments=false
 org.eclipse.jdt.core.formatter.comment.format_comments=true
 org.eclipse.jdt.core.formatter.comment.format_header=false
@@ -324,6 +324,8 @@
 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=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
 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
diff --git a/org.eclipse.mylyn.monitor-feature/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.monitor-feature/.settings/org.eclipse.jdt.ui.prefs
index 5e70d08..de64fe6 100644
--- a/org.eclipse.mylyn.monitor-feature/.settings/org.eclipse.jdt.ui.prefs
+++ b/org.eclipse.mylyn.monitor-feature/.settings/org.eclipse.jdt.ui.prefs
@@ -1,4 +1,4 @@
-#Sat Mar 01 03:38:47 PST 2008
+#Thu Sep 11 16:27:18 PDT 2008
 cleanup_settings_version=2
 eclipse.preferences.version=1
 editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
@@ -10,7 +10,7 @@
 org.eclipse.jdt.ui.javadoc=false
 org.eclipse.jdt.ui.keywordthis=false
 org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2004, 2007 Mylyn project committers and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\r\n * Copyright (c) 2009 Tasktop Technologies and others.\r\n * All rights reserved. This program and the accompanying materials\r\n * are made available under the terms of the Eclipse Public License v1.0\r\n * which accompanies this distribution, and is available at\r\n * http\://www.eclipse.org/legal/epl-v10.html\r\n *\r\n * Contributors\:\r\n *     Tasktop Technologies - initial API and implementation\r\n *******************************************************************************/\r\n\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\r\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\r\n * @return the ${bare_field_name}\r\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\r\n * @param ${param} the ${bare_field_name} to set\r\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\r\n * @author ${user}\r\n *\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\r\n * \r\n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\r\n * ${tags}\r\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\r\n * ${see_to_overridden}\r\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\r\n * ${tags}\r\n * ${see_to_target}\r\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\r\n${package_declaration}\r\n\r\n${typecomment}\r\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\r\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\r\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\r\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\r\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\r\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\r\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\r\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
 sp_cleanup.add_default_serial_version_id=true
 sp_cleanup.add_generated_serial_version_id=false
 sp_cleanup.add_missing_annotations=true
diff --git a/org.eclipse.mylyn.monitor-feature/about.html b/org.eclipse.mylyn.monitor-feature/about.html
index 0dd939c..d774b07 100644
--- a/org.eclipse.mylyn.monitor-feature/about.html
+++ b/org.eclipse.mylyn.monitor-feature/about.html
@@ -7,7 +7,7 @@
 <body lang="EN-US">
 <h2>About This Content</h2>
  
-<p>June 7, 2007</p>	
+<p>June 25, 2008</p>	
 <h3>License</h3>
 
 <p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
diff --git a/org.eclipse.mylyn.monitor-feature/build.properties b/org.eclipse.mylyn.monitor-feature/build.properties
index 3e5240f..e5756cd 100644
--- a/org.eclipse.mylyn.monitor-feature/build.properties
+++ b/org.eclipse.mylyn.monitor-feature/build.properties
@@ -1,4 +1,15 @@
-bin.includes = feature.xml,\
+###############################################################################
+# Copyright (c) 2009 Tasktop Technologies and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#      Tasktop Technologies - initial API and implementation
+###############################################################################
+bin.includes = feature.properties,\
+               feature.xml,\
                about.html,\
                license.html,\
                epl-v10.html
diff --git a/org.eclipse.mylyn.monitor-feature/feature.properties b/org.eclipse.mylyn.monitor-feature/feature.properties
new file mode 100644
index 0000000..8210fc9
--- /dev/null
+++ b/org.eclipse.mylyn.monitor-feature/feature.properties
@@ -0,0 +1,58 @@
+###############################################################################
+# Copyright (c) 2009 Tasktop Technologies and others.
+# All rights reserved. This program and the accompanying materials
+# are made available under the terms of the Eclipse Public License v1.0
+# which accompanies this distribution, and is available at
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Contributors:
+#      Tasktop Technologies - initial API and implementation
+###############################################################################
+featureName=Mylyn UI Usage Reporting
+description=Generate personal usage data reports and optionally share usage statistics with the eclipse.org community.
+providerName=Eclipse Mylyn
+copyright=Copyright (c) 2004, 2009 Tasktop Technologies and others. All rights reserved.
+updateSiteName=Mylyn Incubator for Eclipse 3.3 and 3.4
+license=\
+Eclipse Foundation Software User Agreement\n\
+\n\
+March 17, 2005\n\
+Usage Of Content\n\
+\n\
+THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT"). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
+Applicable Licenses\n\
+\n\
+Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html. For purposes of the EPL, "Program" will mean the Content.\n\
+\n\
+Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository ("Repository") in CVS modules ("Modules") and made available as downloadable archives ("Downloads").\n\
+\n\
+    * Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"), plug-in fragments ("Fragments"), and features ("Features").\n\
+    * Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java\u2122 ARchive) in a directory named "plugins".\n\
+    * A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named "features". Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+    * Features may also include other Features ("Included Features"). Within a Feature, files named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
+\n\
+The terms and conditions governing Plug-ins and Fragments should be contained in files named "about.html" ("Abouts"). The terms and conditions governing Features and Included Features should be contained in files named "license.html" ("Feature Licenses"). Abouts and Feature Licenses may be located in any directory of a Download or Module including, but not limited to the following locations:\n\
+\n\
+    * The top-level (root) directory\n\
+    * Plug-in and Fragment directories\n\
+    * Inside Plug-ins and Fragments packaged as JARs\n\
+    * Sub-directories of the directory named "src" of certain Plug-ins\n\
+    * Feature directories\n\
+\n\
+Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license ("Feature Update License") during the installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or inform you where you can locate them. Feature Update Licenses may be found in the "license" property of files named "feature.properties" found within a Feature. Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in that directory.\n\
+\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
+\n\
+    * Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+    * Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+    * Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+    * IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
+    * Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+    * Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
+\n\
+IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.\n\
+Cryptography\n\
+\n\
+Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check the country&apos;s laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted.\n\
+\n\
+Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.
diff --git a/org.eclipse.mylyn.monitor-feature/feature.xml b/org.eclipse.mylyn.monitor-feature/feature.xml
index 41ab263..bc6cf33 100644
--- a/org.eclipse.mylyn.monitor-feature/feature.xml
+++ b/org.eclipse.mylyn.monitor-feature/feature.xml
@@ -1,67 +1,35 @@
-<?xml version="1.0" encoding="UTF-8"?>
+<?xml version="1.0" encoding="UTF-8"?><!--
+    Copyright (c) 2009 Tasktop Technologies and others.
+    All rights reserved. This program and the accompanying materials
+    are made available under the terms of the Eclipse Public License v1.0
+    which accompanies this distribution, and is available at
+    http://www.eclipse.org/legal/epl-v10.html
+   
+    Contributors:
+         Tasktop Technologies - initial API and implementation
+ -->
+
 <feature
       id="org.eclipse.mylyn.monitor_feature"
-      label="Mylyn UI Usage Reporting"
-      version="3.0.0.qualifier"
-      provider-name="Eclipse.org"
+      label="%featureName"
+      version="3.2.1.qualifier"
+      provider-name="%providerName"
       plugin="org.eclipse.mylyn">
 
    <description>
-      Generate personal usage data reports and optionally share usage
-statistics with the eclipse.org community.
+      %description
    </description>
 
    <copyright>
-      Copyright (c) 2004 - 2007 Mylyn project committers and others.
+      %copyright
    </copyright>
 
    <license url="license.html">
-      Eclipse Foundation Software User Agreement
-
-March 17, 2005
-Usage Of Content
-
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY &quot;CONTENT&quot;). USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.
-Applicable Licenses
-
-Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0 (&quot;EPL&quot;). A copy of the EPL is provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html. For purposes of the EPL, &quot;Program&quot; will mean the Content.
-
-Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).
-
-    * Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content. Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).
-    * Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java™ ARchive) in a directory named &quot;plugins&quot;.
-    * A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material. Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;. Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins and/or Fragments associated with that Feature.
-    * Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.
-
-The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;). Abouts and Feature Licenses may be located in any directory of a Download or Module including, but not limited to the following locations:
-
-    * The top-level (root) directory
-    * Plug-in and Fragment directories
-    * Inside Plug-ins and Fragments packaged as JARs
-    * Sub-directories of the directory named &quot;src&quot; of certain Plug-ins
-    * Feature directories
-
-Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the installation process. If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or inform you where you can locate them. Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature. Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in that directory.
-
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):
-
-    * Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)
-    * Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)
-    * Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)
-    * IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)
-    * Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)
-    * Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)
-
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License is provided, please contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.
-Cryptography
-
-Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to another country, of encryption software. BEFORE using any encryption software, please check the country&apos;s laws, regulations and policies concerning the import, possession, or use, and re-export of encryption software, to see if this is permitted.
-
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.
+      %license
    </license>
 
    <url>
-      <update label="Mylyn Experimental Features" url="http://download.eclipse.org/tools/mylyn/update/weekly/experimental"/>
+      <update label="%updateSiteName" url="http://download.eclipse.org/tools/mylyn/update/incubator"/>
    </url>
 
    <requires>
@@ -87,6 +55,7 @@
       <import plugin="org.apache.commons.lang" version="2.3.0" match="greaterOrEqual"/>
       <import plugin="org.apache.commons.logging" version="1.0.4" match="greaterOrEqual"/>
       <import plugin="org.eclipse.core.net"/>
+      <import feature="org.eclipse.rcp" version="3.3.0" match="compatible"/>
    </requires>
 
    <plugin
diff --git a/org.eclipse.mylyn.monitor.reports/.classpath b/org.eclipse.mylyn.monitor.reports/.classpath
deleted file mode 100644
index c9c6503..0000000
--- a/org.eclipse.mylyn.monitor.reports/.classpath
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
-		<accessrules>
-			<accessrule kind="accessible" pattern="**/internal/**"/>
-		</accessrules>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
-		<accessrules>
-			<accessrule kind="nonaccessible" pattern="com/sun/**"/>
-		</accessrules>
-	</classpathentry>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.mylyn.monitor.reports/.cvsignore b/org.eclipse.mylyn.monitor.reports/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/org.eclipse.mylyn.monitor.reports/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/org.eclipse.mylyn.monitor.reports/.project b/org.eclipse.mylyn.monitor.reports/.project
deleted file mode 100644
index adbe91f..0000000
--- a/org.eclipse.mylyn.monitor.reports/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.mylyn.monitor.reports</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.mylyn.monitor.reports/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.monitor.reports/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 8b08f1b..0000000
--- a/org.eclipse.mylyn.monitor.reports/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,340 +0,0 @@
-#Thu Apr 24 21:03:23 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-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.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
-org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
-org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL,NORMAL
-org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX,API
-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_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_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_selector_in_method_invocation=80
-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.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=1
-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=false
-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=false
-org.eclipse.jdt.core.formatter.comment.format_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=false
-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=120
-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=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-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=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_member=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_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not 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=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=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_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_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_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_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_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.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=120
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
-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_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.monitor.reports/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.monitor.reports/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 5e70d08..0000000
--- a/org.eclipse.mylyn.monitor.reports/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,63 +0,0 @@
-#Sat Mar 01 03:38:47 PST 2008
-cleanup_settings_version=2
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-formatter_profile=_Mylyn based on Eclipse
-formatter_settings_version=11
-internal.default.compliance=default
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=true
-org.eclipse.jdt.ui.javadoc=false
-org.eclipse.jdt.ui.keywordthis=false
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2004, 2007 Mylyn project committers and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
-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_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=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=true
-sp_cleanup.correct_indentation=true
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.make_local_variable_final=false
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-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=true
-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=true
-sp_cleanup.remove_unused_imports=false
-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=true
-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=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.monitor.reports/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.monitor.reports/.settings/org.eclipse.ltk.core.refactoring.prefs
deleted file mode 100644
index 7ab03bd..0000000
--- a/org.eclipse.mylyn.monitor.reports/.settings/org.eclipse.ltk.core.refactoring.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Jun 02 15:30:09 PDT 2006
-eclipse.preferences.version=1
-org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.monitor.reports/.settings/org.eclipse.mylyn.tasklist.prefs b/org.eclipse.mylyn.monitor.reports/.settings/org.eclipse.mylyn.tasklist.prefs
deleted file mode 100644
index 0a2cc0b..0000000
--- a/org.eclipse.mylyn.monitor.reports/.settings/org.eclipse.mylyn.tasklist.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Jun 18 17:14:59 PDT 2007
-eclipse.preferences.version=1
-project.repository.kind=bugzilla
-project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.monitor.reports/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.monitor.reports/.settings/org.eclipse.mylyn.tasks.ui.prefs
deleted file mode 100644
index d8c6d26..0000000
--- a/org.eclipse.mylyn.monitor.reports/.settings/org.eclipse.mylyn.tasks.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Jun 25 03:02:37 GMT 2007
-eclipse.preferences.version=1
-project.repository.kind=bugzilla
-project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.monitor.reports/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.monitor.reports/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index e8f2d56..0000000
--- a/org.eclipse.mylyn.monitor.reports/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,18 +0,0 @@
-#Tue Apr 15 11:07:59 PDT 2008
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=2
-compilers.p.missing-bundle-classpath-entries=1
-compilers.p.missing-packages=1
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=2
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=0
-compilers.p.unknown-element=0
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=0
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.monitor.reports/META-INF/MANIFEST.MF b/org.eclipse.mylyn.monitor.reports/META-INF/MANIFEST.MF
deleted file mode 100644
index 1f94d70..0000000
--- a/org.eclipse.mylyn.monitor.reports/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,25 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Mylyn Monitor Reports
-Bundle-SymbolicName: org.eclipse.mylyn.monitor.reports; singleton:=true
-Bundle-Version: 3.0.0.qualifier
-Bundle-Activator: org.eclipse.mylyn.internal.monitor.reports.MonitorReportsPlugin
-Bundle-Vendor: Eclipse.org
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.core.resources,
- org.eclipse.jdt.ui,
- org.eclipse.ui.forms,
- org.eclipse.mylyn.context.core;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.monitor.usage;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.context.ui;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.tasks.ui;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.monitor.ui;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.monitor.core;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)"
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.mylyn.internal.monitor.reports;x-internal:=true,
- org.eclipse.mylyn.internal.monitor.reports.collectors;x-internal:=true,
- org.eclipse.mylyn.internal.monitor.reports.preferences;x-internal:=true,
- org.eclipse.mylyn.internal.monitor.reports.ui.actions;x-internal:=true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/org.eclipse.mylyn.monitor.reports/about.html b/org.eclipse.mylyn.monitor.reports/about.html
deleted file mode 100644
index 0dd939c..0000000
--- a/org.eclipse.mylyn.monitor.reports/about.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 7, 2007</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.reports/build-user.xml b/org.eclipse.mylyn.monitor.reports/build-user.xml
deleted file mode 100644
index 6097713..0000000
--- a/org.eclipse.mylyn.monitor.reports/build-user.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-<target name="help">
-    <echo message="Please run: $ ant -v -projecthelp"/>
-</target>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.reports/build.properties b/org.eclipse.mylyn.monitor.reports/build.properties
deleted file mode 100644
index d379fe6..0000000
--- a/org.eclipse.mylyn.monitor.reports/build.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 Mylyn project committers and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-###############################################################################
-bin.includes = META-INF/,\
-               plugin.xml,\
-               icons/,\
-               .,\
-               about.html
-src.includes = about.html
-jre.compilation.profile = J2SE-1.5
-source.. = src/
diff --git a/org.eclipse.mylyn.monitor.reports/icons/eview16/folder.gif b/org.eclipse.mylyn.monitor.reports/icons/eview16/folder.gif
deleted file mode 100644
index 51e703b..0000000
--- a/org.eclipse.mylyn.monitor.reports/icons/eview16/folder.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.monitor.reports/icons/eview16/monitor.gif b/org.eclipse.mylyn.monitor.reports/icons/eview16/monitor.gif
deleted file mode 100644
index 3ea4ad7..0000000
--- a/org.eclipse.mylyn.monitor.reports/icons/eview16/monitor.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.monitor.reports/plugin.xml b/org.eclipse.mylyn.monitor.reports/plugin.xml
deleted file mode 100644
index d83cce1..0000000
--- a/org.eclipse.mylyn.monitor.reports/plugin.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<?eclipse version="3.0"?>
-<plugin>
-     <extension point = "org.eclipse.ui.popupMenus">
-     <viewerContribution
-        id="org.eclipse.mylyn.monitor.ui.commands"
-        targetID="org.eclipse.jdt.ui.PackageExplorer">
-	    <action  
-  		  	label="Reports: My Usage Summary" 
-	  		tooltip="Mylyn Reports: Usage Summary"
-	  		menubarPath="mylyn.monitor" 
-	  		id="org.eclipse.mylyn.monitor.ui.reports.ui.actions.ComputeSummaryAction" 
-	  		class="org.eclipse.mylyn.internal.monitor.reports.ui.actions.EclipseUsageSummaryAction"
-	  		icon="icons/eview16/monitor.gif"
-	  		enablesFor="*"/>   
-	  	<action  
-  		  	label="Reports: Mylyn User Analysis" 
-	  		tooltip="Mylyn Reports: User Analysis"
-	  		menubarPath="mylyn.monitor" 
-	  		id="org.eclipse.mylyn.monitor.ui.reports.ui.actions.ComputeSummaryAction" 
-	  		class="org.eclipse.mylyn.internal.monitor.reports.ui.actions.FocusedUiUserAnalysisAction"
-	  		icon="icons/eview16/monitor.gif"
-	  		enablesFor="*"/>   
-	 </viewerContribution> 
-	 <viewerContribution
-        id="org.eclipse.mylyn.monitor.ui.commands"
-        targetID="org.eclipse.ui.views.ResourceNavigator">
-	    <action  
-  		  	label="Reports: My Usage Summary" 
-	  		tooltip="Mylyn Reports: My Usage Summary"
-	  		menubarPath="mylyn.monitor" 
-	  		id="org.eclipse.mylyn.monitor.ui.reports.ui.actions.ComputeSummaryAction" 
-	  		class="org.eclipse.mylyn.internal.monitor.reports.ui.actions.EclipseUsageSummaryAction"
-	  		icon="icons/eview16/monitor.gif"
-	  		enablesFor="*"/>   
-	  		    <action  
-  		  	label="Reports: Mylyn User Analysis" 
-	  		tooltip="Mylyn Reports: User Analysis"
-	  		menubarPath="mylyn.monitor" 
-	  		id="org.eclipse.mylyn.monitor.ui.reports.ui.actions.ComputeSummaryAction" 
-	  		class="org.eclipse.mylyn.internal.monitor.reports.ui.actions.FocusedUiUserAnalysisAction"
-	  		icon="icons/eview16/monitor.gif"
-	  		enablesFor="*"/>   
-	 </viewerContribution> 
-   </extension>
-	  		
-	  		
-	<extension point="org.eclipse.ui.editors">
-        <editor
-           icon="icons/eview16/monitor.gif"
-           class="org.eclipse.mylyn.internal.monitor.usage.editors.UsageSummaryReportEditorPart"
-           name="Multi-user Analysis"
-           id="org.eclipse.mylyn.monitor.ui.reports.ui.actions.monitorUsersReport"/>
-  	</extension>
-  	
-</plugin>
-
diff --git a/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/MonitorReportsPlugin.java b/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/MonitorReportsPlugin.java
deleted file mode 100644
index dbedb4f..0000000
--- a/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/MonitorReportsPlugin.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.reports;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * @author Mik Kersten
- */
-public class MonitorReportsPlugin extends AbstractUIPlugin {
-
-	public static final String REPORT_SUMMARY_ID = "org.eclipse.mylyn.monitor.ui.reports.ui.actions.monitorSummaryReport";
-
-	public static final String REPORT_USERS_ID = "org.eclipse.mylyn.monitor.ui.reports.ui.actions.monitorUsersReport";
-
-	public static final String SHARED_TASK_DATA_ROOT_DIR = "org.eclipse.mylyn.monitor.ui.reports.preferences.sharedTaskDataRootDir";
-
-	public static final String ID_PLUGIN = "org.eclipse.mylyn.monitor.ui.reports";
-
-	private static MonitorReportsPlugin plugin;
-
-	public MonitorReportsPlugin() {
-		plugin = this;
-	}
-
-	@Override
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	@Override
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	public static MonitorReportsPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given plug-in relative path.
-	 * 
-	 * @param path
-	 *            the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.mylyn.internal.monitor.reports", path);
-	}
-
-	/**
-	 * Returns the root directory of the shared location where task data files are stored. Returns "" if the preference
-	 * has not been set.
-	 */
-	public String getRootSharedDataDirectory() {
-		return getPreferenceStore().getString(SHARED_TASK_DATA_ROOT_DIR);
-	}
-}
diff --git a/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/collectors/AbstractMylynUsageCollector.java b/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/collectors/AbstractMylynUsageCollector.java
deleted file mode 100644
index 7bf5347..0000000
--- a/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/collectors/AbstractMylynUsageCollector.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.reports.collectors;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.mylyn.internal.monitor.core.collection.CommandUsageCollector;
-import org.eclipse.mylyn.internal.monitor.core.collection.DelegatingUsageCollector;
-import org.eclipse.mylyn.monitor.core.InteractionEvent;
-
-/**
- * @author Mik Kersten
- */
-public abstract class AbstractMylynUsageCollector extends DelegatingUsageCollector {
-
-	protected Set<Integer> userIds = new HashSet<Integer>();
-
-	protected Set<Integer> mylynUserIds = new HashSet<Integer>();
-
-	protected Set<Integer> mylynInactiveUserIds = new HashSet<Integer>();
-
-	protected CommandUsageCollector commandUsageCollector = new CommandUsageCollector();
-
-	public AbstractMylynUsageCollector() {
-		super.getDelegates().add(commandUsageCollector);
-	}
-
-	/**
-	 * Overriders must call super.consumeEvent(..)
-	 */
-	@Override
-	public void consumeEvent(InteractionEvent event, int userId) {
-		super.consumeEvent(event, userId);
-		userIds.add(userId);
-		if (FocusedUiUsageDetector.isAMylynActivateCommand(event)) {
-			mylynUserIds.add(userId);
-			mylynInactiveUserIds.remove(userId);
-		}
-		if (FocusedUiUsageDetector.isAMylynDeactivateCommand(event)) {
-			mylynInactiveUserIds.add(userId);
-		}
-	}
-
-}
diff --git a/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/collectors/FocusedUiUsageAnalysisCollector.java b/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/collectors/FocusedUiUsageAnalysisCollector.java
deleted file mode 100644
index 768ffe5..0000000
--- a/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/collectors/FocusedUiUsageAnalysisCollector.java
+++ /dev/null
@@ -1,529 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.reports.collectors;
-
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.mylyn.commons.core.DateUtil;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.monitor.reports.MonitorReportsPlugin;
-import org.eclipse.mylyn.internal.monitor.usage.ReportGenerator;
-import org.eclipse.mylyn.internal.tasks.ui.actions.TaskActivateAction;
-import org.eclipse.mylyn.internal.tasks.ui.actions.TaskDeactivateAction;
-import org.eclipse.mylyn.monitor.core.InteractionEvent;
-
-/**
- * Delagates to other collectors for additional info.
- * 
- * @author Mik Kersten
- */
-public class FocusedUiUsageAnalysisCollector extends AbstractMylynUsageCollector {
-
-	public static final int BASELINE_EDITS_THRESHOLD = 1000;
-
-	private static final int MYLYN_EDITS_THRESHOLD = 3000;
-
-	private static final int NUM_VIEWS_REPORTED = 5;
-
-	private float summaryEditRatioDelta = 0;
-
-	private final List<Integer> usersImproved = new ArrayList<Integer>();
-
-	private final List<Integer> usersDegraded = new ArrayList<Integer>();
-
-	private final Map<Integer, Date> startDates = new HashMap<Integer, Date>();
-
-	private final Map<Integer, Integer> numMylynActiveJavaEdits = new HashMap<Integer, Integer>();
-
-	private final Map<Integer, Date> endDates = new HashMap<Integer, Date>();
-
-	private final Map<Integer, Integer> baselineSelections = new HashMap<Integer, Integer>();
-
-	private final Map<Integer, Integer> baselineEdits = new HashMap<Integer, Integer>();
-
-	private final Map<Integer, Integer> mylynInactiveSelections = new HashMap<Integer, Integer>();
-
-	private final Map<Integer, Integer> mylynInactiveEdits = new HashMap<Integer, Integer>();
-
-	private final Map<Integer, Integer> mylynSelections = new HashMap<Integer, Integer>();
-
-	private final Map<Integer, Integer> mylynEdits = new HashMap<Integer, Integer>();
-
-	private final Map<Integer, Integer> baselineCurrentNumSelectionsBeforeEdit = new HashMap<Integer, Integer>();
-
-	private final Map<Integer, Integer> baselineTotalSelectionsBeforeEdit = new HashMap<Integer, Integer>();
-
-	private final Map<Integer, Integer> baselineTotalEditsCounted = new HashMap<Integer, Integer>();
-
-	private final Map<Integer, Integer> mylynCurrentNumSelectionsBeforeEdit = new HashMap<Integer, Integer>();
-
-	private final Map<Integer, Integer> mylynTotalSelectionsBeforeEdit = new HashMap<Integer, Integer>();
-
-	private final Map<Integer, Integer> mylynTotalEditsCounted = new HashMap<Integer, Integer>();
-
-	private final Map<Integer, InteractionEvent> lastUserEvent = new HashMap<Integer, InteractionEvent>();
-
-	private final Map<Integer, Long> timeMylynActive = new HashMap<Integer, Long>();
-
-	private final Map<Integer, Long> timeMylynInactive = new HashMap<Integer, Long>();
-
-	private final Map<Integer, Long> timeBaseline = new HashMap<Integer, Long>();
-
-	private final FocusedUiViewUsageCollector viewUsageCollector = new FocusedUiViewUsageCollector();
-
-	public FocusedUiUsageAnalysisCollector() {
-		viewUsageCollector.setMaxViewsToReport(NUM_VIEWS_REPORTED);
-		super.getDelegates().add(viewUsageCollector);
-	}
-
-	@Override
-	public String getReportTitle() {
-		return "Mylyn Usage";
-	}
-
-	@Override
-	public void consumeEvent(InteractionEvent event, int userId) {
-		super.consumeEvent(event, userId);
-		if (!startDates.containsKey(userId)) {
-			startDates.put(userId, event.getDate());
-		}
-		endDates.put(userId, event.getDate());
-
-		// Mylyn is active
-		if (mylynUserIds.contains(userId) && !mylynInactiveUserIds.contains(userId)) {
-			accumulateDuration(event, userId, timeMylynActive);
-			if (isJavaEdit(event)) {
-				incrementCount(userId, numMylynActiveJavaEdits);
-			}
-			if (isSelection(event)) {
-				incrementCount(userId, mylynSelections);
-				incrementCount(userId, mylynCurrentNumSelectionsBeforeEdit);
-			} else if (isEdit(event)) {
-				incrementCount(userId, mylynEdits);
-
-				if (mylynCurrentNumSelectionsBeforeEdit.containsKey((userId))) {
-					int num = mylynCurrentNumSelectionsBeforeEdit.get(userId);
-					if (num > 0) {
-						incrementCount(userId, mylynTotalEditsCounted);
-						incrementCount(userId, mylynTotalSelectionsBeforeEdit, num);
-						mylynCurrentNumSelectionsBeforeEdit.put(userId, 0);
-					}
-				}
-			}
-			// Mylyn is inactive
-		} else if (mylynInactiveUserIds.contains(userId)) {
-			accumulateDuration(event, userId, timeMylynInactive);
-			if (isSelection(event)) {
-				incrementCount(userId, mylynInactiveSelections);
-			} else if (isEdit(event)) {
-				incrementCount(userId, mylynInactiveEdits);
-			}
-			// Baseline
-		} else {
-			accumulateDuration(event, userId, timeBaseline);
-			if (isSelection(event)) {
-				incrementCount(userId, baselineSelections);
-
-				incrementCount(userId, baselineCurrentNumSelectionsBeforeEdit);
-			} else if (isEdit(event)) {
-				incrementCount(userId, baselineEdits);
-
-				if (baselineCurrentNumSelectionsBeforeEdit.containsKey((userId))) {
-					int num = baselineCurrentNumSelectionsBeforeEdit.get(userId);
-					if (num > 0) {
-						incrementCount(userId, baselineTotalEditsCounted);
-						incrementCount(userId, baselineTotalSelectionsBeforeEdit, num);
-						baselineCurrentNumSelectionsBeforeEdit.put(userId, 0);
-					}
-				}
-			}
-		}
-	}
-
-	private void accumulateDuration(InteractionEvent event, int userId, Map<Integer, Long> timeAccumulator) {
-		// Restart accumulation if greater than 5 min has elapsed between events
-		if (lastUserEvent.containsKey(userId)) {
-			long elapsed = event.getDate().getTime() - lastUserEvent.get(userId).getDate().getTime();
-
-			if (elapsed < 5 * 60 * 1000) {
-				if (!timeAccumulator.containsKey(userId)) {
-					timeAccumulator.put(userId, new Long(0));
-				}
-				timeAccumulator.put(userId, timeAccumulator.get(userId) + elapsed);
-			}
-		}
-		lastUserEvent.put(userId, event);
-	}
-
-	public static boolean isEdit(InteractionEvent event) {
-		return event.getKind().equals(InteractionEvent.Kind.EDIT)
-				|| (event.getKind().equals(InteractionEvent.Kind.SELECTION) && isSelectionInEditor(event));
-	}
-
-	public static boolean isSelection(InteractionEvent event) {
-		return event.getKind().equals(InteractionEvent.Kind.SELECTION) && !isSelectionInEditor(event);
-	}
-
-	public static boolean isSelectionInEditor(InteractionEvent event) {
-		return event.getOriginId().contains("Editor") || event.getOriginId().contains("editor")
-				|| event.getOriginId().contains("source");
-	}
-
-	public static boolean isJavaEdit(InteractionEvent event) {
-		return event.getKind().equals(InteractionEvent.Kind.EDIT)
-				&& (event.getOriginId().contains("java") || event.getOriginId().contains("jdt.ui"));
-	}
-
-	private void incrementCount(int userId, Map<Integer, Integer> map, int count) {
-		if (!map.containsKey(userId)) {
-			map.put(userId, 0);
-		}
-		map.put(userId, map.get(userId) + count);
-	}
-
-	private void incrementCount(int userId, Map<Integer, Integer> map) {
-		incrementCount(userId, map, 1);
-	}
-
-	@Override
-	public List<String> getReport() {
-		usersImproved.clear();
-		usersDegraded.clear();
-		int acceptedUsers = 0;
-		int rejectedUsers = 0;
-		summaryEditRatioDelta = 0;
-		List<String> report = new ArrayList<String>();
-		for (int id : userIds) {
-			if (acceptUser(id)) {
-				report.add("<h3>USER ID: " + id + " (from: " + getStartDate(id) + " to " + getEndDate(id) + ")</h3>");
-				acceptedUsers++;
-
-				float baselineRatio = getBaselineRatio(id);
-				float mylynInactiveRatio = getMylynInactiveRatio(id);
-				float mylynActiveRatio = getMylynRatio(id);
-				float combinedMylynRatio = mylynInactiveRatio + mylynActiveRatio;
-
-				float ratioPercentage = (combinedMylynRatio - baselineRatio) / baselineRatio;
-				if (ratioPercentage > 0) {
-					usersImproved.add(id);
-				} else {
-					usersDegraded.add(id);
-				}
-				summaryEditRatioDelta += ratioPercentage;
-				String baselineVsMylynRatio = "Baseline vs. Mylyn edit ratio: " + baselineRatio + ", mylyn: "
-						+ combinedMylynRatio + ",  ";
-				String ratioChange = ReportGenerator.formatPercentage(100 * ratioPercentage);
-				baselineVsMylynRatio += " <b>change: " + ratioChange + "%</b>";
-				report.add(baselineVsMylynRatio + "<br>");
-
-				report.add("<h4>Activity</h4>");
-				float editsActive = getNumMylynEdits(id);
-				float editsInactive = getNumInactiveEdits(id);
-				report.add("Proportion Mylyn active (by edits): <b>"
-						+ ReportGenerator.formatPercentage(100 * ((editsActive) / (editsInactive + editsActive)))
-						+ "%</b><br>");
-
-				report.add("Elapsed time baseline: " + getTime(id, timeBaseline) + ", active: "
-						+ getTime(id, timeMylynActive) + ", inactive: " + getTime(id, timeMylynInactive) + "<br>");
-
-				report.add("Selections baseline: " + getNumBaselineSelections(id) + ", Mylyn active: "
-						+ getNumMylynSelections(id) + ", inactive: " + getNumMylynInactiveSelections(id) + "<br>");
-				report.add("Edits baseline: " + getNumBaselineEdits(id) + ", Mylyn active: " + getNumMylynEdits(id)
-						+ ", inactive: " + getNumInactiveEdits(id) + "<br>");
-
-				int numTaskActivations = commandUsageCollector.getCommands().getUserCount(id, TaskActivateAction.ID);
-				int numTaskDeactivations = commandUsageCollector.getCommands()
-						.getUserCount(id, TaskDeactivateAction.ID);
-				report.add("Task activations: " + numTaskActivations + ", ");
-				report.add("deactivations: " + numTaskDeactivations + "<br>");
-
-				int numIncrement = commandUsageCollector.getCommands().getUserCount(id,
-						"org.eclipse.mylyn.ui.interest.increment");
-				int numDecrement = commandUsageCollector.getCommands().getUserCount(id,
-						"org.eclipse.mylyn.ui.interest.decrement");
-				report.add("Interest increments: " + numIncrement + ", ");
-				report.add("Interest decrements: " + numDecrement + "<br>");
-
-				report.addAll(viewUsageCollector.getSummary(id, true));
-				report.add(ReportGenerator.SUMMARY_SEPARATOR);
-			} else {
-				rejectedUsers++;
-			}
-		}
-		report.add("<h3>Summary</h3>");
-		String acceptedSummary = " (based on " + acceptedUsers + " accepted, " + rejectedUsers + " rejected users)";
-		float percentage = summaryEditRatioDelta / acceptedUsers;
-		String ratioChange = ReportGenerator.formatPercentage(100 * (percentage - 1));
-		if (percentage >= 1) {
-			report.add("Overall edit ratio improved by: " + ratioChange + "% " + acceptedSummary + "<br>");
-		} else {
-			report.add("Overall edit ratio degraded by: " + ratioChange + "% " + acceptedSummary + "<br>");
-		}
-		report.add("degraded: " + usersDegraded.size() + ", improved: " + usersImproved.size() + "<br>");
-		report.add(ReportGenerator.SUMMARY_SEPARATOR);
-		return report;
-	}
-
-	@Override
-	public void exportAsCSVFile(String directory) {
-		FileWriter writer;
-		try {
-			writer = new FileWriter(directory + "/mylyn-usage.csv");
-			writer.write("userid, "
-					+ "ratio-baseline, ratio-mylyn, "
-					+ "ratio-improvement, "
-					+ "filtered-explorer, "
-					+ "filtered-outline, "
-					+ "filtered-problems, "
-					+ "edits-active, "
-					+ "time-baseline, time-active, time-inactive, "
-					+ "task-activations, task-deactivations, sel-interesting, sel-predicted, sel-decayed, sel-new, sel-unknown\n");
-			// "filtered-explorer, filtered-outline, filtered-problems, ");
-
-			for (int userId : userIds) {
-				if (acceptUser(userId)) {
-					writer.write(userId + ", ");
-					float baselineRatio = getBaselineRatio(userId);
-					float mylynInactiveRatio = getMylynInactiveRatio(userId);
-					float mylynActiveRatio = getMylynRatio(userId);
-					float combinedMylynRatio = mylynInactiveRatio + mylynActiveRatio;
-
-					writer.write(baselineRatio + ", ");
-					writer.write(combinedMylynRatio + ", ");
-
-					float ratioPercentage = (combinedMylynRatio - baselineRatio) / baselineRatio;
-					writer.write(100 * ratioPercentage + ", ");
-
-					Map<String, Integer> filteredViewSelections = viewUsageCollector.usersFilteredViewSelections.get(userId);
-					Map<String, Integer> normalViewSelections = viewUsageCollector.getUsersNormalViewSelections().get(
-							userId);
-
-					String[] views = new String[] { "org.eclipse.jdt.ui.PackageExplorer",
-							"org.eclipse.ui.views.ContentOutline", "org.eclipse.ui.views.ProblemView" };
-					for (String view : views) {
-						if (normalViewSelections.containsKey(view) && filteredViewSelections.containsKey(view)) {
-							float normalSelections = normalViewSelections.get(view);
-							float filteredSelections = filteredViewSelections.get(view);
-							float ratio = filteredSelections / (normalSelections + filteredSelections);
-							// int unfilteredSelections = normalSelections -
-							// filteredSelections;
-							if (ratio >= 0.01) {
-								writer.write(ratio + ", ");
-							} else {
-								writer.write("0, ");
-							}
-						} else {
-							writer.write("0, ");
-						}
-					}
-
-					float editsActive = getNumMylynEdits(userId);
-					float editsInactive = getNumInactiveEdits(userId);
-					writer.write(100 * ((editsActive) / (editsInactive + editsActive)) + ", ");
-
-					writer.write(getTime(userId, timeBaseline) + ", ");
-					writer.write(getTime(userId, timeMylynActive) + ", ");
-					writer.write(getTime(userId, timeMylynInactive) + ", ");
-
-					int numTaskActivations = commandUsageCollector.getCommands().getUserCount(userId,
-							TaskActivateAction.ID);
-					int numTaskDeactivations = commandUsageCollector.getCommands().getUserCount(userId,
-							TaskDeactivateAction.ID);
-					writer.write(numTaskActivations + ", ");
-					writer.write(numTaskDeactivations + ", ");
-
-					int numNew = 0;
-					if (viewUsageCollector.usersNumNew.containsKey(userId)) {
-						numNew = viewUsageCollector.usersNumNew.get(userId);
-					}
-					int numPredicted = 0;
-					if (viewUsageCollector.usersNumPredicted.containsKey(userId)) {
-						numPredicted = viewUsageCollector.usersNumPredicted.get(userId);
-					}
-					int numInteresting = 0;
-					if (viewUsageCollector.usersNumDefault.containsKey(userId)) {
-						numInteresting = viewUsageCollector.usersNumDefault.get(userId);
-					}
-					int numDecayed = 0;
-					if (viewUsageCollector.usersNumDecayed.containsKey(userId)) {
-						numDecayed = viewUsageCollector.usersNumDecayed.get(userId);
-					}
-					int numUnknown = 0;
-					if (viewUsageCollector.usersNumUnknown.containsKey(userId)) {
-						numUnknown = viewUsageCollector.usersNumUnknown.get(userId);
-					}
-
-					// float numSelections = numNew + numPredicted +
-					// numInteresting + numDecayed + numUnknown;
-					// writer.write(numSelections + ", ");
-					writer.write(numInteresting + ", ");
-					writer.write(numPredicted + ", ");
-					writer.write(numDecayed + ", ");
-					writer.write(numNew + ", ");
-					writer.write(numUnknown + ", ");
-
-					writer.write("\n");
-				}
-			}
-			writer.close();
-		} catch (IOException e) {
-			StatusHandler.fail(new Status(IStatus.ERROR, MonitorReportsPlugin.ID_PLUGIN, "Could not generate csv file",
-					e));
-		}
-	}
-
-	private String getTime(int id, Map<Integer, Long> timeMap) {
-		if (timeMap.containsKey(id)) {
-			long timeInSeconds = timeMap.get(id) / 1000;
-			long hours, minutes;
-			hours = timeInSeconds / 3600;
-			timeInSeconds = timeInSeconds - (hours * 3600);
-			minutes = timeInSeconds / 60;
-			timeInSeconds = timeInSeconds - (minutes * 60);
-			return hours + "." + minutes;
-		} else {
-			return "0";
-		}
-	}
-
-	public boolean acceptUser(int id) {
-		// XXX: delete
-		// int[] ACCEPTED = {
-		// 1922,
-		// 970,
-		// 1650,
-		// 1548,
-		// 1565,
-		// 1752,
-		// 2194,
-		// 2364,
-		// 1735,
-		// 936,
-		// 1803,
-		// 2007,
-		// 1208,
-		// 1684,
-		// 919,
-		// 2041,
-		// 1174
-		// };
-		// for (int i : ACCEPTED) {
-		// if (i == id) return true;
-		// }
-		// return false;
-		if (!numMylynActiveJavaEdits.containsKey(id)) {
-			return false;
-		} else {
-			return getNumBaselineEdits(id) > BASELINE_EDITS_THRESHOLD && getNumMylynEdits(id) > MYLYN_EDITS_THRESHOLD;
-		}
-	}
-
-	public String getStartDate(int id) {
-		Calendar start = Calendar.getInstance();
-		start.setTime(startDates.get(id));
-		return DateUtil.getIsoFormattedDate(start);
-	}
-
-	public String getEndDate(int id) {
-		Calendar end = Calendar.getInstance();
-		end.setTime(endDates.get(id));
-		return DateUtil.getIsoFormattedDate(end);
-	}
-
-	public int getNumBaselineSelections(int id) {
-		if (baselineSelections.containsKey(id)) {
-			return baselineSelections.get(id);
-		} else {
-			return 0;
-		}
-	}
-
-	public int getNumBaselineEdits(int id) {
-		if (baselineEdits.containsKey(id)) {
-			return baselineEdits.get(id);
-		} else {
-			return 0;
-		}
-	}
-
-	public int getNumMylynEdits(int id) {
-		if (mylynEdits.containsKey(id)) {
-			return mylynEdits.get(id);
-		} else {
-			return 0;
-		}
-	}
-
-	public int getNumMylynInactiveEdits(int id) {
-		if (mylynInactiveEdits.containsKey(id)) {
-			return mylynInactiveEdits.get(id);
-		} else {
-			return 0;
-		}
-	}
-
-	public int getNumInactiveEdits(int id) {
-		if (mylynInactiveEdits.containsKey(id)) {
-			return mylynInactiveEdits.get(id);
-		} else {
-			return 0;
-		}
-	}
-
-	public int getNumMylynInactiveSelections(int id) {
-		if (mylynInactiveSelections.containsKey(id)) {
-			return mylynInactiveSelections.get(id);
-		} else {
-			return 0;
-		}
-	}
-
-	public int getNumMylynSelections(int id) {
-		if (mylynSelections.containsKey(id)) {
-			return mylynSelections.get(id);
-		} else {
-			return 0;
-		}
-	}
-
-	/**
-	 * Public for testing.
-	 */
-	public float getBaselineRatio(int id) {
-		return getEditRatio(id, baselineEdits, baselineSelections);
-	}
-
-	public float getMylynInactiveRatio(int id) {
-		return getEditRatio(id, mylynInactiveEdits, mylynInactiveSelections);
-	}
-
-	/**
-	 * Public for testing.
-	 */
-	public float getMylynRatio(int id) {
-		return getEditRatio(id, mylynEdits, mylynSelections);
-	}
-
-	private float getEditRatio(int id, Map<Integer, Integer> edits, Map<Integer, Integer> selections) {
-		if (edits.containsKey(id) && selections.containsKey(id)) {
-			return (float) edits.get(id) / (float) selections.get(id);
-		} else {
-			return 0f;
-		}
-	}
-}
diff --git a/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/collectors/FocusedUiUsageDetector.java b/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/collectors/FocusedUiUsageDetector.java
deleted file mode 100644
index f945065..0000000
--- a/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/collectors/FocusedUiUsageDetector.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.monitor.reports.collectors;
-
-import org.eclipse.mylyn.internal.tasks.ui.actions.TaskActivateAction;
-import org.eclipse.mylyn.internal.tasks.ui.actions.TaskDeactivateAction;
-import org.eclipse.mylyn.monitor.core.InteractionEvent;
-
-public abstract class FocusedUiUsageDetector {
-
-	public static boolean isAMylynActivateCommand(InteractionEvent event) {
-		if (event.getKind().equals(InteractionEvent.Kind.COMMAND)) {
-			if (event.getOriginId().equals(TaskActivateAction.ID)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	public static boolean isAMylynDeactivateCommand(InteractionEvent event) {
-		if (event.getKind().equals(InteractionEvent.Kind.COMMAND)) {
-			if (event.getOriginId().equals(TaskDeactivateAction.ID)) {
-				return true;
-			}
-		}
-		return false;
-	}
-}
diff --git a/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/collectors/FocusedUiViewUsageCollector.java b/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/collectors/FocusedUiViewUsageCollector.java
deleted file mode 100644
index bf2fe2e..0000000
--- a/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/collectors/FocusedUiViewUsageCollector.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.reports.collectors;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.mylyn.context.ui.AbstractFocusViewAction;
-import org.eclipse.mylyn.internal.monitor.core.collection.ViewUsageCollector;
-import org.eclipse.mylyn.internal.tasks.ui.actions.TaskActivateAction;
-import org.eclipse.mylyn.internal.tasks.ui.actions.TaskDeactivateAction;
-import org.eclipse.mylyn.monitor.core.InteractionEvent;
-
-/**
- * @author Mik Kersten
- */
-public class FocusedUiViewUsageCollector extends ViewUsageCollector {
-
-	private final Set<Integer> mylynUserIds = new HashSet<Integer>();
-
-	Map<Integer, Map<String, Integer>> usersFilteredViewSelections = new HashMap<Integer, Map<String, Integer>>();
-
-	private final Map<Integer, Set<String>> usersFilteredViews = new HashMap<Integer, Set<String>>();
-
-	Map<Integer, Integer> usersNumDecayed = new HashMap<Integer, Integer>();
-
-	Map<Integer, Integer> usersNumDefault = new HashMap<Integer, Integer>();
-
-	Map<Integer, Integer> usersNumNew = new HashMap<Integer, Integer>();
-
-	Map<Integer, Integer> usersNumPredicted = new HashMap<Integer, Integer>();
-
-	Map<Integer, Integer> usersNumUnknown = new HashMap<Integer, Integer>();
-
-	@Override
-	public void consumeEvent(InteractionEvent event, int userId) {
-		super.consumeEvent(event, userId);
-
-		if (event.getKind().equals(InteractionEvent.Kind.COMMAND)) {
-			if (event.getOriginId().equals(TaskActivateAction.ID)) {
-				mylynUserIds.add(userId);
-			} else if (event.getOriginId().equals(TaskDeactivateAction.ID)) {
-				mylynUserIds.remove(userId);
-			}
-		}
-
-		Set<String> filteredViews = usersFilteredViews.get(userId);
-		if (filteredViews == null) {
-			filteredViews = new HashSet<String>();
-			usersFilteredViews.put(userId, filteredViews);
-		}
-
-		Map<String, Integer> filteredViewSelections = usersFilteredViewSelections.get(userId);
-		if (filteredViewSelections == null) {
-			filteredViewSelections = new HashMap<String, Integer>();
-			usersFilteredViewSelections.put(userId, filteredViewSelections);
-		}
-
-		if (event.getKind().equals(InteractionEvent.Kind.SELECTION)) {
-			String viewId = event.getOriginId();
-
-			// TODO: put back?
-			// if (mylynUserIds.contains(userId)) {
-			// if (event.getDelta().equals(SelectionMonitor.SELECTION_DECAYED))
-			// {
-			// if (!usersNumDecayed.containsKey(userId))
-			// usersNumDecayed.put(userId, 0);
-			// int numDecayed = usersNumDecayed.get(userId) + 1;
-			// usersNumDecayed.put(userId, numDecayed);
-			// } else if
-			// (event.getDelta().equals(SelectionMonitor.SELECTION_PREDICTED)) {
-			// if (!usersNumPredicted.containsKey(userId))
-			// usersNumPredicted.put(userId, 0);
-			// int numPredicted = usersNumPredicted.get(userId) + 1;
-			// usersNumPredicted.put(userId, numPredicted);
-			// } else if
-			// (event.getDelta().equals(SelectionMonitor.SELECTION_NEW)) {
-			// if (!usersNumNew.containsKey(userId))
-			// usersNumNew.put(userId, 0);
-			// int numNew = usersNumNew.get(userId) + 1;
-			// usersNumNew.put(userId, numNew);
-			// } else if
-			// (event.getDelta().equals(SelectionMonitor.SELECTION_DEFAULT)) {
-			// if (!usersNumDefault.containsKey(userId))
-			// usersNumDefault.put(userId, 0);
-			// int numDefault = usersNumDefault.get(userId) + 1;
-			// usersNumDefault.put(userId, numDefault);
-			// } else {
-			// if (!usersNumUnknown.containsKey(userId))
-			// usersNumUnknown.put(userId, 0);
-			// int numUnknownNew = usersNumUnknown.get(userId) + 1;
-			// usersNumUnknown.put(userId, numUnknownNew);
-			// }
-			// }
-
-			if (filteredViews.contains(viewId)) {
-				if (!filteredViewSelections.containsKey(viewId)) {
-					filteredViewSelections.put(viewId, 0);
-				}
-				int filtered = filteredViewSelections.get(viewId) + 1;
-				filteredViewSelections.put(viewId, filtered);
-			}
-
-		} else if (event.getKind().equals(InteractionEvent.Kind.PREFERENCE)) {
-			if (event.getOriginId().startsWith(AbstractFocusViewAction.PREF_ID_PREFIX)) {
-				String viewId = event.getOriginId().substring(AbstractFocusViewAction.PREF_ID_PREFIX.length());
-				if (event.getDelta().equals("true")) {
-					filteredViews.add(viewId);
-				} else {
-					filteredViews.remove(viewId);
-				}
-			}
-		}
-	}
-
-	public int getFilteredSelections(int userId, String viewId) {
-		Map<String, Integer> filteredViewSelections = usersFilteredViewSelections.get(userId);
-		if (filteredViewSelections.containsKey(viewId)) {
-			return filteredViewSelections.get(viewId);
-		} else {
-			return 0;
-		}
-	}
-
-	@Override
-	public List<String> getSummary(int userId, boolean html) {
-
-		List<String> summaries = new ArrayList<String>();
-		Map<String, Integer> filteredViewSelections = usersFilteredViewSelections.get(userId);
-		Map<String, Integer> normalViewSelections = usersNormalViewSelections.get(userId);
-
-		if (!filteredViewSelections.keySet().isEmpty()) {
-			if (html) {
-				summaries.add("<h4>Interest Filtering</h4>");
-			} else {
-				summaries.add("Interest Filtering");
-			}
-
-		}
-
-		for (String view : filteredViewSelections.keySet()) {
-			int normalSelections = normalViewSelections.get(view);
-			int filteredSelections = filteredViewSelections.get(view);
-			int unfilteredSelections = normalSelections - filteredSelections;
-			summaries.add(view + " filtered: " + filteredSelections + " vs. unfiltered: ");
-			if (html) {
-				summaries.add(unfilteredSelections + "<br>");
-			} else {
-				summaries.add(unfilteredSelections + "");
-			}
-		}
-
-		if (html) {
-			summaries.add("<h4>View Usage ");
-		} else {
-			summaries.add("View Usage ");
-		}
-
-		List<String> allSummaries = super.getSummary(userId, true);
-		if (maxViewsToReport != -1 && allSummaries.size() == maxViewsToReport) {
-			summaries.add("(top " + maxViewsToReport + ")");
-		}
-		if (html) {
-			summaries.add("</h4>");
-		}
-		summaries.addAll(allSummaries);
-
-		// summaries.add("<h4>Interest Model</h4>");
-		// int numNew = 0;
-		// if (usersNumNew.containsKey(userId))
-		// numNew = usersNumNew.get(userId);
-		// int numPredicted = 0;
-		// if (usersNumPredicted.containsKey(userId))
-		// numPredicted = usersNumPredicted.get(userId);
-		// int numInteresting = 0;
-		// if (usersNumDefault.containsKey(userId))
-		// numInteresting = usersNumDefault.get(userId);
-		// int numDecayed = 0;
-		// if (usersNumDecayed.containsKey(userId))
-		// numDecayed = usersNumDecayed.get(userId);
-		// int numUnknown = 0;
-		// if (usersNumUnknown.containsKey(userId))
-		// numUnknown = usersNumUnknown.get(userId);
-		//
-		// float numSelections = numNew + numPredicted + numInteresting +
-		// numDecayed + numUnknown;
-		// float inModel = (numPredicted + numInteresting + numDecayed);
-		// float notInModel = numNew;
-		// float hitRatio = inModel / (inModel + notInModel);
-		// summaries.add("In model (inModel / (inModel + notInModel): " +
-		// ReportGenerator.formatPercentage(hitRatio) + "<br>");
-		// 
-		// summaries.add("New: " + ReportGenerator.formatPercentage(numNew /
-		// numSelections) + "(" + numNew + ")" + "; ");
-		// summaries.add("Predicted: " +
-		// ReportGenerator.formatPercentage(numPredicted / numSelections) + " ("
-		// + numPredicted + ")"
-		// + "; ");
-		// summaries.add("Interesting: " +
-		// ReportGenerator.formatPercentage(numInteresting / numSelections) + "
-		// (" + numInteresting
-		// + ")" + "; ");
-		// summaries.add("Decayed: " +
-		// ReportGenerator.formatPercentage(numDecayed / numSelections) + " (" +
-		// numDecayed + ")" + "; ");
-		// summaries.add("Unknown: " +
-		// ReportGenerator.formatPercentage(numUnknown / numSelections) + " (" +
-		// numUnknown + ")" + "<br>");
-
-		return summaries;
-	}
-
-	@Override
-	public List<String> getReport() {
-		List<String> summaries = new ArrayList<String>();
-		for (int userId : usersNormalViewSelections.keySet()) {
-			summaries.addAll(getSummary(userId, true));
-		}
-		return summaries;
-	}
-
-	@Override
-	public List<String> getPlainTextReport() {
-		List<String> summaries = new ArrayList<String>();
-		for (int userId : usersNormalViewSelections.keySet()) {
-			summaries.addAll(getSummary(userId, false));
-		}
-		return summaries;
-	}
-
-	@Override
-	public String getReportTitle() {
-		return "Mylyn View Usage";
-	}
-
-	/**
-	 * For testing.
-	 */
-	public Map<String, Integer> getFilteredViewSelections() {
-		Map<String, Integer> filteredViewSelections = new HashMap<String, Integer>();
-		for (int userId : usersFilteredViewSelections.keySet()) {
-			filteredViewSelections.putAll(usersFilteredViewSelections.get(userId));
-		}
-		return filteredViewSelections;
-	}
-}
diff --git a/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/preferences/UiUsageReportsPreferencePage.java b/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/preferences/UiUsageReportsPreferencePage.java
deleted file mode 100644
index f031f03..0000000
--- a/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/preferences/UiUsageReportsPreferencePage.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.monitor.reports.preferences;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.mylyn.internal.monitor.reports.MonitorReportsPlugin;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-/**
- * Preference page for reporting preferences
- * 
- * @author Wesley Coelho
- */
-public class UiUsageReportsPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
-
-	private Text mylarDataDirectory = null;
-
-	private Button browse = null;
-
-	public UiUsageReportsPreferencePage() {
-		super();
-		setPreferenceStore(MonitorReportsPlugin.getDefault().getPreferenceStore());
-	}
-
-	@Override
-	protected Control createContents(Composite parent) {
-		Composite container = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout(1, false);
-		container.setLayout(layout);
-		createTaskDirectoryControl(container);
-		return container;
-	}
-
-	public void init(IWorkbench workbench) {
-		// No initialization required
-	}
-
-	@Override
-	public boolean performOk() {
-		String taskDirectory = mylarDataDirectory.getText();
-		taskDirectory = taskDirectory.replaceAll("\\\\", "/");
-		getPreferenceStore().setValue(MonitorReportsPlugin.SHARED_TASK_DATA_ROOT_DIR, taskDirectory);
-		return true;
-	}
-
-	@Override
-	public void performDefaults() {
-		super.performDefaults();
-
-		// IPath rootPath =
-		// ResourcesPlugin.getWorkspace().getRoot().getLocation();
-		// String taskDirectory = rootPath.toString() + "/" +
-		// ContextCorePlugin.DATA_DIR_NAME;
-		mylarDataDirectory.setText(TasksUiPlugin.getDefault().getDataDirectory());
-	}
-
-	private void createTaskDirectoryControl(Composite parent) {
-		Group taskDirComposite = new Group(parent, SWT.SHADOW_ETCHED_IN);
-		taskDirComposite.setText("Shared Task Data Root Directory");
-		taskDirComposite.setLayout(new GridLayout(2, false));
-		taskDirComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		String taskDirectory = getPreferenceStore().getString(MonitorReportsPlugin.SHARED_TASK_DATA_ROOT_DIR);
-		if (taskDirectory.trim().equals("")) {
-			taskDirectory = TasksUiPlugin.getDefault().getDataDirectory();
-			// getPreferenceStore().getString(ContextCorePlugin.PREF_DATA_DIR);
-		}
-		taskDirectory = taskDirectory.replaceAll("\\\\", "/");
-		mylarDataDirectory = new Text(taskDirComposite, SWT.BORDER);
-		mylarDataDirectory.setText(taskDirectory);
-		mylarDataDirectory.setEditable(false);
-		mylarDataDirectory.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		browse = createButton(taskDirComposite, "Browse...");
-		browse.addSelectionListener(new SelectionAdapter() {
-
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				DirectoryDialog dialog = new DirectoryDialog(getShell());
-				dialog.setText("Folder Selection");
-				dialog.setMessage("Specify the root folder where shared task data is stored");
-				String dir = mylarDataDirectory.getText();
-				dir = dir.replaceAll("\\\\", "/");
-				dialog.setFilterPath(dir);
-
-				dir = dialog.open();
-				if (dir == null || dir.equals("")) {
-					return;
-				}
-				mylarDataDirectory.setText(dir);
-			}
-		});
-	}
-
-	private Button createButton(Composite parent, String text) {
-		Button button = new Button(parent, SWT.TRAIL);
-		button.setText(text);
-		button.setVisible(true);
-		return button;
-	}
-}
diff --git a/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/ui/actions/EclipseUsageSummaryAction.java b/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/ui/actions/EclipseUsageSummaryAction.java
deleted file mode 100644
index 1debfe6..0000000
--- a/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/ui/actions/EclipseUsageSummaryAction.java
+++ /dev/null
@@ -1,124 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.reports.ui.actions;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.IJobChangeEvent;
-import org.eclipse.core.runtime.jobs.JobChangeAdapter;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.monitor.core.collection.CommandUsageCollector;
-import org.eclipse.mylyn.internal.monitor.core.collection.DelegatingUsageCollector;
-import org.eclipse.mylyn.internal.monitor.core.collection.IUsageCollector;
-import org.eclipse.mylyn.internal.monitor.core.collection.SummaryCollector;
-import org.eclipse.mylyn.internal.monitor.core.collection.ViewUsageCollector;
-import org.eclipse.mylyn.internal.monitor.reports.MonitorReportsPlugin;
-import org.eclipse.mylyn.internal.monitor.usage.ReportGenerator;
-import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
-import org.eclipse.mylyn.internal.monitor.usage.collectors.PerspectiveUsageCollector;
-import org.eclipse.mylyn.internal.monitor.usage.editors.UsageStatsEditorInput;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ViewPluginAction;
-
-/**
- * @author Mik Kersten
- */
-public class EclipseUsageSummaryAction implements IViewActionDelegate {
-	ReportGenerator generator = null;
-
-	public void init(IViewPart view) {
-		// ignore
-	}
-
-	public void run(IAction action) {
-		if (action instanceof ViewPluginAction) {
-			ViewPluginAction objectAction = (ViewPluginAction) action;
-			final List<File> files = getStatsFilesFromSelection(objectAction);
-			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-				public void run() {
-
-					List<IUsageCollector> delegates = new ArrayList<IUsageCollector>();
-					delegates.add(new ViewUsageCollector());
-					delegates.add(new PerspectiveUsageCollector());
-					delegates.add(new CommandUsageCollector());
-					// delegates.add(new CsvOutputCollector());
-					delegates.add(new SummaryCollector());
-
-					DelegatingUsageCollector collector = new DelegatingUsageCollector();
-					collector.setReportTitle("Usage Summary");
-					collector.setDelegates(delegates);
-					generator = new ReportGenerator(UiUsageMonitorPlugin.getDefault().getInteractionLogger(),
-							collector, new JobChangeAdapter() {
-								@Override
-								public void done(IJobChangeEvent event) {
-									try {
-										IWorkbenchPage page = MonitorReportsPlugin.getDefault()
-												.getWorkbench()
-												.getActiveWorkbenchWindow()
-												.getActivePage();
-										if (page == null) {
-											return;
-										}
-										IEditorInput input = new UsageStatsEditorInput(files, generator);
-										page.openEditor(input, MonitorReportsPlugin.REPORT_SUMMARY_ID);
-									} catch (PartInitException e) {
-										StatusHandler.log(new Status(IStatus.ERROR, MonitorReportsPlugin.ID_PLUGIN,
-												"Could not open summary editor", e));
-									}
-								}
-							});
-
-				}
-			});
-		}
-	}
-
-	/**
-	 * TODO: move
-	 */
-	public static List<File> getStatsFilesFromSelection(ViewPluginAction objectAction) {
-		final List<File> files = new ArrayList<File>();
-		if (objectAction.getSelection() instanceof StructuredSelection) {
-			StructuredSelection structuredSelection = (StructuredSelection) objectAction.getSelection();
-			for (Object object : structuredSelection.toList()) {
-				if (object instanceof IFile) {
-					IFile file = (IFile) object;
-					if (file.getFileExtension().equals("zip")) {
-						files.add(new File(file.getLocation().toString()));
-					}
-				}
-			}
-		}
-		Collections.sort(files); // ensure that they are sorted by date
-
-		if (files.isEmpty()) {
-			files.add(UiUsageMonitorPlugin.getDefault().getMonitorLogFile());
-		}
-		return files;
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-		// TODO Auto-generated method stub
-	}
-
-}
diff --git a/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/ui/actions/FocusedUiUserAnalysisAction.java b/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/ui/actions/FocusedUiUserAnalysisAction.java
deleted file mode 100644
index 6398269..0000000
--- a/org.eclipse.mylyn.monitor.reports/src/org/eclipse/mylyn/internal/monitor/reports/ui/actions/FocusedUiUserAnalysisAction.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.reports.ui.actions;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.monitor.core.collection.IUsageCollector;
-import org.eclipse.mylyn.internal.monitor.reports.MonitorReportsPlugin;
-import org.eclipse.mylyn.internal.monitor.reports.collectors.FocusedUiUsageAnalysisCollector;
-import org.eclipse.mylyn.internal.monitor.usage.ReportGenerator;
-import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
-import org.eclipse.mylyn.internal.monitor.usage.editors.UsageStatsEditorInput;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.ViewPluginAction;
-
-/**
- * @author Mik Kersten
- */
-public class FocusedUiUserAnalysisAction implements IViewActionDelegate {
-
-	public void init(IViewPart view) {
-		// ignore
-	}
-
-	public void run(IAction action) {
-		if (action instanceof ViewPluginAction) {
-			ViewPluginAction objectAction = (ViewPluginAction) action;
-			final List<File> files = EclipseUsageSummaryAction.getStatsFilesFromSelection(objectAction);
-			if (files.isEmpty()) {
-				files.add(UiUsageMonitorPlugin.getDefault().getMonitorLogFile());
-			}
-			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					try {
-						List<IUsageCollector> collectors = new ArrayList<IUsageCollector>();
-						collectors.add(new FocusedUiUsageAnalysisCollector());
-						ReportGenerator generator = new ReportGenerator(UiUsageMonitorPlugin.getDefault()
-								.getInteractionLogger(), collectors);
-
-						IWorkbenchPage page = MonitorReportsPlugin.getDefault()
-								.getWorkbench()
-								.getActiveWorkbenchWindow()
-								.getActivePage();
-						if (page == null) {
-							return;
-						}
-						IEditorInput input = new UsageStatsEditorInput(files, generator);
-						page.openEditor(input, MonitorReportsPlugin.REPORT_USERS_ID);
-					} catch (PartInitException e) {
-						StatusHandler.log(new Status(IStatus.ERROR, MonitorReportsPlugin.ID_PLUGIN,
-								"Could not open summary editor", e));
-					}
-				}
-			});
-		}
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-		// TODO Auto-generated method stub
-	}
-}
diff --git a/org.eclipse.mylyn.monitor.usage/.classpath b/org.eclipse.mylyn.monitor.usage/.classpath
deleted file mode 100644
index aafa820..0000000
--- a/org.eclipse.mylyn.monitor.usage/.classpath
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
-		<accessrules>
-			<accessrule kind="accessible" pattern="org/eclipse/mylyn/**"/>
-			<accessrule kind="accessible" pattern="org/eclipse/core/internal/**"/>
-			<accessrule kind="accessible" pattern="org/eclipse/ui/internal/**"/>
-			<accessrule kind="accessible" pattern="org/eclipse/update/internal/**"/>
-		</accessrules>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.mylyn.monitor.usage/.cvsignore b/org.eclipse.mylyn.monitor.usage/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/org.eclipse.mylyn.monitor.usage/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/org.eclipse.mylyn.monitor.usage/.project b/org.eclipse.mylyn.monitor.usage/.project
deleted file mode 100644
index a7a2341..0000000
--- a/org.eclipse.mylyn.monitor.usage/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.mylyn.monitor.usage</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 8b08f1b..0000000
--- a/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,340 +0,0 @@
-#Thu Apr 24 21:03:23 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-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.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
-org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
-org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL,NORMAL
-org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX,API
-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_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_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_selector_in_method_invocation=80
-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.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=1
-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=false
-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=false
-org.eclipse.jdt.core.formatter.comment.format_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=false
-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=120
-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=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-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=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_member=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_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not 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=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=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_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_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_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_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_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.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=120
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
-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_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 5e70d08..0000000
--- a/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,63 +0,0 @@
-#Sat Mar 01 03:38:47 PST 2008
-cleanup_settings_version=2
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-formatter_profile=_Mylyn based on Eclipse
-formatter_settings_version=11
-internal.default.compliance=default
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=true
-org.eclipse.jdt.ui.javadoc=false
-org.eclipse.jdt.ui.keywordthis=false
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2004, 2007 Mylyn project committers and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
-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_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=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=true
-sp_cleanup.correct_indentation=true
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.make_local_variable_final=false
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-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=true
-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=true
-sp_cleanup.remove_unused_imports=false
-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=true
-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=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.ltk.core.refactoring.prefs
deleted file mode 100644
index 7ab03bd..0000000
--- a/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.ltk.core.refactoring.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Jun 02 15:30:09 PDT 2006
-eclipse.preferences.version=1
-org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.mylyn.tasklist.prefs b/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.mylyn.tasklist.prefs
deleted file mode 100644
index 0a2cc0b..0000000
--- a/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.mylyn.tasklist.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Jun 18 17:14:59 PDT 2007
-eclipse.preferences.version=1
-project.repository.kind=bugzilla
-project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.mylyn.tasks.ui.prefs
deleted file mode 100644
index d8c6d26..0000000
--- a/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.mylyn.tasks.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Jun 25 03:02:37 GMT 2007
-eclipse.preferences.version=1
-project.repository.kind=bugzilla
-project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index e8f2d56..0000000
--- a/org.eclipse.mylyn.monitor.usage/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,18 +0,0 @@
-#Tue Apr 15 11:07:59 PDT 2008
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=2
-compilers.p.missing-bundle-classpath-entries=1
-compilers.p.missing-packages=1
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=2
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=0
-compilers.p.unknown-element=0
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=0
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.monitor.usage/META-INF/MANIFEST.MF b/org.eclipse.mylyn.monitor.usage/META-INF/MANIFEST.MF
deleted file mode 100644
index 6b593cc..0000000
--- a/org.eclipse.mylyn.monitor.usage/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,33 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Mylyn Usage Monitor
-Bundle-SymbolicName: org.eclipse.mylyn.monitor.usage;singleton:=true
-Bundle-Version: 3.0.0.qualifier
-Bundle-Activator: org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.core.resources,
- org.eclipse.jface.text,
- org.eclipse.update.ui,
- org.eclipse.update.core,
- org.eclipse.ui.browser,
- org.eclipse.ui.editors,
- org.eclipse.ui.workbench.texteditor,
- org.eclipse.ui.forms,
- org.eclipse.core.filesystem,
- org.eclipse.ui.ide,
- org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.commons.net;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.context.core;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.monitor.core;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.monitor.ui;bundle-version="[3.0.0,4.0.0)"
-Bundle-ActivationPolicy: lazy
-Bundle-Vendor: Eclipse.org
-Export-Package: 
- org.eclipse.mylyn.internal.monitor.usage;x-internal:=true,
- org.eclipse.mylyn.internal.monitor.usage.collectors;x-internal:=true,
- org.eclipse.mylyn.internal.monitor.usage.editors;x-internal:=true,
- org.eclipse.mylyn.internal.monitor.usage.preferences;x-internal:=true,
- org.eclipse.mylyn.internal.monitor.usage.wizards;x-internal:=true,
- org.eclipse.mylyn.monitor.usage
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/org.eclipse.mylyn.monitor.usage/about.html b/org.eclipse.mylyn.monitor.usage/about.html
deleted file mode 100644
index 0dd939c..0000000
--- a/org.eclipse.mylyn.monitor.usage/about.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 7, 2007</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.usage/build-user.xml b/org.eclipse.mylyn.monitor.usage/build-user.xml
deleted file mode 100644
index 6097713..0000000
--- a/org.eclipse.mylyn.monitor.usage/build-user.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-<target name="help">
-    <echo message="Please run: $ ant -v -projecthelp"/>
-</target>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.monitor.usage/build.properties b/org.eclipse.mylyn.monitor.usage/build.properties
deleted file mode 100644
index dfd66f7..0000000
--- a/org.eclipse.mylyn.monitor.usage/build.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 Mylyn project committers and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-###############################################################################
-bin.includes = plugin.xml,\
-               icons/,\
-               META-INF/,\
-               doc/,\
-               about.html,\
-               .
-src.includes = about.html
-jre.compilation.profile = J2SE-1.5
-source.. = src/
diff --git a/org.eclipse.mylyn.monitor.usage/doc/book.css b/org.eclipse.mylyn.monitor.usage/doc/book.css
deleted file mode 100644
index 6ee38f3..0000000
--- a/org.eclipse.mylyn.monitor.usage/doc/book.css
+++ /dev/null
@@ -1 +0,0 @@
-@import "../../PRODUCT_PLUGIN/book.css";
diff --git a/org.eclipse.mylyn.monitor.usage/doc/images/logo-ubc.gif b/org.eclipse.mylyn.monitor.usage/doc/images/logo-ubc.gif
deleted file mode 100644
index cd5f55e..0000000
--- a/org.eclipse.mylyn.monitor.usage/doc/images/logo-ubc.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.monitor.usage/doc/index.html b/org.eclipse.mylyn.monitor.usage/doc/index.html
deleted file mode 100644
index 47044aa..0000000
--- a/org.eclipse.mylyn.monitor.usage/doc/index.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
-<html>
-<head>
-<meta name="copyright" content="Copyright (c) IBM Corporation and others 2000, 2005. This page is made available under license. For full details see the LEGAL in the documentation book that contains this page." >
-<meta http-equiv="Content-Language" content="en-us">
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
-<link rel="STYLESHEET" href="book.css" charset="ISO-8859-1"
-	type="text/css">
-<title>Mylar Documentation</title>
-</head>
-<body>
-<h2>Mylar Monitor</h2><p>The Mylar monitor watches programming activity in order 
-to assist planning tools and support user studies intended to measure the 
-effectiveness of the tool.
-			</p>
-
-			</body>
-</html>
diff --git a/org.eclipse.mylyn.monitor.usage/doc/readme.html b/org.eclipse.mylyn.monitor.usage/doc/readme.html
deleted file mode 100644
index ab10e18..0000000
--- a/org.eclipse.mylyn.monitor.usage/doc/readme.html
+++ /dev/null
@@ -1,160 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html> <head>
-  <meta http-equiv="Content-Language" content="en-us">
-  <title>Changes in AspectJ</title>
-<STYLE TYPE="text/css">
-<!--
- 
-   /* FOR THE SDA PAGE */
- 
-	/*
-	BODY {margin-top: 15px; margin-left: 15px; margin-right: 15px;}
-	*/
-
-	A:link {
-		color:#4756AC;
-	}
-	A:visited {
-		color:#60657B;
-	}
-	A:hover {
-		color:red
-	}
-	
-	INPUT {font:12px "Courier New", sans-serif;}
-	
-	H2 {
-		font:18px/18px Verdana, Arial, Helvetica, sans-serif; 
-		color:black; 
-		font-weight:bold; 
-		margin-left: 10px;
-		line-height:110%; 
-	}
-	H3 {
-		font:17px/17px Verdana, Arial, Helvetica, sans-serif; 
-		color:black; 
-		//font-weight:bold; 
-		margin-left: 10px;
-		line-height:110%; 
-	}
-	H4 {
-		font:15px/16px Verdana, Arial, Helvetica, sans-serif; 
-		color:black; 
-		font-weight:bold; 
-		margin-left: 10px;
-		line-height:140%;
-	}
-	P {
-		font:13px/13px Verdana, Arial, Helvetica, sans-serif; 
-		margin-right: 10px;
-		margin-left: 10px;
-		line-height:130%; 
-	}
-	.paragraph {
-		font:13px/13px Verdana, Arial, Helvetica, sans-serif; 
-		margin-right: 10px;
-		margin-left: 10px;
-		line-height:130%; 
-	}
-	.smallParagraph {
-		font:11px/11px Verdana, Arial, Helvetica, sans-serif; 
-		margin-right: 10px;
-		margin-left: 10px;
-		line-height:130%; 
-	}
-	LI {
-		font:13px/13px Verdana, Arial, Helvetica, sans-serif;
-		text-align:justify; 
-		margin-right: 10px;
-		margin-left: 15px;
-		line-height:120%; 
-	}
-	/*
-	UL {
-		font:13px/13px Verdana, Arial, Helvetica, sans-serif;
-		text-align:justify; 
-		margin-right: 10px;
-		margin-left: 15px;
-		line-height:120%; 
-	}*/
-	
-	DL {
-		font:13px/13px Verdana, Arial, Helvetica, sans-serif;
-		text-align:justify; 
-		margin-right: 10px;
-		margin-left: 15px;
-		line-height:120%; 
-	}
-	B { font:13px/13px Verdana, Arial, Helvetica, sans-serif; 
-		font-weight:bold; 
-		line-height:140%;
-	}
-	.footer {
-		font:10px/10px Verdana, Arial, Helvetica, sans-serif;  
-		color:#888888; 
-		text-align:left
-	}
-	.figureTitle {
-		font:13px/13px Verdana, Arial, Helvetica, sans-serif; 
-		text-align:justify; 
-		text-align:center
-	}
-	.copyrightNotice {
-		font:10px/10px Verdana, Arial, Helvetica, sans-serif; 
-		color:#999999; 
-		line-height:110%;
-	}
-	.smallHeading {
-		font:13px/13px Verdana, Arial, Helvetica, sans-serif; 
-		font-weight:bold;
-		line-height:110%;
-	}
-	.tinyHeading {
-		font:11px/11px Verdana, Arial, Helvetica, sans-serif; 
-		font-weight:bold;
-		line-height:120%;
-	}
-	.newsText {
-		font:11px/11px Verdana, Arial, Helvetica, sans-serif; 
-		line-height:130%;
-	}
-	.smallParagraph {
-		font:11px/11px Verdana, Arial, Helvetica, sans-serif; 
-		line-height:130%;
-	}
-	.fancyHeading {
-		font:20px/20px Chantilly, Arial, Helvetica, sans-serif; 
-		margin-right: 10px;
-		color:#6f7a92;
-		margin-left: 10px;
-		line-height:130%;
-	}
- 
--->
-</STYLE>
-</head>
-<body>
-
-<h2>Mylar Monitor</h2>
-<h4>Usage</h4>
-<p>To enable the monitor, the &quot;Usage Statistics&quot; view must be opened.&nbsp; 
-Statistics and the usage log are gathered to the two corresponding files in the 
-workspace root.&nbsp; If the &quot;link&quot; button is pressed the statistics will be 
-updated live in the view as well.</p>
-<h4>Extending</h4>
-<p>To extend the monitor extend the ca.ubc.mylar.monitor.MylarMonitor class and 
-implement the abstract methods.&nbsp; For example, to log every distinct 
-IJavaElement selected do the following:</p>
-<p>&nbsp;&nbsp;&nbsp;&nbsp; public void handleElementSelection(IJavaElement 
-selected, IJavaElement lastSelected, IJavaElement lastResolved) {<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!selected.equals(lastSelected)) {<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
-MonitorPlugin.log(&quot;IJavaElement selected: &quot; + selected.getElementName());<br>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br>
-&nbsp;&nbsp;&nbsp; }</p>
-<p>Now you need to register your monitor by calling: </p>
-<p>&nbsp;&nbsp;&nbsp; MonitorPlugin.getDefault().getMonitors().add(new 
-MyNewMonitor());</p>
-
-</body>
-</html>
diff --git a/org.eclipse.mylyn.monitor.usage/doc/toc.xml b/org.eclipse.mylyn.monitor.usage/doc/toc.xml
deleted file mode 100644
index e7a6d35..0000000
--- a/org.eclipse.mylyn.monitor.usage/doc/toc.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?NLS TYPE="org.eclipse.help.toc"?>
-
-<toc link_to="../org.eclipse.mylyn.doc/doc/toc.xml#monitor" label="Monitor">
-	<topic label="Monitor" href="doc/index.html">
-		<topic label="UBC User Study" href="doc/study-info.html"/>
-	</topic>
-</toc>
diff --git a/org.eclipse.mylyn.monitor.usage/icons/etool16/monitor.gif b/org.eclipse.mylyn.monitor.usage/icons/etool16/monitor.gif
deleted file mode 100644
index 3ea4ad7..0000000
--- a/org.eclipse.mylyn.monitor.usage/icons/etool16/monitor.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.monitor.usage/icons/eview16/editor-usage.gif b/org.eclipse.mylyn.monitor.usage/icons/eview16/editor-usage.gif
deleted file mode 100644
index 02a5c6c..0000000
--- a/org.eclipse.mylyn.monitor.usage/icons/eview16/editor-usage.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.monitor.usage/icons/wizban/banner-submission.gif b/org.eclipse.mylyn.monitor.usage/icons/wizban/banner-submission.gif
deleted file mode 100644
index abc75e4..0000000
--- a/org.eclipse.mylyn.monitor.usage/icons/wizban/banner-submission.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.monitor.usage/icons/wizban/banner-usage.gif b/org.eclipse.mylyn.monitor.usage/icons/wizban/banner-usage.gif
deleted file mode 100644
index 2c5fe6d..0000000
--- a/org.eclipse.mylyn.monitor.usage/icons/wizban/banner-usage.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.monitor.usage/icons/wizban/banner-user.gif b/org.eclipse.mylyn.monitor.usage/icons/wizban/banner-user.gif
deleted file mode 100644
index d61b8ad..0000000
--- a/org.eclipse.mylyn.monitor.usage/icons/wizban/banner-user.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.monitor.usage/plugin.xml b/org.eclipse.mylyn.monitor.usage/plugin.xml
deleted file mode 100644
index 27b7f4c..0000000
--- a/org.eclipse.mylyn.monitor.usage/plugin.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-   <extension-point id="study" name="UI Usage Monitor" schema="schema/study.exsd"/>
-
-   <extension
-         name="Mylyn UI Usage Monitoring Startup"
-         point="org.eclipse.ui.startup">
-      <startup
-            class="org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin$UiUsageMonitorStartup">
-      </startup>
-   </extension>   
-    
-   <extension point="org.eclipse.ui.preferencePages">
-      <page 
-         name="Usage Data"
-         class="org.eclipse.mylyn.internal.monitor.usage.preferences.UsageDataPreferencePage"
-         id="org.eclipse.mylyn.monitor.ui.ui.preferences"
-		 category="org.eclipse.mylyn.ui.preferences">
-         <keywordReference id="org.eclipse.mylyn.monitor.ui.keywords"/>
-      </page> 
-   </extension>
-   
-   <extension
-   		point="org.eclipse.ui.keywords">
-      <keyword
-            label="mylyn UI Usage Monitor Data"
-            id="org.eclipse.mylyn.monitor.ui.keywords"/>
-   </extension>
- 
-	<extension point="org.eclipse.ui.newWizards">
-    	<wizard
-            canFinishEarly="false" 
-            category="org.eclipse.mylyn.ui.wizards.new"
-            class="org.eclipse.mylyn.internal.monitor.usage.wizards.NewUsageSummaryEditorWizard"
-            hasPages="true"
-            icon="icons/eview16/editor-usage.gif"
-            id="org.eclipse.mylyn.sandbox.wizard.usageSummary"
-            name="UI Usage Report"/>
-   	</extension>
-   
-   	<extension point="org.eclipse.ui.editors">
-        <editor
-           icon="icons/eview16/editor-usage.gif"
-           class="org.eclipse.mylyn.internal.monitor.usage.editors.UsageSummaryReportEditorPart"
-           name="UI Usage Report"
-           id="org.eclipse.mylyn.monitor.usage.summary.editor"/>
-  	</extension>
-</plugin>
diff --git a/org.eclipse.mylyn.monitor.usage/schema/study.exsd b/org.eclipse.mylyn.monitor.usage/schema/study.exsd
deleted file mode 100644
index 041e31f..0000000
--- a/org.eclipse.mylyn.monitor.usage/schema/study.exsd
+++ /dev/null
@@ -1,214 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.mylar.monitor.ui">
-<annotation>
-      <appInfo>
-         <meta.schema plugin="org.eclipse.mylar.monitor.ui" id="study" name="Mylar Monitor Study"/>
-      </appInfo>
-      <documentation>
-         Provides a mechanism to connect a user study plug-in with the Mylyn Monitors usage monitoring facilities.  For more information please see: http://wiki.eclipse.org/index.php/Mylyn_Integrator_Reference#Monitor_API
-      </documentation>
-   </annotation>
-
-   <element name="study">
-      <complexType>
-         <sequence>
-            <element ref="scripts"/>
-            <element ref="ui"/>
-            <element ref="monitors"/>
-         </sequence>
-         <attribute name="point" type="string" use="required">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="id" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="name" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute translatable="true"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="scripts">
-      <complexType>
-         <attribute name="url" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="upload" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="userId" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="questionnaire" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="background" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="version" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="ui">
-      <complexType>
-         <attribute name="title" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="description" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="daysBetweenUpload" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="questionnairePage" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java" basedOn="org.eclipse.mylyn.monitor.usage.AbstractStudyQuestionnairePage:"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="backgroundPage" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="java"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="consentForm" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-               <appInfo>
-                  <meta.attribute kind="resource"/>
-               </appInfo>
-            </annotation>
-         </attribute>
-         <attribute name="useContactField" type="boolean">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <element name="monitors">
-      <complexType>
-         <attribute name="browserUrlFilter" type="string">
-            <annotation>
-               <documentation>
-                  
-               </documentation>
-            </annotation>
-         </attribute>
-      </complexType>
-   </element>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="since"/>
-      </appInfo>
-      <documentation>
-         1.0
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="examples"/>
-      </appInfo>
-      <documentation>
-         See the org.eclipse.mylyn.examples.monitor.study plug-in for a reference implementation.
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="implementation"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-   <annotation>
-      <appInfo>
-         <meta.section type="copyright"/>
-      </appInfo>
-      <documentation>
-         
-      </documentation>
-   </annotation>
-
-</schema>
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/FileDisplayDialog.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/FileDisplayDialog.java
deleted file mode 100644
index 7313563..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/FileDisplayDialog.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-/**
- * 
- */
-package org.eclipse.mylyn.internal.monitor.usage;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStreamReader;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Dialog that displays the contents of a file to the user
- * 
- * @author Shawn Minto
- * 
- */
-public class FileDisplayDialog extends MessageDialog {
-
-	private static String contents = "";
-
-	public FileDisplayDialog(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage,
-			int dialogImageType, String[] dialogButtonLabels, int defaultIndex, String contents) {
-		super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels,
-				defaultIndex);
-	}
-
-	public static int openShowFile(Shell parent, String title, String message, File file) throws FileNotFoundException {
-		contents = getContents(file);
-		return showFile(parent, title, message);
-	}
-
-	public static int openShowFile(Shell parent, String title, String message, File file, int maxNumLines)
-			throws FileNotFoundException {
-		contents = getContents(file, maxNumLines);
-		return showFile(parent, title, message);
-	}
-
-	private static int showFile(Shell parent, String title, String message) {
-		FileDisplayDialog dialog = new FileDisplayDialog(parent, title, null, // accept
-				// the
-				// default
-				// window
-				// icon
-				message, NONE, new String[] { IDialogConstants.OK_LABEL }, 0, contents);
-		// ok is the default
-		return dialog.open();
-	}
-
-	@Override
-	public Control createCustomArea(Composite parent) {
-		GridLayout layout = new GridLayout();
-		parent.setLayout(layout);
-		layout.numColumns = 1;
-
-		Text t = new Text(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.READ_ONLY);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.verticalSpan = 50;
-		t.setLayoutData(gd);
-		t.setEditable(false);
-		t.setText(contents);
-		return parent;
-	}
-
-	/**
-	 * Get the contents of an InputStream
-	 * 
-	 * @param is
-	 *            The InputStream to get the contents for
-	 * @return The <code>String</code> representing the contents
-	 */
-	public static String getContents(File f) throws FileNotFoundException {
-		return getContents(f, -1);
-	}
-
-	/**
-	 * Get the contents of an InputStream
-	 * 
-	 * @param is
-	 *            The InputStream to get the contents for
-	 * @return The <code>String</code> representing the contents
-	 */
-	public static String getContents(File f, int maxNumLines) throws FileNotFoundException {
-
-		// create a new reader for the stream
-		BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f)));
-		StringBuilder sb = new StringBuilder();
-		int i = 0;
-		try {
-
-			// get the contents
-			String s = "";
-			while ((s = br.readLine()) != null && (i < maxNumLines || maxNumLines == -1)) {
-				sb.append(s);
-				sb.append("\n");
-				i++;
-			}
-
-		} catch (IOException e) {
-			StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID, "Could not get contents", e));
-		}
-		return sb.toString();
-	}
-
-}
-
-/*
- * stringbuffer sb = new stringbuffer(); for (int i = 1; i <= n; i++) {
- * sb.append("*"); } string str2 = sb.tostring();
- */
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/InteractionEventLogger.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/InteractionEventLogger.java
deleted file mode 100644
index a4dd284..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/InteractionEventLogger.java
+++ /dev/null
@@ -1,357 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.usage;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.Reader;
-import java.io.StringReader;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.commons.net.HtmlStreamTokenizer;
-import org.eclipse.mylyn.commons.net.HtmlStreamTokenizer.Token;
-import org.eclipse.mylyn.internal.context.core.InteractionContextExternalizer;
-import org.eclipse.mylyn.monitor.core.AbstractMonitorLog;
-import org.eclipse.mylyn.monitor.core.IInteractionEventListener;
-import org.eclipse.mylyn.monitor.core.InteractionEvent;
-import org.eclipse.mylyn.monitor.core.InteractionEvent.Kind;
-
-/**
- * @author Mik Kersten
- * @author Ken Sueda (XML serialization)
- * 
- *         TODO: use buffered output stream for better performance?
- */
-public class InteractionEventLogger extends AbstractMonitorLog implements IInteractionEventListener {
-
-	private int eventAccumulartor = 0;
-
-	private final List<InteractionEvent> queue = new CopyOnWriteArrayList<InteractionEvent>();
-
-	private final InteractionEventObfuscator handleObfuscator = new InteractionEventObfuscator();
-
-	private final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S z", Locale.ENGLISH);
-
-	public InteractionEventLogger(File outputFile) {
-		this.outputFile = outputFile;
-	}
-
-	public synchronized void interactionObserved(InteractionEvent event) {
-//		 System.err.println("> " + event);
-		if (UiUsageMonitorPlugin.getDefault().isObfuscationEnabled()) {
-			String obfuscatedHandle = handleObfuscator.obfuscateHandle(event.getStructureKind(),
-					event.getStructureHandle());
-			event = new InteractionEvent(event.getKind(), event.getStructureKind(), obfuscatedHandle,
-					event.getOriginId(), event.getNavigation(), event.getDelta(), event.getInterestContribution());
-		}
-		try {
-			if (started) {
-				String xml = getXmlForEvent(event);
-				outputStream.write(xml.getBytes());
-			} else if (event != null) {
-				queue.add(event);
-			}
-			eventAccumulartor++;
-		} catch (Throwable t) {
-			StatusHandler.log(new Status(IStatus.WARNING, UiUsageMonitorPlugin.PLUGIN_ID,
-					"Could not log interaction event", t));
-		}
-	}
-
-	@Override
-	public void startMonitoring() {
-		super.startMonitoring();
-		for (InteractionEvent queuedEvent : queue) {
-			interactionObserved(queuedEvent);
-		}
-		queue.clear();
-	}
-
-	@Override
-	public void stopMonitoring() {
-		super.stopMonitoring();
-		if (UiUsageMonitorPlugin.getDefault() != null) {
-			UiUsageMonitorPlugin.getDefault().incrementObservedEvents(eventAccumulartor);
-		}
-		eventAccumulartor = 0;
-	}
-
-	private String getXmlForEvent(InteractionEvent event) {
-		return writeLegacyEvent(event);
-	}
-
-	/**
-	 * @return true if successfully cleared
-	 */
-	public synchronized void clearInteractionHistory() throws IOException {
-		this.clearInteractionHistory(true);
-	}
-
-	public synchronized void clearInteractionHistory(boolean startMonitoring) throws IOException {
-		stopMonitoring();
-		outputStream = new FileOutputStream(outputFile, false);
-		outputStream.flush();
-		outputStream.close();
-		outputFile.delete();
-		outputFile.createNewFile();
-		if (startMonitoring) {
-			startMonitoring();
-		}
-	}
-
-	public List<InteractionEvent> getHistoryFromFile(File file) {
-		List<InteractionEvent> events = new ArrayList<InteractionEvent>();
-		try {
-			// The file may be a zip file...
-			if (file.getName().endsWith(".zip")) {
-				ZipFile zip = new ZipFile(file);
-				if (zip.entries().hasMoreElements()) {
-					ZipEntry entry = zip.entries().nextElement();
-					getHistoryFromStream(zip.getInputStream(entry), events);
-				}
-			} else {
-				InputStream reader = new FileInputStream(file);
-				getHistoryFromStream(reader, events);
-				reader.close();
-			}
-
-		} catch (Exception e) {
-			StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID,
-					"Could not read interaction history", e));
-		}
-		return events;
-	}
-
-	/**
-	 * @param events
-	 * @param tag
-	 * @param endl
-	 * @param buf
-	 */
-	private void getHistoryFromStream(InputStream reader, List<InteractionEvent> events) throws IOException {
-		String xml;
-		int index;
-		String buf = "";
-		String tag = "</" + InteractionContextExternalizer.ELMNT_INTERACTION_HISTORY_OLD + ">";
-		String endl = "\r\n";
-		byte[] buffer = new byte[1000];
-		int bytesRead = 0;
-		while ((bytesRead = reader.read(buffer)) != -1) {
-			buf = buf + new String(buffer, 0, bytesRead);
-			while ((index = buf.indexOf(tag)) != -1) {
-				index += tag.length();
-				xml = buf.substring(0, index);
-				InteractionEvent event = readLegacyEvent(xml);
-				if (event != null) {
-					events.add(event);
-				}
-
-				if (index + endl.length() > buf.length()) {
-					buf = "";
-				} else {
-					buf = buf.substring(index + endl.length(), buf.length());
-				}
-			}
-			buffer = new byte[1000];
-		}
-	}
-
-	private static final String OPEN = "<";
-
-	private static final String CLOSE = ">";
-
-	private static final String SLASH = "/";
-
-	private static final String ENDL = "\n";
-
-	private static final String TAB = "\t";
-
-	@Deprecated
-	public String writeLegacyEvent(InteractionEvent e) {
-		try {
-			StringBuffer res = new StringBuffer();
-			String tag = "interactionEvent";
-			res.append(OPEN);
-			res.append(tag);
-			res.append(CLOSE);
-			res.append(ENDL);
-
-			openElement(res, "kind");
-			formatContent(res, e.getKind());
-			closeElement(res, "kind");
-
-			openElement(res, "date");
-			formatContent(res, e.getDate());
-			closeElement(res, "date");
-
-			openElement(res, "endDate");
-			formatContent(res, e.getEndDate());
-			closeElement(res, "endDate");
-
-			openElement(res, "originId");
-			formatContent(res, e.getOriginId());
-			closeElement(res, "originId");
-
-			openElement(res, "structureKind");
-			formatContent(res, e.getStructureKind());
-			closeElement(res, "structureKind");
-
-			openElement(res, "structureHandle");
-			formatContent(res, e.getStructureHandle());
-			closeElement(res, "structureHandle");
-
-			openElement(res, "navigation");
-			formatContent(res, e.getNavigation());
-			closeElement(res, "navigation");
-
-			openElement(res, "delta");
-			formatContent(res, e.getDelta());
-			closeElement(res, "delta");
-
-			openElement(res, "interestContribution");
-			formatContent(res, e.getInterestContribution());
-			closeElement(res, "interestContribution");
-
-			res.append(OPEN);
-			res.append(SLASH);
-			res.append(tag);
-			res.append(CLOSE);
-			res.append(ENDL);
-			return res.toString();
-		} catch (Throwable t) {
-			StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID, "Could not write event", t));
-			return "";
-		}
-	}
-
-	private void formatContent(StringBuffer buffer, float interestContribution) {
-		buffer.append(interestContribution);
-	}
-
-	@SuppressWarnings("deprecation")
-	private void formatContent(StringBuffer buffer, String content) {
-		if (content != null && content.length() > 0) {
-			String xmlContent;
-			xmlContent = org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(content);
-			xmlContent = xmlContent.replace("\n", "\n\t\t");
-			buffer.append(xmlContent);
-		}
-	}
-
-	private void formatContent(StringBuffer buffer, Kind kind) {
-		buffer.append(kind.toString());
-	}
-
-	private void formatContent(StringBuffer buffer, Date date) {
-		buffer.append(dateFormat.format(date));
-	}
-
-	private void openElement(StringBuffer buffer, String tag) {
-		buffer.append(TAB);
-		buffer.append(OPEN);
-		buffer.append(tag);
-		buffer.append(CLOSE);
-	}
-
-	private void closeElement(StringBuffer buffer, String tag) {
-		buffer.append(OPEN);
-		buffer.append(SLASH);
-		buffer.append(tag);
-		buffer.append(CLOSE);
-		buffer.append(ENDL);
-	}
-
-	public InteractionEvent readLegacyEvent(String xml) {
-		Reader reader = new StringReader(xml);
-		HtmlStreamTokenizer tokenizer = new HtmlStreamTokenizer(reader, null);
-		String kind = "";
-		String startDate = "";
-		String endDate = "";
-		String originId = "";
-		String structureKind = "";
-		String structureHandle = "";
-		String navigation = "";
-		String delta = "";
-		String interest = "";
-		try {
-			for (Token token = tokenizer.nextToken(); token.getType() != Token.EOF; token = tokenizer.nextToken()) {
-				if (token.getValue().toString().equals("<kind>")) {
-					kind = readStringContent(tokenizer, "</kind>");
-					kind = kind.toLowerCase(Locale.ENGLISH);
-				} else if (token.getValue().toString().equals("<date>")) {
-					startDate = readStringContent(tokenizer, "</date>");
-				} else if (token.getValue().toString().equals("<endDate>")) {
-					endDate = readStringContent(tokenizer, "</endDate>");
-				} else if (token.getValue().toString().equals("<originId>")) {
-					originId = readStringContent(tokenizer, "</originId>");
-				} else if (token.getValue().toString().equals("<structureKind>")) {
-					structureKind = readStringContent(tokenizer, "</structureKind>");
-				} else if (token.getValue().toString().equals("<structureHandle>")) {
-					structureHandle = readStringContent(tokenizer, "</structureHandle>");
-				} else if (token.getValue().toString().equals("<navigation>")) {
-					navigation = readStringContent(tokenizer, "</navigation>");
-				} else if (token.getValue().toString().equals("<delta>")) {
-					delta = readStringContent(tokenizer, "</delta>");
-				} else if (token.getValue().toString().equals("<interestContribution>")) {
-					interest = readStringContent(tokenizer, "</interestContribution>");
-				}
-			}
-			float interestFloatVal = 0;
-			try {
-				interestFloatVal = Float.parseFloat(interest);
-			} catch (NumberFormatException nfe) {
-				// ignore for empty interest values
-			}
-			InteractionEvent event = new InteractionEvent(Kind.fromString(kind), structureKind, structureHandle,
-					originId, navigation, delta, interestFloatVal, dateFormat.parse(startDate),
-					dateFormat.parse(endDate));
-			return event;
-
-		} catch (ParseException e) {
-			System.err.println("readevent: " + xml);
-			e.printStackTrace();
-		} catch (IOException e) {
-			System.err.println("readevent: " + xml);
-			e.printStackTrace();
-		} catch (Exception e) {
-			System.err.println("readevent: " + xml);
-			e.printStackTrace();
-		}
-
-		return null;
-	}
-
-	@SuppressWarnings("deprecation")
-	private String readStringContent(HtmlStreamTokenizer tokenizer, String endTag) throws IOException, ParseException {
-		StringBuffer content = new StringBuffer();
-		Token token = tokenizer.nextToken();
-		while (!token.getValue().toString().equals(endTag)) {
-			if (content.length() > 0) {
-				content.append(' ');
-			}
-			content.append(token.getValue().toString());
-			token = tokenizer.nextToken();
-		}
-		return org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(content.toString()).trim();
-	}
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/InteractionEventObfuscator.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/InteractionEventObfuscator.java
deleted file mode 100644
index 2cf3a35..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/InteractionEventObfuscator.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.usage;
-
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-
-import org.eclipse.core.internal.preferences.Base64;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
-import org.eclipse.mylyn.context.core.ContextCore;
-
-/**
- * Provides one way hashing of events for the purpose of ensuring privacy of element handles.
- * 
- * @author Mik Kersten
- */
-public class InteractionEventObfuscator {
-
-	private static final char DELIM_PATH = '/';
-
-	public static final String LABEL_FAILED_TO_OBFUSCATE = "<failed to obfuscate>";
-
-	public static final String ENCRYPTION_ALGORITHM = "SHA";
-
-	public String obfuscateHandle(String structureKind, String structureHandle) {
-		if (structureHandle == null || structureHandle.equals("")) {
-			return structureHandle;
-		}
-		StringBuilder obfuscated = new StringBuilder();
-		AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(structureKind);
-		Object object = bridge.getObjectForHandle(structureHandle);
-		if (object instanceof IAdaptable) {
-			Object adapter = ((IAdaptable) object).getAdapter(IResource.class);
-			if (adapter instanceof IResource) {
-				obfuscated.append(obfuscateResourcePath(((IResource) adapter).getFullPath()));
-				obfuscated.append(DELIM_PATH);
-			}
-		}
-		obfuscated.append(obfuscateString(structureHandle));
-		return obfuscated.toString();
-	}
-
-	/**
-	 * Encrypts the string using SHA, then makes it reasonable to print.
-	 */
-	public String obfuscateString(String string) {
-		String obfuscatedString = null;
-		try {
-			MessageDigest md = MessageDigest.getInstance(ENCRYPTION_ALGORITHM);
-			md.update(string.getBytes());
-			byte[] digest = md.digest();
-			obfuscatedString = new String(Base64.encode(digest)).replace(DELIM_PATH, '=');
-			// obfuscatedString = "" + new String(digest).hashCode();
-		} catch (NoSuchAlgorithmException e) {
-			StatusHandler.log(new Status(IStatus.WARNING, UiUsageMonitorPlugin.PLUGIN_ID, "SHA not available", e));
-			obfuscatedString = LABEL_FAILED_TO_OBFUSCATE;
-		}
-		return obfuscatedString;
-	}
-
-	public String obfuscateResourcePath(IPath path) {
-		if (path == null) {
-			return "";
-		} else {
-			StringBuffer obfuscatedPath = new StringBuffer();
-			for (int i = 0; i < path.segmentCount(); i++) {
-				obfuscatedPath.append(obfuscateString(path.segments()[i]));
-				if (i < path.segmentCount() - 1) {
-					obfuscatedPath.append(DELIM_PATH);
-				}
-			}
-			return obfuscatedPath.toString();
-		}
-	}
-
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/InteractionEventSummarySorter.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/InteractionEventSummarySorter.java
deleted file mode 100644
index 94c7795..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/InteractionEventSummarySorter.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.usage;
-
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.mylyn.internal.monitor.core.collection.InteractionEventSummary;
-
-/**
- * Sorts SingleSummary objects based on type, id, name, or usage count.
- */
-public class InteractionEventSummarySorter extends ViewerSorter {
-
-	/**
-	 * Constructor argument values that indicate to sort items by different columns.
-	 */
-	public final static int TYPE = 1;
-
-	public final static int ID = 2;
-
-	public final static int NAME = 3;
-
-	public final static int USAGE_COUNT = 4;
-
-	// Criteria that the instance uses
-	private final int criteria;
-
-	/**
-	 * Creates a resource sorter that will use the given sort criteria.
-	 * 
-	 * @param criteria
-	 *            the sort criterion to use: one of <code>LABEL_VIEW_REPOSITORIES</code> or <code>TYPE</code>
-	 */
-	public InteractionEventSummarySorter(int criteria) {
-		super();
-		this.criteria = criteria;
-	}
-
-	@Override
-	public int compare(Viewer viewer, Object obj1, Object obj2) {
-		InteractionEventSummary summary1 = (InteractionEventSummary) obj1;
-		InteractionEventSummary summary2 = (InteractionEventSummary) obj2;
-
-		switch (criteria) {
-		case TYPE:
-			return compareTypes(summary1, summary2);
-		case NAME:
-			return compareNames(summary1, summary2);
-		case USAGE_COUNT:
-			return compareUsageCount(summary2, summary1);
-		default:
-			return 0;
-		}
-	}
-
-	/**
-	 * Returns a number reflecting the collation order of the given summaries based on their usage count.
-	 * 
-	 * @param summary1
-	 * @param summary2
-	 * @return a negative number if the first element is less than the second element; the value <code>0</code> if the
-	 *         first element is equal to the second element; and a positive number if the first element is greater than
-	 *         the second element
-	 */
-	private int compareUsageCount(InteractionEventSummary summary1, InteractionEventSummary summary2) {
-		int result = summary1.getUsageCount() - summary2.getUsageCount();
-		result = result < 0 ? -1 : (result > 0) ? 1 : 0;
-		return result;
-	}
-
-	/**
-	 * Returns a number reflecting the collation order of the given summaries based on their names.
-	 * 
-	 * @param summary1
-	 *            the first task element to be ordered
-	 * @param summary2
-	 *            the second task element to be ordered
-	 * @return a negative number if the first element is less than the second element; the value <code>0</code> if the
-	 *         first element is equal to the second element; and a positive number if the first element is greater than
-	 *         the second element
-	 */
-	@SuppressWarnings("unchecked")
-	protected int compareNames(InteractionEventSummary summary1, InteractionEventSummary summary2) {
-		return getComparator().compare(summary1.getName(), summary2.getName());
-	}
-
-	/**
-	 * Returns a number reflecting the collation order of the given summaries based on their types.
-	 * 
-	 * @param summary1
-	 *            the first task element to be ordered
-	 * @param summary2
-	 *            the second task element to be ordered
-	 * @return a negative number if the first element is less than the second element; the value <code>0</code> if the
-	 *         first element is equal to the second element; and a positive number if the first element is greater than
-	 *         the second element
-	 */
-	@SuppressWarnings("unchecked")
-	protected int compareTypes(InteractionEventSummary summary1, InteractionEventSummary summary2) {
-		return getComparator().compare(summary1.getType(), summary2.getType());
-	}
-
-	/**
-	 * Returns the sort criteria of this this sorter.
-	 * 
-	 * @return the sort criterion
-	 */
-	public int getCriteria() {
-		return criteria;
-	}
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/MonitorFileRolloverJob.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/MonitorFileRolloverJob.java
deleted file mode 100644
index 80bed6a..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/MonitorFileRolloverJob.java
+++ /dev/null
@@ -1,285 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.monitor.usage;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.List;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.IJobChangeEvent;
-import org.eclipse.core.runtime.jobs.IJobChangeListener;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.monitor.core.collection.IUsageCollector;
-import org.eclipse.mylyn.internal.monitor.usage.editors.UsageStatsEditorInput;
-import org.eclipse.mylyn.internal.monitor.usage.editors.UsageSummaryReportEditorPart;
-import org.eclipse.mylyn.monitor.core.InteractionEvent;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Job that performs the rollover of the monitor interaction history log file. Overwrites destination if exists!
- * 
- * @author Meghan Allen (modelled after org.eclipse.mylyn.internal.tasks.ui.util.TaskDataExportJob)
- * 
- */
-public class MonitorFileRolloverJob extends Job implements IJobChangeListener {
-
-	private static final String JOB_LABEL = "Mylyn Monitor Log Rollover";
-
-	// XXX: needs to be the same as NAME_DATA_DIR in org.eclipse.mylyn.tasks.ui.TasksUIPlugin
-	private static final String NAME_DATA_DIR = ".mylyn";
-
-	private static final String DIRECTORY_MONITOR_BACKUP = "monitor";
-
-	private static final String ZIP_EXTENSION = ".zip";
-
-	private List<IUsageCollector> collectors = null;
-
-	private ReportGenerator generator = null;
-
-	private IEditorInput input = null;
-
-	private boolean forceSyncForTesting = false;
-
-	public static final String BACKUP_FILE_SUFFIX = "monitor-log";
-
-	public MonitorFileRolloverJob(List<IUsageCollector> collectors) {
-		super(JOB_LABEL);
-		this.collectors = collectors;
-	}
-
-	@SuppressWarnings("deprecation")
-	private String getYear(InteractionEvent event) {
-		return "" + (event.getDate().getYear() + 1900);
-	}
-
-	public void forceSyncForTesting(boolean forceSync) {
-		this.forceSyncForTesting = forceSync;
-	}
-
-	private String getMonth(int month) {
-		switch (month) {
-		case 0:
-			return "01";
-		case 1:
-			return "02";
-		case 2:
-			return "03";
-		case 3:
-			return "04";
-		case 4:
-			return "05";
-		case 5:
-			return "06";
-		case 6:
-			return "07";
-		case 7:
-			return "08";
-		case 8:
-			return "09";
-		case 9:
-			return "10";
-		case 10:
-			return "11";
-		case 11:
-			return "12";
-		default:
-			return "";
-
-		}
-	}
-
-	public static String getZippedMonitorFileDirPath() {
-		return ResourcesPlugin.getWorkspace().getRoot().getLocation().toString() + File.separatorChar + NAME_DATA_DIR
-				+ File.separatorChar + DIRECTORY_MONITOR_BACKUP;
-	}
-
-	@Override
-	@SuppressWarnings("deprecation")
-	public IStatus run(final IProgressMonitor progressMonitor) {
-
-		progressMonitor.beginTask(JOB_LABEL, IProgressMonitor.UNKNOWN);
-
-		final File monitorFile = UiUsageMonitorPlugin.getDefault().getMonitorLogFile();
-		InteractionEventLogger logger = UiUsageMonitorPlugin.getDefault().getInteractionLogger();
-
-		logger.stopMonitoring();
-
-		List<InteractionEvent> events = logger.getHistoryFromFile(monitorFile);
-		progressMonitor.worked(1);
-
-		int nowMonth = Calendar.getInstance().get(Calendar.MONTH);
-		if (events.size() > 0 && events.get(0).getDate().getMonth() != nowMonth) {
-			int currMonth = events.get(0).getDate().getMonth();
-
-			String fileName = getYear(events.get(0)) + "-" + getMonth(currMonth) + "-" + BACKUP_FILE_SUFFIX;
-
-			File dir = new File(getZippedMonitorFileDirPath());
-
-			if (!dir.exists()) {
-				dir.mkdirs();
-			}
-			try {
-				File currBackupZipFile = new File(dir, fileName + ZIP_EXTENSION);
-				if (!currBackupZipFile.exists()) {
-					currBackupZipFile.createNewFile();
-				}
-				ZipOutputStream zipFileStream;
-
-				zipFileStream = new ZipOutputStream(new FileOutputStream(currBackupZipFile));
-				zipFileStream.putNextEntry(new ZipEntry(UiUsageMonitorPlugin.getDefault().getMonitorLogFile().getName()));
-
-				for (InteractionEvent event : events) {
-					int monthOfCurrEvent = event.getDate().getMonth();
-					if (monthOfCurrEvent == currMonth) {
-						// put in curr zip
-						String xml = logger.writeLegacyEvent(event);
-
-						zipFileStream.write(xml.getBytes());
-
-					} else if (monthOfCurrEvent != nowMonth) {
-						// we are finished backing up currMonth, but now need to
-						// start backing up monthOfCurrEvent
-						progressMonitor.worked(1);
-						zipFileStream.closeEntry();
-						zipFileStream.close();
-
-						fileName = getYear(event) + "-" + getMonth(monthOfCurrEvent) + "-" + BACKUP_FILE_SUFFIX;
-						currBackupZipFile = new File(dir, fileName + ZIP_EXTENSION);
-						if (!currBackupZipFile.exists()) {
-
-							currBackupZipFile.createNewFile();
-
-						}
-						zipFileStream = new ZipOutputStream(new FileOutputStream(currBackupZipFile));
-						zipFileStream.putNextEntry(new ZipEntry(UiUsageMonitorPlugin.getDefault()
-								.getMonitorLogFile()
-								.getName()));
-						currMonth = monthOfCurrEvent;
-						String xml = logger.writeLegacyEvent(event);
-						zipFileStream.write(xml.getBytes());
-					} else if (monthOfCurrEvent == nowMonth) {
-						// if these events are from the current event, just put
-						// them back in the current log (first clear the log,
-						// since we are putting them all back)
-
-						logger.clearInteractionHistory(false);
-						logger.interactionObserved(event);
-					}
-				}
-				zipFileStream.closeEntry();
-				zipFileStream.close();
-			} catch (IOException e) {
-				StatusHandler.fail(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID,
-						"Mylyn monitor log rollover failed", e));
-			}
-
-		}
-		progressMonitor.worked(1);
-		logger.startMonitoring();
-
-		generator = new ReportGenerator(UiUsageMonitorPlugin.getDefault().getInteractionLogger(), collectors, this,
-				forceSyncForTesting);
-
-		progressMonitor.worked(1);
-		final List<File> files = new ArrayList<File>();
-
-		files.add(monitorFile);
-		input = new UsageStatsEditorInput(files, generator);
-
-		progressMonitor.done();
-
-		if (forceSyncForTesting) {
-			try {
-				final IEditorInput input = this.input;
-
-				IWorkbenchPage page = UiUsageMonitorPlugin.getDefault()
-						.getWorkbench()
-						.getActiveWorkbenchWindow()
-						.getActivePage();
-				if (page == null) {
-					return new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID, IStatus.OK, "Mylyn Usage Summary",
-							null);
-				}
-				if (input != null) {
-					page.openEditor(input, UsageSummaryReportEditorPart.ID);
-				}
-
-			} catch (PartInitException e) {
-				StatusHandler.fail(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID,
-						"Could not show usage summary", e));
-			}
-
-		}
-
-		return Status.OK_STATUS;
-	}
-
-	public void aboutToRun(IJobChangeEvent event) {
-		// ignore
-
-	}
-
-	public void awake(IJobChangeEvent event) {
-		// ignore
-
-	}
-
-	public void done(IJobChangeEvent event) {
-		PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-			public void run() {
-				try {
-					final IWorkbenchPage page = UiUsageMonitorPlugin.getDefault()
-							.getWorkbench()
-							.getActiveWorkbenchWindow()
-							.getActivePage();
-					if (page == null) {
-						return;
-					}
-
-					if (input != null) {
-						page.openEditor(input, UsageSummaryReportEditorPart.ID);
-					}
-
-				} catch (PartInitException e) {
-					StatusHandler.fail(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID,
-							"Could not show usage summary", e));
-				}
-			}
-		});
-
-	}
-
-	public void running(IJobChangeEvent event) {
-		// ignore
-
-	}
-
-	public void scheduled(IJobChangeEvent event) {
-		// ignore
-
-	}
-
-	public void sleeping(IJobChangeEvent event) {
-		// ignore
-
-	}
-
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/MonitorPreferenceConstants.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/MonitorPreferenceConstants.java
deleted file mode 100644
index 6b79fdd..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/MonitorPreferenceConstants.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.usage;
-
-/**
- * @author Mik Kersten
- */
-public class MonitorPreferenceConstants {
-
-	public static final String PREF_PREVIOUS_TRANSMIT_DATE = "org.eclipse.mylyn.monitor.ui.upload.previousTransmit";
-
-	public static final String PREF_NUM_USER_EVENTS = "org.eclipse.mylyn.monitor.ui.events.observed";
-
-	public static final String PREF_MONITORING_ENABLED = "org.eclipse.mylyn.monitor.ui.enabled";
-
-	public static final String PREF_MONITORING_OBFUSCATE = "org.eclipse.mylyn.monitor.ui.obfuscate";
-
-	public static final String PREF_MONITORING_ENABLE_SUBMISSION = "org.eclipse.mylyn.monitor.enable.submission";
-
-	public static final String PREF_MONITORING_SUBMIT_FREQUENCY = "org.eclipse.mylyn.monitor.submission.frequency";
-
-	public static final String PREF_MONITORING_MYLYN_ECLIPSE_ORG_CONSENT_VIEWED = "org.eclipse.mylyn.monitor.mylyn.eclipse.org.consent.viewed";
-
-	public static final String PREF_MONITORING_STARTED = "org.eclipse.mylyn.monitor.monitoring.started";
-
-	public static final String PREF_MONITORING_INITIALLY_ENABLED = "org.eclipse.mylyn.monitor.initially.enabled";
-
-	public static final String PREF_MONITORING_ENABLE_SUBMISSION_INITITALLY_ENABLED = "org.eclipse.mylyn.monitor.submission.initially.enabled";
-
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/ReportGenerator.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/ReportGenerator.java
deleted file mode 100644
index b538127..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/ReportGenerator.java
+++ /dev/null
@@ -1,379 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.usage;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.IJobChangeListener;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.monitor.core.collection.IUsageCollector;
-import org.eclipse.mylyn.internal.monitor.core.collection.IUsageScanner;
-import org.eclipse.mylyn.internal.monitor.core.collection.InteractionEventComparator;
-import org.eclipse.mylyn.internal.monitor.core.collection.InteractionEventSummary;
-import org.eclipse.mylyn.internal.monitor.core.collection.InteractionEventUtil;
-import org.eclipse.mylyn.monitor.core.InteractionEvent;
-
-/**
- * Used for generating reports of user activity.
- * 
- * @author Mik Kersten
- * @since 3.0
- */
-public class ReportGenerator {
-
-	public static final String SUMMARY_SEPARATOR = "<hr><br>";
-
-	private final InteractionEventLogger logger;
-
-	private UsageStatisticsSummary lastParsedSummary = null;
-
-	private final Set<Integer> userIds = new HashSet<Integer>();
-
-	private final List<IUsageCollector> collectors;
-
-	private List<IUsageScanner> scanners;
-
-	private Map<Integer, Map<String, SortedSet<InteractionEvent>>> allUserEvents;
-
-	private boolean saveAllUserEvents = false;
-
-	private IJobChangeListener listener = null;
-
-	private boolean forceSyncForTesting = false;
-
-	public ReportGenerator(InteractionEventLogger logger, IUsageCollector collector, boolean saveAllUserEvents) {
-		this(logger, collector);
-		this.saveAllUserEvents = saveAllUserEvents;
-	}
-
-	public ReportGenerator(InteractionEventLogger logger, List<IUsageCollector> collectors, boolean saveAllUserEvents) {
-		this(logger, collectors);
-		this.saveAllUserEvents = saveAllUserEvents;
-	}
-
-	public ReportGenerator(InteractionEventLogger logger, IUsageCollector collector) {
-		List<IUsageCollector> collectors = new ArrayList<IUsageCollector>();
-		collectors.add(collector);
-		this.logger = logger;
-		this.collectors = collectors;
-	}
-
-	public ReportGenerator(InteractionEventLogger logger, List<IUsageCollector> collectors) {
-		this.logger = logger;
-		this.collectors = collectors;
-	}
-
-	public ReportGenerator(InteractionEventLogger logger, List<IUsageCollector> collectors,
-			List<IUsageScanner> scanners, IJobChangeListener listener) {
-		this(logger, collectors);
-		this.scanners = scanners;
-	}
-
-	public ReportGenerator(InteractionEventLogger logger, IUsageCollector collector, IJobChangeListener listener) {
-		this(logger, collector);
-		this.listener = listener;
-	}
-
-	public ReportGenerator(InteractionEventLogger logger, List<IUsageCollector> collectors,
-			IJobChangeListener listener, boolean forceSyncForTesting) {
-		this(logger, collectors);
-		this.listener = listener;
-		this.forceSyncForTesting = forceSyncForTesting;
-	}
-
-	public void setScanners(List<IUsageScanner> scanners) {
-		this.scanners = scanners;
-	}
-
-	public void getStatisticsFromInteractionHistory(File source, IJobChangeListener listener) {
-		List<File> sources = new ArrayList<File>();
-		sources.add(source);
-		getStatisticsFromInteractionHistories(sources, listener);
-	}
-
-	public void getStatisticsFromInteractionHistories(List<File> sources, IJobChangeListener jobChangeListener) {
-
-		GenerateStatisticsJob job = new GenerateStatisticsJob(this, sources);
-		if (jobChangeListener != null) {
-			job.addJobChangeListener(jobChangeListener);
-		}
-		if (this.listener != null) {
-			job.addJobChangeListener(this.listener);
-		}
-		job.setPriority(Job.LONG);
-		if (forceSyncForTesting) {
-			job.run(new NullProgressMonitor());
-		} else {
-			job.schedule();
-		}
-
-	}
-
-	public UsageStatisticsSummary getLastParsedSummary() {
-		return lastParsedSummary;
-	}
-
-	/**
-	 * Assuming the file naming convention of <phase>-<version>-usage-<userID>-<date and time>.zip
-	 */
-	private int getUserId(File source) {
-		String userIDText = source.getName();
-		int userId = -1;
-		String prefix = "-usage-";
-
-		if (source.getName().indexOf(prefix) >= 0) {
-			try {
-				userIDText = userIDText.substring(userIDText.indexOf(prefix) + prefix.length(), userIDText.length());
-				userIDText = userIDText.substring(0, userIDText.indexOf("-"));
-				userId = Integer.valueOf(userIDText);
-			} catch (Throwable t) {
-				StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID,
-						"Could not parse user ID from source file", t));
-			}
-		}
-
-		return userId;
-	}
-
-	private String getPhase(File source) {
-		String userIDText = source.getName();
-		String phase = "unknown";
-		String terminator = "-";
-
-		if (source.getName().indexOf(terminator) >= 0) {
-			try {
-				phase = userIDText.substring(0, userIDText.indexOf(terminator) - 1);
-			} catch (Throwable t) {
-				StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID,
-						"Could not parse user ID from source file", t));
-			}
-		}
-		return phase;
-	}
-
-	class GenerateStatisticsJob extends Job {
-
-		private static final String JOB_LABEL = "Mylyn Usage Summary Generation";
-
-		private final ReportGenerator generator;
-
-		private final List<File> sources;
-
-		public GenerateStatisticsJob(ReportGenerator generator, List<File> sources) {
-			super("Generate statistics job");
-			this.generator = generator;
-			this.sources = sources;
-		}
-
-		@Override
-		public IStatus run(IProgressMonitor monitor) {
-
-			if (saveAllUserEvents) {
-				allUserEvents = new HashMap<Integer, Map<String, SortedSet<InteractionEvent>>>();
-			}
-
-			UsageStatisticsSummary statistics = new UsageStatisticsSummary();
-			Map<Integer, Map<String, InteractionEventSummary>> summaryMap = new HashMap<Integer, Map<String, InteractionEventSummary>>();
-
-			Map<Integer, List<File>> filesPerUser = new HashMap<Integer, List<File>>();
-			try {
-
-				// Go through the files to determine which users we have to
-				// process (by user id)
-				for (File source : sources) {
-					int userId = getUserId(source);
-					userIds.add(userId);
-					List<File> filesForUser = null;
-					if (filesPerUser.containsKey(userId)) {
-						filesForUser = filesPerUser.get(userId);
-					}
-					if (filesForUser == null) {
-						filesForUser = new ArrayList<File>();
-					}
-					filesForUser.add(source);
-					filesPerUser.put(userId, filesForUser);
-				}
-			} catch (Throwable t) {
-				StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID,
-						"Could not generate usage report", t));
-			}
-
-			try {
-				// There are three processing events per user
-				monitor.beginTask(JOB_LABEL, userIds.size() * 3);
-
-				// Process the files for each user
-				for (Integer aUser : filesPerUser.keySet()) {
-					Map<String, SortedSet<InteractionEvent>> userEvents = new HashMap<String, SortedSet<InteractionEvent>>();
-
-					for (File aFile : filesPerUser.get(aUser)) {
-						String phase = getPhase(aFile);
-
-						// orderedEvents must be a set because the
-						// monitor-log.xml file contains some duplicate
-						// events and we want to be sure that we ignore the
-						// duplicates in the reporting. Sets
-						// cannot contain duplicates, so orderedEvents will only
-						// accept the unique events.
-						SortedSet<InteractionEvent> orderedEvents;
-						if (userEvents.get(phase) == null) {
-							orderedEvents = new TreeSet<InteractionEvent>(new InteractionEventComparator());
-							orderedEvents.addAll(this.generator.logger.getHistoryFromFile(aFile));
-						} else {
-							orderedEvents = userEvents.get(phase);
-							orderedEvents.addAll(this.generator.logger.getHistoryFromFile(aFile));
-						}
-						userEvents.put(phase, orderedEvents);
-					}
-					monitor.worked(1);
-
-					// If there are scanners registered, give each event to each
-					// scanner in turn
-					if (this.generator.scanners != null && this.generator.scanners.size() > 0) {
-
-						for (Map.Entry<String, SortedSet<InteractionEvent>> eventsPerPhase : userEvents.entrySet()) {
-							// String phaseToProcess = eventsPerPhase.getKey();
-							SortedSet<InteractionEvent> events = eventsPerPhase.getValue();
-
-							for (InteractionEvent event : events) {
-								for (IUsageScanner scanner : this.generator.scanners) {
-									scanner.scanEvent(event, aUser);
-								}
-							}
-						}
-					}
-					monitor.worked(1);
-
-					if (allUserEvents != null) {
-						allUserEvents.put(aUser, userEvents);
-					}
-
-					// Consume all events
-					for (Map.Entry<String, SortedSet<InteractionEvent>> eventsPerPhase : userEvents.entrySet()) {
-						// String phaseToProcess = eventsPerPhase.getKey();
-						SortedSet<InteractionEvent> events = eventsPerPhase.getValue();
-
-						for (InteractionEvent event : events) {
-
-							if (event.getKind().isUserEvent()) { // TODO:
-								// some
-								// collectors
-								// may want
-								// non-user
-								// events
-								for (IUsageCollector collector : this.generator.collectors) {
-									collector.consumeEvent(event, aUser);
-								}
-							}
-							createUsageTableData(summaryMap, event, aUser);
-						}
-					}
-					monitor.worked(1);
-				}
-
-				for (IUsageCollector collector : this.generator.collectors) {
-					statistics.add(collector);
-				}
-
-				// Flatten the summaries for the command usage table
-				List<InteractionEventSummary> flattenedSummaries = new ArrayList<InteractionEventSummary>();
-				Map<String, InteractionEventSummary> combinedUserSummary = new HashMap<String, InteractionEventSummary>();
-
-				// Go through the summary for each user and combine the
-				// information into a table sorted by the command
-				for (Map<String, InteractionEventSummary> userSummary : summaryMap.values()) {
-					for (InteractionEventSummary aSummary : userSummary.values()) {
-						if (!combinedUserSummary.containsKey(aSummary.getName())) {
-							combinedUserSummary.put(aSummary.getName(), new InteractionEventSummary(aSummary));
-						} else {
-							// Could be simplified; but written this way for
-							// clarity
-							InteractionEventSummary combinedSummary = combinedUserSummary.get(aSummary.getName());
-							combinedSummary.combine(aSummary);
-							combinedUserSummary.put(aSummary.getName(), combinedSummary);
-						}
-					}
-
-				}
-
-				flattenedSummaries.addAll(combinedUserSummary.values());
-
-				statistics.setSingleSummaries(flattenedSummaries);
-				this.generator.lastParsedSummary = statistics;
-				monitor.done();
-
-			} catch (Throwable t) {
-				StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID,
-						"Could not generate usage report", t));
-			}
-
-			return Status.OK_STATUS;
-		}
-
-		private void createUsageTableData(Map<Integer, Map<String, InteractionEventSummary>> summaryMap,
-				InteractionEvent event, int userId) {
-			Map<String, InteractionEventSummary> usersSummary = summaryMap.get(userId);
-			if (usersSummary == null) {
-				usersSummary = new HashMap<String, InteractionEventSummary>();
-				summaryMap.put(userId, usersSummary);
-			}
-
-			InteractionEventSummary summary = usersSummary.get(getIdentifier(event));
-			if (summary == null) {
-				summary = new InteractionEventSummary(event.getKind().toString(),
-						InteractionEventUtil.getCleanOriginId(event), 0);
-				usersSummary.put(getIdentifier(event), summary);
-			}
-			summary.setUsageCount(summary.getUsageCount() + 1);
-			summary.setInterestContribution(summary.getInterestContribution() + event.getInterestContribution());
-			summary.setDelta(event.getDelta());
-			summary.addUserId(userId);
-		}
-
-		public String getIdentifier(InteractionEvent event) {
-			return event.getKind().toString() + ':' + InteractionEventUtil.getCleanOriginId(event);
-		}
-
-	}
-
-	public static String formatPercentage(float percentage) {
-		String percentageString = "" + percentage;
-		int indexOf2ndDecimal = percentageString.indexOf('.') + 3;
-		if (indexOf2ndDecimal <= percentageString.length()) {
-			percentageString = percentageString.substring(0, indexOf2ndDecimal);
-		}
-		return percentageString;
-	}
-
-	public List<IUsageCollector> getCollectors() {
-		return collectors;
-	}
-
-	public Map<Integer, Map<String, SortedSet<InteractionEvent>>> getAllUsers() {
-		return allUserEvents;
-	}
-
-	public void forceSyncForTesting(boolean syncForTesting) {
-		this.forceSyncForTesting = syncForTesting;
-
-	}
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/StudyParameters.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/StudyParameters.java
deleted file mode 100644
index 05ddb31..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/StudyParameters.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.usage;
-
-import org.eclipse.mylyn.monitor.usage.AbstractStudyBackgroundPage;
-import org.eclipse.mylyn.monitor.usage.AbstractStudyQuestionnairePage;
-
-/**
- * @author Mik Kersten
- * @author Leah Findlater
- */
-public class StudyParameters {
-
-	private String title = UiUsageMonitorPlugin.DEFAULT_TITLE;
-
-	private String description = UiUsageMonitorPlugin.DEFAULT_DESCRIPTION;
-
-	private AbstractStudyQuestionnairePage questionnairePage = null;
-
-	private AbstractStudyBackgroundPage backgroundPage = null;
-
-	private long transmitPromptPeriod = UiUsageMonitorPlugin.DEFAULT_DELAY_BETWEEN_TRANSMITS;
-
-	private String acceptedUrlList = UiUsageMonitorPlugin.DEFAULT_ACCEPTED_URL_LIST;
-
-	private String useContactField = UiUsageMonitorPlugin.DEFAULT_CONTACT_CONSENT_FIELD;
-
-	private String formsConsent = UiUsageMonitorPlugin.DEFAULT_ETHICS_FORM;
-
-	private String version = UiUsageMonitorPlugin.DEFAULT_VERSION;
-
-	private String servletUrl = UiUsageMonitorPlugin.DEFAULT_UPLOAD_SERVER;
-
-	public String getServletUrl() {
-		return servletUrl;
-	}
-
-	public void setServletUrl(String servletServerUrl) {
-		if (servletUrl != null) {
-			this.servletUrl = servletServerUrl;
-		}
-	}
-
-	public String getFormsConsent() {
-		return formsConsent;
-	}
-
-	public void setFormsConsent(String formsConsent) {
-		if (formsConsent != null) {
-			this.formsConsent = formsConsent;
-		}
-	}
-
-	public long getTransmitPromptPeriod() {
-		return transmitPromptPeriod;
-	}
-
-	public void setTransmitPromptPeriod(long transmitPromptPeriod) {
-		this.transmitPromptPeriod = transmitPromptPeriod;
-	}
-
-	public String getDescription() {
-		return description;
-	}
-
-	public void setDescription(String description) {
-		if (description != null) {
-			this.description = description;
-		}
-	}
-
-	public AbstractStudyQuestionnairePage getQuestionnairePage() {
-		return questionnairePage;
-	}
-
-	public void setQuestionnairePage(AbstractStudyQuestionnairePage questionnairePage) {
-		if (questionnairePage != null) {
-			this.questionnairePage = questionnairePage;
-		}
-	}
-
-	public AbstractStudyBackgroundPage getBackgroundPage() {
-		return backgroundPage;
-	}
-
-	public void setBackgroundPage(AbstractStudyBackgroundPage backgroundPage) {
-		if (backgroundPage != null) {
-			this.backgroundPage = backgroundPage;
-		}
-	}
-
-	public String getTitle() {
-		return title;
-	}
-
-	public void setTitle(String title) {
-		if (title != null) {
-			this.title = title;
-		}
-	}
-
-	public String getAcceptedUrlList() {
-		return this.acceptedUrlList;
-	}
-
-	public void setAcceptedUrlList(String acceptedUrlList) {
-		if (acceptedUrlList != null) {
-			this.acceptedUrlList = acceptedUrlList;
-		}
-	}
-
-	public String getVersion() {
-		return version;
-	}
-
-	public void setVersion(String version) {
-		if (version != null) {
-			this.version = version;
-		}
-	}
-
-	public String getUseContactField() {
-		return useContactField;
-	}
-
-	public void setUseContactField(String useContactField) {
-		if (useContactField != null) {
-			this.useContactField = useContactField;
-		}
-	}
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/UiUsageMonitorPlugin.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/UiUsageMonitorPlugin.java
deleted file mode 100644
index a8c75fb..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/UiUsageMonitorPlugin.java
+++ /dev/null
@@ -1,810 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.usage;
-
-import java.io.File;
-import java.io.IOException;
-import java.net.Proxy;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.apache.commons.httpclient.HttpClient;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExtension;
-import org.eclipse.core.runtime.IExtensionPoint;
-import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.core.runtime.Preferences;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
-import org.eclipse.mylyn.internal.context.core.IContextStoreListener;
-import org.eclipse.mylyn.internal.context.core.InteractionContextManager;
-import org.eclipse.mylyn.internal.monitor.ui.ActionExecutionMonitor;
-import org.eclipse.mylyn.internal.monitor.ui.ActivityChangeMonitor;
-import org.eclipse.mylyn.internal.monitor.ui.KeybindingCommandMonitor;
-import org.eclipse.mylyn.internal.monitor.ui.MenuCommandMonitor;
-import org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin;
-import org.eclipse.mylyn.internal.monitor.ui.PerspectiveChangeMonitor;
-import org.eclipse.mylyn.internal.monitor.ui.PreferenceChangeMonitor;
-import org.eclipse.mylyn.internal.monitor.ui.WindowChangeMonitor;
-import org.eclipse.mylyn.internal.monitor.usage.wizards.NewUsageSummaryEditorWizard;
-import org.eclipse.mylyn.monitor.core.IInteractionEventListener;
-import org.eclipse.mylyn.monitor.ui.AbstractCommandMonitor;
-import org.eclipse.mylyn.monitor.ui.IActionExecutionListener;
-import org.eclipse.mylyn.monitor.ui.IMonitorLifecycleListener;
-import org.eclipse.mylyn.monitor.ui.MonitorUi;
-import org.eclipse.mylyn.monitor.usage.AbstractStudyBackgroundPage;
-import org.eclipse.mylyn.monitor.usage.AbstractStudyQuestionnairePage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ShellEvent;
-import org.eclipse.swt.events.ShellListener;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.IStartup;
-import org.eclipse.ui.IWindowListener;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.update.internal.ui.security.Authentication;
-import org.osgi.framework.BundleContext;
-
-/**
- * @author Mik Kersten
- * @author Shawn Minto
- */
-public class UiUsageMonitorPlugin extends AbstractUIPlugin {
-
-	public static final String PREF_USER_ID = "org.eclipse.mylyn.user.id";
-
-	public static String VERSION = "1.0";
-
-	public static String UPLOAD_FILE_LABEL = "USAGE";
-
-	private static final long HOUR = 3600 * 1000;
-
-	private static final long DAY = HOUR * 24;
-
-	private static final long DELAY_ON_USER_REQUEST = 5 * DAY;
-
-	public static final String DEFAULT_TITLE = "Mylyn Feedback";
-
-	public static final String DEFAULT_DESCRIPTION = "Fill out the following form to help us improve Mylyn based on your input.\n";
-
-	public static final long DEFAULT_DELAY_BETWEEN_TRANSMITS = 21 * 24 * HOUR;
-
-	public static final String DEFAULT_ETHICS_FORM = "doc/study-ethics.html";
-
-	public static final String DEFAULT_VERSION = "";
-
-	public static final String DEFAULT_UPLOAD_SERVER = "http://mylyn.eclipse.org/monitor/upload";
-
-	public static final String DEFAULT_UPLOAD_SERVLET_ID = "/GetUserIDServlet";
-
-	public static final String DEFAULT_UPLOAD_SERVLET = "/MylarUsageUploadServlet";
-
-	public static final String DEFAULT_ACCEPTED_URL_LIST = "";
-
-	public static final String DEFAULT_CONTACT_CONSENT_FIELD = "false";
-
-	public static final String UI_PLUGIN_ID = "org.eclipse.mylyn.ui";
-
-	public static final String MONITOR_LOG_NAME = "monitor-log";
-
-	public static final String PLUGIN_ID = "org.eclipse.mylyn.monitor.usage";
-
-	private InteractionEventLogger interactionLogger;
-
-	private String customizingPlugin = null;
-
-	private PreferenceChangeMonitor preferenceMonitor;
-
-	private PerspectiveChangeMonitor perspectiveMonitor;
-
-	private ActivityChangeMonitor activityMonitor;
-
-	private MenuCommandMonitor menuMonitor;
-
-	private WindowChangeMonitor windowMonitor;
-
-	private KeybindingCommandMonitor keybindingCommandMonitor;
-
-	private static UiUsageMonitorPlugin plugin;
-
-	private final List<IActionExecutionListener> actionExecutionListeners = new ArrayList<IActionExecutionListener>();
-
-	private final List<AbstractCommandMonitor> commandMonitors = new ArrayList<AbstractCommandMonitor>();
-
-	private ResourceBundle resourceBundle;
-
-	private static Date lastTransmit = null;
-
-	private final Authentication uploadAuthentication = null;
-
-	private static boolean performingUpload = false;
-
-	private boolean questionnaireEnabled = true;
-
-	private boolean backgroundEnabled = false;
-
-	private final StudyParameters studyParameters = new StudyParameters();
-
-	private final ListenerList lifecycleListeners = new ListenerList();
-
-	public static class UiUsageMonitorStartup implements IStartup {
-
-		public void earlyStartup() {
-			// everything happens on normal start
-		}
-	}
-
-	private final IWindowListener WINDOW_LISTENER = new IWindowListener() {
-		public void windowActivated(IWorkbenchWindow window) {
-		}
-
-		public void windowDeactivated(IWorkbenchWindow window) {
-		}
-
-		public void windowClosed(IWorkbenchWindow window) {
-			if (window.getShell() != null) {
-				window.getShell().removeShellListener(SHELL_LISTENER);
-			}
-		}
-
-		public void windowOpened(IWorkbenchWindow window) {
-			if (window.getShell() != null && !PlatformUI.getWorkbench().isClosing()) {
-				window.getShell().addShellListener(SHELL_LISTENER);
-			}
-		}
-	};
-
-	private final ShellListener SHELL_LISTENER = new ShellListener() {
-
-		public void shellDeactivated(ShellEvent arg0) {
-			if (!isPerformingUpload() && ContextCorePlugin.getDefault() != null) {
-				for (IInteractionEventListener listener : MonitorUiPlugin.getDefault().getInteractionListeners()) {
-					listener.stopMonitoring();
-				}
-			}
-		}
-
-		public void shellActivated(ShellEvent arg0) {
-//			if (!MonitorUiPlugin.getDefault().suppressConfigurationWizards() && ContextCorePlugin.getDefault() != null) {
-//				checkForStatisticsUpload();
-//			}
-			if (!isPerformingUpload() && ContextCorePlugin.getDefault() != null) {
-				for (IInteractionEventListener listener : MonitorUiPlugin.getDefault().getInteractionListeners()) {
-					listener.startMonitoring();
-				}
-			}
-		}
-
-		public void shellDeiconified(ShellEvent arg0) {
-		}
-
-		public void shellIconified(ShellEvent arg0) {
-		}
-
-		public void shellClosed(ShellEvent arg0) {
-		}
-	};
-
-	private LogMoveUtility logMoveUtility;
-
-	/**
-	 * NOTE: this needs to be a separate class in order to avoid loading ..mylyn.context.core on eager startup
-	 */
-	private class LogMoveUtility {
-
-		private final IContextStoreListener DATA_DIR_MOVE_LISTENER = new IContextStoreListener() {
-
-			public void contextStoreMoved(File file) {
-				if (!isPerformingUpload()) {
-					for (IInteractionEventListener listener : MonitorUiPlugin.getDefault().getInteractionListeners()) {
-						listener.stopMonitoring();
-					}
-					interactionLogger.moveOutputFile(getMonitorLogFile().getAbsolutePath());
-					for (IInteractionEventListener listener : MonitorUiPlugin.getDefault().getInteractionListeners()) {
-						listener.startMonitoring();
-					}
-				}
-			}
-		};
-
-		void start() {
-//			ContextCore.getContextStore().addListener(DATA_DIR_MOVE_LISTENER);
-		}
-
-		void stop() {
-//			ContextCore.getContextStore().removeListener(DATA_DIR_MOVE_LISTENER);
-		}
-	}
-
-	public UiUsageMonitorPlugin() {
-		plugin = this;
-
-	}
-
-	private void initDefaultPrefs() {
-		getPreferenceStore().setDefault(MonitorPreferenceConstants.PREF_MONITORING_OBFUSCATE, true);
-
-		if (!getPreferenceStore().contains(MonitorPreferenceConstants.PREF_MONITORING_INITIALLY_ENABLED)) {
-			getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_MONITORING_INITIALLY_ENABLED, true);
-			getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_MONITORING_ENABLED, true);
-		}
-
-		if (!getPreferenceStore().contains(
-				MonitorPreferenceConstants.PREF_MONITORING_ENABLE_SUBMISSION_INITITALLY_ENABLED)) {
-			getPreferenceStore().setValue(
-					MonitorPreferenceConstants.PREF_MONITORING_ENABLE_SUBMISSION_INITITALLY_ENABLED, true);
-			getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_MONITORING_ENABLE_SUBMISSION, true);
-
-		}
-
-		getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_MONITORING_STARTED, false);
-	}
-
-	@Override
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		initDefaultPrefs();
-		final IWorkbench workbench = PlatformUI.getWorkbench();
-		workbench.getDisplay().asyncExec(new Runnable() {
-			public void run() {
-				try {
-					// ------- moved from synch start
-					new MonitorUsageExtensionPointReader().initExtensions();
-
-					if (preferenceMonitor == null) {
-						preferenceMonitor = new PreferenceChangeMonitor();
-					}
-
-					interactionLogger = new InteractionEventLogger(getMonitorLogFile());
-					perspectiveMonitor = new PerspectiveChangeMonitor();
-					activityMonitor = new ActivityChangeMonitor();
-					windowMonitor = new WindowChangeMonitor();
-					menuMonitor = new MenuCommandMonitor();
-					keybindingCommandMonitor = new KeybindingCommandMonitor();
-
-					// browserMonitor = new BrowserMonitor();
-					// setAcceptedUrlMatchList(studyParameters.getAcceptedUrlList());
-
-					studyParameters.setServletUrl(DEFAULT_UPLOAD_SERVER + DEFAULT_UPLOAD_SERVLET);
-					// ------- moved from synch start
-
-					if (getPreferenceStore().getBoolean(MonitorPreferenceConstants.PREF_MONITORING_ENABLED)) {
-						startMonitoring();
-					}
-
-					if (plugin.getPreferenceStore().contains(MonitorPreferenceConstants.PREF_PREVIOUS_TRANSMIT_DATE)) {
-						lastTransmit = new Date(plugin.getPreferenceStore().getLong(
-								MonitorPreferenceConstants.PREF_PREVIOUS_TRANSMIT_DATE));
-					} else {
-						lastTransmit = new Date();
-						plugin.getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_PREVIOUS_TRANSMIT_DATE,
-								lastTransmit.getTime());
-					}
-				} catch (Throwable t) {
-					StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID,
-							"Monitor failed to start", t));
-				}
-			}
-		});
-	}
-
-	public void startMonitoring() {
-		if (getPreferenceStore().contains(MonitorPreferenceConstants.PREF_MONITORING_STARTED)) {
-			return;
-		}
-		interactionLogger.startMonitoring();
-		for (IInteractionEventListener listener : MonitorUiPlugin.getDefault().getInteractionListeners()) {
-			listener.startMonitoring();
-		}
-
-		IWorkbench workbench = PlatformUI.getWorkbench();
-		MonitorUi.addInteractionListener(interactionLogger);
-		getCommandMonitors().add(keybindingCommandMonitor);
-
-		getActionExecutionListeners().add(new ActionExecutionMonitor());
-		workbench.addWindowListener(WINDOW_LISTENER);
-		for (IWorkbenchWindow w : MonitorUiPlugin.getDefault().getMonitoredWindows()) {
-			if (w.getShell() != null) {
-				w.getShell().addShellListener(SHELL_LISTENER);
-			}
-		}
-
-		if (logMoveUtility == null) {
-			logMoveUtility = new LogMoveUtility();
-		}
-		logMoveUtility.start();
-
-		MonitorUiPlugin.getDefault().addWindowPerspectiveListener(perspectiveMonitor);
-		workbench.getActivitySupport().getActivityManager().addActivityManagerListener(activityMonitor);
-		workbench.getDisplay().addFilter(SWT.Selection, menuMonitor);
-		workbench.addWindowListener(windowMonitor);
-
-		// installBrowserMonitor(workbench);
-
-		for (Object listener : lifecycleListeners.getListeners()) {
-			((IMonitorLifecycleListener) listener).startMonitoring();
-		}
-
-		if (!MonitorUiPlugin.getDefault().suppressConfigurationWizards()) {
-			checkForFirstMonitorUse();
-		}
-		getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_MONITORING_STARTED, true);
-	}
-
-	public void addMonitoredPreferences(Preferences preferences) {
-		if (preferenceMonitor == null) {
-			preferenceMonitor = new PreferenceChangeMonitor();
-		}
-		preferences.addPropertyChangeListener(preferenceMonitor);
-	}
-
-	public void removeMonitoredPreferences(Preferences preferences) {
-		if (preferenceMonitor != null) {
-			preferences.removePropertyChangeListener(preferenceMonitor);
-		} else {
-			StatusHandler.log(new Status(IStatus.WARNING, UiUsageMonitorPlugin.PLUGIN_ID,
-					"UI Usage Monitor not started", new Exception()));
-		}
-	}
-
-	public boolean isObfuscationEnabled() {
-		return UiUsageMonitorPlugin.getPrefs().getBoolean(MonitorPreferenceConstants.PREF_MONITORING_OBFUSCATE);
-	}
-
-	public void stopMonitoring() {
-		if (!getPreferenceStore().contains(MonitorPreferenceConstants.PREF_MONITORING_STARTED)) {
-			return;
-		}
-
-		for (Object listener : lifecycleListeners.getListeners()) {
-			((IMonitorLifecycleListener) listener).stopMonitoring();
-		}
-
-		for (IInteractionEventListener listener : MonitorUiPlugin.getDefault().getInteractionListeners()) {
-			listener.stopMonitoring();
-		}
-
-		IWorkbench workbench = PlatformUI.getWorkbench();
-		MonitorUi.removeInteractionListener(interactionLogger);
-
-		getCommandMonitors().remove(keybindingCommandMonitor);
-		getActionExecutionListeners().remove(new ActionExecutionMonitor());
-
-		workbench.removeWindowListener(WINDOW_LISTENER);
-		for (IWorkbenchWindow w : MonitorUiPlugin.getDefault().getMonitoredWindows()) {
-			if (w.getShell() != null) {
-				w.getShell().removeShellListener(SHELL_LISTENER);
-			}
-		}
-		logMoveUtility.stop();
-		// ContextCore.getPluginPreferences().removePropertyChangeListener(DATA_DIR_MOVE_LISTENER);
-
-		MonitorUiPlugin.getDefault().removeWindowPerspectiveListener(perspectiveMonitor);
-		workbench.getActivitySupport().getActivityManager().removeActivityManagerListener(activityMonitor);
-		workbench.getDisplay().removeFilter(SWT.Selection, menuMonitor);
-		workbench.removeWindowListener(windowMonitor);
-
-		// uninstallBrowserMonitor(workbench);
-		interactionLogger.stopMonitoring();
-
-		getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_MONITORING_STARTED, false);
-	}
-
-	public void addMonitoringLifecycleListener(IMonitorLifecycleListener listener) {
-		lifecycleListeners.add(listener);
-		if (isMonitoringEnabled()) {
-			listener.startMonitoring();
-		}
-	}
-
-	public void removeMonitoringLifecycleListener(IMonitorLifecycleListener listener) {
-		lifecycleListeners.remove(listener);
-	}
-
-	@Override
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-		resourceBundle = null;
-	}
-
-	public void actionObserved(IAction action, String info) {
-		for (IActionExecutionListener listener : actionExecutionListeners) {
-			listener.actionObserved(action);
-		}
-	}
-
-	public List<IActionExecutionListener> getActionExecutionListeners() {
-		return actionExecutionListeners;
-	}
-
-	public List<AbstractCommandMonitor> getCommandMonitors() {
-		return commandMonitors;
-	}
-
-	/**
-	 * Parallels TasksUiPlugin.getDefaultDataDirectory()
-	 */
-	public File getMonitorLogFile() {
-		File rootDir = new File(ResourcesPlugin.getWorkspace().getRoot().getLocation().toString() + "/.metadata/.mylyn");
-		File file = new File(rootDir, MONITOR_LOG_NAME + InteractionContextManager.CONTEXT_FILE_EXTENSION_OLD);
-		if (!file.exists() || !file.canWrite()) {
-			try {
-				file.createNewFile();
-			} catch (IOException e) {
-				StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID,
-						"Could not create monitor file", e));
-			}
-		}
-		return file;
-	}
-
-	private long getUserPromptDelay() {
-		return DELAY_ON_USER_REQUEST / DAY;
-	}
-
-	public void userCancelSubmitFeedback(Date currentTime, boolean wait3Hours) {
-		if (wait3Hours) {
-			lastTransmit.setTime(currentTime.getTime() + DELAY_ON_USER_REQUEST
-					- studyParameters.getTransmitPromptPeriod());
-			plugin.getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_PREVIOUS_TRANSMIT_DATE,
-					lastTransmit.getTime());
-		} else {
-			long day = HOUR * 24;
-			lastTransmit.setTime(currentTime.getTime() + day - studyParameters.getTransmitPromptPeriod());
-			plugin.getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_PREVIOUS_TRANSMIT_DATE,
-					lastTransmit.getTime());
-		}
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static UiUsageMonitorPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the string from the plugin's resource bundle, or 'key' if not found.
-	 */
-	public static String getResourceString(String key) {
-		ResourceBundle bundle = UiUsageMonitorPlugin.getDefault().getResourceBundle();
-		try {
-			return (bundle != null) ? bundle.getString(key) : key;
-		} catch (MissingResourceException e) {
-			return key;
-		}
-	}
-
-	/**
-	 * Returns the plugin's resource bundle,
-	 */
-	public ResourceBundle getResourceBundle() {
-		try {
-			if (resourceBundle == null) {
-				resourceBundle = ResourceBundle.getBundle("org.eclipse.mylyn.monitor.ui.MonitorPluginResources");
-			}
-		} catch (MissingResourceException x) {
-			resourceBundle = null;
-		}
-		return resourceBundle;
-	}
-
-	// TODO: remove
-	private void checkForFirstMonitorUse() {
-
-	}
-
-	// NOTE: not currently used
-	synchronized void checkForStatisticsUpload() {
-		if (!isMonitoringEnabled()) {
-			return;
-		}
-		if (plugin == null || plugin.getPreferenceStore() == null) {
-			return;
-		}
-
-		if (plugin.getPreferenceStore().contains(MonitorPreferenceConstants.PREF_PREVIOUS_TRANSMIT_DATE)) {
-
-			lastTransmit = new Date(plugin.getPreferenceStore().getLong(
-					MonitorPreferenceConstants.PREF_PREVIOUS_TRANSMIT_DATE));
-		} else {
-			lastTransmit = new Date();
-			plugin.getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_PREVIOUS_TRANSMIT_DATE,
-					lastTransmit.getTime());
-		}
-		Date currentTime = new Date();
-
-		if (currentTime.getTime() > lastTransmit.getTime() + studyParameters.getTransmitPromptPeriod()
-				&& getPreferenceStore().getBoolean(MonitorPreferenceConstants.PREF_MONITORING_ENABLE_SUBMISSION)) {
-
-			String ending = getUserPromptDelay() == 1 ? "" : "s";
-			MessageDialog message = new MessageDialog(
-					Display.getDefault().getActiveShell(),
-					"Send Usage Feedback",
-					null,
-					"To help improve the Eclipse and Mylyn user experience please consider uploading your UI usage statistics.",
-					MessageDialog.QUESTION, new String[] { "Open UI Usage Report",
-							"Remind me in " + getUserPromptDelay() + " day" + ending, "Don't ask again" }, 0);
-			int result = 0;
-			if ((result = message.open()) == 0) {
-				// time must be stored right away into preferences, to prevent
-				// other threads
-				lastTransmit.setTime(new Date().getTime());
-				plugin.getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_PREVIOUS_TRANSMIT_DATE,
-						currentTime.getTime());
-
-				if (!plugin.getPreferenceStore().contains(
-						MonitorPreferenceConstants.PREF_MONITORING_MYLYN_ECLIPSE_ORG_CONSENT_VIEWED)
-						|| !plugin.getPreferenceStore().getBoolean(
-								MonitorPreferenceConstants.PREF_MONITORING_MYLYN_ECLIPSE_ORG_CONSENT_VIEWED)) {
-					MessageDialog consentMessage = new MessageDialog(
-							Display.getDefault().getActiveShell(),
-							"Consent",
-							null,
-							"All data that is submitted to mylyn.eclipse.org will be publicly available under the "
-									+ "Eclipse Public License (EPL).  By submitting your data, you are agreeing that it can be publicly "
-									+ "available. Please press cancel on the submission dialog box if you do not wish to share your data.",
-							MessageDialog.INFORMATION, new String[] { IDialogConstants.OK_LABEL }, 0);
-					consentMessage.open();
-					plugin.getPreferenceStore().setValue(
-							MonitorPreferenceConstants.PREF_MONITORING_MYLYN_ECLIPSE_ORG_CONSENT_VIEWED, true);
-				}
-
-				NewUsageSummaryEditorWizard wizard = new NewUsageSummaryEditorWizard();
-				wizard.init(PlatformUI.getWorkbench(), null);
-				// Instantiates the wizard container with the wizard and
-				// opens it
-				WizardDialog dialog = new WizardDialog(Display.getDefault().getActiveShell(), wizard);
-				dialog.create();
-				dialog.open();
-				/*
-				 * the UI usage report is loaded asynchronously so there's no
-				 * synchronous way to know if it failed if (wizard.failed()) {
-				 * lastTransmit.setTime(currentTime.getTime() + DELAY_ON_FAILURE -
-				 * studyParameters.getTransmitPromptPeriod());
-				 * plugin.getPreferenceStore().setValue(MylynMonitorPreferenceConstants.PREF_PREVIOUS_TRANSMIT_DATE,
-				 * currentTime.getTime()); }
-				 */
-
-			} else {
-				if (result == 1) {
-					userCancelSubmitFeedback(currentTime, true);
-				} else {
-					plugin.getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_MONITORING_ENABLE_SUBMISSION,
-							false);
-				}
-			}
-			message.close();
-		}
-	}
-
-	public void incrementObservedEvents(int increment) {
-		int numEvents = getPreferenceStore().getInt(MonitorPreferenceConstants.PREF_NUM_USER_EVENTS);
-		numEvents += increment;
-		getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_NUM_USER_EVENTS, numEvents);
-	}
-
-	// TODO: move to new proxy support
-	@SuppressWarnings("deprecation")
-	public void configureProxy(HttpClient httpClient, String uploadScript) {
-		Proxy proxy = org.eclipse.mylyn.commons.net.WebClientUtil.getPlatformProxy();
-		org.eclipse.mylyn.commons.net.WebClientUtil.setupHttpClient(httpClient, proxy, uploadScript,
-				uploadAuthentication.getUser(), uploadAuthentication.getPassword());
-	}
-
-	public static IPreferenceStore getPrefs() {
-		return getDefault().getPreferenceStore();
-	}
-
-	public static boolean isPerformingUpload() {
-		return performingUpload;
-	}
-
-	public static void setPerformingUpload(boolean performingUpload) {
-		UiUsageMonitorPlugin.performingUpload = performingUpload;
-	}
-
-	public InteractionEventLogger getInteractionLogger() {
-		return interactionLogger;
-	}
-
-	public boolean isQuestionnaireEnabled() {
-		return questionnaireEnabled;
-	}
-
-	public void setQuestionnaireEnabled(boolean questionnaireEnabled) {
-		this.questionnaireEnabled = questionnaireEnabled;
-	}
-
-	class MonitorUsageExtensionPointReader {
-
-		public static final String EXTENSION_ID_STUDY = "org.eclipse.mylyn.monitor.ui.study";
-
-		public static final String ELEMENT_SCRIPTS = "scripts";
-
-		public static final String ELEMENT_SCRIPTS_VERSION = "version";
-
-		public static final String ELEMENT_SCRIPTS_SERVER_URL = "url";
-
-		public static final String ELEMENT_SCRIPTS_UPLOAD_USAGE = "upload";
-
-		public static final String ELEMENT_SCRIPTS_GET_USER_ID = "userId";
-
-		public static final String ELEMENT_SCRIPTS_UPLOAD_QUESTIONNAIRE = "questionnaire";
-
-		public static final String ELEMENT_UI = "ui";
-
-		public static final String ELEMENT_UI_TITLE = "title";
-
-		public static final String ELEMENT_UI_DESCRIPTION = "description";
-
-		public static final String ELEMENT_UI_UPLOAD_PROMPT = "daysBetweenUpload";
-
-		public static final String ELEMENT_UI_QUESTIONNAIRE_PAGE = "questionnairePage";
-
-		public static final String ELEMENT_UI_BACKGROUND_PAGE = "backgroundPage";
-
-		public static final String ELEMENT_UI_CONSENT_FORM = "consentForm";
-
-		public static final String ELEMENT_UI_CONTACT_CONSENT_FIELD = "useContactField";
-
-		public static final String ELEMENT_MONITORS = "monitors";
-
-		public static final String ELEMENT_MONITORS_BROWSER_URL = "browserUrlFilter";
-
-		private boolean extensionsRead = false;
-
-		// private MonitorUsageExtensionPointReader thisReader = new
-		// MonitorUsageExtensionPointReader();
-
-		public void initExtensions() {
-			try {
-				if (!extensionsRead) {
-					IExtensionRegistry registry = Platform.getExtensionRegistry();
-					IExtensionPoint extensionPoint = registry.getExtensionPoint(EXTENSION_ID_STUDY);
-					if (extensionPoint != null) {
-						IExtension[] extensions = extensionPoint.getExtensions();
-						for (IExtension extension : extensions) {
-							IConfigurationElement[] elements = extension.getConfigurationElements();
-							for (IConfigurationElement element : elements) {
-								if (element.getName().compareTo(ELEMENT_SCRIPTS) == 0) {
-									readScripts(element);
-								} else if (element.getName().compareTo(ELEMENT_UI) == 0) {
-									readForms(element);
-								} else if (element.getName().compareTo(ELEMENT_MONITORS) == 0) {
-									readMonitors(element);
-								}
-							}
-							customizingPlugin = extension.getContributor().getName();
-						}
-						extensionsRead = true;
-					}
-				}
-			} catch (Throwable t) {
-				StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID,
-						"Could not read monitor extension", t));
-			}
-		}
-
-		private void readScripts(IConfigurationElement element) {
-			studyParameters.setVersion(element.getAttribute(ELEMENT_SCRIPTS_VERSION));
-		}
-
-		private void readForms(IConfigurationElement element) throws CoreException {
-			studyParameters.setTitle(element.getAttribute(ELEMENT_UI_TITLE));
-			studyParameters.setDescription(element.getAttribute(ELEMENT_UI_DESCRIPTION));
-			if (element.getAttribute(ELEMENT_UI_UPLOAD_PROMPT) != null) {
-				Integer uploadInt = new Integer(element.getAttribute(ELEMENT_UI_UPLOAD_PROMPT));
-				studyParameters.setTransmitPromptPeriod(HOUR * 24 * uploadInt);
-			}
-			studyParameters.setUseContactField(element.getAttribute(ELEMENT_UI_CONTACT_CONSENT_FIELD));
-
-			try {
-				if (element.getAttribute(ELEMENT_UI_QUESTIONNAIRE_PAGE) != null) {
-					Object questionnaireObject = element.createExecutableExtension(ELEMENT_UI_QUESTIONNAIRE_PAGE);
-					if (questionnaireObject instanceof AbstractStudyQuestionnairePage) {
-						AbstractStudyQuestionnairePage page = (AbstractStudyQuestionnairePage) questionnaireObject;
-						studyParameters.setQuestionnairePage(page);
-					}
-				} else {
-					UiUsageMonitorPlugin.getDefault().setQuestionnaireEnabled(false);
-				}
-			} catch (CoreException e) {
-				StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID,
-						"Could not load questionaire", e));
-				UiUsageMonitorPlugin.getDefault().setQuestionnaireEnabled(false);
-			}
-
-			try {
-				if (element.getAttribute(ELEMENT_UI_BACKGROUND_PAGE) != null) {
-					Object backgroundObject = element.createExecutableExtension(ELEMENT_UI_BACKGROUND_PAGE);
-					if (backgroundObject instanceof AbstractStudyBackgroundPage) {
-						AbstractStudyBackgroundPage page = (AbstractStudyBackgroundPage) backgroundObject;
-						studyParameters.setBackgroundPage(page);
-						UiUsageMonitorPlugin.getDefault().setBackgroundEnabled(true);
-					}
-				} else {
-					UiUsageMonitorPlugin.getDefault().setBackgroundEnabled(false);
-				}
-			} catch (CoreException e) {
-				StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID,
-						"Could not load background page", e));
-				UiUsageMonitorPlugin.getDefault().setBackgroundEnabled(false);
-			}
-
-			studyParameters.setFormsConsent("/" + element.getAttribute(ELEMENT_UI_CONSENT_FORM));
-
-		}
-
-		private void readMonitors(IConfigurationElement element) throws CoreException {
-			// TODO: This should parse a list of filters but right now it takes
-			// the
-			// entire string as a single filter.
-			// ArrayList<String> urlList = new ArrayList<String>();
-			String urlList = element.getAttribute(ELEMENT_MONITORS_BROWSER_URL);
-			studyParameters.setAcceptedUrlList(urlList);
-		}
-	}
-
-	public StudyParameters getStudyParameters() {
-		return studyParameters;
-	}
-
-	public String getCustomizingPlugin() {
-		return customizingPlugin;
-	}
-
-	public boolean isMonitoringEnabled() {
-		return getPreferenceStore().getBoolean(MonitorPreferenceConstants.PREF_MONITORING_ENABLED);
-	}
-
-	public String getCustomizedByMessage() {
-		String customizedBy = UiUsageMonitorPlugin.getDefault().getCustomizingPlugin();
-		String message = "NOTE: You have previously downloaded the Mylyn monitor and a user study plug-in with id: "
-				+ customizedBy + "\n" + "If you are not familiar with this plug-in do not upload data.";
-		return message;
-	}
-
-	public boolean isBackgroundEnabled() {
-		return backgroundEnabled;
-	}
-
-	public void setBackgroundEnabled(boolean backgroundEnabled) {
-		this.backgroundEnabled = backgroundEnabled;
-	}
-
-	public String getExtensionVersion() {
-		return studyParameters.getVersion();
-	}
-
-	public boolean usingContactField() {
-		if (studyParameters.getUseContactField().equals("true")) {
-			return true;
-		} else {
-			return false;
-		}
-	}
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/UsageMonitorImages.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/UsageMonitorImages.java
deleted file mode 100644
index a8f35e7..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/UsageMonitorImages.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.usage;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author Mik Kersten
- */
-public class UsageMonitorImages {
-
-	private static ImageRegistry imageRegistry;
-
-	private static final String T_ELCL = "elcl16";
-
-	private static final String T_EVIEW = "eview16";
-
-	private static final URL baseURL = UiUsageMonitorPlugin.getDefault().getBundle().getEntry("/icons/");
-
-	public static final ImageDescriptor REFRESH = create(T_ELCL, "refresh.gif");
-
-	public static final ImageDescriptor SYNCHED = create(T_ELCL, "synched.gif");
-
-	public static final ImageDescriptor REMOVE = create(T_ELCL, "remove.gif");
-
-	public static final ImageDescriptor MONITOR = create(T_EVIEW, "monitor.gif");
-
-	public static final ImageDescriptor ZIP_FILE = create(T_ELCL, "import-zip.gif");
-
-	private static ImageDescriptor create(String prefix, String name) {
-		try {
-			return ImageDescriptor.createFromURL(makeIconFileURL(prefix, name));
-		} catch (MalformedURLException e) {
-			return ImageDescriptor.getMissingImageDescriptor();
-		}
-	}
-
-	private static URL makeIconFileURL(String prefix, String name) throws MalformedURLException {
-		if (baseURL == null) {
-			throw new MalformedURLException();
-		}
-
-		StringBuffer buffer = new StringBuffer(prefix);
-		buffer.append('/');
-		buffer.append(name);
-		return new URL(baseURL, buffer.toString());
-	}
-
-	private static ImageRegistry getImageRegistry() {
-		if (imageRegistry == null) {
-			imageRegistry = new ImageRegistry();
-		}
-
-		return imageRegistry;
-	}
-
-	/**
-	 * Lazily initializes image map.
-	 */
-	public static Image getImage(ImageDescriptor imageDescriptor) {
-		ImageRegistry imageRegistry = getImageRegistry();
-
-		Image image = imageRegistry.get("" + imageDescriptor.hashCode());
-		if (image == null) {
-			image = imageDescriptor.createImage();
-			imageRegistry.put("" + imageDescriptor.hashCode(), image);
-		}
-		return image;
-	}
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/UsageStatisticsSummary.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/UsageStatisticsSummary.java
deleted file mode 100644
index 417f29f..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/UsageStatisticsSummary.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.usage;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.mylyn.internal.monitor.core.collection.IUsageCollector;
-import org.eclipse.mylyn.internal.monitor.core.collection.InteractionEventSummary;
-
-/**
- * Container for statistics
- * 
- * @author Mik Kersten
- */
-public class UsageStatisticsSummary {
-
-	private List<InteractionEventSummary> singleSummaries = new ArrayList<InteractionEventSummary>();
-
-	private final List<IUsageCollector> collectors = new ArrayList<IUsageCollector>();
-
-	public List<InteractionEventSummary> getSingleSummaries() {
-		return singleSummaries;
-	}
-
-	public void setSingleSummaries(List<InteractionEventSummary> singleSummaries) {
-		this.singleSummaries = singleSummaries;
-	}
-
-	public void add(int index, IUsageCollector collector) {
-		collectors.add(index, collector);
-	}
-
-	public void add(IUsageCollector collector) {
-		collectors.add(collector);
-	}
-
-	public List<IUsageCollector> getCollectors() {
-		return collectors;
-	}
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/WebBrowserDialog.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/WebBrowserDialog.java
deleted file mode 100644
index 40fd2aa..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/WebBrowserDialog.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.usage;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-
-/**
- * Dialog to show the contents of an html page to the user
- * 
- * @author Shawn Minto
- */
-public class WebBrowserDialog extends MessageDialog {
-
-	private String data = null;
-
-	private boolean isUrl = false;
-
-	public WebBrowserDialog(Shell parentShell, String dialogTitle, Image dialogTitleImage, String dialogMessage,
-			int dialogImageType, String[] dialogButtonLabels, int defaultIndex, String data, boolean isUrl) {
-		super(parentShell, dialogTitle, dialogTitleImage, dialogMessage, dialogImageType, dialogButtonLabels,
-				defaultIndex);
-		this.data = data;
-		this.isUrl = isUrl;
-	}
-
-	public static int openAcceptAgreement(Shell parent, String title, String message, String data, boolean isUrl) {
-		WebBrowserDialog dialog = new WebBrowserDialog(parent, title, null, // accept
-				// the
-				// default
-				// window
-				// icon
-				message, NONE, new String[] { IDialogConstants.OK_LABEL }, 0, data, isUrl);
-		// ok is the default
-		return dialog.open();
-	}
-
-	@Override
-	public Control createCustomArea(Composite parent) {
-		// super.createCustomArea(parent);
-		// Composite container = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		parent.setLayout(layout);
-		layout.numColumns = 1;
-
-		Browser b = new Browser(parent, SWT.NONE);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		gd.horizontalSpan = 1;
-		gd.verticalSpan = 50;
-		b.setLayoutData(gd);
-		if (isUrl) {
-			b.setUrl(data);
-		} else {
-			b.setText(data);
-		}
-
-		return parent;
-	}
-
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/collectors/PerspectiveUsageCollector.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/collectors/PerspectiveUsageCollector.java
deleted file mode 100644
index 98c3028..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/collectors/PerspectiveUsageCollector.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.usage.collectors;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.mylyn.internal.monitor.core.collection.IUsageCollector;
-import org.eclipse.mylyn.internal.monitor.core.collection.PercentUsageComparator;
-import org.eclipse.mylyn.internal.monitor.ui.PerspectiveChangeMonitor;
-import org.eclipse.mylyn.monitor.core.InteractionEvent;
-
-/**
- * @author Mik Kersten and Leah Findlater
- * 
- * TODO: put unclassified events in dummy perspective
- */
-public class PerspectiveUsageCollector implements IUsageCollector {
-
-	private final Map<String, Integer> perspectiveUsage = new HashMap<String, Integer>();
-
-	private String currentPerspective = "";
-
-	private int numUnassociatedEvents = 0;
-
-	private int numEvents = 0;
-
-	public void consumeEvent(InteractionEvent event, int userId) {
-		numEvents++;
-		if (event.getKind().equals(InteractionEvent.Kind.PREFERENCE)) {
-			if (event.getDelta().equals(PerspectiveChangeMonitor.PERSPECTIVE_ACTIVATED)) {
-				currentPerspective = event.getOriginId();
-				if (!perspectiveUsage.containsKey(event.getOriginId())) {
-					perspectiveUsage.put(event.getOriginId(), 1);
-				}
-			}
-		}
-
-		if (!perspectiveUsage.containsKey(currentPerspective)) {
-			numUnassociatedEvents++;
-			return;
-		}
-
-		perspectiveUsage.put(currentPerspective, perspectiveUsage.get(currentPerspective) + 1);
-	}
-
-	public List<String> getReport() {
-		return getReport(true);
-	}
-
-	public String getReportTitle() {
-		return "Perspective Usage";
-	}
-
-	public void exportAsCSVFile(String directory) {
-		String filename = directory + File.separator + "PerspectiveUsage.csv";
-
-		try {
-			BufferedWriter writer = new BufferedWriter(new FileWriter(new File(filename)));
-
-			// Write header
-			writer.write("Perspective");
-			writer.write(",");
-			writer.write("Events");
-			writer.newLine();
-
-			// Write Data
-			for (String perspective : perspectiveUsage.keySet()) {
-				writer.write(perspective);
-				writer.write(",");
-				writer.write(new Integer(perspectiveUsage.get(perspective)).toString());
-				writer.newLine();
-			}
-
-			writer.write("Unclassified");
-			writer.write(",");
-			writer.write(numUnassociatedEvents);
-			writer.newLine();
-
-			writer.flush();
-			writer.close();
-
-		} catch (IOException e) {
-			System.err.println("Unable to write CVS file <" + filename + ">");
-			e.printStackTrace(System.err);
-		}
-
-	}
-
-	public List<String> getPlainTextReport() {
-		return getReport(false);
-	}
-
-	private List<String> getReport(boolean html) {
-		List<String> summaries = new ArrayList<String>();
-		summaries.add("Perspectives (based on total user events, with " + numUnassociatedEvents
-				+ " unclassified events)");
-		summaries.add(" ");
-
-		List<String> perspectiveUsageList = new ArrayList<String>();
-		for (String perspective : perspectiveUsage.keySet()) {
-			float perspectiveUse = 100 * perspectiveUsage.get(perspective) / (numEvents);
-			String formattedPerspectiveUse = ("" + perspectiveUse);
-			int indexOf2ndDecimal = formattedPerspectiveUse.indexOf('.') + 3;
-			if (indexOf2ndDecimal <= formattedPerspectiveUse.length()) {
-				formattedPerspectiveUse = formattedPerspectiveUse.substring(0, indexOf2ndDecimal);
-			}
-			String perspectiveName = perspective; // .substring(perspective.lastIndexOf(".")+1,
-			// perspective.length());
-			if (perspectiveName.contains("Perspective")) {
-				perspectiveName = perspectiveName.substring(0, perspectiveName.indexOf("Perspective"));
-			}
-			perspectiveUsageList.add(formattedPerspectiveUse + "%: " + perspectiveName + " ("
-					+ perspectiveUsage.get(perspective) + ")");
-		}
-		Collections.sort(perspectiveUsageList, new PercentUsageComparator());
-		for (String perspectiveUsageSummary : perspectiveUsageList) {
-			if (html) {
-				summaries.add("<br>" + perspectiveUsageSummary);
-			} else {
-				summaries.add(perspectiveUsageSummary);
-			}
-		}
-
-		if (perspectiveUsage.size() % 2 != 0) {
-			summaries.add(" ");
-		}
-		return summaries;
-
-	}
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageCountContentProvider.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageCountContentProvider.java
deleted file mode 100644
index 3b5532a..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageCountContentProvider.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.usage.editors;
-
-import java.util.List;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.mylyn.internal.monitor.core.collection.InteractionEventSummary;
-import org.eclipse.mylyn.internal.monitor.usage.ReportGenerator;
-
-/**
- * Acts as proxy to the Taskscape model.
- * 
- * @author Mik Kersten
- */
-class UsageCountContentProvider implements IStructuredContentProvider {
-
-	private final ReportGenerator parser;
-
-	public UsageCountContentProvider(ReportGenerator parser) {
-		this.parser = parser;
-	}
-
-	public void inputChanged(Viewer v, Object oldInput, Object newInput) {
-
-	}
-
-	public void dispose() {
-		// model.removeChangeListener(this);
-	}
-
-	// Return the individual stat summaries as an array of Objects
-
-	public Object[] getElements(Object parent) {
-		if (parser.getLastParsedSummary() == null) {
-			return new Object[] {};
-		} else {
-			List<InteractionEventSummary> stats = parser.getLastParsedSummary().getSingleSummaries();
-			return stats.toArray();
-		}
-	}
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageCountLabelProvider.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageCountLabelProvider.java
deleted file mode 100644
index 19f3672..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageCountLabelProvider.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.usage.editors;
-
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.mylyn.internal.monitor.core.collection.InteractionEventSummary;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * Provides labels for TableViewer 'viewer'.
- * 
- * @author Leah Findlater and Mik Kersten
- */
-class UsageCountLabelProvider extends LabelProvider implements ITableLabelProvider {
-
-	public String getColumnText(Object obj, int index) {
-		String labelText;
-		switch (index) {
-		case 0:
-			labelText = ((InteractionEventSummary) obj).getType();
-			break;
-		case 1:
-			labelText = ((InteractionEventSummary) obj).getName();
-			break;
-		case 2:
-			labelText = String.valueOf(((InteractionEventSummary) obj).getUsageCount());
-			break;
-		// case 3:
-		// labelText = String.valueOf(((InteractionEventSummary)
-		// obj).getInterestContribution());
-		// break;
-		case 3:
-			labelText = String.valueOf(((InteractionEventSummary) obj).getDelta());
-			break;
-		case 4:
-			labelText = ((InteractionEventSummary) obj).getUserIds().toString();
-			break;
-		default:
-			labelText = "";
-		}
-		return labelText;
-	}
-
-	public Image getColumnImage(Object obj, int index) {
-		return null;
-	}
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageEditorPart.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageEditorPart.java
deleted file mode 100644
index 8e1857b..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageEditorPart.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.usage.editors;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.monitor.core.collection.IUsageCollector;
-import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.part.EditorPart;
-
-/**
- * @author Mik Kersten
- * @author Meghan Allen (re-factoring)
- */
-public class UsageEditorPart extends EditorPart {
-
-	protected UsageStatsEditorInput editorInput;
-
-	protected FormToolkit toolkit;
-
-	protected ScrolledForm sForm;
-
-	protected Composite editorComposite;
-
-	@Override
-	public void doSave(IProgressMonitor monitor) {
-	}
-
-	@Override
-	public void doSaveAs() {
-	}
-
-	@Override
-	public void init(IEditorSite site, IEditorInput input) throws PartInitException {
-		setSite(site);
-		setInput(input);
-		editorInput = (UsageStatsEditorInput) input;
-		setPartName(editorInput.getName());
-	}
-
-	@Override
-	public boolean isDirty() {
-		return false;
-	}
-
-	@Override
-	public boolean isSaveAsAllowed() {
-		return false;
-	}
-
-	@Override
-	public void createPartControl(Composite parent) {
-		toolkit = new FormToolkit(parent.getDisplay());
-		sForm = toolkit.createScrolledForm(parent);
-		sForm.getBody().setLayout(new GridLayout());// TableWrapLayout());
-		editorComposite = sForm.getBody();
-		sForm.setText("Usage Summary");
-		toolkit.decorateFormHeading(sForm.getForm());
-		createSummaryStatsSection(editorComposite, toolkit);
-		addSections(editorComposite, toolkit);
-		createActionSection(editorComposite, toolkit);
-	}
-
-	protected void addSections(Composite composite, FormToolkit toolkit) {
-		// none
-	}
-
-	@Override
-	public void setFocus() {
-	}
-
-	protected void createActionSection(Composite parent, FormToolkit toolkit) {
-		Section section = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR);
-		section.setText("Actions");
-		section.setLayout(new GridLayout());
-		section.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		Composite container = toolkit.createComposite(section);
-		section.setClient(container);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		container.setLayout(layout);
-
-		Button exportHtml = toolkit.createButton(container, "Export as HTML", SWT.PUSH | SWT.CENTER);
-		exportHtml.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				exportToHtml();
-			}
-		});
-
-		Button export = toolkit.createButton(container, "Export as CSV Files", SWT.PUSH | SWT.CENTER);
-		export.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				exportToCSV();
-			}
-		});
-	}
-
-	protected void createSummaryStatsSection(Composite parent, FormToolkit toolkit) {
-		for (IUsageCollector collector : editorInput.getReportGenerator().getLastParsedSummary().getCollectors()) {
-			List<String> summary = collector.getPlainTextReport();
-			if (!summary.isEmpty()) {
-				Section summarySection = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR
-						| ExpandableComposite.TWISTIE);
-				summarySection.setText(collector.getReportTitle());
-				summarySection.setLayout(new GridLayout());
-				summarySection.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-				Composite summaryContainer = toolkit.createComposite(summarySection);
-				summaryContainer.setLayout(new GridLayout());
-
-				GridData data = new GridData(GridData.FILL_BOTH);
-				data.horizontalSpan = 1;
-				data.grabExcessHorizontalSpace = true;
-				summaryContainer.setLayoutData(data);
-
-				// GridDataFactory.fillDefaults().grab(true,
-				// false).applyTo(summaryContainer);
-				summarySection.setClient(summaryContainer);
-				/*
-				 * 
-				 * GridLayout attributesLayout = new GridLayout();
-				 * attributesLayout.numColumns = 4;
-				 * attributesLayout.horizontalSpacing = 5;
-				 * attributesLayout.verticalSpacing = 4;
-				 * attributesComposite.setLayout(attributesLayout); GridData
-				 * attributesData = new GridData(GridData.FILL_BOTH);
-				 * attributesData.horizontalSpan = 1;
-				 * attributesData.grabExcessVerticalSpace = false;
-				 * attributesComposite.setLayoutData(attributesData);
-				 * attributesSection.setClient(attributesComposite);
-				 */
-
-				StyledText t = new StyledText(summaryContainer, SWT.NONE);
-				t.setEditable(false);
-				for (String description : summary) {
-					t.append(description + System.getProperty("line.separator"));
-
-				}
-				/*
-				 * Browser browser = new Browser(summaryContainer, SWT.NONE);
-				 * GridData browserLayout = new GridData(GridData.FILL_BOTH);
-				 * browserLayout.heightHint = summary.size() * 25; //
-				 * browserLayout.widthHint = 500;
-				 * browser.setLayoutData(browserLayout); String htmlText = "<html><head><LINK
-				 * REL=STYLESHEET HREF=\"http://eclipse.org/default_style.css\"
-				 * TYPE=\"text/css\"></head><body topmargin=0 leftmargin=0
-				 * rightmargin=0><font size=-1>\n"; for (String description :
-				 * summary) { htmlText += description; System.err.println("> " +
-				 * description); } htmlText += "</font></body></html>";
-				 * browser.setText(htmlText);
-				 */
-				// if (description.equals(ReportGenerator.SUMMARY_SEPARATOR)) {
-				// toolkit.createLabel(summaryContainer,
-				// "---------------------------------");
-				// toolkit.createLabel(summaryContainer,
-				// "---------------------------------");
-				// } else {
-				// Label label = toolkit.createLabel(summaryContainer,
-				// description);
-				// if (!description.startsWith("<h"));
-				// label.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
-				// label.setLayoutData(new
-				// TableWrapData(TableWrapData.FILL_GRAB));
-				// }
-				// }
-			}
-		}
-	}
-
-	protected void exportToCSV() {
-
-		// Ask the user to pick a directory into which to place multiple CSV
-		// files
-		try {
-			DirectoryDialog dialog = new DirectoryDialog(getSite().getWorkbenchWindow().getShell());
-			dialog.setText("Specify a directory for the CSV files");
-			String directoryName = dialog.open();
-
-			File outputFile;
-			FileOutputStream outputStream;
-
-			String filename = directoryName + File.separator + "Usage.csv";
-			outputFile = new File(filename);
-
-			outputStream = new FileOutputStream(outputFile, false);
-
-			// Delegate to all collectors
-			for (IUsageCollector collector : editorInput.getReportGenerator().getCollectors()) {
-				collector.exportAsCSVFile(directoryName);
-			}
-
-			outputStream.flush();
-			outputStream.close();
-
-		} catch (SWTException e) {
-			StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID, "Unable to get directory name",
-					e));
-		} catch (FileNotFoundException e) {
-			StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID, "Could not resolve file", e));
-		} catch (IOException e) {
-			StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID, "Could not write to file", e));
-		}
-	}
-
-	protected void exportToHtml() {
-		File outputFile;
-		try {
-			FileDialog dialog = new FileDialog(getSite().getWorkbenchWindow().getShell());
-			dialog.setText("Specify a file name");
-			dialog.setFilterExtensions(new String[] { "*.html", "*.*" });
-
-			String filename = dialog.open();
-			if (!filename.endsWith(".html")) {
-				filename += ".html";
-			}
-			outputFile = new File(filename);
-			// outputStream = new FileOutputStream(outputFile, true);
-			BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile));
-			writer.write("<html><head>");
-			for (IUsageCollector collector : editorInput.getReportGenerator().getCollectors()) {
-				writer.write("<h3>" + collector.getReportTitle() + "</h3>");
-				for (String reportLine : collector.getReport()) {
-					writer.write(reportLine);
-				}
-				writer.write("<br><hr>");
-			}
-			writer.write("</body></html>");
-			writer.close();
-		} catch (IOException e) {
-			StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID, "Cound not write to file", e));
-		}
-	}
-
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageStatsEditorInput.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageStatsEditorInput.java
deleted file mode 100644
index 5dc8f47..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageStatsEditorInput.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.usage.editors;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.List;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.mylyn.internal.monitor.usage.ReportGenerator;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IPersistableElement;
-
-/**
- * @author Mik Kersten
- * 
- */
-public class UsageStatsEditorInput implements IEditorInput {
-
-	private final ReportGenerator reportGenerator;
-
-	private final List<File> usageFiles;
-
-	/**
-	 * Supports either the single workspace file or multiple zip files.
-	 */
-	public UsageStatsEditorInput(List<File> files, ReportGenerator reportGenerator) {
-		// try {
-		this.reportGenerator = reportGenerator;
-		usageFiles = files;
-		reportGenerator.getStatisticsFromInteractionHistories(usageFiles, null);
-	}
-
-	public boolean exists() {
-		return true;
-	}
-
-	public ImageDescriptor getImageDescriptor() {
-		return null;
-	}
-
-	public String getName() {
-		return "Usage Summary";
-	}
-
-	public IPersistableElement getPersistable() {
-		return null;
-	}
-
-	public String getToolTipText() {
-		return "Mylyn Usage Statistics";
-	}
-
-	@SuppressWarnings("unchecked")
-	public Object getAdapter(Class adapter) {
-		return null;
-	}
-
-	public List<File> getInputFiles() {
-		return usageFiles;
-	}
-
-	public ReportGenerator getReportGenerator() {
-		return reportGenerator;
-	}
-
-	private final byte[] buffer = new byte[8192];
-
-	public void transferData(InputStream sourceStream, OutputStream destination) throws IOException {
-		int bytesRead = 0;
-		while (bytesRead != -1) {
-			bytesRead = sourceStream.read(buffer, 0, buffer.length);
-			if (bytesRead != -1) {
-				destination.write(buffer, 0, bytesRead);
-			}
-		}
-	}
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageSummaryReportEditorPart.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageSummaryReportEditorPart.java
deleted file mode 100644
index 0dc838e..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UsageSummaryReportEditorPart.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.usage.editors;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.monitor.usage.InteractionEventSummarySorter;
-import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
-import org.eclipse.mylyn.internal.monitor.usage.wizards.UsageSubmissionWizard;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.program.Program;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.browser.IWebBrowser;
-import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.browser.WebBrowserPreference;
-import org.eclipse.ui.internal.browser.WorkbenchBrowserSupport;
-
-/**
- * @author Meghan Allen
- */
-
-public class UsageSummaryReportEditorPart extends UsageEditorPart {
-
-	public static final String ID = "org.eclipse.mylyn.monitor.usage.summary.editor";
-
-	private static final long MAX_FILE_LENGTH = 1024 * 1024;
-
-	private static final String URL_USAGE_PAGE = "http://mylyn.eclipse.org/monitor/upload/usageSummary.html";
-
-	private static final String DATE_FORMAT_STRING = "MMMMM d, h:mm a";
-
-	// private static final int MAX_NUM_LINES = 1000;
-
-	private Table table;
-
-	private TableViewer tableViewer;
-
-	private final String[] columnNames = new String[] { "Kind", "ID", "Count" };
-
-	@Override
-	public void createPartControl(Composite parent) {
-		super.createPartControl(parent);
-		sForm.setText(new SimpleDateFormat(DATE_FORMAT_STRING).format(new Date()));
-	}
-
-	@Override
-	protected void addSections(Composite composite, FormToolkit toolkit) {
-		if (editorInput.getReportGenerator().getLastParsedSummary().getSingleSummaries().size() > 0) {
-			createUsageSection(editorComposite, toolkit);
-		}
-	}
-
-	private void createUsageSection(Composite parent, FormToolkit toolkit) {
-		Section section = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR);
-		section.setText("Usage Details");
-		section.setLayout(new GridLayout());
-		section.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		Composite container = toolkit.createComposite(section);
-		section.setClient(container);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 2;
-		container.setLayout(layout);
-
-		createTable(container, toolkit);
-		createTableViewer();
-		toolkit.paintBordersFor(container);
-	}
-
-	@Override
-	protected void createActionSection(Composite parent, FormToolkit toolkit) {
-		Section section = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR);
-		section.setText("Actions");
-		section.setLayout(new GridLayout());
-		section.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		Composite topContainer = toolkit.createComposite(section);
-		GridLayout topContainerLayout = new GridLayout();
-		topContainerLayout.numColumns = 1;
-		topContainer.setLayout(topContainerLayout);
-		section.setClient(topContainer);
-
-		Composite buttonContainer = toolkit.createComposite(topContainer);
-		GridLayout buttonContainerLayout = new GridLayout();
-		buttonContainerLayout.numColumns = 3;
-		buttonContainer.setLayout(buttonContainerLayout);
-
-		Button submitData = toolkit.createButton(buttonContainer, "Submit to Eclipse.org", SWT.PUSH | SWT.CENTER);
-		submitData.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				submitData();
-			}
-		});
-
-		Button viewFile = toolkit.createButton(buttonContainer, "View File", SWT.PUSH | SWT.CENTER);
-		viewFile.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				viewFile();
-			}
-		});
-
-		Button viewStats = toolkit.createButton(buttonContainer, "View Community Statistics", SWT.PUSH | SWT.CENTER);
-		viewStats.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				viewStats();
-			}
-		});
-		Composite labelContainer = toolkit.createComposite(topContainer);
-		GridLayout labelContainerLayout = new GridLayout();
-		labelContainerLayout.numColumns = 1;
-		labelContainer.setLayout(labelContainerLayout);
-		Label submissionLabel = new Label(labelContainer, SWT.NONE);
-		submissionLabel.setText("Only usage of org.eclipse.* IDs will be submitted to Eclipse.org");
-	}
-
-	/**
-	 * TODO: move to Mylyn Web UI stuff
-	 */
-	private void viewStats() {
-		try {
-			if (WebBrowserPreference.getBrowserChoice() == WebBrowserPreference.EXTERNAL) {
-				try {
-					IWorkbenchBrowserSupport support = PlatformUI.getWorkbench().getBrowserSupport();
-					support.getExternalBrowser().openURL(new URL(URL_USAGE_PAGE));
-				} catch (Exception e) {
-					StatusHandler.fail(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID,
-							"Could not open task url", e));
-				}
-			} else {
-				IWebBrowser browser = null;
-				int flags = 0;
-				if (WorkbenchBrowserSupport.getInstance().isInternalWebBrowserAvailable()) {
-					flags = IWorkbenchBrowserSupport.AS_EDITOR | IWorkbenchBrowserSupport.LOCATION_BAR
-							| IWorkbenchBrowserSupport.NAVIGATION_BAR;
-
-				} else {
-					flags = IWorkbenchBrowserSupport.AS_EXTERNAL | IWorkbenchBrowserSupport.LOCATION_BAR
-							| IWorkbenchBrowserSupport.NAVIGATION_BAR;
-				}
-
-				String generatedId = "org.eclipse.mylyn.web.browser-" + Calendar.getInstance().getTimeInMillis();
-				browser = WorkbenchBrowserSupport.getInstance().createBrowser(flags, generatedId, null, null);
-				browser.openURL(new URL(URL_USAGE_PAGE));
-			}
-		} catch (PartInitException e) {
-			MessageDialog.openError(Display.getDefault().getActiveShell(), "Browser init error",
-					"Browser could not be initiated");
-		} catch (MalformedURLException e) {
-			MessageDialog.openError(Display.getDefault().getActiveShell(), "URL not found", "URL Could not be opened");
-		}
-	}
-
-	/**
-	 * Only opens in workbench if file is small enough not to blow it up.
-	 */
-	private void viewFile() {
-		File monitorFile = UiUsageMonitorPlugin.getDefault().getMonitorLogFile();
-
-		if (monitorFile.length() <= MAX_FILE_LENGTH) {
-			IFileStore fileStore = EFS.getLocalFileSystem().getStore(new Path(monitorFile.getAbsolutePath()));
-			if (!fileStore.fetchInfo().isDirectory() && fileStore.fetchInfo().exists()) {
-				IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-				try {
-					IDE.openEditorOnFileStore(page, fileStore);
-				} catch (PartInitException e) {
-				}
-			}
-		} else {
-			boolean failed = false;
-			failed = !Program.launch(monitorFile.getAbsolutePath());
-			if (failed) {
-				Program p = Program.findProgram(".txt");
-				if (p != null) {
-					p.execute(monitorFile.getAbsolutePath());
-				}
-			}
-		}
-	}
-
-	private void submitData() {
-
-		UsageSubmissionWizard submissionWizard = new UsageSubmissionWizard();
-
-		WizardDialog dialog = new WizardDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(),
-				submissionWizard);
-		dialog.open();
-
-	}
-
-	private void createTable(Composite parent, FormToolkit toolkit) {
-		int style = SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION;
-		table = toolkit.createTable(parent, style);
-		TableLayout tlayout = new TableLayout();
-		table.setLayout(tlayout);
-		GridData wd = new GridData(GridData.FILL_HORIZONTAL);
-		wd.heightHint = 300;
-		table.setLayoutData(wd);
-
-		table.setLinesVisible(true);
-		table.setHeaderVisible(true);
-
-		TableColumn column = new TableColumn(table, SWT.LEFT, 0);
-		column.setText(columnNames[0]);
-		column.setWidth(60);
-		column.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				tableViewer.setSorter(new InteractionEventSummarySorter(InteractionEventSummarySorter.TYPE));
-
-			}
-		});
-
-		column = new TableColumn(table, SWT.LEFT, 1);
-		column.setText(columnNames[1]);
-		column.setWidth(370);
-		column.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				tableViewer.setSorter(new InteractionEventSummarySorter(InteractionEventSummarySorter.NAME));
-			}
-		});
-
-		column = new TableColumn(table, SWT.LEFT, 2);
-		column.setText(columnNames[2]);
-		column.setWidth(50);
-		column.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				tableViewer.setSorter(new InteractionEventSummarySorter(InteractionEventSummarySorter.USAGE_COUNT));
-			}
-		});
-
-	}
-
-	private void createTableViewer() {
-		tableViewer = new TableViewer(table);
-		tableViewer.setUseHashlookup(true);
-		tableViewer.setColumnProperties(columnNames);
-
-		tableViewer.setContentProvider(new UsageCountContentProvider(editorInput.getReportGenerator()));
-		tableViewer.setLabelProvider(new UsageCountLabelProvider());
-		tableViewer.setInput(editorInput);
-	}
-
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UserStudyEditorPart.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UserStudyEditorPart.java
deleted file mode 100644
index 7c4dbec..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/editors/UserStudyEditorPart.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.usage.editors;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.monitor.core.collection.IUsageCollector;
-import org.eclipse.mylyn.internal.monitor.usage.InteractionEventSummarySorter;
-import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.SWTException;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapData;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-
-/**
- * @author Mik Kersten
- * @author Meghan Allen (re-factoring)
- */
-public class UserStudyEditorPart extends UsageEditorPart {
-
-	private Table table;
-
-	private TableViewer tableViewer;
-
-	private final String[] columnNames = new String[] { "Kind", "ID", "Num", "Last Delta", "Users" };
-
-	public UserStudyEditorPart(String id, String title) {
-		// super(id, title);
-	}
-
-	@Override
-	protected void addSections(Composite composite, FormToolkit toolkit) {
-		if (editorInput.getReportGenerator().getLastParsedSummary().getSingleSummaries().size() > 0) {
-			createUsageSection(editorComposite, toolkit);
-		}
-	}
-
-	private void createUsageSection(Composite parent, FormToolkit toolkit) {
-		Section section = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR);
-		section.setText("Usage Details");
-		section.setLayout(new TableWrapLayout());
-		section.setLayoutData(new TableWrapData(TableWrapData.FILL_GRAB));
-		Composite container = toolkit.createComposite(section);
-		section.setClient(container);
-		TableWrapLayout layout = new TableWrapLayout();
-		layout.numColumns = 2;
-		container.setLayout(layout);
-
-		createTable(container, toolkit);
-		createTableViewer();
-		toolkit.paintBordersFor(container);
-	}
-
-	private void createTable(Composite parent, FormToolkit toolkit) {
-		int style = SWT.SINGLE | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION;
-		table = toolkit.createTable(parent, style);
-		TableLayout tlayout = new TableLayout();
-		table.setLayout(tlayout);
-		TableWrapData wd = new TableWrapData(TableWrapData.FILL_GRAB);
-		wd.heightHint = 300;
-		wd.grabVertical = true;
-		table.setLayoutData(wd);
-
-		table.setLinesVisible(true);
-		table.setHeaderVisible(true);
-
-		TableColumn column = new TableColumn(table, SWT.LEFT, 0);
-		column.setText(columnNames[0]);
-		column.setWidth(60);
-		column.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				tableViewer.setSorter(new InteractionEventSummarySorter(InteractionEventSummarySorter.TYPE));
-
-			}
-		});
-
-		column = new TableColumn(table, SWT.LEFT, 1);
-		column.setText(columnNames[1]);
-		column.setWidth(370);
-		column.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				tableViewer.setSorter(new InteractionEventSummarySorter(InteractionEventSummarySorter.NAME));
-			}
-		});
-
-		column = new TableColumn(table, SWT.LEFT, 2);
-		column.setText(columnNames[2]);
-		column.setWidth(50);
-		column.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				tableViewer.setSorter(new InteractionEventSummarySorter(InteractionEventSummarySorter.USAGE_COUNT));
-			}
-		});
-
-		// column = new TableColumn(table, SWT.LEFT, 3);
-		// column.setText(columnNames[3]);
-		// column.setWidth(60);
-
-		column = new TableColumn(table, SWT.LEFT, 3);
-		column.setText(columnNames[3]);
-		column.setWidth(60);
-
-		column = new TableColumn(table, SWT.LEFT, 4);
-		column.setText(columnNames[4]);
-		column.setWidth(60);
-	}
-
-	private void createTableViewer() {
-		tableViewer = new TableViewer(table);
-		tableViewer.setUseHashlookup(true);
-		tableViewer.setColumnProperties(columnNames);
-
-		tableViewer.setContentProvider(new UsageCountContentProvider(editorInput.getReportGenerator()));
-		tableViewer.setLabelProvider(new UsageCountLabelProvider());
-		tableViewer.setInput(editorInput);
-	}
-
-	@Override
-	protected void exportToCSV() {
-
-		// Ask the user to pick a directory into which to place multiple CSV
-		// files
-		try {
-			DirectoryDialog dialog = new DirectoryDialog(getSite().getWorkbenchWindow().getShell());
-			dialog.setText("Specify a directory for the CSV files");
-			String directoryName = dialog.open();
-
-			File outputFile;
-			FileOutputStream outputStream;
-
-			String filename = directoryName + File.separator + "Usage.csv";
-			outputFile = new File(filename);
-
-			outputStream = new FileOutputStream(outputFile, false);
-
-			// Delegate to all collectors
-			for (IUsageCollector collector : editorInput.getReportGenerator().getCollectors()) {
-				collector.exportAsCSVFile(directoryName);
-			}
-
-			int columnCount = table.getColumnCount();
-			for (TableItem item : table.getItems()) {
-
-				for (int i = 0; i < columnCount - 1; i++) {
-
-					outputStream.write((item.getText(i) + ",").getBytes());
-				}
-
-				outputStream.write(item.getText(columnCount - 1).getBytes());
-				outputStream.write(("\n").getBytes());
-
-			}
-			outputStream.flush();
-			outputStream.close();
-		} catch (SWTException e) {
-			StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID, "Unable to get directory name",
-					e));
-		} catch (FileNotFoundException e) {
-			StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID, "Could not resolve file", e));
-		} catch (IOException e) {
-			StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID, "Could not write to file", e));
-		}
-	}
-
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/preferences/UsageDataPreferencePage.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/preferences/UsageDataPreferencePage.java
deleted file mode 100644
index c21e50d..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/preferences/UsageDataPreferencePage.java
+++ /dev/null
@@ -1,242 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.usage.preferences;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.mylyn.internal.monitor.usage.InteractionEventObfuscator;
-import org.eclipse.mylyn.internal.monitor.usage.MonitorPreferenceConstants;
-import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-/**
- * @author Mik Kersten
- * @author Ken Sueda
- */
-public class UsageDataPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
-
-	private static final String DESCRIPTION = "If enabled the Mylyn Monitor logs selections, edits, commands, and preference changes. "
-			+ "If you would like to help improve the user experience by anonymously sharing non-private "
-			+ "parts of this data, enable automatic feedback submission or submit your data via the "
-			+ "Usage Summary Wizard.";
-
-	private static final long DAYS_IN_MS = 1000 * 60 * 60 * 24;
-
-	private Button enableMonitoring;
-
-	private Button enableObfuscation;
-
-	private Button enableSubmission;
-
-	private Text logFileText;
-
-	private Text uploadUrl;
-
-	private Text submissionTime;
-
-	public UsageDataPreferencePage() {
-		super();
-		setPreferenceStore(UiUsageMonitorPlugin.getPrefs());
-		setDescription(DESCRIPTION);
-	}
-
-	@Override
-	protected Control createContents(Composite parent) {
-		Composite container = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout(1, false);
-		container.setLayout(layout);
-
-		if (UiUsageMonitorPlugin.getDefault().getCustomizingPlugin() != null) {
-			Label label = new Label(parent, SWT.NULL);
-			label.setText(UiUsageMonitorPlugin.getDefault().getCustomizedByMessage());
-			label.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
-		}
-
-		createLogFileSection(container);
-		createUsageSection(container);
-		updateEnablement();
-		return container;
-	}
-
-	public void init(IWorkbench workbench) {
-		// Nothing to init
-	}
-
-	private void updateEnablement() {
-		if (!enableMonitoring.getSelection()) {
-			logFileText.setEnabled(false);
-			enableSubmission.setEnabled(false);
-			submissionTime.setEnabled(false);
-		} else {
-			logFileText.setEnabled(true);
-			enableSubmission.setEnabled(true);
-			if (!enableSubmission.getSelection()) {
-				submissionTime.setEnabled(false);
-			} else {
-				submissionTime.setEnabled(true);
-			}
-		}
-
-	}
-
-	private void createLogFileSection(Composite parent) {
-		final Group group = new Group(parent, SWT.SHADOW_ETCHED_IN);
-		group.setText("Monitoring");
-		group.setLayout(new GridLayout(2, false));
-		group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		enableMonitoring = new Button(group, SWT.CHECK);
-		enableMonitoring.setText("Enable logging to: ");
-		enableMonitoring.setSelection(getPreferenceStore().getBoolean(
-				MonitorPreferenceConstants.PREF_MONITORING_ENABLED));
-		enableMonitoring.addSelectionListener(new SelectionListener() {
-
-			public void widgetSelected(SelectionEvent e) {
-				updateEnablement();
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				// ignore
-			}
-		});
-
-		String logFilePath = UiUsageMonitorPlugin.getDefault().getMonitorLogFile().getPath();
-		logFilePath = logFilePath.replaceAll("\\\\", "/");
-		logFileText = new Text(group, SWT.BORDER);
-		logFileText.setText(logFilePath);
-		logFileText.setEditable(false);
-		logFileText.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		enableObfuscation = new Button(group, SWT.CHECK);
-		enableObfuscation.setText("Obfuscate elements using: ");
-		enableObfuscation.setSelection(getPreferenceStore().getBoolean(
-				MonitorPreferenceConstants.PREF_MONITORING_OBFUSCATE));
-		Label obfuscationLablel = new Label(group, SWT.NULL);
-		obfuscationLablel.setText(InteractionEventObfuscator.ENCRYPTION_ALGORITHM + " message digest one-way hash");
-	}
-
-	private void createUsageSection(Composite parent) {
-		Group group = new Group(parent, SWT.SHADOW_ETCHED_IN);
-		group.setText("Usage Feedback");
-		group.setLayout(new GridLayout(2, false));
-		group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		Label label = new Label(group, SWT.NULL);
-		label.setText(" Upload URL: ");
-		uploadUrl = new Text(group, SWT.BORDER);
-		uploadUrl.setEditable(false);
-		uploadUrl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		uploadUrl.setText(UiUsageMonitorPlugin.getDefault().getStudyParameters().getServletUrl());
-
-		Label events = new Label(group, SWT.NULL);
-		events.setText(" Events since upload:");
-		Label logged = new Label(group, SWT.NULL);
-		logged.setText("" + getPreferenceStore().getInt(MonitorPreferenceConstants.PREF_NUM_USER_EVENTS));
-
-		Composite enableSubmissionComposite = new Composite(group, SWT.NULL);
-		GridLayout submissionGridLayout = new GridLayout(4, false);
-		submissionGridLayout.marginWidth = 0;
-		submissionGridLayout.marginHeight = 0;
-		enableSubmissionComposite.setLayout(submissionGridLayout);
-		enableSubmission = new Button(enableSubmissionComposite, SWT.CHECK);
-
-		enableSubmission.setText("Enable submission every");
-		enableSubmission.setSelection(getPreferenceStore().getBoolean(
-				MonitorPreferenceConstants.PREF_MONITORING_ENABLE_SUBMISSION));
-		enableSubmission.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				updateEnablement();
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-		submissionTime = new Text(enableSubmissionComposite, SWT.BORDER | SWT.RIGHT);
-		GridData gridData = new GridData();
-		gridData.widthHint = 15;
-		submissionTime.setLayoutData(gridData);
-		long submissionFreq = UiUsageMonitorPlugin.DEFAULT_DELAY_BETWEEN_TRANSMITS;
-		if (UiUsageMonitorPlugin.getPrefs().contains(MonitorPreferenceConstants.PREF_MONITORING_SUBMIT_FREQUENCY)) {
-			submissionFreq = UiUsageMonitorPlugin.getPrefs().getLong(
-					MonitorPreferenceConstants.PREF_MONITORING_SUBMIT_FREQUENCY);
-		}
-		long submissionFreqInDays = submissionFreq / DAYS_IN_MS;
-		submissionTime.setText("" + submissionFreqInDays);
-		submissionTime.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-
-			}
-		});
-		Label label2 = new Label(enableSubmissionComposite, SWT.NONE);
-		label2.setText("days");
-
-	}
-
-	@Override
-	public void performDefaults() {
-		super.performDefaults();
-		logFileText.setText(UiUsageMonitorPlugin.getDefault().getMonitorLogFile().getPath());
-	}
-
-	@Override
-	public boolean performOk() {
-		getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_MONITORING_OBFUSCATE,
-				enableObfuscation.getSelection());
-		if (enableMonitoring.getSelection()) {
-			UiUsageMonitorPlugin.getDefault().startMonitoring();
-		} else {
-			UiUsageMonitorPlugin.getDefault().stopMonitoring();
-		}
-
-		getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_MONITORING_ENABLE_SUBMISSION,
-				enableSubmission.getSelection());
-
-		getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_MONITORING_ENABLED,
-				enableMonitoring.getSelection());
-
-		long transmitFrequency = UiUsageMonitorPlugin.DEFAULT_DELAY_BETWEEN_TRANSMITS;
-
-		String submissionFrequency = submissionTime.getText();
-
-		try {
-			transmitFrequency = Integer.parseInt(submissionFrequency);
-			transmitFrequency *= DAYS_IN_MS;
-		} catch (NumberFormatException nfe) {
-			// do nothing, transmitFrequency will have the default value
-		}
-
-		getPreferenceStore().setValue(MonitorPreferenceConstants.PREF_MONITORING_SUBMIT_FREQUENCY, transmitFrequency);
-
-		UiUsageMonitorPlugin.getDefault().getStudyParameters().setTransmitPromptPeriod(transmitFrequency);
-		return true;
-	}
-
-	@Override
-	public boolean performCancel() {
-		enableMonitoring.setSelection(getPreferenceStore().getBoolean(
-				MonitorPreferenceConstants.PREF_MONITORING_ENABLED));
-		enableObfuscation.setSelection(getPreferenceStore().getBoolean(
-				MonitorPreferenceConstants.PREF_MONITORING_OBFUSCATE));
-		return true;
-	}
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/GetNewUserIdPage.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/GetNewUserIdPage.java
deleted file mode 100644
index ead510f..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/GetNewUserIdPage.java
+++ /dev/null
@@ -1,554 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.usage.wizards;
-
-import java.net.URL;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Page to get a user study id for the user.
- * 
- * @author Mik Kersten
- * @author Shawn Minto
- */
-public class GetNewUserIdPage extends WizardPage {
-
-	private static final String SELECT_BELOW = "<Select Below>";
-
-	private Text firstName;
-
-	private Text lastName;
-
-	private Text emailAddress;
-
-	private Button contactAgreement;
-
-	// private Button anonymous;
-	private Button getNewUid;
-
-	private Button getExistingUid;
-
-	private String first;
-
-	private String last;
-
-	private String email;
-
-	private boolean contactEmail = false;
-
-	private boolean anon;
-
-	private boolean hasValidated = false;
-
-	private String jobFunction = SELECT_BELOW;
-
-	private String companySize = SELECT_BELOW;
-
-	private String companyFunction = SELECT_BELOW;
-
-	private final UsageSubmissionWizard wizard;
-
-	private final boolean performUpload;
-
-	private boolean extendedMonitor = false;
-
-	public GetNewUserIdPage(UsageSubmissionWizard wizard, boolean performUpload) {
-		super("Statistics Wizard");
-		this.performUpload = performUpload;
-		setTitle("Get Mylyn Feedback User ID");
-		setDescription("In order to submit usage feedback you first need to get a User ID.\n");
-		this.wizard = wizard;
-		if (UiUsageMonitorPlugin.getDefault().getCustomizingPlugin() != null) {
-			extendedMonitor = true;
-			String customizedTitle = UiUsageMonitorPlugin.getDefault().getStudyParameters().getTitle();
-			if (!customizedTitle.equals("")) {
-				setTitle(customizedTitle + ": Consent Form and User ID");
-			}
-		}
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		container.setLayout(layout);
-		layout.numColumns = 1;
-		if (extendedMonitor) {
-			createBrowserSection(container);
-			// createAnonymousSection(container);
-			createInstructionSection(container);
-			createNamesSection(container);
-			createJobDetailSection(container);
-			if (UiUsageMonitorPlugin.getDefault().usingContactField()) {
-				createContactSection(container);
-			}
-			createUserIdButtons(container);
-		} else {
-			createAnonymousParticipationButtons(container);
-		}
-		setControl(container);
-	}
-
-	@SuppressWarnings("deprecation")
-	private void createBrowserSection(Composite parent) {
-		if (extendedMonitor) {
-			Label label = new Label(parent, SWT.NULL);
-			label.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
-			label.setText(UiUsageMonitorPlugin.getDefault().getCustomizedByMessage());
-
-			Composite container = new Composite(parent, SWT.NULL);
-			GridLayout layout = new GridLayout();
-			container.setLayout(layout);
-			layout.numColumns = 1;
-			Browser browser = new Browser(parent, SWT.NONE);
-			GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-			gd.heightHint = 200;
-			gd.widthHint = 600;
-			browser.setLayoutData(gd);
-
-			URL url = Platform.getBundle(UiUsageMonitorPlugin.getDefault().getCustomizingPlugin()).getEntry(
-					UiUsageMonitorPlugin.getDefault().getStudyParameters().getFormsConsent());
-			try {
-				URL localURL = Platform.asLocalURL(url);
-				browser.setUrl(localURL.toString());
-			} catch (Exception e) {
-				browser.setText("Feedback description could not be located.");
-			}
-		} else {
-			Label label = new Label(parent, SWT.NULL);
-			label.setText("bla bla");
-		}
-	}
-
-	// private void createAnonymousSection(Composite parent) {
-	// Composite container = new Composite(parent, SWT.NULL);
-	// GridLayout layout = new GridLayout();
-	// container.setLayout(layout);
-	// layout.numColumns = 1;
-	//        
-	// anonymous = new Button(container, SWT.CHECK);
-	// GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
-	// anonymous.setLayoutData(gd);
-	// anonymous.setSelection(false);
-	// anonymous.setText("Anonymous (you must still provide your name and email
-	// for consent purposes)");
-	// anonymous.addSelectionListener(new SelectionListener() {
-	// public void widgetSelected(SelectionEvent e) {
-	// if (e.widget instanceof Button) {
-	// Button b = (Button) e.widget;
-	// anon = b.getSelection();
-	// updateEnablement();
-	// // boolean edit = !anon;
-	// // firstName.setEditable(edit);
-	// // lastName.setEditable(edit);
-	// // emailAddress.setEditable(edit);
-	// GetNewUserIdPage.this.setPageComplete(GetNewUserIdPage.this.isPageComplete());
-	// }
-	// }
-	// public void widgetDefaultSelected(SelectionEvent e) {
-	// // don't care about default selection
-	// }
-	// });
-	// }
-
-	private void createNamesSection(Composite parent) {
-		Composite names = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout(6, true);
-		layout.verticalSpacing = 9;
-		layout.horizontalSpacing = 4;
-		names.setLayout(layout);
-
-		Label label = new Label(names, SWT.NULL);
-		label.setText("First Name:");
-
-		firstName = new Text(names, SWT.BORDER | SWT.SINGLE);
-		GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true);
-		gd.horizontalSpan = 2;
-		firstName.setLayoutData(gd);
-		firstName.setEditable(true);
-		firstName.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				first = firstName.getText();
-				updateEnablement();
-				GetNewUserIdPage.this.setPageComplete(GetNewUserIdPage.this.isPageComplete());
-			}
-		});
-
-		label = new Label(names, SWT.NULL);
-		label.setText("Last Name:");
-
-		lastName = new Text(names, SWT.BORDER | SWT.SINGLE);
-		gd = new GridData(SWT.FILL, SWT.FILL, true, true);
-		gd.horizontalSpan = 2;
-		lastName.setLayoutData(gd);
-		lastName.setEditable(true);
-		lastName.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				last = lastName.getText();
-				updateEnablement();
-				GetNewUserIdPage.this.setPageComplete(GetNewUserIdPage.this.isPageComplete());
-			}
-		});
-
-		label = new Label(names, SWT.NONE);
-		label.setText("Email Address:");
-
-		emailAddress = new Text(names, SWT.BORDER | SWT.SINGLE);
-		gd = new GridData(GridData.GRAB_HORIZONTAL | GridData.FILL_BOTH);
-		gd.horizontalSpan = 5;
-		emailAddress.setLayoutData(gd);
-		emailAddress.setEditable(true);
-		emailAddress.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				email = emailAddress.getText();
-				updateEnablement();
-				GetNewUserIdPage.this.setPageComplete(GetNewUserIdPage.this.isPageComplete());
-			}
-		});
-	}
-
-	private void createJobDetailSection(Composite parent) {
-		Composite container = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		container.setLayout(layout);
-		layout.numColumns = 2;
-
-		Label l = new Label(container, SWT.NULL);
-		l.setText("Job Function:");
-		final Combo jobFunctionCombo = new Combo(container, SWT.DROP_DOWN);
-		jobFunctionCombo.setText(jobFunction);
-		jobFunctionCombo.add("Application Developer");
-		jobFunctionCombo.add("QA/Testing");
-		jobFunctionCombo.add("Program Director");
-		jobFunctionCombo.add("CIO/CTO");
-		jobFunctionCombo.add("VP Development Systems Integrator");
-		jobFunctionCombo.add("Application Architect");
-		jobFunctionCombo.add("Project Manager");
-		jobFunctionCombo.add("Student");
-		jobFunctionCombo.add("Faculty");
-		jobFunctionCombo.add("Business");
-		jobFunctionCombo.add("Analyst");
-		jobFunctionCombo.add("Database Administrator");
-		jobFunctionCombo.add("Other");
-		jobFunctionCombo.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				jobFunction = jobFunctionCombo.getText();
-				updateEnablement();
-			}
-		});
-
-		l = new Label(container, SWT.NULL);
-		l.setText("Company Size:");
-		final Combo companySizecombo = new Combo(container, SWT.DROP_DOWN);
-		companySizecombo.setText(companySize);
-		companySizecombo.add("Individual");
-		companySizecombo.add("<50");
-		companySizecombo.add("50-100");
-		companySizecombo.add("100-500");
-		companySizecombo.add("500-1000");
-		companySizecombo.add("1000-2500");
-		companySizecombo.add(">2500");
-		companySizecombo.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				companySize = companySizecombo.getText();
-				updateEnablement();
-			}
-		});
-
-		l = new Label(container, SWT.NULL);
-		l.setText("Company Business");
-		final Combo companyBuisnesscombo = new Combo(container, SWT.DROP_DOWN);
-		companyBuisnesscombo.setText(companyFunction);
-		companyBuisnesscombo.add("Financial service/insurance");
-		companyBuisnesscombo.add("Energy");
-		companyBuisnesscombo.add("Government");
-		companyBuisnesscombo.add("Hardware Manufacturer");
-		companyBuisnesscombo.add("Networking");
-		companyBuisnesscombo.add("Pharmaceutical/Medical");
-		companyBuisnesscombo.add("Automotive");
-		companyBuisnesscombo.add("Software Manufacturer");
-		companyBuisnesscombo.add("Communications");
-		companyBuisnesscombo.add("Transportation");
-		companyBuisnesscombo.add("Retail");
-		companyBuisnesscombo.add("Utilities");
-		companyBuisnesscombo.add("Other Manufacturing");
-		companyBuisnesscombo.add("Academic/Education");
-		companyBuisnesscombo.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				companyFunction = companyBuisnesscombo.getText();
-				updateEnablement();
-			}
-		});
-	}
-
-	private void createInstructionSection(Composite parent) {
-		Composite container = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 1;
-		container.setLayout(layout);
-
-		Label l = new Label(container, SWT.NONE);
-		// l.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
-		l.setText("To create a user ID please fill in the following information. If you already have an ID please fill out the information again to retrieve it.");
-
-		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
-		l.setLayoutData(gd);
-	}
-
-	private void createContactSection(Composite parent) {
-		Composite container = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 1;
-		container.setLayout(layout);
-
-		contactAgreement = new Button(container, SWT.CHECK);
-		contactAgreement.setText("I would be willing to receive email about my participation in this study.");
-		contactAgreement.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				contactEmail = contactAgreement.getSelection();
-			}
-		});
-	}
-
-	private void createUserIdButtons(Composite parent) {
-		Composite container = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 1;
-		container.setLayout(layout);
-
-		Label l = new Label(container, SWT.NONE);
-		l.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
-		l.setText("By clicking \"I consent\" you acknowledge that you have received this consent form, and are consenting to participate in the study.");
-		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
-		l.setLayoutData(gd);
-
-		container = new Composite(parent, SWT.NULL);
-		layout = new GridLayout();
-		layout.numColumns = 2;
-		container.setLayout(layout);
-
-		getNewUid = new Button(container, SWT.PUSH);
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
-		getNewUid.setLayoutData(gd);
-		getNewUid.setSelection(false);
-		getNewUid.setText("I consent; get me a new user ID");
-		getNewUid.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				if (e.widget instanceof Button) {
-					if (hasAllFields(false)) {
-						if (wizard.getNewUid(first, last, email, anon, jobFunction, companySize, companyFunction,
-								contactEmail) != -1) {
-							if (wizard.getUploadPage() != null) {
-								wizard.getUploadPage().updateUid();
-							}
-							hasValidated = true;
-							MessageDialog.openInformation(Display.getDefault().getActiveShell(), "Mylyn User Study ID",
-									"Your Mylyn user study ID is: " + wizard.getUid());
-						}
-					} else {
-						MessageDialog.openError(Display.getDefault().getActiveShell(), "Incomplete Form Input",
-								"Please complete all of the fields.");
-					}
-					GetNewUserIdPage.this.setPageComplete(GetNewUserIdPage.this.isPageComplete());
-				}
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				// don't care about default selected
-			}
-		});
-
-		getExistingUid = new Button(container, SWT.PUSH);
-		gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
-		getExistingUid.setLayoutData(gd);
-		getExistingUid.setSelection(false);
-		getExistingUid.setText("I have already consented; retrieve my existing user ID");
-		getExistingUid.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				if (e.widget instanceof Button) {
-					if (hasAllFields(true)) {
-						if (wizard.getExistingUid(first, last, email, anon) != -1) {
-							if (wizard.getUploadPage() != null) {
-								wizard.getUploadPage().updateUid();
-							}
-							hasValidated = true;
-							MessageDialog.openInformation(
-									Display.getDefault().getActiveShell(),
-									"Mylyn Feedback User ID",
-									"Your Mylyn feedback ID is: "
-											+ wizard.getUid()
-											+ "\n\nPlease record this number if you are using multiple copies of eclipse so that you do not have to register again.\n\nYou can also retrieve this ID by repeating the consent process at a later time.");
-						}
-					} else {
-						MessageDialog.openError(Display.getDefault().getActiveShell(), "Incomplete Form Input",
-								"Please complete all of the fields.");
-					}
-					GetNewUserIdPage.this.setPageComplete(GetNewUserIdPage.this.isPageComplete());
-				}
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				// don't care about default selected
-			}
-		});
-
-		updateEnablement();
-	}
-
-	private void createAnonymousParticipationButtons(Composite parent) {
-		Composite container = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 1;
-		container.setLayout(layout);
-
-		Label label = new Label(container, SWT.NONE);
-		label.setText("Your data will not be traceable back to you, but an ID helps us analyze the usage statistics.");
-		label = new Label(container, SWT.NONE);
-		label.setText("Before switching workspaces please retrieve this ID from the Mylyn Preferences so that you can use it again.");
-		// GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
-		// label.setLayoutData(gd);
-
-		container = new Composite(parent, SWT.NULL);
-		layout = new GridLayout();
-		layout.numColumns = 2;
-		container.setLayout(layout);
-
-		getNewUid = new Button(container, SWT.PUSH);
-		GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
-		getNewUid.setLayoutData(gd);
-		getNewUid.setSelection(false);
-		getNewUid.setText("Create or Retrieve ID");
-		getNewUid.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				if (e.widget instanceof Button) {
-					if (wizard.getNewUid(null, null, null, true, null, null, null, false) != -1) {
-						if (wizard.getUploadPage() != null) {
-							wizard.getUploadPage().updateUid();
-						}
-						hasValidated = true;
-						MessageDialog.openInformation(
-								Display.getDefault().getActiveShell(),
-								"Mylyn User Study ID",
-								"Your Mylyn user study id is: "
-										+ wizard.getUid()
-										+ "\n Please record this number if you are using multiple copies of eclipse so that you do not have to register again.");
-					}
-					GetNewUserIdPage.this.setPageComplete(GetNewUserIdPage.this.isPageComplete());
-				}
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				// don't care about default selected
-			}
-		});
-		updateEnablement();
-	}
-
-	private void updateEnablement() {
-		if (!extendedMonitor) {
-			return;
-		}
-		boolean nameFilled = (!firstName.getText().equals("") && !lastName.getText().equals("") && !emailAddress.getText()
-				.equals(""))
-				|| anon;
-		// if(nameFilled){
-		// getExistingUid.setEnabled(true);
-		boolean jobFilled = !jobFunction.equals(SELECT_BELOW) && !companyFunction.equals(SELECT_BELOW)
-				&& !companySize.equals(SELECT_BELOW);
-		// if(jobFilled){
-		// getNewUid.setEnabled(true);
-		// } else {
-		// getNewUid.setEnabled(false);
-		// }
-		if (nameFilled && jobFilled) {
-			getNewUid.setEnabled(true);
-			getExistingUid.setEnabled(true);
-		} else {
-			getExistingUid.setEnabled(false);
-			getNewUid.setEnabled(false);
-		}
-	}
-
-	public boolean hasAllFields(boolean existing) {
-		if (!extendedMonitor) {
-			return true;
-		}
-		boolean nameFilled = !firstName.getText().equals("") && !lastName.getText().equals("")
-				&& !emailAddress.getText().equals("");
-		if (!existing) {
-			boolean jobFilled = !jobFunction.equals(SELECT_BELOW) && !companyFunction.equals(SELECT_BELOW)
-					&& !companySize.equals(SELECT_BELOW);
-			return (jobFilled && nameFilled);
-		} else {
-			return nameFilled || anon;
-		}
-	}
-
-	@Override
-	public boolean isPageComplete() {
-		if (hasAllFields(true) && hasValidated) {
-			return true;
-		} else {
-			return false;
-		}
-	}
-
-	@Override
-	public IWizardPage getNextPage() {
-		if (isPageComplete() && performUpload) {
-			wizard.addPage(wizard.getUploadPage());
-		}
-
-		return super.getNextPage();
-
-	}
-
-	public boolean isAnonymous() {
-		return anon;
-	}
-
-	public String getEmailAddress() {
-		return email;
-	}
-
-	public String getFirstName() {
-		return first;
-	}
-
-	public String getLastName() {
-		return last;
-	}
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/NewUsageSummaryEditorWizard.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/NewUsageSummaryEditorWizard.java
deleted file mode 100644
index 4f1e58e..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/NewUsageSummaryEditorWizard.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.usage.wizards;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.mylyn.internal.monitor.core.collection.IUsageCollector;
-import org.eclipse.mylyn.internal.monitor.core.collection.ViewUsageCollector;
-import org.eclipse.mylyn.internal.monitor.usage.MonitorFileRolloverJob;
-import org.eclipse.mylyn.internal.monitor.usage.collectors.PerspectiveUsageCollector;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * @author Meghan Allen
- */
-public class NewUsageSummaryEditorWizard extends Wizard implements INewWizard {
-
-	private static final String TITLE = "New Usage Summary Report";
-
-	private UsageSummaryEditorWizardPage usageSummaryPage;
-
-	public NewUsageSummaryEditorWizard() {
-		super();
-		init();
-		setWindowTitle(TITLE);
-	}
-
-	private void init() {
-		usageSummaryPage = new UsageSummaryEditorWizardPage();
-	}
-
-	@Override
-	public boolean performFinish() {
-
-		if (!usageSummaryPage.includePerspective() && !usageSummaryPage.includeViews()) {
-			return false;
-		}
-
-		List<IUsageCollector> collectors = new ArrayList<IUsageCollector>();
-
-		if (usageSummaryPage.includePerspective()) {
-			collectors.add(new PerspectiveUsageCollector());
-		}
-		if (usageSummaryPage.includeViews()) {
-			ViewUsageCollector mylynViewUsageCollector = new ViewUsageCollector();
-			collectors.add(mylynViewUsageCollector);
-		}
-
-		MonitorFileRolloverJob job = new MonitorFileRolloverJob(collectors);
-		job.setPriority(Job.LONG);
-		job.schedule();
-
-		return true;
-	}
-
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		// ignore
-
-	}
-
-	@Override
-	public void addPages() {
-		addPage(usageSummaryPage);
-	}
-
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageFileSelectionWizardPage.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageFileSelectionWizardPage.java
deleted file mode 100644
index 4e76622..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageFileSelectionWizardPage.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.usage.wizards;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Comparator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.monitor.usage.MonitorFileRolloverJob;
-import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-public class UsageFileSelectionWizardPage extends WizardPage {
-
-	private final static String PAGE_TITLE = "Select any archived Mylyn usage files you wish to upload";
-
-	private static final String DESCRIPTION = "Please select the archived usage files you want to upload to eclipse.org";
-
-	private Table zippedFilesTable;
-
-	public static final String SUBMISSION_LOG_FILE_NAME = "submittedUsageLogs.txt";
-
-	protected UsageFileSelectionWizardPage(String pageName) {
-		super("org.eclipse.mylyn.monitor.usage.fileSelectionPage", PAGE_TITLE,
-				AbstractUIPlugin.imageDescriptorFromPlugin(UiUsageMonitorPlugin.PLUGIN_ID,
-						"icons/wizban/banner-submission.gif"));
-		setDescription(DESCRIPTION);
-	}
-
-	private static List<File> getBackupFiles() {
-		ArrayList<File> backupFiles = new ArrayList<File>();
-		try {
-
-			String destination = MonitorFileRolloverJob.getZippedMonitorFileDirPath();
-
-			File backupFolder = new File(destination);
-
-			if (backupFolder.exists()) {
-				File[] files = backupFolder.listFiles();
-				File submissionLogFile = new File(destination, SUBMISSION_LOG_FILE_NAME);
-
-				if (!submissionLogFile.exists()) {
-					submissionLogFile.createNewFile();
-				}
-
-				FileInputStream inputStream = new FileInputStream(submissionLogFile);
-
-				int bytesRead = 0;
-				byte[] buffer = new byte[1000];
-
-				String fileContents = "";
-
-				if (submissionLogFile.exists()) {
-					while ((bytesRead = inputStream.read(buffer)) != -1) {
-						fileContents += new String(buffer, 0, bytesRead);
-
-					}
-				}
-				for (File file : files) {
-					if (file.getName().contains(MonitorFileRolloverJob.BACKUP_FILE_SUFFIX)
-							&& !fileContents.contains(file.getName())) {
-						backupFiles.add(file);
-					}
-				}
-
-			}
-		} catch (FileNotFoundException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		} catch (IOException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-
-		}
-		return backupFiles;
-	}
-
-	public static boolean unsubmittedLogsExist() {
-		List<File> backupFiles = getBackupFiles();
-		return backupFiles.size() > 0;
-	}
-
-	private void addZippedFileView(Composite composite) {
-		zippedFilesTable = new Table(composite, SWT.BORDER | SWT.MULTI);
-
-		GridDataFactory.fillDefaults().span(2, SWT.DEFAULT).grab(true, true).applyTo(zippedFilesTable);
-
-		TableColumn filenameColumn = new TableColumn(zippedFilesTable, SWT.LEFT);
-		filenameColumn.setWidth(200);
-
-		List<File> backupFiles = getBackupFiles();
-
-		File[] backupFileArray = backupFiles.toArray(new File[backupFiles.size()]);
-
-		if (backupFileArray != null && backupFileArray.length > 0) {
-			Arrays.sort(backupFileArray, new Comparator<File>() {
-				public int compare(File file1, File file2) {
-					return (new Long((file1).lastModified()).compareTo(new Long((file2).lastModified()))) * -1;
-				}
-
-			});
-			for (File file : backupFileArray) {
-				TableItem item = new TableItem(zippedFilesTable, SWT.NONE);
-				item.setData(file.getAbsolutePath());
-				item.setText(file.getName());
-			}
-		}
-	}
-
-	public void createControl(Composite parent) {
-		try {
-			Composite container = new Composite(parent, SWT.NONE);
-			GridLayout layout = new GridLayout(3, false);
-			layout.verticalSpacing = 15;
-			container.setLayout(layout);
-			addZippedFileView(container);
-			setControl(container);
-			// setPageComplete(validate());
-		} catch (RuntimeException e) {
-			// FIXME what exception is caught here?
-			StatusHandler.fail(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID,
-					"Could not create import wizard page", e));
-		}
-	}
-
-	public List<String> getZipFilesSelected() {
-
-		List<String> list = new ArrayList<String>();
-		if (zippedFilesTable.getSelectionCount() >= 1) {
-			TableItem[] selectedItems = zippedFilesTable.getSelection();
-			for (TableItem selectedItem : selectedItems) {
-				list.add(selectedItem.getText());
-			}
-		} else {
-			list.add("<unspecified>");
-		}
-		return list;
-	}
-
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageSubmissionWizard.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageSubmissionWizard.java
deleted file mode 100644
index 7a001a7..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageSubmissionWizard.java
+++ /dev/null
@@ -1,733 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.monitor.usage.wizards;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.lang.reflect.InvocationTargetException;
-import java.net.NoRouteToHostException;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.NameValuePair;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.commons.httpclient.methods.PostMethod;
-import org.apache.commons.httpclient.methods.multipart.FilePart;
-import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
-import org.apache.commons.httpclient.methods.multipart.Part;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.commons.core.ZipFileUtil;
-import org.eclipse.mylyn.internal.monitor.usage.InteractionEventLogger;
-import org.eclipse.mylyn.internal.monitor.usage.MonitorFileRolloverJob;
-import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
-import org.eclipse.mylyn.monitor.core.InteractionEvent;
-import org.eclipse.mylyn.monitor.usage.AbstractStudyBackgroundPage;
-import org.eclipse.mylyn.monitor.usage.AbstractStudyQuestionnairePage;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * A wizard for uploading the Mylyn statistics to a website
- * 
- * @author Shawn Minto
- */
-public class UsageSubmissionWizard extends Wizard implements INewWizard {
-
-	public static final String LOG = "log";
-
-	public static final String STATS = "usage";
-
-	public static final String QUESTIONAIRE = "questionaire";
-
-	public static final String BACKGROUND = "background";
-
-	private static final String ORG_ECLIPSE_PREFIX = "org.eclipse.";
-
-	public static final int HTTP_SERVLET_RESPONSE_SC_OK = 200;
-
-	public static final int SIZE_OF_INT = 8;
-
-	private boolean failed = false;
-
-	private boolean displayBackgroundPage = false;
-
-	private boolean displayFileSelectionPage = false;
-
-	/** The id of the user */
-	private int uid;
-
-	private final File monitorFile = UiUsageMonitorPlugin.getDefault().getMonitorLogFile();
-
-	private static int processedFileCount = 1;
-
-	private UsageUploadWizardPage uploadPage;
-
-	private UsageFileSelectionWizardPage fileSelectionPage;
-
-	// private GetNewUserIdPage getUidPage;
-
-	private AbstractStudyQuestionnairePage questionnairePage;
-
-	private AbstractStudyBackgroundPage backgroundPage;
-
-	private boolean performUpload = true;
-
-	private List<String> backupFilesToUpload;
-
-	public UsageSubmissionWizard() {
-		super();
-		setTitles();
-		init(true);
-	}
-
-	public UsageSubmissionWizard(boolean performUpload) {
-		super();
-		setTitles();
-		init(performUpload);
-	}
-
-	private void setTitles() {
-		super.setDefaultPageImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(UiUsageMonitorPlugin.PLUGIN_ID,
-				"icons/wizban/banner-user.gif"));
-		super.setWindowTitle("Mylyn Feedback");
-	}
-
-	private void init(boolean performUpload) {
-		this.performUpload = performUpload;
-		setNeedsProgressMonitor(true);
-		uid = UiUsageMonitorPlugin.getDefault().getPreferenceStore().getInt(UiUsageMonitorPlugin.PREF_USER_ID);
-		if (uid == 0 || uid == -1) {
-			uid = this.getNewUid();
-			UiUsageMonitorPlugin.getDefault().getPreferenceStore().setValue(UiUsageMonitorPlugin.PREF_USER_ID, uid);
-		}
-		uploadPage = new UsageUploadWizardPage(this);
-		fileSelectionPage = new UsageFileSelectionWizardPage("TODO, change this string");
-		if (UiUsageMonitorPlugin.getDefault().isBackgroundEnabled()) {
-			AbstractStudyBackgroundPage page = UiUsageMonitorPlugin.getDefault()
-					.getStudyParameters()
-					.getBackgroundPage();
-			backgroundPage = page;
-		}
-		if (UiUsageMonitorPlugin.getDefault().isQuestionnaireEnabled() && performUpload) {
-			AbstractStudyQuestionnairePage page = UiUsageMonitorPlugin.getDefault()
-					.getStudyParameters()
-					.getQuestionnairePage();
-			questionnairePage = page;
-		}
-		super.setForcePreviousAndNextButtons(true);
-
-	}
-
-	private File questionnaireFile = null;
-
-	private File backgroundFile = null;
-
-	@Override
-	public boolean performFinish() {
-
-		if (!performUpload) {
-			return true;
-		}
-		if (UiUsageMonitorPlugin.getDefault().isQuestionnaireEnabled() && performUpload && questionnairePage != null) {
-			questionnaireFile = questionnairePage.createFeedbackFile();
-		}
-		if (UiUsageMonitorPlugin.getDefault().isBackgroundEnabled() && performUpload && displayBackgroundPage
-				&& backgroundPage != null) {
-			backgroundFile = backgroundPage.createFeedbackFile();
-		}
-
-		if (displayFileSelectionPage) {
-			backupFilesToUpload = fileSelectionPage.getZipFilesSelected();
-		}
-
-		// final WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
-		// protected void execute(final IProgressMonitor monitor) throws
-		// CoreException {
-		// monitor.beginTask("Uploading user statistics", 3);
-		// performUpload(monitor);
-		// monitor.done();
-		// }
-		// };
-
-		Job j = new Job("Upload User Statistics") {
-
-			@Override
-			protected IStatus run(IProgressMonitor monitor) {
-				try {
-					monitor.beginTask("Uploading user statistics", 3);
-					performUpload(monitor);
-					monitor.done();
-					// op.run(monitor);
-					return Status.OK_STATUS;
-				} catch (Exception e) {
-					Status status = new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID, IStatus.ERROR,
-							"Error uploading statistics", e);
-					StatusHandler.log(status);
-					return status;
-				}
-			}
-		};
-		// j.setUser(true);
-		j.setPriority(Job.DECORATE);
-		j.schedule();
-		return true;
-	}
-
-	public void performUpload(IProgressMonitor monitor) {
-		if (UiUsageMonitorPlugin.getDefault().isBackgroundEnabled() && performUpload && backgroundFile != null) {
-			upload(backgroundFile, BACKGROUND, monitor);
-
-			if (failed) {
-				failed = false;
-			}
-
-			if (backgroundFile.exists()) {
-				backgroundFile.delete();
-			}
-		}
-
-		if (UiUsageMonitorPlugin.getDefault().isQuestionnaireEnabled() && performUpload && questionnaireFile != null) {
-			upload(questionnaireFile, QUESTIONAIRE, monitor);
-
-			if (failed) {
-				failed = false;
-			}
-
-			if (questionnaireFile.exists()) {
-				questionnaireFile.delete();
-			}
-		}
-		File zipFile = zipFilesForUpload();
-		if (zipFile == null) {
-			return;
-		}
-
-		upload(zipFile, STATS, monitor);
-
-		if (zipFile.exists()) {
-			zipFile.delete();
-		}
-
-		if (!failed) {
-			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					// popup a dialog telling the user that the upload was good
-					MessageDialog.openInformation(Display.getCurrent().getActiveShell(), "Successful Upload",
-							"Your usage statistics have been successfully uploaded.\n Thank you for participating.");
-				}
-			});
-		}
-
-		UiUsageMonitorPlugin.getDefault().getInteractionLogger().startMonitoring();
-		UiUsageMonitorPlugin.setPerformingUpload(false);
-		return;
-	}
-
-	public boolean performCancel() {
-		UiUsageMonitorPlugin.getDefault().userCancelSubmitFeedback(new Date(), true);
-		return true;
-	}
-
-	@Override
-	public boolean canFinish() {
-		if (!performUpload) {
-			return true;// getUidPage.isPageComplete();
-		} else {
-			return this.getContainer().getCurrentPage() == uploadPage || !performUpload;
-		}
-	}
-
-	public UsageUploadWizardPage getUploadPage() {
-		return uploadPage;
-	}
-
-	/**
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
-	 *      org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		// no initialization needed
-	}
-
-	@Override
-	public void addPages() {
-		if (UiUsageMonitorPlugin.getDefault().isQuestionnaireEnabled() && performUpload && questionnairePage != null) {
-			addPage(questionnairePage);
-		}
-		if (performUpload) {
-			if (UsageFileSelectionWizardPage.unsubmittedLogsExist()) {
-				addPage(fileSelectionPage);
-				displayFileSelectionPage = true;
-			}
-			addPage(uploadPage);
-		}
-	}
-
-	public void addBackgroundPage() {
-		if (UiUsageMonitorPlugin.getDefault().isBackgroundEnabled() && backgroundPage != null) {
-			addPage(backgroundPage);
-			displayBackgroundPage = true;
-		}
-	}
-
-	/**
-	 * Method to upload a file to a cgi script
-	 * 
-	 * @param f
-	 *            The file to upload
-	 */
-	private void upload(File f, String type, IProgressMonitor monitor) {
-		if (failed) {
-			return;
-		}
-
-		int status = 0;
-
-		try {
-			String servletUrl = UiUsageMonitorPlugin.getDefault().getStudyParameters().getServletUrl();
-			final PostMethod filePost = new PostMethod(servletUrl);
-
-			Part[] parts = { new FilePart("temp.txt", f) };
-
-			filePost.setRequestEntity(new MultipartRequestEntity(parts, filePost.getParams()));
-
-			final HttpClient client = new HttpClient();
-
-			status = client.executeMethod(filePost);
-			filePost.releaseConnection();
-
-		} catch (final Exception e) {
-			// there was a problem with the file upload so throw up an error
-			// dialog to inform the user and log the exception
-			failed = true;
-			if (e instanceof NoRouteToHostException || e instanceof UnknownHostException) {
-				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-					public void run() {
-						MessageDialog.openError(null, "Error Uploading", "There was an error uploading the file"
-								+ ": \n" + "No network connection.  Please try again later");
-					}
-				});
-			} else {
-				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-					public void run() {
-						MessageDialog.openError(null, "Error Uploading", "There was an error uploading the file"
-								+ ": \n" + e.getClass().getCanonicalName());
-					}
-				});
-				StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID, "Error uploading", e));
-			}
-		}
-
-		monitor.worked(1);
-
-		final String filedesc = f.getName();
-
-		final int httpResponseStatus = status;
-
-		if (status == 401) {
-			// The uid was incorrect so inform the user
-			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					MessageDialog.openError(null, "Error Uploading", "There was an error uploading the " + filedesc
-							+ ": \n" + "Your uid was incorrect: " + uid + "\n");
-				}
-			});
-		} else if (status == 407) {
-			failed = true;
-			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					MessageDialog.openError(null, "Error Uploading",
-							"Could not upload because proxy server authentication failed.  Please check your proxy server settings.");
-				}
-			});
-		} else if (status != 200) {
-			failed = true;
-			// there was a problem with the file upload so throw up an error
-			// dialog to inform the user
-			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					MessageDialog.openError(null, "Error Uploading", "There was an error uploading the " + filedesc
-							+ ": \n" + "HTTP Response Code " + httpResponseStatus + "\n" + "Please try again later");
-				}
-			});
-		} else {
-			// the file was uploaded successfully
-		}
-
-	}
-
-	public String getMonitorFileName() {
-		return monitorFile.getAbsolutePath();
-	}
-
-	/** The status from the http request */
-	private int status;
-
-	/** the response for the http request */
-	private String resp;
-
-	public int getExistingUid(String firstName, String lastName, String emailAddress, boolean anonymous) {
-		if (failed) {
-			return -1;
-		}
-		try {
-
-			// TODO, do this method properly
-			// create a new post method
-			String url = UiUsageMonitorPlugin.getDefault().getStudyParameters().getServletUrl()
-					+ UiUsageMonitorPlugin.getDefault().getStudyParameters().getServletUrl();
-			final GetMethod getUidMethod = new GetMethod(url);
-
-			NameValuePair first = new NameValuePair("firstName", firstName);
-			NameValuePair last = new NameValuePair("lastName", lastName);
-			NameValuePair email = new NameValuePair("email", emailAddress);
-			NameValuePair job = new NameValuePair("jobFunction", "");
-			NameValuePair size = new NameValuePair("companySize", "");
-			NameValuePair buisness = new NameValuePair("companyBuisness", "");
-			NameValuePair contact = new NameValuePair("contact", "");
-			NameValuePair anon = null;
-			if (anonymous) {
-				anon = new NameValuePair("anonymous", "true");
-			} else {
-				anon = new NameValuePair("anonymous", "false");
-			}
-
-			if (UiUsageMonitorPlugin.getDefault().usingContactField()) {
-				getUidMethod.setQueryString(new NameValuePair[] { first, last, email, job, size, buisness, anon,
-						contact });
-			} else {
-				getUidMethod.setQueryString(new NameValuePair[] { first, last, email, job, size, buisness, anon });
-			}
-
-			// create a new client and upload the file
-			final HttpClient client = new HttpClient();
-			UiUsageMonitorPlugin.getDefault().configureProxy(client, url);
-
-			ProgressMonitorDialog pmd = new ProgressMonitorDialog(Display.getCurrent().getActiveShell());
-			pmd.run(false, false, new IRunnableWithProgress() {
-				public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-					monitor.beginTask("Get User Id", 1);
-
-					try {
-						status = client.executeMethod(getUidMethod);
-
-						resp = getData(getUidMethod.getResponseBodyAsStream());
-
-						// release the connection to the server
-						getUidMethod.releaseConnection();
-					} catch (final Exception e) {
-						// there was a problem with the file upload so throw up
-						// an error
-						// dialog to inform the user and log the exception
-						failed = true;
-						if (e instanceof NoRouteToHostException || e instanceof UnknownHostException) {
-							PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-								public void run() {
-									MessageDialog.openError(null, "Error Uploading",
-											"There was an error getting a new user id: \n"
-													+ "No network connection.  Please try again later");
-								}
-							});
-						} else {
-							PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-								public void run() {
-									MessageDialog.openError(null, "Error Uploading",
-											"There was an error getting a new user id: \n"
-													+ e.getClass().getCanonicalName() + e.getMessage());
-								}
-							});
-							StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID,
-									"Error uploading", e));
-						}
-					}
-					monitor.worked(1);
-					monitor.done();
-				}
-			});
-
-			if (status != 200) {
-				// there was a problem with the file upload so throw up an error
-				// dialog to inform the user
-
-				failed = true;
-
-				// there was a problem with the file upload so throw up an error
-				// dialog to inform the user
-				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-					public void run() {
-						MessageDialog.openError(null, "Error Getting User ID",
-								"There was an error getting a user id: \n" + "HTTP Response Code " + status + "\n"
-										+ "Please try again later");
-					}
-				});
-			} else {
-				resp = resp.substring(resp.indexOf(":") + 1).trim();
-				uid = Integer.parseInt(resp);
-				UiUsageMonitorPlugin.getDefault().getPreferenceStore().setValue(UiUsageMonitorPlugin.PREF_USER_ID, uid);
-				return uid;
-			}
-
-		} catch (final Exception e) {
-			// there was a problem with the file upload so throw up an error
-			// dialog to inform the user and log the exception
-			failed = true;
-			if (e instanceof NoRouteToHostException || e instanceof UnknownHostException) {
-				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-					public void run() {
-						MessageDialog.openError(null, "Error Uploading", "There was an error getting a new user id: \n"
-								+ "No network connection.  Please try again later");
-					}
-				});
-			} else {
-				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-					public void run() {
-						MessageDialog.openError(null, "Error Uploading", "There was an error getting a new user id: \n"
-								+ e.getClass().getCanonicalName());
-					}
-				});
-				StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID, "Error uploading", e));
-			}
-		}
-		return -1;
-	}
-
-	public int getNewUid() {
-		final PostMethod filePost = new PostMethod(UiUsageMonitorPlugin.DEFAULT_UPLOAD_SERVER
-				+ UiUsageMonitorPlugin.DEFAULT_UPLOAD_SERVLET_ID);
-
-		filePost.addParameter(new NameValuePair("MylarUserID", ""));
-		final HttpClient client = new HttpClient();
-		int status = 0;
-
-		try {
-			status = client.executeMethod(filePost);
-
-			if (status == HTTP_SERVLET_RESPONSE_SC_OK) {
-				InputStream inputStream = filePost.getResponseBodyAsStream();
-				byte[] buffer = new byte[SIZE_OF_INT];
-				int numBytesRead = inputStream.read(buffer);
-				int uid = new Integer(new String(buffer, 0, numBytesRead)).intValue();
-				filePost.releaseConnection();
-
-				return uid;
-			} else {
-				return -1;
-			}
-
-		} catch (final Exception e) {
-			// there was a problem with the file upload so throw up an error
-			// dialog to inform the user and log the exception
-			return -1;
-
-		}
-	}
-
-	public int getNewUid(String firstName, String lastName, String emailAddress, boolean anonymous, String jobFunction,
-			String companySize, String companyFunction, boolean contactEmail) {
-		if (failed) {
-			return -1;
-		}
-		try {
-			addBackgroundPage();
-
-			final PostMethod filePost = new PostMethod(UiUsageMonitorPlugin.DEFAULT_UPLOAD_SERVER
-					+ UiUsageMonitorPlugin.DEFAULT_UPLOAD_SERVLET_ID);
-			filePost.addParameter(new NameValuePair("MylarUserID", ""));
-			final HttpClient client = new HttpClient();
-			int status = 0;
-
-			try {
-				status = client.executeMethod(filePost);
-
-				if (status == 202) {
-					InputStream inputStream = filePost.getResponseBodyAsStream();
-					byte[] buffer = new byte[8];
-					int numBytesRead = inputStream.read(buffer);
-					int uid = new Integer(new String(buffer, 0, numBytesRead)).intValue();
-					filePost.releaseConnection();
-
-					return uid;
-				} else {
-					return -1;
-				}
-
-			} catch (final Exception e) {
-				// there was a problem with the file upload so throw up an error
-				// dialog to inform the user and log the exception
-			}
-
-			// NameValuePair first = new NameValuePair("firstName", firstName);
-			// NameValuePair last = new NameValuePair("lastName", lastName);
-			// NameValuePair email = new NameValuePair("email", emailAddress);
-			// NameValuePair job = new NameValuePair("jobFunction",
-			// jobFunction);
-			// NameValuePair size = new NameValuePair("companySize",
-			// companySize);
-			// NameValuePair buisness = new NameValuePair("companyBuisness",
-			// companyFunction);
-			// NameValuePair contact = null;
-			// if (contactEmail) {
-			// contact = new NameValuePair("contact", "true");
-			// } else {
-			// contact = new NameValuePair("contact", "false");
-			// }
-			// NameValuePair anon = null;
-			// if (anonymous) {
-			// anon = new NameValuePair("anonymous", "true");
-			// } else {
-			// anon = new NameValuePair("anonymous", "false");
-			// }
-
-			if (status != 200) {
-				// there was a problem with the file upload so throw up an error
-				// dialog to inform the user
-
-				failed = true;
-
-				// there was a problem with the file upload so throw up an error
-				// dialog to inform the user
-				MessageDialog.openError(null, "Error Getting User ID", "There was an error getting a user id: \n"
-						+ "HTTP Response Code " + status + "\n" + "Please try again later");
-			} else {
-				resp = resp.substring(resp.indexOf(":") + 1).trim();
-				uid = Integer.parseInt(resp);
-				UiUsageMonitorPlugin.getDefault().getPreferenceStore().setValue(UiUsageMonitorPlugin.PREF_USER_ID, uid);
-				return uid;
-			}
-
-		} catch (Exception e) {
-			// there was a problem with the file upload so throw up an error
-			// dialog to inform the user and log the exception
-			failed = true;
-			if (e instanceof NoRouteToHostException || e instanceof UnknownHostException) {
-				MessageDialog.openError(null, "Error Uploading", "There was an error getting a new user id: \n"
-						+ "No network connection.  Please try again later");
-			} else {
-				MessageDialog.openError(null, "Error Uploading", "There was an error getting a new user id: \n"
-						+ e.getClass().getCanonicalName());
-				StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID, "Error uploading", e));
-			}
-		}
-		return -1;
-	}
-
-	private String getData(InputStream i) {
-		String s = "";
-		String data = "";
-		BufferedReader br = new BufferedReader(new InputStreamReader(i));
-		try {
-			while ((s = br.readLine()) != null) {
-				data += s;
-			}
-		} catch (IOException e) {
-			StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID, "Error uploading", e));
-		}
-		return data;
-	}
-
-	public int getUid() {
-		return uid;
-	}
-
-	public boolean failed() {
-		return failed;
-	}
-
-	private File processMonitorFile(File monitorFile) {
-		File processedFile = new File("processed-" + UiUsageMonitorPlugin.MONITOR_LOG_NAME + processedFileCount++
-				+ ".xml");
-		InteractionEventLogger logger = new InteractionEventLogger(processedFile);
-		logger.startMonitoring();
-		List<InteractionEvent> eventList = logger.getHistoryFromFile(monitorFile);
-
-		if (eventList.size() > 0) {
-			for (InteractionEvent event : eventList) {
-				if (event.getOriginId().startsWith(ORG_ECLIPSE_PREFIX)) {
-					logger.interactionObserved(event);
-				}
-			}
-		}
-
-		return processedFile;
-	}
-
-	private void addToSubmittedLogFile(String fileName) {
-		File submissionLogFile = new File(MonitorFileRolloverJob.getZippedMonitorFileDirPath(),
-				UsageFileSelectionWizardPage.SUBMISSION_LOG_FILE_NAME);
-		try {
-			FileWriter fileWriter = new FileWriter(submissionLogFile, true);
-			fileWriter.append(fileName + "\n");
-			fileWriter.flush();
-			fileWriter.close();
-		} catch (IOException e) {
-			StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID,
-					"Error unzipping backup monitor log files", e));
-		}
-	}
-
-	private File zipFilesForUpload() {
-		UiUsageMonitorPlugin.setPerformingUpload(true);
-		UiUsageMonitorPlugin.getDefault().getInteractionLogger().stopMonitoring();
-
-		List<File> files = new ArrayList<File>();
-		File monitorFile = UiUsageMonitorPlugin.getDefault().getMonitorLogFile();
-		File fileToUpload = this.processMonitorFile(monitorFile);
-		files.add(fileToUpload);
-
-		if (displayFileSelectionPage && backupFilesToUpload.size() > 0) {
-			for (String currFilePath : backupFilesToUpload) {
-				File file = new File(MonitorFileRolloverJob.getZippedMonitorFileDirPath(), currFilePath);
-				if (file.exists()) {
-					List<File> unzippedFiles;
-					try {
-						unzippedFiles = ZipFileUtil.unzipFiles(file, System.getProperty("java.io.tmpdir"));
-
-						if (unzippedFiles.size() > 0) {
-							for (File f : unzippedFiles) {
-								files.add(this.processMonitorFile(f));
-								this.addToSubmittedLogFile(currFilePath);
-							}
-						}
-					} catch (IOException e) {
-						StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID,
-								"Error unzipping backup monitor log files", e));
-					}
-				}
-			}
-		}
-
-		UiUsageMonitorPlugin.getDefault().getInteractionLogger().startMonitoring();
-		try {
-			File zipFile = File.createTempFile(uid + ".", ".zip");
-			ZipFileUtil.createZipFile(zipFile, files);
-			return zipFile;
-		} catch (Exception e) {
-			StatusHandler.log(new Status(IStatus.ERROR, UiUsageMonitorPlugin.PLUGIN_ID, "Error uploading", e));
-			return null;
-		}
-	}
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageSummaryEditorWizardPage.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageSummaryEditorWizardPage.java
deleted file mode 100644
index f35452d..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageSummaryEditorWizardPage.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.usage.wizards;
-
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-/**
- * @author Meghan Allen
- */
-public class UsageSummaryEditorWizardPage extends WizardPage implements IWizardPage {
-
-	private static final String TITLE = "Usage Summary and Submission";
-
-	private static final String DESCRIPTION = "Summarizes usage and provides mechanism for uploading to eclipse.org \n"
-			+ "server for usage analysis. May take a lot of memory for large histories.";
-
-	private Button perspectiveCheckbox = null;
-
-	private Button viewCheckbox = null;
-
-	public UsageSummaryEditorWizardPage() {
-		super(TITLE);
-		setTitle(TITLE);
-		setDescription(DESCRIPTION);
-		setImageDescriptor(AbstractUIPlugin.imageDescriptorFromPlugin(UiUsageMonitorPlugin.PLUGIN_ID,
-				"icons/wizban/banner-usage.gif"));
-	}
-
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.FILL);
-		GridLayout layout = new GridLayout();
-		container.setLayout(layout);
-		layout.numColumns = 1;
-
-		Label label = new Label(container, SWT.LEFT);
-		label.setText("This will run in the background because it may take a long time for large histories.\n"
-				+ "The editor will open when the summary has been generated.");
-
-		createCheckboxes(container);
-
-		setControl(container);
-
-	}
-
-	private void createCheckboxes(Composite parent) {
-		Group checkboxGroup = new Group(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 1;
-
-		checkboxGroup.setLayout(layout);
-		checkboxGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
-		checkboxGroup.setText("Show usage summaries for:");
-		checkboxGroup.setFont(parent.getFont());
-
-		perspectiveCheckbox = new Button(checkboxGroup, SWT.CHECK | SWT.LEFT | SWT.NO_FOCUS);
-		perspectiveCheckbox.setText("Use of perspectives");
-		perspectiveCheckbox.setSelection(true);
-		perspectiveCheckbox.addSelectionListener(new CheckboxSelectionListener());
-
-		viewCheckbox = new Button(checkboxGroup, SWT.CHECK | SWT.LEFT | SWT.NO_FOCUS);
-		viewCheckbox.setText("Use of views");
-		viewCheckbox.setSelection(true);
-		viewCheckbox.addSelectionListener(new CheckboxSelectionListener());
-	}
-
-	public boolean includePerspective() {
-		return perspectiveCheckbox.getSelection();
-	}
-
-	public boolean includeViews() {
-		return viewCheckbox.getSelection();
-	}
-
-	private class CheckboxSelectionListener extends SelectionAdapter {
-
-		@Override
-		public void widgetSelected(SelectionEvent e) {
-			if (!perspectiveCheckbox.getSelection() && !viewCheckbox.getSelection()) {
-				setPageComplete(false);
-			} else {
-				setPageComplete(true);
-			}
-		}
-
-	}
-
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageUploadWizardPage.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageUploadWizardPage.java
deleted file mode 100644
index add1728..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/internal/monitor/usage/wizards/UsageUploadWizardPage.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.monitor.usage.wizards;
-
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Page to upload the file to the server
- * 
- * @author Shawn Minto
- * @author Mik Kersten
- */
-public class UsageUploadWizardPage extends WizardPage {
-
-	// private static final int MAX_NUM_LINES = 1000;
-
-	/** A text box to hold the address of the server */
-	private Text serverAddrText;
-
-	/** A text box to hold the location of the usage statistics file */
-	private Text usageFileText;
-
-	// /** A text box to hold the location of the log file */
-	// private Text logFileText;
-
-	/** A text file to show the id of the user */
-	private Text idText;
-
-	private final UsageSubmissionWizard wizard;
-
-	/**
-	 * Constructor
-	 */
-	public UsageUploadWizardPage(UsageSubmissionWizard wizard) {
-		super("Usage Data Submission Wizard");
-
-		setTitle("Usage Data Submission");
-		if (UiUsageMonitorPlugin.getDefault().getCustomizingPlugin() != null) {
-			String customizedTitle = UiUsageMonitorPlugin.getDefault().getStudyParameters().getTitle();
-			if (!customizedTitle.equals("")) {
-				setTitle(customizedTitle + ": Usage Data Upload");
-			}
-		}
-
-		setDescription("The usage file listed below will be uploaded along with the archived files you selected (there may not have been any to select from).\n"
-				+ "Information about program elements that you worked with is obfuscated to ensure privacy.");
-		// setDescription(
-		// "The files listed below will be uploaded. Information about program
-		// elements that you "
-		// + "worked with is obfuscated to ensure privacy.");
-		this.wizard = wizard;
-	}
-
-	/**
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout();
-		container.setLayout(layout);
-		layout.numColumns = 1;
-
-		Composite topContainer = new Composite(container, SWT.NULL);
-		GridLayout topContainerLayout = new GridLayout();
-		topContainer.setLayout(topContainerLayout);
-		topContainerLayout.numColumns = 2;
-		topContainerLayout.verticalSpacing = 9;
-
-		Label label;
-		if (UiUsageMonitorPlugin.getDefault().getCustomizingPlugin() != null) {
-			label = new Label(parent, SWT.NULL);
-			label.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DEFAULT_FONT));
-			label.setText(UiUsageMonitorPlugin.getDefault().getCustomizedByMessage());
-		}
-
-		label = new Label(topContainer, SWT.NULL);
-		label.setText("Upload URL:");
-
-		serverAddrText = new Text(topContainer, SWT.BORDER | SWT.SINGLE);
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		serverAddrText.setLayoutData(gd);
-		serverAddrText.setEditable(false);
-		serverAddrText.setText(UiUsageMonitorPlugin.getDefault().getStudyParameters().getServletUrl());
-
-		label = new Label(topContainer, SWT.NULL);
-		label.setText("Usage file location:");
-
-		usageFileText = new Text(topContainer, SWT.BORDER | SWT.SINGLE);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		usageFileText.setLayoutData(gd);
-		usageFileText.setEditable(false);
-
-		usageFileText.setText(wizard.getMonitorFileName());
-
-		Composite bottomContainer = new Composite(container, SWT.NULL);
-		GridLayout bottomContainerLayout = new GridLayout();
-		bottomContainer.setLayout(bottomContainerLayout);
-		bottomContainerLayout.numColumns = 2;
-
-		Label submissionLabel = new Label(bottomContainer, SWT.NONE);
-		submissionLabel.setText("Only events from org.eclipse.* packages will be submitted to Eclipse.org");
-
-		setControl(container);
-	}
-
-	@Override
-	public IWizardPage getNextPage() {
-		return null;
-	}
-
-	public void updateUid() {
-		if (idText != null && !idText.isDisposed()) {
-			idText.setText(wizard.getUid() + "");
-		}
-	}
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/monitor/usage/AbstractStudyBackgroundPage.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/monitor/usage/AbstractStudyBackgroundPage.java
deleted file mode 100644
index 739cc53..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/monitor/usage/AbstractStudyBackgroundPage.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.monitor.usage;
-
-import java.io.File;
-
-import org.eclipse.jface.wizard.IWizardPage;
-
-/**
- * Extend to provide a custom background page.
- * 
- * @author Leah Findlater
- * @author Mik Kersten
- * @since 2.0
- */
-public abstract class AbstractStudyBackgroundPage implements IWizardPage {
-
-	public abstract File createFeedbackFile();
-}
diff --git a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/monitor/usage/AbstractStudyQuestionnairePage.java b/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/monitor/usage/AbstractStudyQuestionnairePage.java
deleted file mode 100644
index f8c10b4..0000000
--- a/org.eclipse.mylyn.monitor.usage/src/org/eclipse/mylyn/monitor/usage/AbstractStudyQuestionnairePage.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.monitor.usage;
-
-import java.io.File;
-
-import org.eclipse.jface.wizard.WizardPage;
-
-/**
- * Extend to provide a custom questionnaire page.
- * 
- * @author Mik Kersten
- * @since 2.0
- */
-public abstract class AbstractStudyQuestionnairePage extends WizardPage {
-
-	public AbstractStudyQuestionnairePage(String name) {
-		super(name);
-	}
-
-	public abstract File createFeedbackFile();
-}
diff --git a/org.eclipse.mylyn.sandbox.dev/.classpath b/org.eclipse.mylyn.sandbox.dev/.classpath
deleted file mode 100644
index 45ae018..0000000
--- a/org.eclipse.mylyn.sandbox.dev/.classpath
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
-		<accessrules>
-			<accessrule kind="accessible" pattern="**/internal/**"/>
-		</accessrules>
-	</classpathentry>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
-		<accessrules>
-			<accessrule kind="nonaccessible" pattern="com/sun/**"/>
-		</accessrules>
-	</classpathentry>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.mylyn.sandbox.dev/.cvsignore b/org.eclipse.mylyn.sandbox.dev/.cvsignore
deleted file mode 100644
index 4a98758..0000000
--- a/org.eclipse.mylyn.sandbox.dev/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-.fbwarnings
diff --git a/org.eclipse.mylyn.sandbox.dev/.project b/org.eclipse.mylyn.sandbox.dev/.project
deleted file mode 100644
index b9cc1ab..0000000
--- a/org.eclipse.mylyn.sandbox.dev/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.mylyn.sandbox.dev</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.mylyn.sandbox.dev/.settings/.api_filters b/org.eclipse.mylyn.sandbox.dev/.settings/.api_filters
deleted file mode 100644
index cbb318a..0000000
--- a/org.eclipse.mylyn.sandbox.dev/.settings/.api_filters
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<component id="org.eclipse.mylyn.sandbox.dev" version="2">
-    <resource path="META-INF/MANIFEST.MF">
-        <filter id="925892614">
-            <message_arguments>
-                <message_argument value="3.0.0.qualifier"/>
-                <message_argument value="2.3.2.v20080402-2100"/>
-            </message_arguments>
-        </filter>
-    </resource>
-</component>
diff --git a/org.eclipse.mylyn.sandbox.dev/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.sandbox.dev/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 8b08f1b..0000000
--- a/org.eclipse.mylyn.sandbox.dev/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,340 +0,0 @@
-#Thu Apr 24 21:03:23 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-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.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
-org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
-org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL,NORMAL
-org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX,API
-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_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_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_selector_in_method_invocation=80
-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.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=1
-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=false
-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=false
-org.eclipse.jdt.core.formatter.comment.format_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=false
-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=120
-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=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-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=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_member=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_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not 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=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=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_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_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_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_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_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.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=120
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
-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_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.sandbox.dev/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.sandbox.dev/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 5e70d08..0000000
--- a/org.eclipse.mylyn.sandbox.dev/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,63 +0,0 @@
-#Sat Mar 01 03:38:47 PST 2008
-cleanup_settings_version=2
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-formatter_profile=_Mylyn based on Eclipse
-formatter_settings_version=11
-internal.default.compliance=default
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=true
-org.eclipse.jdt.ui.javadoc=false
-org.eclipse.jdt.ui.keywordthis=false
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2004, 2007 Mylyn project committers and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
-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_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=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=true
-sp_cleanup.correct_indentation=true
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.make_local_variable_final=false
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-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=true
-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=true
-sp_cleanup.remove_unused_imports=false
-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=true
-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=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.sandbox.dev/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.sandbox.dev/.settings/org.eclipse.ltk.core.refactoring.prefs
deleted file mode 100644
index 7ab03bd..0000000
--- a/org.eclipse.mylyn.sandbox.dev/.settings/org.eclipse.ltk.core.refactoring.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Jun 02 15:30:09 PDT 2006
-eclipse.preferences.version=1
-org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.sandbox.dev/.settings/org.eclipse.mylyn.tasklist.prefs b/org.eclipse.mylyn.sandbox.dev/.settings/org.eclipse.mylyn.tasklist.prefs
deleted file mode 100644
index 0a2cc0b..0000000
--- a/org.eclipse.mylyn.sandbox.dev/.settings/org.eclipse.mylyn.tasklist.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Jun 18 17:14:59 PDT 2007
-eclipse.preferences.version=1
-project.repository.kind=bugzilla
-project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.sandbox.dev/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.sandbox.dev/.settings/org.eclipse.mylyn.tasks.ui.prefs
deleted file mode 100644
index d8c6d26..0000000
--- a/org.eclipse.mylyn.sandbox.dev/.settings/org.eclipse.mylyn.tasks.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Jun 25 03:02:37 GMT 2007
-eclipse.preferences.version=1
-project.repository.kind=bugzilla
-project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.sandbox.dev/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.sandbox.dev/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index e8f2d56..0000000
--- a/org.eclipse.mylyn.sandbox.dev/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,18 +0,0 @@
-#Tue Apr 15 11:07:59 PDT 2008
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=2
-compilers.p.missing-bundle-classpath-entries=1
-compilers.p.missing-packages=1
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=2
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=0
-compilers.p.unknown-element=0
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=0
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.sandbox.dev/META-INF/MANIFEST.MF b/org.eclipse.mylyn.sandbox.dev/META-INF/MANIFEST.MF
deleted file mode 100644
index 8826831..0000000
--- a/org.eclipse.mylyn.sandbox.dev/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,24 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Mylyn Sandbox Developer Tools
-Bundle-SymbolicName: org.eclipse.mylyn.sandbox.dev;singleton:=true
-Bundle-Version: 3.0.0.qualifier
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.mylyn.context.core;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.tasks.core;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.core.resources,
- org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.context.ui;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.tasks.ui;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.jdt.core,
- org.eclipse.ui.views.properties.tabbed,
- org.eclipse.mylyn.commons.ui;bundle-version="[3.0.0,4.0.0)"
-Bundle-ActivationPolicy: lazy
-Bundle-Vendor: Eclipse.org
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-Activator: org.eclipse.mylyn.internal.sandbox.dev.MylynDevPlugin
-Export-Package: org.eclipse.mylyn.internal.sandbox.dev;x-internal:=true,
- org.eclipse.mylyn.internal.sandbox.dev.actions;x-internal:=true,
- org.eclipse.mylyn.internal.sandbox.dev.properties;x-internal:=true,
- org.eclipse.mylyn.internal.sandbox.dev.views;x-internal:=true
diff --git a/org.eclipse.mylyn.sandbox.dev/about.html b/org.eclipse.mylyn.sandbox.dev/about.html
deleted file mode 100644
index 0dd939c..0000000
--- a/org.eclipse.mylyn.sandbox.dev/about.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 7, 2007</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.sandbox.dev/build.properties b/org.eclipse.mylyn.sandbox.dev/build.properties
deleted file mode 100644
index 25a32b2..0000000
--- a/org.eclipse.mylyn.sandbox.dev/build.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 Mylyn project committers and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-###############################################################################
-bin.includes = plugin.xml,\
-               META-INF/,\
-               about.html,\
-               .,\
-               icons/
-src.includes = about.html
-jre.compilation.profile = J2SE-1.5
-source.. = src/
diff --git a/org.eclipse.mylyn.sandbox.dev/icons/repositories.gif b/org.eclipse.mylyn.sandbox.dev/icons/repositories.gif
deleted file mode 100644
index a076324..0000000
--- a/org.eclipse.mylyn.sandbox.dev/icons/repositories.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.sandbox.dev/icons/test.png b/org.eclipse.mylyn.sandbox.dev/icons/test.png
deleted file mode 100644
index 2b2f4f7..0000000
--- a/org.eclipse.mylyn.sandbox.dev/icons/test.png
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.sandbox.dev/plugin.xml b/org.eclipse.mylyn.sandbox.dev/plugin.xml
deleted file mode 100644
index aa06ee6..0000000
--- a/org.eclipse.mylyn.sandbox.dev/plugin.xml
+++ /dev/null
@@ -1,123 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-   <extension point = "org.eclipse.ui.popupMenus">
-     <objectContribution
-        id="org.eclipse.mylyn.ui.instrospection"
-        objectClass="java.lang.Object">
-	    <action
-  		  	label="Sanbox: Introspect Object"
-	  		menubarPath="additions"
-	  		id="org.eclipse.mylyn.sandbox.actions.introspect"
-	  		class="org.eclipse.mylyn.internal.sandbox.dev.IntrospectObjectAction"
-	  		enablesFor="1"/>
-	 </objectContribution>
-	</extension>
-
-     <extension point="org.eclipse.ui.decorators">
-      <decorator
-            lightweight="true"
-            label="Mylyn: Interest Debugging Decorator"
-            class="org.eclipse.mylyn.internal.sandbox.dev.InterestDebuggingDecorator"
-            state="false"
-            id="org.eclipse.mylyn.sandbox.ui.decorator.interest">
-         <description>
-			Appends interest level to nodes
-		 </description>
-         <enablement>
-            <objectClass name="java.lang.Object"/>
-         </enablement>
-      </decorator>
-   </extension>
-
-  <extension
-         point="org.eclipse.ui.views">
-      <view
-            name="Repository Spy"
-            icon="icons/repositories.gif"
-            category="org.eclipse.mylyn.sandbox"
-            class="org.eclipse.mylyn.internal.sandbox.dev.views.RepositorySpyView"
-            id="org.eclipse.mylyn.tasks.spy.views.RepositorySpyView">
-      </view>
-      <category
-            id="org.eclipse.mylyn.sandbox"
-            name="Mylyn Sandbox">
-      </category>
-   </extension>
-   <extension
-         point="org.eclipse.core.runtime.adapters">
-      <factory
-            adaptableType="org.eclipse.mylyn.tasks.core.TaskRepository"
-            class="org.eclipse.mylyn.internal.sandbox.dev.properties.MylynPropertiesSourceAdapterFactory">
-         <adapter
-               type="org.eclipse.ui.views.properties.IPropertySource">
-         </adapter>
-      </factory>
-      <factory
-            adaptableType="org.eclipse.mylyn.internal.tasks.core.AbstractTask"
-            class="org.eclipse.mylyn.internal.sandbox.dev.properties.MylynPropertiesSourceAdapterFactory">
-         <adapter
-               type="org.eclipse.ui.views.properties.IPropertySource">
-         </adapter>
-      </factory>
-    <factory
-            adaptableType="org.eclipse.mylyn.internal.tasks.core.RepositoryQuery"
-            class="org.eclipse.mylyn.internal.sandbox.dev.properties.MylynPropertiesSourceAdapterFactory">
-         <adapter
-               type="org.eclipse.ui.views.properties.IPropertySource">
-         </adapter>
-      </factory>
-   
-    <factory
-            adaptableType="org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory"
-            class="org.eclipse.mylyn.internal.sandbox.dev.properties.MylynPropertiesSourceAdapterFactory">
-         <adapter
-               type="org.eclipse.ui.views.properties.IPropertySource">
-         </adapter>
-      </factory>
-   </extension>
-
-  <extension point="org.eclipse.ui.popupMenus"> 
-     <objectContribution
-     	   adaptable="false"
-           id="org.eclipse.mylyn.java.ui.interest.decrease.contribution"
-           objectClass="org.eclipse.jdt.core.IJavaElement">
-	    <action
-           class="org.eclipse.mylyn.internal.sandbox.dev.InterestDecrementAction"
-           enablesFor="*"
-           id="org.eclipse.mylyn.java.ui.interest.increase.element"
-           label="Make Less Interesting (Experimental)"
-           menubarPath="group.reorganize">
-     </action>
-     <visibility>
-     	<and>
-	     	<systemProperty
-	               name="org.eclipse.mylyn.context.core.context.active"
-    	           value="true">
-    	    </systemProperty>
-           <objectClass
-                 name="org.eclipse.jdt.core.IMember">
-           </objectClass>
-        </and>
-     </visibility>
-	 </objectContribution>
-	</extension>
-  <extension
-        point="org.eclipse.ui.actionSets">
-     <actionSet
-           id="org.eclipse.mylyn.sandbox.dev.actions"
-           label="Mylyn Sandbox Dev Actions"
-           visible="false">
-        <action
-              class="org.eclipse.mylyn.internal.sandbox.dev.actions.TestTaskListNotificationAction"
-              icon="icons/test.png"
-              id="org.eclipse.mylyn.sandbox.dev.action1"
-              label="Test Notifications"
-              style="push"
-              toolbarPath="mylyn">
-        </action>
-     </actionSet>
-  </extension>
-  
-</plugin>
diff --git a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/InterestDebuggingDecorator.java b/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/InterestDebuggingDecorator.java
deleted file mode 100644
index e12cd59..0000000
--- a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/InterestDebuggingDecorator.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.dev;
-
-import java.util.ConcurrentModificationException;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.viewers.IDecoration;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ILightweightLabelDecorator;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
-import org.eclipse.mylyn.context.core.ContextCore;
-import org.eclipse.mylyn.context.core.IInteractionElement;
-import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
-import org.eclipse.mylyn.internal.context.core.InteractionContextRelation;
-import org.eclipse.mylyn.internal.context.ui.ColorMap;
-
-/**
- * @author Mik Kersten
- */
-public class InterestDebuggingDecorator implements ILightweightLabelDecorator {
-
-	public InterestDebuggingDecorator() {
-		super();
-	}
-
-	public void decorate(Object element, IDecoration decoration) {
-		AbstractContextStructureBridge bridge = null;
-		try {
-			if (ContextCorePlugin.getDefault() == null) {
-				return;
-			}
-			bridge = ContextCore.getStructureBridge(element);
-		} catch (ConcurrentModificationException cme) {
-			// ignored, because we can add structure bridges during decoration
-		}
-		try {
-			IInteractionElement node = null;
-			if (element instanceof InteractionContextRelation) {
-				decoration.setForegroundColor(ColorMap.RELATIONSHIP);
-			} else if (element instanceof IInteractionElement) {
-				node = (IInteractionElement) element;
-			} else {
-				if (bridge != null && bridge.getContentType() != null) {
-					node = ContextCore.getContextManager().getElement(bridge.getHandleIdentifier(element));
-				}
-			}
-			if (node != null) {
-				decoration.addSuffix(" {" + node.getInterest().getValue() + " [" + node.getInterest().getEncodedValue() + "] " + "}");
-			}
-		} catch (Exception e) {
-			StatusHandler.log(new Status(IStatus.WARNING, MylynDevPlugin.PLUGIN_ID, "Decoration failed", e));
-		}
-	}
-
-	public void addListener(ILabelProviderListener listener) {
-		// don't care about listeners
-	}
-
-	public void dispose() {
-		// don't care when we are disposed
-	}
-
-	public boolean isLabelProperty(Object element, String property) {
-		return false;
-	}
-
-	public void removeListener(ILabelProviderListener listener) {
-		// don't care about listeners
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/InterestDecrementAction.java b/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/InterestDecrementAction.java
deleted file mode 100644
index baa0c8b..0000000
--- a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/InterestDecrementAction.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.dev;
-
-import org.eclipse.mylyn.internal.context.ui.actions.AbstractInterestManipulationAction;
-
-/**
- * @author Mik Kersten
- */
-public class InterestDecrementAction extends AbstractInterestManipulationAction {
-
-	public InterestDecrementAction() {
-		super.preserveUninteresting = true;
-	}
-
-	@Override
-	protected boolean isIncrement() {
-		return false;
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/IntrospectObjectAction.java b/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/IntrospectObjectAction.java
deleted file mode 100644
index cdaaa80..0000000
--- a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/IntrospectObjectAction.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.dev;
-
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
-import org.eclipse.mylyn.context.core.ContextCore;
-import org.eclipse.mylyn.context.core.IInteractionElement;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-import org.eclipse.mylyn.tasks.ui.TasksUi;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-
-/**
- * @author Mik Kersten
- */
-public class IntrospectObjectAction implements IViewActionDelegate {
-
-	private ISelection currentSelection;
-
-	public void init(IViewPart view) {
-
-	}
-
-	@SuppressWarnings("deprecation")
-	public void run(IAction action) {
-		if (currentSelection instanceof StructuredSelection) {
-			StructuredSelection selection = (StructuredSelection) currentSelection;
-			Object object = selection.getFirstElement();
-
-			String text = "Object class: " + object.getClass() + "\n\n";
-
-			try {
-				AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(object);
-				IInteractionElement node = ContextCore.getContextManager().getElement(
-						bridge.getHandleIdentifier(object));
-				if (node != null) {
-					text += "Interest value: " + node.getInterest().getValue() + "\n";
-					text += node.getInterest().toString();
-				}
-			} catch (Throwable t) {
-				text += "<no structure bridge>";
-			}
-
-			if (object instanceof IAdaptable) {
-				Object resourceAdapter = ((IAdaptable) object).getAdapter(IResource.class);
-				if (resourceAdapter != null) {
-					text += "\nResource adapter: " + ((IResource) resourceAdapter).getFullPath().toOSString();
-				}
-			}
-
-			if (object instanceof ITask) {
-
-				AbstractTask task = null;
-				if (object instanceof ITask) {
-					task = (AbstractTask) object;
-				}
-				if (task != null) {
-					TaskRepository repository = TasksUi.getRepositoryManager().getRepository(task.getConnectorKind(),
-							task.getRepositoryUrl());
-					text += "\nHandle Identifier: " + task.getHandleIdentifier();
-					text += "\nLast time in SYNCHRONIZED state: " + task.getLastReadTimeStamp();
-					if (repository != null) {
-						text += "\nRepository synch time stamp: " + repository.getSynchronizationTimeStamp();
-					} else {
-						text += "\nRepository is null (!), url is: " + task.getRepositoryUrl();
-					}
-					text += "\nSync state: " + task.getSynchronizationState();
-					text += "\nParents: " + task.getParentContainers();
-					if (task.getChildren() != null && !task.getChildren().isEmpty()) {
-						text += "\nChildren: ";
-						for (ITask subTask : task.getChildren()) {
-							text += "\n" + subTask;
-						}
-					}
-				}
-			}
-			text += "\n\nNum tasks: " + TasksUiPlugin.getTaskList().getAllTasks().size();
-			text += "\nNum queries: " + TasksUiPlugin.getTaskList().getQueries().size();
-
-			MessageDialog.openInformation(null, "Mylyn Sandbox", text);
-		}
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-		this.currentSelection = selection;
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/MylynDevPlugin.java b/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/MylynDevPlugin.java
deleted file mode 100644
index 9174ebb..0000000
--- a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/MylynDevPlugin.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package org.eclipse.mylyn.internal.sandbox.dev;
-
-import org.eclipse.core.runtime.IAdapterManager;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.mylyn.internal.sandbox.dev.properties.MylynPropertiesSourceAdapterFactory;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class MylynDevPlugin extends AbstractUIPlugin {
-
-	public static final String PLUGIN_ID = "org.eclipse.mylyn.sandbox.dev";
-
-	private static MylynDevPlugin INSTANCE;
-
-	private MylynPropertiesSourceAdapterFactory factory;
-
-	/**
-	 * The constructor
-	 */
-	public MylynDevPlugin() {
-	}
-
-	@Override
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		INSTANCE = this;
-		factory = new MylynPropertiesSourceAdapterFactory();
-		IAdapterManager mgr = Platform.getAdapterManager();
-		mgr.registerAdapters(factory, IPropertySource.class);
-	}
-
-	@Override
-	public void stop(BundleContext context) throws Exception {
-		Platform.getAdapterManager().unregisterAdapters(factory);
-		factory = null;
-		INSTANCE = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 * 
-	 * @return the shared instance
-	 */
-	public static MylynDevPlugin getDefault() {
-		return INSTANCE;
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/actions/TestTaskListNotificationAction.java b/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/actions/TestTaskListNotificationAction.java
deleted file mode 100644
index f5c5143..0000000
--- a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/actions/TestTaskListNotificationAction.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.dev.actions;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.internal.tasks.ui.notifications.TaskListNotificationReminder;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-
-/**
- * @author Mik Kersten
- */
-public class TestTaskListNotificationAction implements IWorkbenchWindowActionDelegate {
-
-	public void dispose() {
-		// ignore
-
-	}
-
-	public void init(IWorkbenchWindow window) {
-		// ignore
-
-	}
-
-	public void run(IAction action) {
-		Collection<AbstractTask> allTasks = TasksUiPlugin.getTaskList().getAllTasks();
-		Iterator<AbstractTask> iterator = allTasks.iterator();
-		Set<TaskListNotificationReminder> dummyNotifications = new HashSet<TaskListNotificationReminder>();
-		for (int i = 0; i < 6; i++) {
-			TaskListNotificationReminder notification = new TaskListNotificationReminder(iterator.next());
-			notification.setDescription("Mylyn is the Task-Focused UI for Eclipse that reduces information overload "
-					+ "\nand makes multi-tasking easy. It does this by making tasks a first class part of"
-					+ "\nEclipse, and integrating rich and offline editing for repositories such as Bugzilla, "
-					+ "\nTrac, and JIRA. Once your tasks are integrated, Mylyn monitors your work activity to "
-					+ "\nidentify information relevant to the task-at-hand, and uses this task context to focus ");
-			dummyNotifications.add(notification);
-			TasksUiPlugin.getTaskListNotificationManager().getNotifications().add(notification);
-		}
-		TasksUiPlugin.getTaskListNotificationManager().showPopup();
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-		// ignore
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/properties/AbstractTaskCategoryPropertySource.java b/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/properties/AbstractTaskCategoryPropertySource.java
deleted file mode 100644
index 5aff0bd..0000000
--- a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/properties/AbstractTaskCategoryPropertySource.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.sandbox.dev.properties;
-
-import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-/**
- * Display various {@link AbstractTaskCategory} properties in the Eclipse Properties View.<br />
- * See <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210639">Bug 210639</a> and <a
- * href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208275">Bug 208275</a><br />
- * 
- * @author Maarten Meijer
- */
-public class AbstractTaskCategoryPropertySource extends AbstractTaskContainerPropertySource implements IPropertySource {
-
-	/**
-	 * @param adaptableObject
-	 *            to create source for
-	 */
-	public AbstractTaskCategoryPropertySource(AbstractTaskCategory adaptableObject) {
-		super(adaptableObject);
-	}
-
-	@Override
-	public IPropertyDescriptor[] getPropertyDescriptors() {
-		TextPropertyDescriptor summary = new TextPropertyDescriptor(SUMMARY, "Summary");
-		summary.setCategory(description);
-		IPropertyDescriptor[] specific = new IPropertyDescriptor[] { summary, };
-		return super.appendSpecifics(specific, super.getPropertyDescriptors());
-	}
-
-	@Override
-	public Object getPropertyValue(Object id) {
-		AbstractTaskCategory category = (AbstractTaskCategory) container;
-		if (SUMMARY.equals(id)) {
-			return category.getSummary();
-		}
-		return super.getPropertyValue(id);
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/properties/AbstractTaskContainerPropertySource.java b/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/properties/AbstractTaskContainerPropertySource.java
deleted file mode 100644
index a27c2f0..0000000
--- a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/properties/AbstractTaskContainerPropertySource.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.sandbox.dev.properties;
-
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.mylyn.tasks.core.ITaskContainer;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-/**
- * Abstract class to display various properties in the Eclipse Properties View.<br /> See <a
- * href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210639">Bug 210639</a> and <a
- * href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208275">Bug 208275</a><br />
- * 
- * @author Maarten Meijer
- */
-public abstract class AbstractTaskContainerPropertySource implements IPropertySource {
-
-	protected static final String CHILDREN = "children";
-
-	protected static final String DESCENDANDS = "descendents";
-
-	protected static final String IS_CYCLIC = "iscyclic";
-
-	protected static final String SUMMARY = "summary";
-
-	protected static final String HANDLE = "handle";
-
-	private boolean cyclic;
-
-	protected AbstractTaskContainer container;
-
-	protected String description;
-
-	public AbstractTaskContainerPropertySource(AbstractTaskContainer adaptableObject) {
-		container = adaptableObject;
-		description = container.getClass().getName();
-	}
-
-	/**
-	 * @return an expanded set of all descendants, excluding itself.
-	 */
-	public Set<ITask> getDescendants(ITaskContainer parent) {
-		Set<ITask> childrenWithoutCycles = new HashSet<ITask>();
-		this.getDescendantsHelper(parent, childrenWithoutCycles, parent);
-		return Collections.unmodifiableSet(childrenWithoutCycles);
-	}
-
-	protected void getDescendantsHelper(ITaskContainer parent, Set<ITask> visited, ITaskContainer root) {
-		for (ITask child : parent.getChildren()) {
-			if (child == root) {
-				cyclic = true;
-			}
-			if (child instanceof ITaskContainer) {
-				if (!visited.contains(child) && child != root) {
-					visited.add(child);
-					getDescendantsHelper((ITaskContainer) child, visited, root);
-				}
-			}
-		}
-	}
-
-	/**
-	 * @return true if the parent also occurs in its descendants.
-	 */
-	public boolean containsCyclic(ITaskContainer parent) {
-		Set<AbstractTaskContainer> childrenWithoutCycles = new HashSet<AbstractTaskContainer>();
-		Set<ITaskContainer> parentStack = new HashSet<ITaskContainer>();
-		cyclic = false;
-		this.containsCyclicHelper(parent, childrenWithoutCycles, parentStack);
-		return cyclic;
-	}
-
-	protected void containsCyclicHelper(ITaskContainer parent, Set<AbstractTaskContainer> visited,
-			Set<ITaskContainer> parentStack) {
-		// fast exit
-		if (cyclic) {
-			return;
-		}
-
-		parentStack.add(parent);
-		for (ITask child : parent.getChildren()) {
-			if (child instanceof AbstractTaskContainer) {
-				if (parentStack.contains(child)) {
-					cyclic = true;
-					return;
-				} else {
-					containsCyclicHelper((ITaskContainer) child, visited, parentStack);
-				}
-			}
-		}
-		parentStack.remove(parent);
-	}
-
-	public IPropertyDescriptor[] getPropertyDescriptors() {
-		TextPropertyDescriptor handle = new TextPropertyDescriptor(HANDLE, "Handle Identifier");
-		handle.setCategory(description);
-		TextPropertyDescriptor children = new TextPropertyDescriptor(CHILDREN, "Total Children (internal)");
-		children.setCategory(description);
-		TextPropertyDescriptor descendants = new TextPropertyDescriptor(DESCENDANDS, "Total Descendants");
-		descendants.setCategory(description);
-		TextPropertyDescriptor cyclic = new TextPropertyDescriptor(IS_CYCLIC, "Cycle in descendants graph?");
-		cyclic.setCategory(description);
-		return new IPropertyDescriptor[] { handle, children, descendants, cyclic };
-	}
-
-	public Object getPropertyValue(Object id) {
-		if (HANDLE.equals(id)) {
-			return container.getHandleIdentifier();
-		} else if (CHILDREN.equals(id)) {
-			return container.getChildren().size();
-		} else if (DESCENDANDS.equals(id)) {
-			return getDescendants(container).size();
-		} else if (IS_CYCLIC.equals(id)) {
-			return containsCyclic(container) ? "Cyclic" : "Not Cyclic";
-		}
-		return null;
-	}
-
-	public boolean isPropertySet(Object id) {
-		// ignore
-		return false;
-	}
-
-	public void resetPropertyValue(Object id) {
-		// ignore
-	}
-
-	public void setPropertyValue(Object id, Object value) {
-		// ignore
-	}
-
-	public Object getEditableValue() {
-		// ignore
-		return null;
-	}
-
-	public IPropertyDescriptor[] appendSpecifics(IPropertyDescriptor[] specific, IPropertyDescriptor[] these) {
-		IPropertyDescriptor[] all = new IPropertyDescriptor[specific.length + these.length];
-		System.arraycopy(these, 0, all, 0, these.length);
-		System.arraycopy(specific, 0, all, these.length, specific.length);
-		return all;
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/properties/AbstractTaskPropertiesSource.java b/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/properties/AbstractTaskPropertiesSource.java
deleted file mode 100644
index 86607e5..0000000
--- a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/properties/AbstractTaskPropertiesSource.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.sandbox.dev.properties;
-
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-/**
- * Display various {@link AbstractTask} properties in the Eclipse Properties View.<br /> See <a
- * href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210639">Bug 210639</a> and <a
- * href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208275">Bug 208275</a><br />
- * 
- * @author Maarten Meijer
- */
-public class AbstractTaskPropertiesSource extends AbstractTaskContainerPropertySource implements IPropertySource {
-
-	private static final String NULL_MSG = "<null>";
-
-	private static final String LAST_READ = "last_read";
-
-	private static final String STATE = "state";
-
-	private static final String STATUS = "status";
-
-	private static final String URL = "url";
-
-	private static final String KIND = "kind";
-
-	private static final String OWNER = "owner";
-
-	private static final String PARENT = "parent";
-
-	private static final String SCHEDULED = "scheduled";
-
-	public AbstractTaskPropertiesSource(AbstractTask adaptableObject) {
-		super(adaptableObject);
-	}
-
-	@Override
-	public IPropertyDescriptor[] getPropertyDescriptors() {
-		TextPropertyDescriptor summary = new TextPropertyDescriptor(SUMMARY, "Summary");
-		summary.setCategory(description);
-		TextPropertyDescriptor owner = new TextPropertyDescriptor(OWNER, "Owner");
-		owner.setCategory(description);
-		TextPropertyDescriptor scheduled = new TextPropertyDescriptor(SCHEDULED, "Scheduled for");
-		scheduled.setCategory(description);
-		TextPropertyDescriptor parent = new TextPropertyDescriptor(PARENT, "Parent Containers");
-		parent.setCategory(description);
-		TextPropertyDescriptor kind = new TextPropertyDescriptor(KIND, "Repository Connector Kind");
-		kind.setCategory(description);
-		TextPropertyDescriptor url = new TextPropertyDescriptor(URL, "Repository URL");
-		url.setCategory(description);
-		TextPropertyDescriptor status = new TextPropertyDescriptor(STATUS, "Synchronization Status");
-		status.setCategory(description);
-		TextPropertyDescriptor state = new TextPropertyDescriptor(STATE, "Synchronization State");
-		state.setCategory(description);
-		TextPropertyDescriptor lastRead = new TextPropertyDescriptor(LAST_READ, "Last Read Timestamp");
-		lastRead.setCategory(description);
-		IPropertyDescriptor[] specific = new IPropertyDescriptor[] { summary, owner, scheduled, parent, kind, url,
-				status, state, lastRead };
-		return super.appendSpecifics(specific, super.getPropertyDescriptors());
-	}
-
-	@SuppressWarnings("deprecation")
-	@Override
-	public Object getPropertyValue(Object id) {
-		AbstractTask task = (AbstractTask) container;
-		if (SUMMARY.equals(id)) {
-			return task.getSummary();
-		} else if (OWNER.equals(id)) {
-			return task.getOwner();
-		} else if (SCHEDULED.equals(id)) {
-			return task.getScheduledForDate() == null ? NULL_MSG : task.getScheduledForDate();
-		} else if (PARENT.equals(id)) {
-			return (task).getParentContainers() == null ? NULL_MSG : (task).getParentContainers().toString();
-		} else if (KIND.equals(id)) {
-			return task.getConnectorKind();
-		} else if (URL.equals(id)) {
-			return task.getRepositoryUrl();
-		} else if (STATE.equals(id)) {
-			return task.getSynchronizationState() == null ? NULL_MSG : task.getSynchronizationState().toString();
-		} else if (STATUS.equals(id)) {
-			return task.getStatus() == null ? NULL_MSG : task.getStatus().toString();
-		} else if (LAST_READ.equals(id)) {
-			return task.getLastReadTimeStamp() == null ? NULL_MSG : task.getLastReadTimeStamp().toString();
-		}
-		return super.getPropertyValue(id);
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/properties/MylynPropertiesSourceAdapterFactory.java b/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/properties/MylynPropertiesSourceAdapterFactory.java
deleted file mode 100644
index 0212db1..0000000
--- a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/properties/MylynPropertiesSourceAdapterFactory.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/**
- *
- */
-package org.eclipse.mylyn.internal.sandbox.dev.properties;
-
-import org.eclipse.core.runtime.IAdapterFactory;
-import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
-import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-import org.eclipse.ui.views.properties.IPropertySource;
-
-/**
- * @author Maarten Meijer
- */
-public class MylynPropertiesSourceAdapterFactory implements IAdapterFactory {
-
-	@SuppressWarnings("unchecked")
-	public Object getAdapter(Object adaptableObject, Class adapterType) {
-		if (adapterType == IPropertySource.class && adaptableObject instanceof TaskRepository) {
-			return new TaskRepositoryPropertiesSource((TaskRepository) adaptableObject);
-		}
-		if (adapterType == IPropertySource.class && adaptableObject instanceof ITask) {
-			return new AbstractTaskPropertiesSource((AbstractTask) adaptableObject);
-		}
-		if (adapterType == IPropertySource.class && adaptableObject instanceof IRepositoryQuery) {
-			return new RepositoryQueryPropertySource((RepositoryQuery) adaptableObject);
-		}
-		if (adapterType == IPropertySource.class && adaptableObject instanceof AbstractTaskCategory) {
-			return new AbstractTaskCategoryPropertySource((AbstractTaskCategory) adaptableObject);
-		}
-		return null;
-	}
-
-	@SuppressWarnings("unchecked")
-	public Class[] getAdapterList() {
-		return new Class[] { IPropertySource.class };
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/properties/RepositoryQueryPropertySource.java b/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/properties/RepositoryQueryPropertySource.java
deleted file mode 100644
index c58ad40..0000000
--- a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/properties/RepositoryQueryPropertySource.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/**
- *
- */
-package org.eclipse.mylyn.internal.sandbox.dev.properties;
-
-import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-/**
- * Display various {@link RepositoryQuery} properties in the Eclipse Properties View.<br />
- * See <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=210639">Bug 210639</a> and <a
- * href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=208275">Bug 208275</a><br />
- *
- * @author Maarten Meijer
- */
-public class RepositoryQueryPropertySource extends AbstractTaskContainerPropertySource implements IPropertySource {
-
-	private static final String NULL_MSG = "<null>";
-
-	private static final String LAST_READ = "last_read";
-
-	private static final String STATUS = "status";
-
-	private static final String REPOSITORY = "repository";
-
-	private static final String QUERY = "query";
-
-	private static final String KIND = "kind";
-
-	public RepositoryQueryPropertySource(RepositoryQuery adaptableObject) {
-		super(adaptableObject);
-	}
-
-	@Override
-	public IPropertyDescriptor[] getPropertyDescriptors() {
-		TextPropertyDescriptor summary = new TextPropertyDescriptor(SUMMARY, "Query Summary");
-		summary.setCategory(description);
-		TextPropertyDescriptor kind = new TextPropertyDescriptor(KIND, "Repository Connector Kind");
-		kind.setCategory(description);
-		TextPropertyDescriptor url = new TextPropertyDescriptor(REPOSITORY, "Repository URL");
-		url.setCategory(description);
-		TextPropertyDescriptor query = new TextPropertyDescriptor(QUERY, "Query URL");
-		query.setCategory(description);
-		TextPropertyDescriptor status = new TextPropertyDescriptor(STATUS, "Synchronization Status");
-		status.setCategory(description);
-		TextPropertyDescriptor lastRead = new TextPropertyDescriptor(LAST_READ, "Synchronization Timestamp");
-		lastRead.setCategory(description);
-		IPropertyDescriptor[] specific = new IPropertyDescriptor[] { summary, kind, url, query, status, lastRead, };
-		return super.appendSpecifics(specific, super.getPropertyDescriptors());
-	}
-
-	@Override
-	public Object getPropertyValue(Object id) {
-		RepositoryQuery query = (RepositoryQuery) container;
-		if (SUMMARY.equals(id)) {
-			return query.getSummary();
-		} else if (KIND.equals(id)) {
-			return query.getConnectorKind();
-		} else if (REPOSITORY.equals(id)) {
-			return query.getRepositoryUrl();
-		} else if (QUERY.equals(id)) {
-			return query.getUrl();
-		} else if (STATUS.equals(id)) {
-			return query.getStatus() == null ? NULL_MSG : query.getStatus().toString();
-		} else if (LAST_READ.equals(id)) {
-			return query.getLastSynchronizedTimeStamp() == null ? NULL_MSG : query.getLastSynchronizedTimeStamp()
-					.toString();
-		}
-		return super.getPropertyValue(id);
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/properties/TaskRepositoryPropertiesSource.java b/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/properties/TaskRepositoryPropertiesSource.java
deleted file mode 100644
index d20bc99..0000000
--- a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/properties/TaskRepositoryPropertiesSource.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.sandbox.dev.properties;
-
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-import org.eclipse.ui.views.properties.IPropertyDescriptor;
-import org.eclipse.ui.views.properties.IPropertySource;
-import org.eclipse.ui.views.properties.PropertyDescriptor;
-import org.eclipse.ui.views.properties.TextPropertyDescriptor;
-
-/**
- * @author Maarten Meijer
- */
-public class TaskRepositoryPropertiesSource implements IPropertySource {
-	private final TaskRepository repository;
-
-	public TaskRepositoryPropertiesSource(TaskRepository repository) {
-		this.repository = repository;
-	}
-
-	public Object getEditableValue() {
-		return null;
-	}
-
-	public IPropertyDescriptor[] getPropertyDescriptors() {
-		Set<String> properties = repository.getProperties().keySet();
-		IPropertyDescriptor[] result = new IPropertyDescriptor[properties.size()];
-		Iterator<String> keys = properties.iterator();
-		int i = 0;
-		while (keys.hasNext()) {
-			String key = keys.next();
-			PropertyDescriptor descriptor = new TextPropertyDescriptor(key, key);
-			descriptor.setCategory(repository.getClass().getName());
-			result[i] = descriptor;
-			++i;
-		}
-		return result;
-	}
-
-	public Object getPropertyValue(Object id) {
-		return repository.getProperty((String) id);
-	}
-
-	public boolean isPropertySet(Object id) {
-		return false;
-	}
-
-	public void resetPropertyValue(Object id) {
-	}
-
-	public void setPropertyValue(Object id, Object value) {
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/views/RepositorySpyView.java b/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/views/RepositorySpyView.java
deleted file mode 100644
index 8349989..0000000
--- a/org.eclipse.mylyn.sandbox.dev/src/org/eclipse/mylyn/internal/sandbox/dev/views/RepositorySpyView.java
+++ /dev/null
@@ -1,372 +0,0 @@
-package org.eclipse.mylyn.internal.sandbox.dev.views;
-
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-import org.eclipse.mylyn.tasks.ui.TasksUi;
-import org.eclipse.mylyn.tasks.ui.TasksUiImages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.ISharedImages;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.DrillDownAdapter;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * This sample class demonstrates how to plug-in a new workbench view. The view shows data obtained from the model. The
- * sample creates a dummy model on the fly, but a real implementation would connect to the model available either in
- * this or another plug-in (e.g. the workspace). The view is connected to the model using a content provider.
- * <p>
- * The view uses a label provider to define how model objects should be presented in the view. Each view can present the
- * same model objects using different labels and icons, if needed. Alternatively, a single label provider can be shared
- * between views in order to ensure that objects of the same type are presented in the same way everywhere.
- * <p>
- */
-
-public class RepositorySpyView extends ViewPart {
-	class RefreshAction extends Action {
-		RepositorySpyView view = null;
-
-		public RefreshAction(RepositorySpyView repositorySpyView) {
-			// TODO Auto-generated constructor stub
-			view = repositorySpyView;
-		}
-
-		@Override
-		public void run() {
-			viewer.getContentProvider().inputChanged(viewer, null, null);
-			view.refresh();
-		}
-	}
-
-	private TreeViewer viewer;
-
-	private DrillDownAdapter drillDownAdapter;
-
-	private Action refreshViewAction;
-
-	private Action clearConfigLastUpdateAction;
-
-	private Action doubleClickAction;
-
-	/*
-	 * The content provider class is responsible for providing objects to the
-	 * view. It can wrap existing objects in adapters or simply return objects
-	 * as-is. These objects may be sensitive to the current input of the view,
-	 * or ignore it and always show the same content (like Task List, for
-	 * example).
-	 */
-
-	class KeyValuePair extends Object {
-		Object key;
-
-		Object value;
-
-		Object parent;
-
-		public KeyValuePair(Object key, Object value, Object parent) {
-			super();
-			this.key = key;
-			this.value = value;
-			this.parent = parent;
-		}
-
-		@Override
-		public String toString() {
-			return key.toString() + " : " + value.toString();
-		}
-
-		/**
-		 * @return the key
-		 */
-		public Object getKey() {
-			return key;
-		}
-
-		/**
-		 * @return the value
-		 */
-		public Object getValue() {
-			return value;
-		}
-
-		/**
-		 * @return the parent
-		 */
-		public Object getParent() {
-			return parent;
-		}
-	}
-
-	private KeyValuePair[] MaptoArray(TaskRepository repository) {
-		Map<String, String> map = repository.getProperties();
-		KeyValuePair[] results = new KeyValuePair[map.size()];
-
-		int i = 0;
-		for (Object key : map.keySet()) {
-			results[i++] = new KeyValuePair(key, map.get(key), repository);
-		}
-		return results;
-	}
-
-	public void refresh() {
-		// TODO Auto-generated method stub
-		viewer.getContentProvider().inputChanged(viewer, null, null);
-		viewer.refresh();
-	}
-
-	class ViewContentProvider implements IStructuredContentProvider, ITreeContentProvider {
-		List<TaskRepository> repositories = null;
-
-		@SuppressWarnings("unchecked")
-		public void inputChanged(Viewer v, Object oldInput, Object newInput) {
-			if (newInput instanceof List || newInput == null) {
-				repositories = (List<TaskRepository>) newInput;
-			}
-		}
-
-		public void dispose() {
-		}
-
-		public Object[] getElements(Object parent) {
-			if (parent.equals(getViewSite())) {
-				if (repositories == null) {
-					initialize();
-				}
-				return getChildren(repositories);
-			}
-			return getChildren(parent);
-		}
-
-		public Object getParent(Object child) {
-			return null;
-		}
-
-		public Object[] getChildren(Object parent) {
-			if (parent instanceof List) {
-				return repositories.toArray();
-			}
-			if (parent instanceof TaskRepository) {
-				TaskRepository repository = (TaskRepository) parent;
-				Object[] result = MaptoArray(repository);
-				return result;
-			}
-			return new Object[0];
-		}
-
-		public boolean hasChildren(Object parent) {
-			if (parent instanceof List) {
-				return repositories.size() > 0;
-			}
-			if (parent instanceof TaskRepository) {
-				TaskRepository repository = (TaskRepository) parent;
-				return repository.getProperties().size() > 0;
-			}
-			return false;
-		}
-
-		private void initialize() {
-
-			if (repositories == null) {
-				repositories = TasksUi.getRepositoryManager().getAllRepositories();
-			}
-		}
-	}
-
-	class ViewLabelProvider extends LabelProvider {
-
-		@Override
-		public String getText(Object obj) {
-			if (obj instanceof List) {
-				return "Repositories";
-			}
-			if (obj instanceof TaskRepository) {
-				TaskRepository repository = (TaskRepository) obj;
-				return repository.getRepositoryLabel();
-			}
-			return obj.toString();
-		}
-
-		@Override
-		public Image getImage(Object obj) {
-			String imageKey = ISharedImages.IMG_OBJ_ELEMENT;
-			if (obj instanceof List) {
-				return TasksUiImages.REPOSITORIES_VIEW.createImage();
-			}
-			if (obj instanceof TaskRepository) {
-				// TODO: decorate with proper overlay
-				return TasksUiImages.REPOSITORY.createImage();
-			}
-			return PlatformUI.getWorkbench().getSharedImages().getImage(imageKey);
-		}
-	}
-
-	class NameSorter extends ViewerSorter {
-	}
-
-	/**
-	 * The constructor.
-	 */
-	public RepositorySpyView() {
-	}
-
-	/**
-	 * This is a callback that will allow us to create the viewer and initialize it.
-	 */
-	@Override
-	public void createPartControl(Composite parent) {
-		viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-		drillDownAdapter = new DrillDownAdapter(viewer);
-		viewer.setContentProvider(new ViewContentProvider());
-		viewer.setLabelProvider(new ViewLabelProvider());
-		viewer.setSorter(new NameSorter());
-		viewer.setInput(getViewSite());
-		makeActions();
-		hookContextMenu();
-		hookDoubleClickAction();
-		contributeToActionBars();
-	}
-
-	private void hookContextMenu() {
-		MenuManager menuMgr = new MenuManager("#PopupMenu");
-		menuMgr.setRemoveAllWhenShown(true);
-		menuMgr.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				RepositorySpyView.this.fillContextMenu(manager);
-			}
-		});
-		Menu menu = menuMgr.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-		getSite().registerContextMenu(menuMgr, viewer);
-	}
-
-	private void contributeToActionBars() {
-		IActionBars bars = getViewSite().getActionBars();
-		fillLocalPullDown(bars.getMenuManager());
-		fillLocalToolBar(bars.getToolBarManager());
-	}
-
-	private void fillLocalPullDown(IMenuManager manager) {
-		manager.add(refreshViewAction);
-		manager.add(new Separator());
-		manager.add(clearConfigLastUpdateAction);
-	}
-
-	private void fillContextMenu(IMenuManager manager) {
-		manager.add(refreshViewAction);
-		manager.add(clearConfigLastUpdateAction);
-		manager.add(new Separator());
-		drillDownAdapter.addNavigationActions(manager);
-		// Other plug-ins can contribute there actions here
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-	private void fillLocalToolBar(IToolBarManager manager) {
-		manager.add(refreshViewAction);
-		manager.add(clearConfigLastUpdateAction);
-		manager.add(new Separator());
-		drillDownAdapter.addNavigationActions(manager);
-	}
-
-	private void makeActions() {
-		refreshViewAction = new RefreshAction(this);
-		refreshViewAction.setText("Refresh");
-		refreshViewAction.setToolTipText("Rebuild Repository List");
-		// refereshViewAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().
-		// getImageDescriptor(ISharedImages.IMG_OBJS_INFO_TSK));
-		refreshViewAction.setImageDescriptor(CommonImages.REFRESH);
-
-		clearConfigLastUpdateAction = new Action() {
-			@Override
-			public void run() {
-				ISelection selection = viewer.getSelection();
-				Object obj = ((IStructuredSelection) selection).getFirstElement();
-				if (null != obj && obj instanceof KeyValuePair) {
-					if (askDeleteMessage((KeyValuePair) obj)) {
-						KeyValuePair kvp = (KeyValuePair) obj;
-						((TaskRepository) kvp.getParent()).removeProperty((String) kvp.getKey());
-						TasksUiPlugin.getExternalizationManager().requestSave();
-						viewer.refresh();
-					}
-				} else if (null == obj) {
-					List<TaskRepository> repositories = TasksUi.getRepositoryManager().getAllRepositories();
-					for (TaskRepository repository : repositories) {
-						repository.removeProperty("config.lastupdate");
-						TasksUiPlugin.getExternalizationManager().requestSave();
-						viewer.refresh();
-					}
-					showMessage("Removed config.lastupdate property");
-				}
-			}
-		};
-		clearConfigLastUpdateAction.setText("Clear Config Update");
-		clearConfigLastUpdateAction.setToolTipText("Forget last config update date");
-		clearConfigLastUpdateAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages().getImageDescriptor(
-				ISharedImages.IMG_TOOL_DELETE));
-		doubleClickAction = new Action() {
-			@Override
-			public void run() {
-				ISelection selection = viewer.getSelection();
-				Object obj = ((IStructuredSelection) selection).getFirstElement();
-				if (obj instanceof KeyValuePair) {
-					if (askDeleteMessage((KeyValuePair) obj)) {
-						KeyValuePair kvp = (KeyValuePair) obj;
-						((TaskRepository) kvp.getParent()).removeProperty((String) kvp.getKey());
-						TasksUiPlugin.getExternalizationManager().requestSave();
-						viewer.refresh();
-					}
-				}
-			}
-		};
-	}
-
-	private void hookDoubleClickAction() {
-		viewer.addDoubleClickListener(new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				doubleClickAction.run();
-			}
-		});
-	}
-
-	private void showMessage(String message) {
-		MessageDialog.openInformation(viewer.getControl().getShell(), "Repository Spy View", message);
-	}
-
-	private boolean askDeleteMessage(KeyValuePair obj) {
-		return MessageDialog.openConfirm(viewer.getControl().getShell(), "Repository Spy View",
-				"Do you want to clear property '" + obj.getKey().toString() + "' from '" + obj.getParent().toString()
-						+ "'");
-	}
-
-	/**
-	 * Passing the focus request to the viewer's control.
-	 */
-	@Override
-	public void setFocus() {
-		viewer.getControl().setFocus();
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.tests/.classpath b/org.eclipse.mylyn.sandbox.tests/.classpath
deleted file mode 100644
index 1c9d79f..0000000
--- a/org.eclipse.mylyn.sandbox.tests/.classpath
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
-		<accessrules>
-			<accessrule kind="accessible" pattern="org/eclipse/mylyn/**"/>
-			<accessrule kind="accessible" pattern="**/internal/**"/>
-		</accessrules>
-	</classpathentry>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.mylyn.sandbox.tests/.cvsignore b/org.eclipse.mylyn.sandbox.tests/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/org.eclipse.mylyn.sandbox.tests/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/org.eclipse.mylyn.sandbox.tests/.project b/org.eclipse.mylyn.sandbox.tests/.project
deleted file mode 100644
index 2ab6bd5..0000000
--- a/org.eclipse.mylyn.sandbox.tests/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.mylyn.sandbox.tests</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.mylyn.sandbox.tests/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.sandbox.tests/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 9cc3e19..0000000
--- a/org.eclipse.mylyn.sandbox.tests/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,340 +0,0 @@
-#Thu May 15 00:36:50 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-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.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=ignore
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
-org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
-org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL,NORMAL
-org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX,API
-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_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_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_selector_in_method_invocation=80
-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.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=1
-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=false
-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=false
-org.eclipse.jdt.core.formatter.comment.format_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=false
-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=120
-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=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-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=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_member=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_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not 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=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=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_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_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_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_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_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.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=120
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
-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_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.sandbox.tests/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.sandbox.tests/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 5e70d08..0000000
--- a/org.eclipse.mylyn.sandbox.tests/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,63 +0,0 @@
-#Sat Mar 01 03:38:47 PST 2008
-cleanup_settings_version=2
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-formatter_profile=_Mylyn based on Eclipse
-formatter_settings_version=11
-internal.default.compliance=default
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=true
-org.eclipse.jdt.ui.javadoc=false
-org.eclipse.jdt.ui.keywordthis=false
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2004, 2007 Mylyn project committers and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
-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_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=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=true
-sp_cleanup.correct_indentation=true
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.make_local_variable_final=false
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-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=true
-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=true
-sp_cleanup.remove_unused_imports=false
-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=true
-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=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.sandbox.tests/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.sandbox.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
deleted file mode 100644
index 7ab03bd..0000000
--- a/org.eclipse.mylyn.sandbox.tests/.settings/org.eclipse.ltk.core.refactoring.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Jun 02 15:30:09 PDT 2006
-eclipse.preferences.version=1
-org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.sandbox.tests/.settings/org.eclipse.mylyn.tasklist.prefs b/org.eclipse.mylyn.sandbox.tests/.settings/org.eclipse.mylyn.tasklist.prefs
deleted file mode 100644
index 0a2cc0b..0000000
--- a/org.eclipse.mylyn.sandbox.tests/.settings/org.eclipse.mylyn.tasklist.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Jun 18 17:14:59 PDT 2007
-eclipse.preferences.version=1
-project.repository.kind=bugzilla
-project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.sandbox.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.sandbox.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
deleted file mode 100644
index d8c6d26..0000000
--- a/org.eclipse.mylyn.sandbox.tests/.settings/org.eclipse.mylyn.tasks.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Jun 25 03:02:37 GMT 2007
-eclipse.preferences.version=1
-project.repository.kind=bugzilla
-project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.sandbox.tests/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.sandbox.tests/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index ae1de47..0000000
--- a/org.eclipse.mylyn.sandbox.tests/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,24 +0,0 @@
-#Thu May 15 00:36:50 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=2
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=2
-compilers.p.internal=1
-compilers.p.missing-bundle-classpath-entries=1
-compilers.p.missing-packages=1
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=2
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=0
-compilers.p.unknown-element=0
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=0
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.sandbox.tests/META-INF/MANIFEST.MF b/org.eclipse.mylyn.sandbox.tests/META-INF/MANIFEST.MF
deleted file mode 100644
index 343992d..0000000
--- a/org.eclipse.mylyn.sandbox.tests/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,35 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Mylyn Sandbox Tests
-Bundle-SymbolicName: org.eclipse.mylyn.sandbox.tests
-Bundle-Version: 0.0.0
-Bundle-Vendor: Eclipse.org
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.mylyn.context.core,
- org.eclipse.mylyn.context.ui,
- org.eclipse.mylyn.java.ui,
- org.eclipse.jdt.core,
- org.eclipse.mylyn.tasks.ui,
- org.eclipse.core.resources,
- org.eclipse.ui.browser,
- org.junit,
- org.eclipse.mylyn.bugzilla.core,
- org.eclipse.mylyn.bugzilla.ui,
- org.eclipse.jface.text,
- org.eclipse.ui.ide,
- org.eclipse.mylyn.java.tests,
- org.eclipse.mylyn.tasks.core,
- org.eclipse.mylyn.monitor.ui,
- org.eclipse.ui.forms,
- org.eclipse.mylyn.sandbox.ui,
- org.eclipse.mylyn.monitor.core,
- org.eclipse.mylyn.monitor.reports,
- org.eclipse.mylyn.monitor.usage,
- org.eclipse.jdt.ui,
- org.eclipse.mylyn.monitor.tests,
- org.eclipse.mylyn.context.tests
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.mylyn.sandbox.tests;x-internal:=true
diff --git a/org.eclipse.mylyn.sandbox.tests/about.html b/org.eclipse.mylyn.sandbox.tests/about.html
deleted file mode 100644
index 0dd939c..0000000
--- a/org.eclipse.mylyn.sandbox.tests/about.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 7, 2007</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.sandbox.tests/build.properties b/org.eclipse.mylyn.sandbox.tests/build.properties
deleted file mode 100644
index bc221e0..0000000
--- a/org.eclipse.mylyn.sandbox.tests/build.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 Mylyn project committers and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               about.html
-src.includes = about.html
diff --git a/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/ActiveHierarchyTest.java b/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/ActiveHierarchyTest.java
deleted file mode 100644
index 54ef787..0000000
--- a/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/ActiveHierarchyTest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.sandbox.tests;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.mylyn.context.core.ContextCore;
-import org.eclipse.mylyn.context.tests.UiTestUtil;
-import org.eclipse.mylyn.internal.sandbox.ui.views.ContextHierarchyView;
-import org.eclipse.mylyn.java.tests.AbstractJavaContextTest;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.PartInitException;
-
-/**
- * @author Mik Kersten
- */
-public class ActiveHierarchyTest extends AbstractJavaContextTest {
-
-	private final ContextHierarchyView view;
-
-	private final Tree tree;
-
-	public ActiveHierarchyTest() throws PartInitException {
-		view = (ContextHierarchyView) JavaPlugin.getActivePage().showView(ContextHierarchyView.ID);
-		tree = view.getViewer().getTree();
-	}
-
-	/**
-	 * bug#107384
-	 */
-	public void testElementDuplication() throws JavaModelException {
-		assertEquals(0, tree.getItemCount());
-		assertEquals(0, ContextCore.getContextManager().getActiveLandmarks().size());
-
-		IType superType = project.createType(p1, "Super.java", "public class Super { }");
-		makeLandmark(superType);
-		List<TreeItem> collectedItems = new ArrayList<TreeItem>();
-		UiTestUtil.collectTreeItemsInView(tree.getItems(), collectedItems);
-		assertEquals(2, collectedItems.size());
-
-		IType sub1 = project.createType(p1, "Sub1.java", "public class Sub1 extends Super { }");
-		makeLandmark(sub1);
-		collectedItems = new ArrayList<TreeItem>();
-		UiTestUtil.collectTreeItemsInView(tree.getItems(), collectedItems);
-		assertEquals(3, collectedItems.size());
-
-		IType sub2 = project.createType(p1, "Sub2.java", "public class Sub2 extends Super { }");
-		makeLandmark(sub2);
-		collectedItems = new ArrayList<TreeItem>();
-		UiTestUtil.collectTreeItemsInView(tree.getItems(), collectedItems);
-		assertEquals(4, collectedItems.size());
-
-		IType subsub = project.createType(p1, "SubSub.java", "public class SubSub extends Sub1 { }");
-		makeLandmark(subsub);
-		collectedItems = new ArrayList<TreeItem>();
-		UiTestUtil.collectTreeItemsInView(tree.getItems(), collectedItems);
-		assertEquals(5, collectedItems.size());
-	}
-
-	private void makeLandmark(IJavaElement element) {
-		StructuredSelection s1 = new StructuredSelection(element);
-		monitor.selectionChanged(view, s1);
-		manager.processInteractionEvent(mockInterestContribution(element.getHandleIdentifier(), scaling.getLandmark()));
-		view.refreshHierarchy(false);
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/ActiveSearchTest.java b/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/ActiveSearchTest.java
deleted file mode 100644
index c18d441..0000000
--- a/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/ActiveSearchTest.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.sandbox.tests;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.IJavaSearchConstants;
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.mylyn.context.core.ContextCore;
-import org.eclipse.mylyn.context.core.IInteractionElement;
-import org.eclipse.mylyn.context.tests.UiTestUtil;
-import org.eclipse.mylyn.context.tests.support.search.TestActiveSearchListener;
-import org.eclipse.mylyn.internal.context.core.AbstractRelationProvider;
-import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
-import org.eclipse.mylyn.internal.context.core.IActiveSearchOperation;
-import org.eclipse.mylyn.internal.java.ui.search.JavaReferencesProvider;
-import org.eclipse.mylyn.internal.sandbox.ui.views.ActiveSearchView;
-import org.eclipse.mylyn.java.tests.AbstractJavaContextTest;
-import org.eclipse.mylyn.java.tests.search.SearchPluginTestHelper;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.Perspective;
-import org.eclipse.ui.internal.WorkbenchPage;
-
-/**
- * @author Mik Kersten
- */
-public class ActiveSearchTest extends AbstractJavaContextTest {
-
-	private ActiveSearchView view;
-
-	@Override
-	protected void setUp() throws Exception {
-		super.setUp();
-	}
-
-	@Override
-	protected void tearDown() throws Exception {
-		super.tearDown();
-	}
-
-	public void testViewRecursion() throws JavaModelException, PartInitException {
-		view = (ActiveSearchView) JavaPlugin.getActivePage().showView(ActiveSearchView.ID);
-		ActiveSearchView.getFromActivePerspective().setSyncExecForTesting(false);
-
-		for (AbstractRelationProvider provider : ContextCorePlugin.getDefault().getRelationProviders()) {
-			assertTrue(provider.isEnabled());
-		}
-		assertEquals(0, view.getViewer().getTree().getItemCount());
-
-		IWorkbenchPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
-		IMethod m1 = type1.createMethod("void m1() {\n m1(); \n}", null, true, null);
-		StructuredSelection sm1 = new StructuredSelection(m1);
-		monitor.selectionChanged(part, sm1);
-		IInteractionElement node = manager.processInteractionEvent(mockInterestContribution(m1.getHandleIdentifier(),
-				scaling.getLandmark()));
-
-		assertEquals(1, ContextCore.getContextManager().getActiveLandmarks().size());
-
-		assertEquals(1, search(2, node).size());
-
-		List<TreeItem> collectedItems = new ArrayList<TreeItem>();
-		UiTestUtil.collectTreeItemsInView(view.getViewer().getTree().getItems(), collectedItems);
-
-		// just make sure that the view didn't blow up.
-		assertEquals(1, collectedItems.size());
-		monitor.selectionChanged(part, sm1);
-		manager.processInteractionEvent(mockInterestContribution(m1.getHandleIdentifier(), -scaling.getLandmark()));
-	}
-
-	public void testSearchNotRunIfViewDeactivated() throws PartInitException, JavaModelException {
-		view = (ActiveSearchView) JavaPlugin.getActivePage().showView(ActiveSearchView.ID);
-		for (AbstractRelationProvider provider : ContextCorePlugin.getDefault().getRelationProviders()) {
-			assertTrue(provider.getCurrentDegreeOfSeparation() > 0);
-		}
-		JavaPlugin.getActivePage().showView("org.eclipse.ui.views.ProblemView");
-
-		Perspective perspective = ((WorkbenchPage) JavaPlugin.getActivePage()).getActivePerspective();
-		IViewReference reference = JavaPlugin.getActivePage().findViewReference(ActiveSearchView.ID);
-		assertNotNull(reference);
-//		assertTrue(perspective.canCloseView(view));
-		assertTrue(perspective.hideView(reference));
-
-		for (AbstractRelationProvider provider : ContextCorePlugin.getDefault().getRelationProviders()) {
-			assertFalse(provider.isEnabled());
-		}
-
-		JavaPlugin.getActivePage().showView(ActiveSearchView.ID);
-		for (AbstractRelationProvider provider : ContextCorePlugin.getDefault().getRelationProviders()) {
-			assertTrue(provider.isEnabled());
-		}
-	}
-
-	public void testSearchAfterDeletion() throws JavaModelException, PartInitException, IOException, CoreException {
-		view = (ActiveSearchView) JavaPlugin.getActivePage().showView(ActiveSearchView.ID);
-		if (view != null) {
-			assertEquals(0, view.getViewer().getTree().getItemCount());
-
-			IWorkbenchPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
-			IMethod m1 = type1.createMethod("void m1() {\n m2() \n}", null, true, null);
-			IMethod m2 = type1.createMethod("void m2() { }", null, true, null);
-			StructuredSelection sm2 = new StructuredSelection(m2);
-			monitor.selectionChanged(part, sm2);
-			IInteractionElement node = manager.processInteractionEvent(mockInterestContribution(
-					m2.getHandleIdentifier(), scaling.getLandmark()));
-			assertEquals(1, ContextCore.getContextManager().getActiveLandmarks().size());
-
-			assertEquals(1, search(2, node).size());
-
-			m1.delete(true, null);
-			assertFalse(m1.exists());
-
-			assertEquals(0, search(2, node).size());
-		}
-	}
-
-	public List<?> search(int dos, IInteractionElement node) {
-		if (node == null) {
-			fail("null element");
-		}
-
-		JavaReferencesProvider prov = new JavaReferencesProvider();
-
-		TestActiveSearchListener l = new TestActiveSearchListener(prov);
-		IActiveSearchOperation o = prov.getSearchOperation(node, IJavaSearchConstants.REFERENCES, dos);
-		if (o == null) {
-			return null;
-		}
-
-		SearchPluginTestHelper.search(o, l);
-		return l.getResults();
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/AllSandboxTests.java b/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/AllSandboxTests.java
deleted file mode 100644
index 7585f58..0000000
--- a/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/AllSandboxTests.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.sandbox.tests;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-public class AllSandboxTests {
-
-	public static Test suite() {
-		TestSuite suite = new TestSuite("Test for org.eclipse.mylyn.sandbox.tests");
-		//$JUnit-BEGIN$
-		suite.addTestSuite(TaskReportGeneratorTest.class);
-		suite.addTestSuite(PredictedErrorInterestTest.class);
-		suite.addTestSuite(ActiveHierarchyTest.class);
-		suite.addTestSuite(ActiveSearchTest.class);
-		suite.addTestSuite(StatisticsReportingTest.class);
-		suite.addTestSuite(SharedTaskFolderTest.class);
-		suite.addTestSuite(BugzillaActiveSearchTest.class);
-		//$JUnit-END$
-		return suite;
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/BugzillaActiveSearchTest.java b/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/BugzillaActiveSearchTest.java
deleted file mode 100644
index 22b9339..0000000
--- a/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/BugzillaActiveSearchTest.java
+++ /dev/null
@@ -1,337 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-/*
- * Created on Nov 19, 2004
- */
-package org.eclipse.mylyn.sandbox.tests;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
-import org.eclipse.mylyn.internal.bugzilla.core.BugzillaTask;
-import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
-import org.eclipse.mylyn.internal.context.core.IActiveSearchListener;
-import org.eclipse.mylyn.internal.sandbox.bridge.bugs.BugzillaMylynSearch;
-import org.eclipse.mylyn.internal.sandbox.bridge.bugs.BugzillaReportInfo;
-import org.eclipse.mylyn.internal.sandbox.bridge.bugs.MylynBugsManager;
-import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
-import org.eclipse.mylyn.internal.tasks.ui.TaskListManager;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.java.tests.search.SearchPluginTestHelper;
-import org.eclipse.mylyn.java.tests.search.WorkspaceSetupHelper;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-
-/*
- * TEST CASES TO HANDLE 1. what is here 2. different scopes ( local and remote )
- * 3. no bugs 4. offline bugs
- * 
- * DEGREE OF SEPARATIONS 1 Local bug, qualified reference 2 local bug,
- * unqualified reference 3 remote bug, qualified reference 4 remote bug,
- * unqualified reference 5 NONE
- */
-
-/**
- * Test the bugzilla search functionality of the bridge
- * 
- * @author Shawn Minto
- */
-public class BugzillaActiveSearchTest extends TestCase {
-
-	private TaskRepository repository;
-
-	// SHAWNTODO Add tests for the different types of searches (local qual,
-	// local unqual, fully qual, unqual) and mock up a bugs db for testing
-
-	/** The expected number of results when searching for astNode */
-	// SHAWNTODO add back in when we have a test server mocked up
-	// private static final int NUM_AST_RESULTS = 302;
-	//	
-	// private static final int NUM_AST_SETSOURCERANGE_RESULTS = 15;
-	/** list to add collectors to when notified */
-	private final List<List<?>> lists = new ArrayList<List<?>>();
-
-	private IType astNodeType;
-
-	@Override
-	protected void setUp() throws Exception {
-		WorkspaceSetupHelper.setupWorkspace();
-		repository = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND, IBugzillaConstants.ECLIPSE_BUGZILLA_URL);
-		TasksUiPlugin.getRepositoryManager().addRepository(repository);
-
-		IJavaProject jp = WorkspaceSetupHelper.getJdtCoreDomProject();
-		astNodeType = WorkspaceSetupHelper.getType(jp, "org.eclipse.jdt.core.dom.ASTNode");
-	}
-
-	@Override
-	protected void tearDown() throws Exception {
-		WorkspaceSetupHelper.clearDoiModel();
-		TasksUiPlugin.getRepositoryManager().removeRepository(repository,
-				TasksUiPlugin.getDefault().getRepositoriesFilePath());
-	}
-
-	/**
-	 * Test adding and removing ISearchCompletedListeners
-	 */
-	public void testSearchCompletedListenerAddAndRemove() {
-		lists.clear();
-
-		// create 2 listeners
-		IActiveSearchListener l1 = new IActiveSearchListener() {
-			private boolean gathered = false;
-
-			public void searchCompleted(List<?> l) {
-				lists.add(l);
-				gathered = true;
-			}
-
-			public boolean resultsGathered() {
-				return gathered;
-			}
-		};
-		IActiveSearchListener l2 = new IActiveSearchListener() {
-			private boolean gathered = false;
-
-			public void searchCompleted(List<?> l) {
-				lists.add(l);
-				gathered = true;
-			}
-
-			public boolean resultsGathered() {
-				return gathered;
-			}
-		};
-
-		BugzillaMylynSearch s = new BugzillaMylynSearch(BugzillaMylynSearch.UNQUAL, astNodeType,
-				IBugzillaConstants.ECLIPSE_BUGZILLA_URL);
-
-		// add the first listener
-		s.addListener(l1);
-		// remove the first listener
-		s.removeListener(l1);
-
-		// perform the search
-		SearchPluginTestHelper.search(s, l2);
-
-		// make sure that only the second listener added has any results left
-		assertTrue("listener was not removed", lists.size() >= 1 && !l1.resultsGathered());
-		assertTrue("listener was not added", lists.size() == 1);
-
-		// display the time it took for the search
-		MylynBugsManager.getBridge().removeFromLandmarksHash(astNodeType);
-	}
-
-	/**
-	 * Tests that the bridge gets the right data for us This test is wierd because it waits on results.
-	 */
-	public void testBridge() {
-		lists.clear();
-		BugzillaMylynSearch s = new BugzillaMylynSearch(BugzillaMylynSearch.UNQUAL, astNodeType,
-				IBugzillaConstants.ECLIPSE_BUGZILLA_URL);
-
-		IActiveSearchListener l = new IActiveSearchListener() {
-			private boolean gathered = false;
-
-			public void searchCompleted(List<?> results) {
-				lists.add(results);
-				gathered = true;
-			}
-
-			public boolean resultsGathered() {
-				return gathered;
-			}
-		};
-
-		// perform the search
-		SearchPluginTestHelper.search(s, l);
-
-		// make sure we got the right number of bugs back
-		assertTrue("No collector returned", lists.size() != 0);
-		List<?> c = lists.get(0);
-		assertTrue("Results not the right size", c.size() > 0); // TODO should
-		// be
-		// assertEquals
-		// on expected
-		// size
-
-		// display the time it took for the search and the results returned
-		MylynBugsManager.getBridge().removeFromLandmarksHash(astNodeType);
-
-	}
-
-	/**
-	 * Tests that the bridge saves the results of a search so that it can be used later
-	 */
-	public void testSaveResults() {
-		lists.clear();
-		BugzillaMylynSearch s = new BugzillaMylynSearch(BugzillaMylynSearch.UNQUAL, astNodeType,
-				IBugzillaConstants.ECLIPSE_BUGZILLA_URL);
-
-		IActiveSearchListener l = new IActiveSearchListener() {
-			private boolean gathered = false;
-
-			public void searchCompleted(List<?> results) {
-				lists.add(results);
-				gathered = true;
-			}
-
-			public boolean resultsGathered() {
-				return gathered;
-			}
-		};
-
-		// perform the search
-		SearchPluginTestHelper.search(s, l);
-
-		// do an inital search
-		assertTrue("No collectors returned", lists.size() != 0);
-		List<?> c = lists.get(0);
-		assertTrue("Results not the right size", c.size() > 0);
-		// TODO should be assertEquals on expected size
-
-		// check that the search has been saved
-		List<BugzillaReportInfo> saved = MylynBugsManager.getBridge().getFromLandmarksHash(astNodeType,
-				BugzillaMylynSearch.UNQUAL);
-		assertTrue("Results not cached", saved != null);
-		if (saved == null) {
-			fail();
-		} else {
-			assertTrue("Results not the right size", saved.size() > 0);
-			// TODO should be assertEquals on expected size
-
-			assertTrue(c.containsAll(saved) && saved.containsAll(c));
-			MylynBugsManager.getBridge().removeFromLandmarksHash(astNodeType);
-		}
-	}
-
-	public void testLocalBugUnqual() throws InterruptedException {
-		lists.clear();
-
-		String bugPrefix = "<server>-";
-
-		TaskListManager manager = TasksUiPlugin.getTaskListManager();
-		TaskCategory cat = new TaskCategory("Testing Category");
-		manager.getTaskList().addCategory(cat);
-		BugzillaTask bugTask1 = new BugzillaTask(bugPrefix, "" + 94185, "<bugzilla info>");
-
-		manager.getTaskList().addTask(bugTask1, cat);
-		// cat.addTask(bugTask1);
-		while (bugTask1.isSynchronizing()) {
-			Thread.sleep(500);
-		}
-		BugzillaTask bugTask2 = new BugzillaTask(bugPrefix, "" + 3692, "<bugzilla info>");
-		manager.getTaskList().addTask(bugTask2, cat);
-		// cat.addTask(bugTask2);
-		while (bugTask2.isSynchronizing()) {
-			Thread.sleep(500);
-		}
-		BugzillaTask bugTask3 = new BugzillaTask(bugPrefix, "" + 3693, "<bugzilla info>");
-		manager.getTaskList().addTask(bugTask3, cat);
-		// cat.addTask(bugTask3);
-		while (bugTask3.isSynchronizing()) {
-			Thread.sleep(500);
-		}
-
-		BugzillaTask bugTask4 = new BugzillaTask(bugPrefix, "" + 9583, "<bugzilla info>");
-		manager.getTaskList().addTask(bugTask4, cat);
-		// cat.addTask(bugTask4);
-		while (bugTask4.isSynchronizing()) {
-			Thread.sleep(500);
-		}
-
-		BugzillaMylynSearch s = new BugzillaMylynSearch(BugzillaMylynSearch.LOCAL_UNQUAL, astNodeType,
-				IBugzillaConstants.ECLIPSE_BUGZILLA_URL);
-
-		IActiveSearchListener l = new IActiveSearchListener() {
-			private boolean gathered = false;
-
-			public void searchCompleted(List<?> results) {
-				lists.add(results);
-				gathered = true;
-			}
-
-			public boolean resultsGathered() {
-				return gathered;
-			}
-		};
-
-		// perform the search
-		SearchPluginTestHelper.search(s, l);
-
-		// do an inital search
-		assertTrue("No collectors returned", lists.size() != 0);
-		List<?> c = lists.get(0);
-		assertEquals("Results not the right size", 3, c.size());
-
-		MylynBugsManager.getBridge().removeFromLandmarksHash(astNodeType);
-		TasksUiPlugin.getTaskList().deleteCategory(cat);
-	}
-
-	// TODO need to test a bug that wraps...should fail since we can only search
-	// on a single line
-	public void testLocalBugFullyQual() throws InterruptedException {
-		lists.clear();
-
-		String bugPrefix = "Bugzilla-";
-
-		TaskListManager manager = TasksUiPlugin.getTaskListManager();
-		TaskCategory cat = new TaskCategory("Testing Category");
-		manager.getTaskList().addCategory(cat);
-		BugzillaTask bugTask1 = new BugzillaTask(bugPrefix, "" + 94185, "<bugzilla info>");
-		manager.getTaskList().addTask(bugTask1, cat);
-		// cat.addTask(bugTask1);
-		while (bugTask1.isSynchronizing()) {
-			Thread.sleep(500);
-		}
-
-		BugzillaTask bugTask2 = new BugzillaTask(bugPrefix, "" + 9583, "<bugzilla info>");
-		manager.getTaskList().addTask(bugTask2, cat);
-		// cat.addTask(bugTask2);
-		while (bugTask2.isSynchronizing()) {
-			Thread.sleep(500);
-		}
-		BugzillaTask bugTask3 = new BugzillaTask(bugPrefix, "" + 3693, "<bugzilla info>");
-		manager.getTaskList().addTask(bugTask3, cat);
-		// cat.addTask(bugTask3);
-		while (bugTask3.isSynchronizing()) {
-			Thread.sleep(500);
-		}
-
-		BugzillaMylynSearch s = new BugzillaMylynSearch(BugzillaMylynSearch.LOCAL_QUAL, astNodeType,
-				IBugzillaConstants.ECLIPSE_BUGZILLA_URL);
-
-		IActiveSearchListener l = new IActiveSearchListener() {
-			private boolean gathered = false;
-
-			public void searchCompleted(List<?> results) {
-				lists.add(results);
-				gathered = true;
-			}
-
-			public boolean resultsGathered() {
-				return gathered;
-			}
-		};
-
-		// perform the search
-		SearchPluginTestHelper.search(s, l);
-
-		// do an inital search
-		assertTrue("No collectors returned", lists.size() != 0);
-		List<?> c = lists.get(0);
-		assertEquals("Results not the right size", 1, c.size());
-
-		MylynBugsManager.getBridge().removeFromLandmarksHash(astNodeType);
-		TasksUiPlugin.getTaskList().deleteCategory(cat);
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/PredictedErrorInterestTest.java b/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/PredictedErrorInterestTest.java
deleted file mode 100644
index 07cc810..0000000
--- a/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/PredictedErrorInterestTest.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.sandbox.tests;
-
-import java.lang.reflect.InvocationTargetException;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jdt.core.IJavaModelMarker;
-import org.eclipse.jdt.core.IMethod;
-import org.eclipse.jdt.core.IPackageFragment;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.mylyn.context.core.ContextCore;
-import org.eclipse.mylyn.context.core.IInteractionElement;
-import org.eclipse.mylyn.internal.java.ui.JavaStructureBridge;
-import org.eclipse.mylyn.internal.sandbox.ui.InterestInducingProblemListener;
-import org.eclipse.mylyn.java.tests.AbstractJavaContextTest;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-
-public class PredictedErrorInterestTest extends AbstractJavaContextTest {
-
-	public void testErrorInterest() throws CoreException, InterruptedException, InvocationTargetException {
-
-		JavaPlugin.getDefault().getProblemMarkerManager().addListener(new InterestInducingProblemListener());
-
-		IViewPart problemsPart = JavaPlugin.getActivePage().showView("org.eclipse.ui.views.ProblemView");
-		assertNotNull(problemsPart);
-
-		IWorkbenchPart part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActivePart();
-		IMethod m1 = type1.createMethod("public void m1() { }", null, true, null);
-		IPackageFragment p2 = project.createPackage("p2");
-
-		IType type2 = project.createType(p2, "Type2.java", "public class Type2 { }");
-		IMethod m2 = type2.createMethod("void m2() { new p1.Type1().m1(); }", null, true, null);
-
-		assertTrue(m1.exists());
-		assertEquals(1, type1.getMethods().length);
-
-		monitor.selectionChanged(part, new StructuredSelection(m1));
-		IInteractionElement m1Node = ContextCore.getContextManager().getElement(m1.getHandleIdentifier());
-		assertTrue(m1Node.getInterest().isInteresting());
-
-		// delete method to cause error
-		m1.delete(true, null);
-		assertEquals(0, type1.getMethods().length);
-		project.build();
-
-		IMarker[] markers = type2.getResource().findMarkers(IJavaModelMarker.JAVA_MODEL_PROBLEM_MARKER, false,
-				IResource.DEPTH_INFINITE);
-		assertEquals(1, markers.length);
-
-		String resourceHandle = new JavaStructureBridge().getHandleIdentifier(m2.getCompilationUnit());
-		assertTrue(ContextCore.getContextManager().getElement(resourceHandle).getInterest().isInteresting());
-
-		// put it back
-		type1.createMethod("public void m1() { }", null, true, null);
-
-		// XXX: put this back, but it needs to wait on the resource marker
-		// update somehow
-		// project.build();
-		// project.build(); // HACK
-		// project.build(); // HACK
-		// assertFalse(ContextCorePlugin.getContextManager().getElement(resourceHandle).getInterest().isInteresting());
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/SharedTaskFolderTest.java b/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/SharedTaskFolderTest.java
deleted file mode 100644
index 87ec5fd..0000000
--- a/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/SharedTaskFolderTest.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.sandbox.tests;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Calendar;
-
-import junit.framework.TestCase;
-
-import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
-import org.eclipse.mylyn.internal.context.core.InteractionContext;
-import org.eclipse.mylyn.internal.sandbox.ui.SandboxUiPlugin;
-import org.eclipse.mylyn.internal.sandbox.ui.actions.SwitchTaskDataFolderAction;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.core.LocalTask;
-import org.eclipse.mylyn.internal.tasks.ui.TaskListManager;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.monitor.core.InteractionEvent;
-import org.eclipse.mylyn.tasks.core.ITask;
-
-/**
- * Tests changing the shared task directory currently in use.
- * 
- * @author Wesley Coelho
- */
-public class SharedTaskFolderTest extends TestCase {
-
-	private File sharedDataRootDir = null;
-
-	private File bobsDataDir = null;
-
-	private File jillsDataDir = null;
-
-	private String originalMainDataDir = null;
-
-	private String originalSharedDataDir = null;
-
-	private final TaskListManager manager = TasksUiPlugin.getTaskListManager();
-
-	/**
-	 * Set up a shared task directory structure by creating some data in the main directory and copying it to the shared
-	 * directories.
-	 */
-	@Override
-	protected void setUp() throws Exception {
-		super.setUp();
-
-		//Get the original main data directory so that it can be reset later
-		originalMainDataDir = TasksUiPlugin.getDefault().getDataDirectory();
-
-		//Create a task to make sure there is some data in the main directory
-		createAndSaveTask("Task1");
-
-		//Create the shared data directory structure
-		sharedDataRootDir = new File(TasksUiPlugin.getDefault().getDataDirectory() + File.separator + "SharedDataDir");
-		sharedDataRootDir.mkdir();
-		assertTrue(sharedDataRootDir.exists());
-
-		bobsDataDir = new File(sharedDataRootDir.getPath() + File.separator + "Bob");
-		bobsDataDir.mkdir();
-		assertTrue(bobsDataDir.exists());
-
-		jillsDataDir = new File(sharedDataRootDir.getPath() + File.separator + "Jill");
-		jillsDataDir.mkdir();
-		assertTrue(jillsDataDir.exists());
-
-		//Start the shared data dirs off with copies of the main data
-		File mainDataDir = new File(originalMainDataDir);
-		for (File currFile : mainDataDir.listFiles()) {
-			File destFile = new File(bobsDataDir.getPath() + File.separator + currFile.getName());
-			copy(currFile, destFile);
-			destFile = new File(jillsDataDir.getPath() + File.separator + currFile.getName());
-			copy(currFile, destFile);
-		}
-
-		//Set the shared data dir
-		originalSharedDataDir = SandboxUiPlugin.getDefault().getSharedDataDirectoryManager().getSharedDataDirectory();
-		SandboxUiPlugin.getDefault()
-				.getSharedDataDirectoryManager()
-				.setSharedDataDirectory(sharedDataRootDir.getPath());
-		assertFalse(TasksUiPlugin.getDefault().getDataDirectory().equals(sharedDataRootDir.getPath()));
-	}
-
-	/**
-	 * Tests moving the main data directory to another location
-	 */
-	public void testSharedDataDirSwitching() {
-		SwitchTaskDataFolderAction switchAction = new SwitchTaskDataFolderAction();
-
-		//Create a task to appear in the main data dir only
-		ITask mainDataDirTask = createAndSaveTask("Main Dir Task");
-
-		//Check the options of folders to switch to
-		String[] sharedDataFolderOptions = switchAction.getFolderStrings();
-		//Note that index 0 is a string indicating a switch back to the main data directory
-		assertTrue(sharedDataFolderOptions[0].equals("Bob"));
-		assertTrue(sharedDataFolderOptions[1].equals("Jill"));
-
-		//Switch to Bob's folder
-		switchAction.switchTaskDataFolder(sharedDataFolderOptions[0]);
-
-		//Check that the task created in the main data dir isn't there
-		File mainDataDirTaskFile = ContextCorePlugin.getContextStore().getFileForContext(
-				mainDataDirTask.getHandleIdentifier());
-		assertFalse(mainDataDirTaskFile.exists());
-		assertNull(manager.getTaskList().getTask(mainDataDirTask.getHandleIdentifier()));
-
-		fail(); // uncomment below
-		//Create a new task in bob's task data folder only and check that it exists in the right place
-//		ITask bobsTask = createAndSaveTask("Bob's Task");
-//		
-//		File bobsTaskFile = new File(bobsDataDir.getPath() + File.separator + 
-//				ContextCorePlugin.getContextManager().getFileForContext(mainDataDirTask.getHandleIdentifier()).getName());
-//		assertTrue(bobsTaskFile.exists());
-//		bobsTaskFile = new File(ContextCore.getDataDirectory() + File.separator + bobsTask.getContextPath() + MylynTaskListPlugin.FILE_EXTENSION);
-//		assertTrue(bobsTaskFile.exists());
-//		assertNotNull(manager.getTaskForHandle(bobsTask.getHandleIdentifier(), false));
-//		
-//		//Switch to Jill's folder
-//		switchAction.switchTaskDataFolder(sharedDataFolderOptions[1]);
-//		
-//		//Check that Bob's task isn't there
-//		bobsTaskFile = new File(ContextCore.getDataDirectory() + File.separator + bobsTask.getContextPath() + MylynTaskListPlugin.FILE_EXTENSION);
-//		assertFalse(bobsTaskFile.exists());
-//		assertNull(manager.getTaskForHandle(bobsTask.getHandleIdentifier(), false));		
-//		
-//		//Switch back to Bob's folder
-//		switchAction.switchTaskDataFolder(sharedDataFolderOptions[0]);
-//		
-//		//Check that bob's task is still there
-//		bobsTaskFile = new File(ContextCore.getDataDirectory() + File.separator + bobsTask.getContextPath() + MylynTaskListPlugin.FILE_EXTENSION);
-//		assertTrue(bobsTaskFile.exists());
-//		assertNotNull(manager.getTaskForHandle(bobsTask.getHandleIdentifier(), false));			
-//		
-//		//Switch back to the main data folder
-//		sharedDataFolderOptions = switchAction.getFolderStrings();
-//		switchAction.switchTaskDataFolder(sharedDataFolderOptions[0]);
-//		
-//		//Check that the main task is there
-//		mainDataDirTaskFile = new File(ContextCore.getDataDirectory() + File.separator + mainDataDirTask.getContextPath() + MylynTaskListPlugin.FILE_EXTENSION);
-//		assertTrue(mainDataDirTaskFile.exists());
-//		assertNotNull(manager.getTaskForHandle(mainDataDirTask.getHandleIdentifier(), false));			
-
-	}
-
-	/**
-	 * Creates a task with an interaction event and checks that it has been properly saved in the currently active data
-	 * directory
-	 */
-	protected ITask createAndSaveTask(String taskName) {
-
-		//Create the task and add it to the root of the task list
-		AbstractTask newTask = new LocalTask("" + Calendar.getInstance().getTimeInMillis(), taskName);
-		manager.getTaskList().addTask(newTask, manager.getTaskList().getDefaultCategory());
-		InteractionContext mockContext = (InteractionContext) ContextCorePlugin.getContextStore().loadContext(
-				newTask.getHandleIdentifier());//, newTask.getContextPath());
-		InteractionEvent event = new InteractionEvent(InteractionEvent.Kind.EDIT, "structureKind", "handle", "originId");
-		mockContext.parseEvent(event);
-		ContextCorePlugin.getContextManager().internalActivateContext(mockContext);
-
-		fail(); // uncomment below
-//		//Save the context file and check that it exists
-//		ContextCorePlugin.getContextManager().saveContext(mockContext.getId());//, newTask.getContextPath());
-//		File taskFile = new File(ContextCore.getDataDirectory() + File.separator + newTask.getContextPath() + MylynContextManager.CONTEXT_FILE_EXTENSION);
-//		assertTrue(ContextCorePlugin.getContextManager().hasContext(newTask.getContextPath()));
-//		assertTrue(taskFile.exists());			
-
-		return newTask;
-	}
-
-	@Override
-	protected void tearDown() throws Exception {
-
-		//Reset the shared directory to the original value
-		SandboxUiPlugin.getDefault().getSharedDataDirectoryManager().setSharedDataDirectory(originalSharedDataDir);
-//		MylynReportsPlugin.getDefault().getPreferenceStore().setValue(MylynReportsPlugin.SHARED_TASK_DATA_ROOT_DIR, originalSharedDataDir);
-
-		//Delete the test shared data directories
-		deleteDir(bobsDataDir);
-		deleteDir(jillsDataDir);
-		deleteDir(sharedDataRootDir);
-
-		super.tearDown();
-	}
-
-	private void deleteDir(File targetDir) {
-		File[] files = targetDir.listFiles();
-		for (File file : files) {
-			file.delete();
-		}
-
-		targetDir.delete();
-		assertFalse(targetDir.exists());
-	}
-
-	// Note: Copied from MylynTaskListPlugin
-	private boolean copy(File src, File dst) {
-		try {
-			InputStream in = new FileInputStream(src);
-			OutputStream out = new FileOutputStream(dst);
-
-			// Transfer bytes from in to out
-			byte[] buf = new byte[1024];
-			int len;
-			while ((len = in.read(buf)) > 0) {
-				out.write(buf, 0, len);
-			}
-			in.close();
-			out.close();
-			return true;
-		} catch (IOException ioe) {
-			return false;
-		}
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/StatisticsReportingTest.java b/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/StatisticsReportingTest.java
deleted file mode 100644
index 1097389..0000000
--- a/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/StatisticsReportingTest.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.sandbox.tests;
-
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.runtime.jobs.JobChangeAdapter;
-import org.eclipse.jdt.internal.ui.packageview.PackageExplorerPart;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.mylyn.context.ui.AbstractFocusViewAction;
-import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
-import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
-import org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin;
-import org.eclipse.mylyn.internal.monitor.core.collection.IUsageCollector;
-import org.eclipse.mylyn.internal.monitor.reports.collectors.FocusedUiUsageAnalysisCollector;
-import org.eclipse.mylyn.internal.monitor.reports.collectors.FocusedUiViewUsageCollector;
-import org.eclipse.mylyn.internal.monitor.ui.MonitorUiPlugin;
-import org.eclipse.mylyn.internal.monitor.usage.InteractionEventLogger;
-import org.eclipse.mylyn.internal.monitor.usage.ReportGenerator;
-import org.eclipse.mylyn.internal.monitor.usage.UiUsageMonitorPlugin;
-import org.eclipse.mylyn.internal.monitor.usage.UsageStatisticsSummary;
-import org.eclipse.mylyn.internal.tasks.ui.actions.TaskActivateAction;
-import org.eclipse.mylyn.monitor.core.InteractionEvent;
-
-/**
- * @author Mik Kersten
- */
-public class StatisticsReportingTest extends TestCase {
-
-	private InteractionEventLogger logger;
-
-	private final FocusedUiViewUsageCollector viewCollector = new FocusedUiViewUsageCollector();
-
-	private final FocusedUiUsageAnalysisCollector editRatioCollector = new FocusedUiUsageAnalysisCollector();;
-
-	private ReportGenerator report;
-
-	@Override
-	protected void setUp() throws Exception {
-		super.setUp();
-		assertNotNull(ContextCorePlugin.getDefault());
-		assertNotNull(JavaUiBridgePlugin.getDefault());
-		assertNotNull(PackageExplorerPart.openInActivePerspective());
-
-		UiUsageMonitorPlugin.getDefault().startMonitoring();
-		assertTrue(UiUsageMonitorPlugin.getDefault().isMonitoringEnabled());
-		logger = UiUsageMonitorPlugin.getDefault().getInteractionLogger();
-		logger.clearInteractionHistory();
-
-		List<IUsageCollector> collectors = new ArrayList<IUsageCollector>();
-		collectors.add(viewCollector);
-		collectors.add(editRatioCollector);
-		report = new ReportGenerator(logger, collectors);
-		report.forceSyncForTesting(true);
-	}
-
-	@Override
-	protected void tearDown() throws Exception {
-		super.tearDown();
-	}
-
-	protected InteractionEvent mockExplorerSelection(String handle) {
-		InteractionEvent event = new InteractionEvent(InteractionEvent.Kind.SELECTION, "java", handle,
-				JavaUI.ID_PACKAGES);
-		MonitorUiPlugin.getDefault().notifyInteractionObserved(event);
-		return event;
-	}
-
-	protected void mockEdit(String handle) {
-		MonitorUiPlugin.getDefault().notifyInteractionObserved(
-				new InteractionEvent(InteractionEvent.Kind.EDIT, "java", handle, JavaUI.ID_PACKAGES));
-	}
-
-	protected void mockTypesSelection(String handle) {
-		MonitorUiPlugin.getDefault().notifyInteractionObserved(
-				new InteractionEvent(InteractionEvent.Kind.SELECTION, "java", handle, JavaUI.ID_TYPES_VIEW));
-	}
-
-	public void testEditRatio() throws InvocationTargetException, InterruptedException {
-		logger.stopMonitoring();
-		PackageExplorerPart part = PackageExplorerPart.openInActivePerspective();
-		assertNotNull(part.getTreeViewer());
-		part.setFocus();
-
-		logger.startMonitoring();
-		final InteractionEvent first = mockExplorerSelection("A.java");
-		mockUserDelay();
-		mockUserDelay();
-		final InteractionEvent second = mockExplorerSelection("A.java");
-
-		assertTrue(!first.getDate().equals(second.getDelta()));
-
-		try {
-			// XXX: this is a hack and sensitive to CPU speeds
-			Thread.sleep(3000);
-		} catch (InterruptedException ie) {
-			fail();
-		}
-
-		mockEdit("A.java");
-
-		MonitorUiPlugin.getDefault().notifyInteractionObserved(InteractionEvent.makeCommand(TaskActivateAction.ID, ""));
-
-		mockExplorerSelection("A.java");
-		mockEdit("A.java");
-		mockUserDelay();
-		mockEdit("A.java");
-
-		logger.stopMonitoring();
-		report.getStatisticsFromInteractionHistory(logger.getOutputFile(), null);
-
-		// TODO: these are off from expected when test run alone, due to unknown
-		// element selections
-		assertEquals(0.5f, editRatioCollector.getBaselineRatio(-1));
-		assertEquals(2f, editRatioCollector.getMylynRatio(-1));
-	}
-
-	@SuppressWarnings("unused")
-	public void testSimpleSelection() {
-		mockExplorerSelection("A.java");
-		report.getStatisticsFromInteractionHistory(logger.getOutputFile(), new JobChangeAdapter() {
-			public void done() {
-				UsageStatisticsSummary summary = report.getLastParsedSummary();
-				assertTrue(summary.getSingleSummaries().size() > 0);
-			}
-		});
-
-	}
-
-	@SuppressWarnings("unused")
-	public void testFilteredModeDetection() throws IOException {
-		UiUsageMonitorPlugin.getDefault().addMonitoredPreferences(ContextUiPlugin.getDefault().getPluginPreferences());
-
-		UiUsageMonitorPlugin.getDefault().getInteractionLogger().clearInteractionHistory();
-		mockExplorerSelection("A.java");
-		mockUserDelay();
-		mockExplorerSelection("A.java");
-		mockUserDelay();
-		mockTypesSelection("A.java");
-
-		assertNotNull(ContextUiPlugin.getDefault().getPreferenceStore());
-		String prefId = AbstractFocusViewAction.PREF_ID_PREFIX + JavaUI.ID_PACKAGES;
-		assertNotNull(prefId);
-
-		PackageExplorerPart part = PackageExplorerPart.openInActivePerspective();
-		assertNotNull(part);
-		// AbstractFocusViewAction action =
-		// FocusPackageExplorerAction.getActionForPart(part);
-		// assertNotNull(action);
-
-		ContextUiPlugin.getDefault().getPreferenceStore().setValue(prefId, true);
-
-		mockExplorerSelection("A.java");
-		mockUserDelay();
-		mockExplorerSelection("A.java");
-		mockUserDelay();
-		mockTypesSelection("A.java");
-
-		ContextUiPlugin.getDefault().getPreferenceStore().setValue(prefId, false);
-
-		mockExplorerSelection("A.java");
-
-		logger.stopMonitoring();
-		report.getStatisticsFromInteractionHistory(logger.getOutputFile(), new JobChangeAdapter() {
-
-			public void done() {
-				int normal = viewCollector.getNormalViewSelections().get(JavaUI.ID_PACKAGES);
-				assertEquals(5, normal);
-
-				int filtered = viewCollector.getFilteredViewSelections().get(JavaUI.ID_PACKAGES);
-				assertEquals(2, filtered);
-
-				UiUsageMonitorPlugin.getDefault().removeMonitoredPreferences(
-						ContextUiPlugin.getDefault().getPluginPreferences());
-			}
-		});
-
-	}
-
-	/**
-	 * Delay enough to make replicated events different
-	 */
-	private void mockUserDelay() {
-		try {
-			// XXX: this could be sensitive to CPU speeds
-			Thread.sleep(100);
-		} catch (InterruptedException ie) {
-			fail();
-		}
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/TaskReportGeneratorTest.java b/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/TaskReportGeneratorTest.java
deleted file mode 100644
index f397ea5..0000000
--- a/org.eclipse.mylyn.sandbox.tests/src/org/eclipse/mylyn/sandbox/tests/TaskReportGeneratorTest.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.sandbox.tests;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Set;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
-import org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryQuery;
-import org.eclipse.mylyn.internal.bugzilla.core.BugzillaTask;
-import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
-import org.eclipse.mylyn.internal.sandbox.ui.planner.CompletedTaskCollector;
-import org.eclipse.mylyn.internal.sandbox.ui.planner.TaskReportGenerator;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
-import org.eclipse.mylyn.internal.tasks.core.TaskCategory;
-import org.eclipse.mylyn.internal.tasks.ui.TaskListManager;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-
-/**
- * @author Mik Kersten
- * @author Rob Elves
- */
-public class TaskReportGeneratorTest extends TestCase {
-
-	private TaskListManager manager;
-
-	@Override
-	protected void setUp() throws Exception {
-		super.setUp();
-		manager = TasksUiPlugin.getTaskListManager();
-		manager.resetTaskList();
-		assertEquals(0, manager.getTaskList().getAllTasks().size());
-	}
-
-	@Override
-	protected void tearDown() throws Exception {
-		super.tearDown();
-		manager.resetTaskList();
-		TasksUiPlugin.getTaskListManager().saveTaskList();
-//		TasksUiPlugin.getDefault().getTaskListSaveManager().saveTaskList(true);
-		assertEquals(0, manager.getTaskList().getAllTasks().size());
-	}
-
-	public void testCompletedTasksRetrieved() throws InvocationTargetException, InterruptedException {
-		AbstractTask task1 = TasksUiInternal.createNewLocalTask("task 1");
-		manager.getTaskList().addTask(task1);
-
-		CompletedTaskCollector collector = new CompletedTaskCollector(new Date(0), new Date());
-		TaskReportGenerator generator = new TaskReportGenerator(manager.getTaskList());
-		generator.addCollector(collector);
-		generator.run(new NullProgressMonitor());
-		assertEquals(0, generator.getAllCollectedTasks().size());
-
-		task1.setCompleted(true);
-		collector = new CompletedTaskCollector(new Date(0), new Date());
-		generator = new TaskReportGenerator(manager.getTaskList());
-		generator.addCollector(collector);
-		generator.run(new NullProgressMonitor());
-		assertEquals(1, generator.getAllCollectedTasks().size());
-		assertEquals(task1, generator.getAllCollectedTasks().get(0));
-	}
-
-	public void testCompletedTasksDateBoundsRetrieved() throws InvocationTargetException, InterruptedException {
-		AbstractTask task1 = TasksUiInternal.createNewLocalTask("task 1");
-		manager.getTaskList().addTask(task1);
-		task1.setCompleted(true);
-		Thread.sleep(1000);
-		long now = new Date().getTime();
-
-		CompletedTaskCollector collector = new CompletedTaskCollector(new Date(now), new Date());
-		TaskReportGenerator generator = new TaskReportGenerator(manager.getTaskList());
-		generator.addCollector(collector);
-		generator.run(new NullProgressMonitor());
-		assertEquals(0, generator.getAllCollectedTasks().size());
-
-		generator = new TaskReportGenerator(manager.getTaskList());
-		collector = new CompletedTaskCollector(new Date(now - 8000), new Date());
-		generator.addCollector(collector);
-		generator.run(new NullProgressMonitor());
-		assertEquals(1, generator.getAllCollectedTasks().size());
-		assertEquals(task1, generator.getAllCollectedTasks().get(0));
-	}
-
-	public void testCompletedBugzillaTasksRetrieved() throws InvocationTargetException, InterruptedException {
-		TaskRepository repository = new TaskRepository(BugzillaCorePlugin.CONNECTOR_KIND,
-				IBugzillaConstants.ECLIPSE_BUGZILLA_URL);
-		TasksUiPlugin.getRepositoryManager().addRepository(repository);
-		BugzillaTask task1 = new BugzillaTask(IBugzillaConstants.ECLIPSE_BUGZILLA_URL, "1", "bugzillatask 1");
-		manager.getTaskList().addTask(task1);
-
-		Calendar cal = Calendar.getInstance();
-		cal.add(Calendar.MINUTE, 5);
-		CompletedTaskCollector collector = new CompletedTaskCollector(new Date(0), cal.getTime());
-		TaskReportGenerator generator = new TaskReportGenerator(manager.getTaskList());
-		generator.addCollector(collector);
-		generator.run(new NullProgressMonitor());
-		assertEquals(0, generator.getAllCollectedTasks().size());
-
-		task1.setCompleted(true);
-		generator.run(new NullProgressMonitor());
-		assertEquals(1, generator.getAllCollectedTasks().size());
-		assertEquals(task1, generator.getAllCollectedTasks().get(0));
-		TasksUiPlugin.getRepositoryManager().removeRepository(repository,
-				TasksUiPlugin.getDefault().getRepositoriesFilePath());
-		manager.resetTaskList();
-	}
-
-	public void testCompletedTasksInCategoryRetrieved() throws InvocationTargetException, InterruptedException {
-		AbstractTask task1 = TasksUiInternal.createNewLocalTask("task 1");
-		manager.getTaskList().addTask(task1);
-		task1.setCompleted(true);
-		TaskCategory cat1 = new TaskCategory("TaskReportGeneratorTest Category");
-		manager.getTaskList().addCategory(cat1);
-
-		Set<AbstractTaskContainer> catagories = new HashSet<AbstractTaskContainer>();
-		catagories.add(cat1);
-
-		CompletedTaskCollector collector = new CompletedTaskCollector(new Date(0), new Date());
-		TaskReportGenerator generator = new TaskReportGenerator(manager.getTaskList(), catagories);
-		generator.addCollector(collector);
-		generator.run(new NullProgressMonitor());
-		assertEquals(0, generator.getAllCollectedTasks().size());
-
-		manager.getTaskList().addTask(task1, cat1);
-
-		generator.run(new NullProgressMonitor());
-		assertEquals(1, generator.getAllCollectedTasks().size());
-		assertEquals(task1, generator.getAllCollectedTasks().get(0));
-	}
-
-	public void testCompletedBugzillaTasksInCategoryRetrieved() throws InvocationTargetException, InterruptedException {
-		BugzillaTask task1 = new BugzillaTask("repo", "1", "task 1");
-		manager.getTaskList().addTask(task1);
-		task1.setCompleted(true);
-		TaskCategory cat1 = new TaskCategory("TaskReportGeneratorTest Category");
-		manager.getTaskList().addCategory(cat1);
-
-		Set<AbstractTaskContainer> catagories = new HashSet<AbstractTaskContainer>();
-		catagories.add(cat1);
-
-		CompletedTaskCollector collector = new CompletedTaskCollector(new Date(0), new Date());
-		TaskReportGenerator generator = new TaskReportGenerator(manager.getTaskList(), catagories);
-		generator.addCollector(collector);
-		generator.run(new NullProgressMonitor());
-		assertEquals(0, generator.getAllCollectedTasks().size());
-
-		manager.getTaskList().addTask(task1, cat1);
-
-		generator.run(new NullProgressMonitor());
-		assertEquals(1, generator.getAllCollectedTasks().size());
-		assertEquals(task1, generator.getAllCollectedTasks().get(0));
-	}
-
-	public void testCompletedBugzillaTasksInQueryRetrieved() throws InvocationTargetException, InterruptedException {
-		BugzillaTask task1 = new BugzillaTask("repo", "1", "task 1");
-		manager.getTaskList().addTask(task1);
-		task1.setCompleted(false);
-
-		BugzillaRepositoryQuery bugQuery = new BugzillaRepositoryQuery("repositoryUrl", "queryUrl",
-				"TaskReportGeneratorBugzillaQueryCategory");
-
-		manager.getTaskList().addQuery(bugQuery);
-
-		Set<AbstractTaskContainer> catagories = new HashSet<AbstractTaskContainer>();
-		catagories.add(bugQuery);
-		Calendar future = Calendar.getInstance();
-		future.add(Calendar.MINUTE, 1);
-		CompletedTaskCollector collector = new CompletedTaskCollector(new Date(0), future.getTime());
-		TaskReportGenerator generator = new TaskReportGenerator(manager.getTaskList(), catagories);
-		generator.addCollector(collector);
-		generator.run(new NullProgressMonitor());
-		assertEquals(0, generator.getAllCollectedTasks().size());
-
-		manager.getTaskList().addTask(task1, bugQuery);
-
-		generator.run(new NullProgressMonitor());
-		assertEquals(0, generator.getAllCollectedTasks().size());
-
-		task1.setCompleted(true);
-
-		generator.run(new NullProgressMonitor());
-		assertEquals(1, generator.getAllCollectedTasks().size());
-		assertEquals(task1, generator.getAllCollectedTasks().get(0));
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/.classpath b/org.eclipse.mylyn.sandbox.ui/.classpath
deleted file mode 100644
index c9c6503..0000000
--- a/org.eclipse.mylyn.sandbox.ui/.classpath
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
-		<accessrules>
-			<accessrule kind="accessible" pattern="**/internal/**"/>
-		</accessrules>
-	</classpathentry>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
-		<accessrules>
-			<accessrule kind="nonaccessible" pattern="com/sun/**"/>
-		</accessrules>
-	</classpathentry>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.mylyn.sandbox.ui/.cvsignore b/org.eclipse.mylyn.sandbox.ui/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/org.eclipse.mylyn.sandbox.ui/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/org.eclipse.mylyn.sandbox.ui/.project b/org.eclipse.mylyn.sandbox.ui/.project
deleted file mode 100644
index 2404cbc..0000000
--- a/org.eclipse.mylyn.sandbox.ui/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.mylyn.sandbox.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.mylyn.sandbox.ui/.settings/.api_filters b/org.eclipse.mylyn.sandbox.ui/.settings/.api_filters
deleted file mode 100644
index 94c67cd..0000000
--- a/org.eclipse.mylyn.sandbox.ui/.settings/.api_filters
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<component id="org.eclipse.mylyn.sandbox.ui" version="2">
-    <resource path="src/org/eclipse/mylyn/internal/sandbox/ui/actions/FindReferencesInContextAction.java" type="org.eclipse.mylyn.internal.sandbox.ui.actions.FindReferencesInContextAction">
-        <filter id="572522506">
-            <message_arguments>
-                <message_argument value="ElementQuerySpecification"/>
-                <message_argument value="FindReferencesInContextAction"/>
-            </message_arguments>
-        </filter>
-    </resource>
-</component>
diff --git a/org.eclipse.mylyn.sandbox.ui/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.sandbox.ui/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index f984ad9..0000000
--- a/org.eclipse.mylyn.sandbox.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,340 +0,0 @@
-#Thu May 15 00:33:09 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-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.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=ignore
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
-org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
-org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL,NORMAL
-org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX,API
-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_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_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_selector_in_method_invocation=80
-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.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=1
-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=false
-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=false
-org.eclipse.jdt.core.formatter.comment.format_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=false
-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=120
-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=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-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=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_member=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_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not 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=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=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_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_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_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_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_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.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=120
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
-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_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.sandbox.ui/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.sandbox.ui/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 5e70d08..0000000
--- a/org.eclipse.mylyn.sandbox.ui/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,63 +0,0 @@
-#Sat Mar 01 03:38:47 PST 2008
-cleanup_settings_version=2
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-formatter_profile=_Mylyn based on Eclipse
-formatter_settings_version=11
-internal.default.compliance=default
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=true
-org.eclipse.jdt.ui.javadoc=false
-org.eclipse.jdt.ui.keywordthis=false
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2004, 2007 Mylyn project committers and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
-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_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=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=true
-sp_cleanup.correct_indentation=true
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.make_local_variable_final=false
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-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=true
-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=true
-sp_cleanup.remove_unused_imports=false
-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=true
-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=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.sandbox.ui/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.sandbox.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
deleted file mode 100644
index 7ab03bd..0000000
--- a/org.eclipse.mylyn.sandbox.ui/.settings/org.eclipse.ltk.core.refactoring.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Jun 02 15:30:09 PDT 2006
-eclipse.preferences.version=1
-org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.sandbox.ui/.settings/org.eclipse.mylyn.tasklist.prefs b/org.eclipse.mylyn.sandbox.ui/.settings/org.eclipse.mylyn.tasklist.prefs
deleted file mode 100644
index 0a2cc0b..0000000
--- a/org.eclipse.mylyn.sandbox.ui/.settings/org.eclipse.mylyn.tasklist.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Jun 18 17:14:59 PDT 2007
-eclipse.preferences.version=1
-project.repository.kind=bugzilla
-project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.sandbox.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.sandbox.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
deleted file mode 100644
index d8c6d26..0000000
--- a/org.eclipse.mylyn.sandbox.ui/.settings/org.eclipse.mylyn.tasks.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Jun 25 03:02:37 GMT 2007
-eclipse.preferences.version=1
-project.repository.kind=bugzilla
-project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.sandbox.ui/.settings/org.eclipse.pde.api.tools.prefs b/org.eclipse.mylyn.sandbox.ui/.settings/org.eclipse.pde.api.tools.prefs
deleted file mode 100644
index 2b916db..0000000
--- a/org.eclipse.mylyn.sandbox.ui/.settings/org.eclipse.pde.api.tools.prefs
+++ /dev/null
@@ -1,151 +0,0 @@
-#Mon May 19 18:43:20 PDT 2008
-ANNOTATION_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
-ANNOTATION_ELEMENT_TYPE_ADDED_FIELD=Error
-ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
-ANNOTATION_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
-ANNOTATION_ELEMENT_TYPE_ADDED_METHOD=Error
-ANNOTATION_ELEMENT_TYPE_ADDED_METHOD_WITHOUT_DEFAULT_VALUE=Error
-ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
-ANNOTATION_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-ANNOTATION_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
-ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
-ANNOTATION_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
-ANNOTATION_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
-ANNOTATION_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
-ANNOTATION_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
-ANNOTATION_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_FIELD=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITHOUT_DEFAULT_VALUE=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_METHOD_WITH_DEFAULT_VALUE=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-ANNOTATION_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
-API_COMPONENT_ELEMENT_TYPE_REMOVED_API_TYPE=Error
-API_COMPONENT_ELEMENT_TYPE_REMOVED_TYPE=Error
-API_PROFILE_ELEMENT_TYPE_REMOVED_API_COMPONENT=Error
-CLASS_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
-CLASS_ELEMENT_TYPE_ADDED_FIELD=Error
-CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
-CLASS_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
-CLASS_ELEMENT_TYPE_ADDED_METHOD=Error
-CLASS_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-CLASS_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
-CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERCLASS_SET=Error
-CLASS_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
-CLASS_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-CLASS_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
-CLASS_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
-CLASS_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
-CLASS_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
-CLASS_ELEMENT_TYPE_CHANGED_SUPERCLASS=Error
-CLASS_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
-CLASS_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
-CLASS_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
-CLASS_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
-CLASS_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
-CLASS_ELEMENT_TYPE_REMOVED_FIELD=Error
-CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
-CLASS_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
-CLASS_ELEMENT_TYPE_REMOVED_METHOD=Error
-CLASS_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-CLASS_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
-CONSTRUCTOR_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
-CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
-CONSTRUCTOR_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
-CONSTRUCTOR_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
-CONSTRUCTOR_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
-CONSTRUCTOR_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
-CONSTRUCTOR_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
-CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
-CONSTRUCTOR_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
-CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-CONSTRUCTOR_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
-ENUM_ELEMENT_TYPE_ADDED_FIELD=Error
-ENUM_ELEMENT_TYPE_ADDED_METHOD=Error
-ENUM_ELEMENT_TYPE_CHANGED_CONTRACTED_SUPERINTERFACES_SET=Error
-ENUM_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
-ENUM_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
-ENUM_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
-ENUM_ELEMENT_TYPE_CHANGED_TO_INTERFACE=Error
-ENUM_ELEMENT_TYPE_REMOVED_CONSTRUCTOR=Error
-ENUM_ELEMENT_TYPE_REMOVED_ENUM_CONSTANT=Error
-ENUM_ELEMENT_TYPE_REMOVED_FIELD=Error
-ENUM_ELEMENT_TYPE_REMOVED_METHOD=Error
-ENUM_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-FIELD_ELEMENT_TYPE_ADDED_VALUE=Error
-FIELD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-FIELD_ELEMENT_TYPE_CHANGED_FINAL_TO_NON_FINAL_STATIC_CONSTANT=Error
-FIELD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
-FIELD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
-FIELD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
-FIELD_ELEMENT_TYPE_CHANGED_TYPE=Error
-FIELD_ELEMENT_TYPE_CHANGED_VALUE=Error
-FIELD_ELEMENT_TYPE_REMOVED_TYPE_ARGUMENTS=Error
-FIELD_ELEMENT_TYPE_REMOVED_VALUE=Error
-ILLEGAL_EXTEND=Warning
-ILLEGAL_IMPLEMENT=Warning
-ILLEGAL_INSTANTIATE=Warning
-ILLEGAL_OVERRIDE=Warning
-ILLEGAL_REFERENCE=Warning
-INTERFACE_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
-INTERFACE_ELEMENT_TYPE_ADDED_FIELD=Error
-INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
-INTERFACE_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
-INTERFACE_ELEMENT_TYPE_ADDED_METHOD=Error
-INTERFACE_ELEMENT_TYPE_ADDED_TYPE_MEMBER=Error
-INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-INTERFACE_ELEMENT_TYPE_ADDED_TYPE_PARAMETERS=Error
-INTERFACE_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
-INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
-INTERFACE_ELEMENT_TYPE_CHANGED_INTERFACE_BOUNDS=Error
-INTERFACE_ELEMENT_TYPE_CHANGED_RESTRICTIONS=Error
-INTERFACE_ELEMENT_TYPE_CHANGED_TO_ANNOTATION=Error
-INTERFACE_ELEMENT_TYPE_CHANGED_TO_CLASS=Error
-INTERFACE_ELEMENT_TYPE_CHANGED_TO_ENUM=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_FIELD=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_METHOD=Error
-INTERFACE_ELEMENT_TYPE_REMOVED_TYPE_MEMBER=Error
-INVALID_JAVADOC_TAG=Ignore
-LEAK_EXTEND=Warning
-LEAK_FIELD_DECL=Warning
-LEAK_IMPLEMENT=Warning
-LEAK_METHOD_PARAM=Warning
-LEAK_METHOD_RETURN_TYPE=Warning
-METHOD_ELEMENT_TYPE_ADDED_CLASS_BOUND=Error
-METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUND=Error
-METHOD_ELEMENT_TYPE_ADDED_INTERFACE_BOUNDS=Error
-METHOD_ELEMENT_TYPE_ADDED_TYPE_PARAMETER=Error
-METHOD_ELEMENT_TYPE_CHANGED_CLASS_BOUND=Error
-METHOD_ELEMENT_TYPE_CHANGED_DECREASE_ACCESS=Error
-METHOD_ELEMENT_TYPE_CHANGED_INTERFACE_BOUND=Error
-METHOD_ELEMENT_TYPE_CHANGED_NON_ABSTRACT_TO_ABSTRACT=Error
-METHOD_ELEMENT_TYPE_CHANGED_NON_FINAL_TO_FINAL=Error
-METHOD_ELEMENT_TYPE_CHANGED_NON_STATIC_TO_STATIC=Error
-METHOD_ELEMENT_TYPE_CHANGED_STATIC_TO_NON_STATIC=Error
-METHOD_ELEMENT_TYPE_CHANGED_TYPE_PARAMETER=Error
-METHOD_ELEMENT_TYPE_CHANGED_VARARGS_TO_ARRAY=Error
-METHOD_ELEMENT_TYPE_REMOVED_ANNOTATION_DEFAULT_VALUE=Error
-METHOD_ELEMENT_TYPE_REMOVED_CLASS_BOUND=Error
-METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUND=Error
-METHOD_ELEMENT_TYPE_REMOVED_INTERFACE_BOUNDS=Error
-METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETER=Error
-METHOD_ELEMENT_TYPE_REMOVED_TYPE_PARAMETERS=Error
-eclipse.preferences.version=1
-incompatible_api_component_version=Error
-invalid_since_tag_version=Error
-malformed_since_tag=Error
-missing_since_tag=Error
diff --git a/org.eclipse.mylyn.sandbox.ui/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.sandbox.ui/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index ed0d632..0000000
--- a/org.eclipse.mylyn.sandbox.ui/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,24 +0,0 @@
-#Mon May 19 18:43:20 PDT 2008
-compilers.f.unresolved-features=1
-compilers.f.unresolved-plugins=2
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=2
-compilers.p.discouraged-class=2
-compilers.p.internal=2
-compilers.p.missing-bundle-classpath-entries=1
-compilers.p.missing-packages=1
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=2
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=0
-compilers.p.unknown-element=0
-compilers.p.unknown-identifier=2
-compilers.p.unknown-resource=0
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.s.create-docs=false
-compilers.s.doc-folder=doc
-compilers.s.open-tags=1
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.sandbox.ui/META-INF/MANIFEST.MF b/org.eclipse.mylyn.sandbox.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index f59bb3a..0000000
--- a/org.eclipse.mylyn.sandbox.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,41 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Mylyn Sandbox Experimental UI
-Bundle-SymbolicName: org.eclipse.mylyn.sandbox.ui;singleton:=true
-Bundle-Version: 3.0.0.qualifier
-Bundle-Activator: org.eclipse.mylyn.internal.sandbox.ui.SandboxUiPlugin
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.core.resources,
- org.eclipse.jface.text,
- org.eclipse.ui,
- org.eclipse.ui.editors,
- org.eclipse.ui.forms,
- org.eclipse.ui.ide,
- org.eclipse.jdt.core,
- org.eclipse.jdt.ui,
- org.eclipse.search,
- org.eclipse.mylyn.context.core;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.context.ui;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.tasks.ui;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.bugzilla.core;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.bugzilla.ui;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.tasks.core;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.monitor.ui;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.java.ui;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.commons.ui;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.monitor.core;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.resources.ui;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.ide.ant;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.pde.ui;bundle-version="[3.0.0,4.0.0)"
-Bundle-ActivationPolicy: lazy
-Bundle-Vendor: Eclipse.org
-Export-Package: org.eclipse.mylyn.internal.sandbox.bridge.bugs;x-internal:=true,
- org.eclipse.mylyn.internal.sandbox.ui;x-internal:=true,
- org.eclipse.mylyn.internal.sandbox.ui.actions;x-internal:=true,
- org.eclipse.mylyn.internal.sandbox.ui.commands;x-internal:=true,
- org.eclipse.mylyn.internal.sandbox.ui.highlighters;x-internal:=true,
- org.eclipse.mylyn.internal.sandbox.ui.planner;x-internal:=true,
- org.eclipse.mylyn.internal.sandbox.ui.views;x-internal:=true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-ClassPath: .
diff --git a/org.eclipse.mylyn.sandbox.ui/about.html b/org.eclipse.mylyn.sandbox.ui/about.html
deleted file mode 100644
index 0dd939c..0000000
--- a/org.eclipse.mylyn.sandbox.ui/about.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 7, 2007</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.sandbox.ui/build.properties b/org.eclipse.mylyn.sandbox.ui/build.properties
deleted file mode 100644
index 3c7ddee..0000000
--- a/org.eclipse.mylyn.sandbox.ui/build.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 Mylyn project committers and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-###############################################################################
-bin.includes = plugin.xml,\
-               META-INF/,\
-               icons/,\
-               .,\
-               about.html
-src.includes = about.html
-jre.compilation.profile = J2SE-1.5
-source.. = src/
-
diff --git a/org.eclipse.mylyn.sandbox.ui/icons/elcl16/capture-pause.gif b/org.eclipse.mylyn.sandbox.ui/icons/elcl16/capture-pause.gif
deleted file mode 100644
index 98e7743..0000000
--- a/org.eclipse.mylyn.sandbox.ui/icons/elcl16/capture-pause.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.sandbox.ui/icons/elcl16/interest-landmark.gif b/org.eclipse.mylyn.sandbox.ui/icons/elcl16/interest-landmark.gif
deleted file mode 100644
index aad6ec2..0000000
--- a/org.eclipse.mylyn.sandbox.ui/icons/elcl16/interest-landmark.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.sandbox.ui/icons/etool16/category.gif b/org.eclipse.mylyn.sandbox.ui/icons/etool16/category.gif
deleted file mode 100644
index 7efb86e..0000000
--- a/org.eclipse.mylyn.sandbox.ui/icons/etool16/category.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.sandbox.ui/icons/etool16/navigate-previous.gif b/org.eclipse.mylyn.sandbox.ui/icons/etool16/navigate-previous.gif
deleted file mode 100644
index cf81b05..0000000
--- a/org.eclipse.mylyn.sandbox.ui/icons/etool16/navigate-previous.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.sandbox.ui/icons/etool16/presentation.gif b/org.eclipse.mylyn.sandbox.ui/icons/etool16/presentation.gif
deleted file mode 100644
index db8f21f..0000000
--- a/org.eclipse.mylyn.sandbox.ui/icons/etool16/presentation.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.sandbox.ui/icons/eview16/active-hierarchy.gif b/org.eclipse.mylyn.sandbox.ui/icons/eview16/active-hierarchy.gif
deleted file mode 100644
index f3aa87a..0000000
--- a/org.eclipse.mylyn.sandbox.ui/icons/eview16/active-hierarchy.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.sandbox.ui/icons/eview16/active-search.gif b/org.eclipse.mylyn.sandbox.ui/icons/eview16/active-search.gif
deleted file mode 100644
index 2cc3267..0000000
--- a/org.eclipse.mylyn.sandbox.ui/icons/eview16/active-search.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.sandbox.ui/icons/eview16/folder.gif b/org.eclipse.mylyn.sandbox.ui/icons/eview16/folder.gif
deleted file mode 100644
index 51e703b..0000000
--- a/org.eclipse.mylyn.sandbox.ui/icons/eview16/folder.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.sandbox.ui/icons/eview16/icons-task-jira.gif b/org.eclipse.mylyn.sandbox.ui/icons/eview16/icons-task-jira.gif
deleted file mode 100644
index f1fa823..0000000
--- a/org.eclipse.mylyn.sandbox.ui/icons/eview16/icons-task-jira.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.sandbox.ui/icons/eview16/task-activity.gif b/org.eclipse.mylyn.sandbox.ui/icons/eview16/task-activity.gif
deleted file mode 100644
index 44ed28d..0000000
--- a/org.eclipse.mylyn.sandbox.ui/icons/eview16/task-activity.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.sandbox.ui/icons/eview16/task-list.gif b/org.eclipse.mylyn.sandbox.ui/icons/eview16/task-list.gif
deleted file mode 100644
index 6ab2668..0000000
--- a/org.eclipse.mylyn.sandbox.ui/icons/eview16/task-list.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.sandbox.ui/icons/obj16/overlay-web.gif b/org.eclipse.mylyn.sandbox.ui/icons/obj16/overlay-web.gif
deleted file mode 100644
index b168c1c..0000000
--- a/org.eclipse.mylyn.sandbox.ui/icons/obj16/overlay-web.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.sandbox.ui/icons/obj16/repository-web.gif b/org.eclipse.mylyn.sandbox.ui/icons/obj16/repository-web.gif
deleted file mode 100644
index 229c391..0000000
--- a/org.eclipse.mylyn.sandbox.ui/icons/obj16/repository-web.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.sandbox.ui/plugin.xml b/org.eclipse.mylyn.sandbox.ui/plugin.xml
deleted file mode 100644
index ce13ba1..0000000
--- a/org.eclipse.mylyn.sandbox.ui/plugin.xml
+++ /dev/null
@@ -1,452 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-	<extension point="org.eclipse.ui.views">
-     	<category name="Mylyn Sandbox" id="org.eclipse.mylyn.sandbox"/>
-    </extension>
-
-    <extension point="org.eclipse.ui.preferencePages">
-      <page 
-         name="Sandbox"
-         class="org.eclipse.mylyn.internal.sandbox.ui.SandboxUiPreferencePage"
-         id="org.eclipse.mylyn.sandbox.ui.preferences"
-         category="org.eclipse.mylyn.ui.preferences">
-         <keywordReference id="org.eclipse.mylyn.java.keywords"/>
-      </page> 
-    </extension>
-
-	<extension point="org.eclipse.mylyn.context.ui.bridges">
-	    <labelProvider
-	        class="org.eclipse.mylyn.internal.sandbox.ui.JavaContextLabelProvider"
-	        contentType="java"/>
-  		<labelProvider
-          	class="org.eclipse.mylyn.internal.ide.ant.AntContextLabelProvider"
-          	contentType="build.xml"/>
-        <labelProvider
-          	class="org.eclipse.mylyn.internal.pde.ui.PdeContextLabelProvider"
-          contentType="plugin.xml"/>
-		<labelProvider
-            class="org.eclipse.mylyn.internal.resources.ui.ResourceContextLabelProvider"
-            contentType="resource"/>
-	</extension>
-
-
-   <extension point="org.eclipse.mylyn.tasks.ui.presentations">
-      <presentation 
-            id="org.eclipse.mylyn.tasks.ui.groupByOwner"
-            name="Grouped by Owner (Experimental)"
-            icon="icons/etool16/presentation.gif"
-            class="org.eclipse.mylyn.internal.sandbox.ui.GroupedPresentation:Owner"
-            primary="false"/>
-      <presentation 
-            id="org.eclipse.mylyn.tasks.ui.groupByPriority"
-            name="Grouped by Priority (Experimental)"
-            icon="icons/etool16/presentation.gif"
-            class="org.eclipse.mylyn.internal.sandbox.ui.GroupedPresentation:Priority"
-            primary="false"/>
-      <presentation 
-            id="org.eclipse.mylyn.tasks.ui.groupByRepository"
-            name="Grouped by Repository (Experimental)"
-            icon="icons/etool16/presentation.gif"
-            class="org.eclipse.mylyn.internal.sandbox.ui.GroupedPresentation:Repository"
-            primary="false"/>
-      <presentation
-            class="org.eclipse.mylyn.internal.sandbox.ui.IncomingPresentation"
-            icon="icons/etool16/presentation.gif"
-            id="org.eclipse.mylyn.tasks.ui.incoming"
-            name="Incoming (Experimental)"
-            primary="false">
-      </presentation>
-      <presentation 
-            id="org.eclipse.mylyn.tasks.ui.groupByDue"
-            name="Grouped by Due (Experimental)"
-            icon="icons/etool16/presentation.gif"
-            class="org.eclipse.mylyn.internal.sandbox.ui.GroupedPresentation:Due"
-            primary="false"/>
-      <!--
-      <presentation 
-            id="org.eclipse.mylyn.tasks.ui.groupBySheduled"
-            name="Grouped by Sheduled"
-            icon="icons/etool16/presentation.gif"
-            class="org.eclipse.mylyn.internal.sandbox.ui.GroupedPresentation:Sheduled"
-            primary="false"/>
-      -->
-   </extension>
-
-	<extension
-	       point="org.eclipse.mylyn.context.core.relationProviders">
-	 <provider
-           class="org.eclipse.mylyn.internal.java.ui.search.JavaImplementorsProvider"
-           contentType="java">
-     </provider>
-     <provider
-           class="org.eclipse.mylyn.internal.java.ui.search.JavaReadAccessProvider"
-           contentType="java">
-     </provider>
-     <provider
-           class="org.eclipse.mylyn.internal.java.ui.search.JavaReferencesProvider"
-           contentType="java">
-     </provider>
-     <provider
-           class="org.eclipse.mylyn.internal.java.ui.search.JavaWriteAccessProvider"
-           contentType="java">
-     </provider>
-     <provider
-           class="org.eclipse.mylyn.internal.java.ui.search.JUnitReferencesProvider"
-           contentType="java">
-     </provider>
-	</extension>
-
-   <!--
-   <extension point="org.eclipse.core.expressions.propertyTesters">
-      <propertyTester 
-         id="org.eclipse.mylyn.tasks.ui.propertyTester"
-         namespace="org.eclipse.mylyn.tasks.ui"
-         properties="trimEnabled"
-         type="java.lang.Object"
-         class="org.eclipse.mylyn.internal.tasks.ui.TaskPropertyTester">
-      </propertyTester>
-   </extension>
-   -->
-
-   <!-- moved to the org.eclipse.mylyn.tasks.ui
-   <extension point="org.eclipse.ui.commands">
-      <command id="org.eclipse.mylyn.tasks.ui.command.previousTask"
-               name="Task Trim Command"/>
-      <command id="org.eclipse.mylyn.ui.context.capture.pause.command"
-               name="Pause Capturing Context Command"/>
-   </extension>
-
-   <extension point="org.eclipse.ui.handlers">
-      <handler commandId="org.eclipse.mylyn.tasks.ui.command.previousTask"
-               class="org.eclipse.mylyn.internal.tasks.ui.TaskHistoryHandler"/>
-      <handler commandId="org.eclipse.mylyn.ui.context.capture.pause.command"
-               class="org.eclipse.mylyn.internal.tasks.ui.ContextCapturePauseHandler"/>
-   </extension>
-   -->
-
-   	<!-- ==================== Commands ==================== -->
-	
-   	<extension point="org.eclipse.ui.commands">
-      <command
-            categoryId="org.eclipse.mylyn.context.ui.commands"
-            defaultHandler="org.eclipse.mylyn.internal.sandbox.ui.commands.ContextCapturePauseHandler"
-            id="org.eclipse.mylyn.ui.context.capture.pause.command"
-            name="Pause Capturing Context"/>
-    </extension>
-
-	<!-- ==================== Markers ==================== -->
-	
-	<extension
-       id="org.eclipse.mylyn.context.ui.markers.landmark"
-       name="Task Context Landmarks"
-       point="org.eclipse.core.resources.markers">
-		<super
-            type="org.eclipse.core.resources.marker">
-      	</super>
-      	<persistent
-            value="true">
-      	</persistent>
- 	</extension>
-	
-    <extension point="org.eclipse.ui.ide.markerImageProviders">
-    <imageprovider
-  		markertype="org.eclipse.mylyn.context.ui.markers.landmark" 
-  		icon="icons/elcl16/interest-landmark.gif" 
-  		id="org.eclipse.mylyn.context.ui.landmarkMarkerProvider" /> 
-   	</extension> 
-  
-  	<extension point="org.eclipse.ui.editors.annotationTypes">
-  		<type
-        	markerSeverity="0"
-         	markerType="org.eclipse.mylyn.context.ui.markers.landmark"
-         	name="org.eclipse.mylyn.context.ui.markers.landmark.annotation"/> 
-  	</extension> 
-   
-  	<extension point="org.eclipse.ui.editors.markerAnnotationSpecification">
-  		<specification annotationType="org.eclipse.mylyn.context.ui.markers.landmark.annotation" 
-	  		label="Task Context Landmark" 
-	  		icon="icons/elcl16/interest-landmark.gif" 
-	  		textPreferenceKey="landmarkIndication" 
-	  		textPreferenceValue="false" 
-	  		highlightPreferenceKey="landmarkHighlighting" 
-	  		highlightPreferenceValue="true" 
-	  		contributesToHeader="true" 
-	  		overviewRulerPreferenceKey="landmarkIndicationInOverviewRuler" 
-	  		overviewRulerPreferenceValue="true" 
-	  		verticalRulerPreferenceKey="landmarkIndicationInVerticalRuler" 
-	  		verticalRulerPreferenceValue="true" 
-	  		colorPreferenceKey="landmarkIndicationColor" 
-	  		colorPreferenceValue="255,255,255" 
-	  		presentationLayer="0" 
-	  		showInNextPrevDropdownToolbarActionKey="showLandmarkInNextPrevDropdownToolbarAction" 
-	  		showInNextPrevDropdownToolbarAction="true" /> 
-   	</extension>
-
-	<!-- ==================== Menus ==================== -->
-
-	<extension point="org.eclipse.ui.menus">
-    <!-- menu for pulldown command -->
-    <menuContribution locationURI="menu:org.eclipse.mylyn.tasks.ui.trim">
-      <dynamic
-         class="org.eclipse.mylyn.internal.tasks.ui.TaskHistoryDropDown"
-         id="org.eclipse.mylyn.tasks.ui.trim.dropdown"/>
-    </menuContribution>
-
-    <menuContribution locationURI="toolbar:org.eclipse.ui.trim.command2?after">
-      <toolbar id="org.eclipse.mylyn.tasks.ui.trim.container">
-        <command
-            id="org.eclipse.mylyn.tasks.ui.trim"
-            commandId="org.eclipse.mylyn.tasks.ui.command.previousTask"
-            label="Previous Task"
-            icon="icons/etool16/navigate-previous.gif"
-            style="pulldown">
-        </command>
-
-        <control
-           class="org.eclipse.mylyn.internal.tasks.ui.TaskTrimWidget"
-           id="org.eclipse.mylyn.tasks.ui.trim.control"/>
-        <!-- for some reason this doesn't work
-        <visibleWhen checkEnabled="false">
-           <test forcePluginActivation="true"
-                 property="org.eclipse.mylyn.tasks.ui.trimEnabled"/>
-        </visibleWhen>
-        <visibleWhen><not><systemTest property="os.name" value="Windows XP"/></not></visibleWhen>
-        -->
-      </toolbar>
-    </menuContribution>
-    
-    <menuContribution locationURI="menu:org.eclipse.mylyn.tasks.ui.views.tasks?after=additions">
-      <command 
-         id="org.eclipse.mylyn.ui.context.capture.pause"
-         commandId="org.eclipse.mylyn.ui.context.capture.pause.command"
-         label="Pause Context (Sandbox)"
-         tooltip="Pause Capturing Context"
-         icon="icons/elcl16/capture-pause.gif"
-         style="toggle"/>
-    </menuContribution>
-  </extension>
-
-    <extension point="org.eclipse.ui.newWizards">
-	  <wizard
-            category="org.eclipse.mylyn.ui.wizards.new"
-            class="org.eclipse.mylyn.internal.sandbox.ui.planner.TaskActivityWizard"
-            icon="icons/eview16/task-list.gif" 
-            id="org.eclipse.mylyn.tasks.ui.wizards.activity.report"
-            name="Task Activity Report (Sandbox)">
-      </wizard> 
-	</extension>
-
-  	<extension
-        point="org.eclipse.ui.editors">
-    	<editor
-          class="org.eclipse.mylyn.internal.sandbox.ui.planner.TaskActivityEditorPart"
-          contributorClass="org.eclipse.mylyn.internal.tasks.ui.editors.TaskEditorActionContributor"
-          icon="icons/eview16/task-list.gif"
-          id="org.eclipse.mylyn.tasks.ui.editors.planning"
-          name="Task Planner"/>     
-  	</extension>
-
-<!--
- 	<extension point="org.eclipse.ui.viewActions"> 
- 		<viewContribution 
-			id="org.eclipse.mylyn.context.ui.taskList.contribution" 
-   			targetID="org.eclipse.mylyn.tasks.ui.views.tasks">
-  		<action
-            class="org.eclipse.mylyn.internal.sandbox.ui.actions.ContextCapturePauseAction"
-            icon="icons/elcl16/capture-pause.gif"
-            id="org.eclipse.mylyn.ui.context.capture.pause"
-            label="Pause Context (Sandbox)"
-            menubarPath="additions"
-            style="toggle"
-            tooltip="Pause Capturing Context"/>
-  		</viewContribution>
-	</extension>
--->
-
-   <extension point="org.eclipse.mylyn.tasks.ui.actions"> 
-      <dynamicPopupMenu
-            class="org.eclipse.mylyn.internal.sandbox.ui.highlighters.TaskHighlighterMenuContributor"
-            menuPath="context"/>
-   </extension>
-   
-   <extension
-   		point="org.eclipse.ui.keywords">
-      <keyword
-            label="mylyn java"
-            id="org.eclipse.mylyn.java.keywords"/>
-   </extension>
-
-   <extension point="org.eclipse.ui.views"> 
-   	  <view
-          allowMultiple="false"
-          category="org.eclipse.mylyn.sandbox"
-          class="org.eclipse.mylyn.internal.sandbox.ui.views.ActiveSearchView"
-          icon="icons/eview16/active-search.gif"
-          id="org.eclipse.mylyn.ui.views.active.search"
-          name="Context Search"/>
-          
-	  <view
-            allowMultiple="false"
-            category="org.eclipse.mylyn.sandbox"
-            class="org.eclipse.mylyn.internal.sandbox.ui.views.ContextHierarchyView"
-            icon="icons/eview16/active-hierarchy.gif"
-            id="org.eclipse.mylyn.ui.views.active.hierarchy"
-            name="Context Hierarchy"/>
-            
-            <view
-            allowMultiple="false"
-            category="org.eclipse.mylyn.sandbox"
-            class="org.eclipse.mylyn.internal.sandbox.ui.views.TaskActivityView"
-            icon="icons/eview16/task-activity.gif"
-            id="org.eclipse.mylyn.tasklist.activity"
-            name="Task Activity"/>
-   </extension>
-   
-    <extension point="org.eclipse.ui.actionSets">
-      <actionSet
-        label="Mylyn Task Context"
-        description="Mylyn Focus"
-        visible="true"
-        id="org.eclipse.mylyn.sandbox.ui.actionSet">
-        
-        <action
-          definitionId="org.eclipse.mylyn.sandbox.ui.commands.open.related.dialog"
-          label="Open Mylyn Related Elements"
-          class="org.eclipse.mylyn.internal.sandbox.ui.actions.OpenRelatedElementsPopupDialogAction"
-          menubarPath="navigate/open.ext2"
-          id="org.eclipse.mylyn.sandbox.ui.actions.open.related.dialog"
-          icon="icons/eview16/active-search.gif">
-        </action>
-      </actionSet>
-    </extension>
-
-	<extension point="org.eclipse.ui.commands">
-		<category
-			name="Mylyn UI"
-			description="Mylyn UI Commands"
-			id="org.eclipse.mylyn.context.ui.commands">
-		</category>
-		
-		<command
-			name="Show Context Search Elements"
-			description="Show Context Search Elements"
-			id="org.eclipse.mylyn.sandbox.ui.commands.open.related.dialog"
-			categoryId="org.eclipse.mylyn.context.ui.commands">
-		</command>
-	</extension>
-	
-    <extension point="org.eclipse.ui.bindings">
-      <key
-        sequence="M1+M2+M3+ARROW_LEFT"
-        commandId="org.eclipse.mylyn.sandbox.ui.commands.open.related.dialog"
-        schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
-      </key>
-    </extension>
-    <extension
-          point="org.eclipse.ui.decorators">
-       <decorator
-             class="org.eclipse.mylyn.internal.sandbox.ui.highlighters.TaskHighlighter"
-             icon="icons/etool16/presentation.gif"
-             id="org.eclipse.mylyn.sandbox.ui.decorator.tasks"
-             label="Task Highlighter"
-             lightweight="true"
-             objectClass="org.eclipse.mylyn.internal.tasks.core.AbstractTask"
-             state="true">
-       </decorator>
-    </extension>
-   
-   
-   
-   <!--
-   <extension point="org.eclipse.mylyn.tasks.ui.presentations">
-      <presentation 
-            id="org.eclipse.mylyn.tasks.ui.groupByOwner"
-            name="Grouped by Owner"
-            icon="icons/etool16/category.gif"
-            contentProvider="org.eclipse.mylyn.internal.sandbox.ui.GroupedTaskListContentProvider:Owner"/>
-      <presentation 
-            id="org.eclipse.mylyn.tasks.ui.groupByPriority"
-            name="Grouped by Priority"
-            icon="icons/etool16/category.gif"
-            contentProvider="org.eclipse.mylyn.internal.sandbox.ui.GroupedTaskListContentProvider:Priority"/>
-      <presentation 
-            id="org.eclipse.mylyn.tasks.ui.groupByRepository"
-            name="Grouped by Repository"
-            icon="icons/etool16/category.gif"
-            contentProvider="org.eclipse.mylyn.internal.sandbox.ui.GroupedTaskListContentProvider:Repository"/>
-      <presentation 
-            id="org.eclipse.mylyn.tasks.ui.groupByDue"
-            name="Grouped by Due"
-            icon="icons/etool16/category.gif"
-            contentProvider="org.eclipse.mylyn.internal.sandbox.ui.GroupedTaskListContentProvider:Due"/>
-      <presentation 
-            id="org.eclipse.mylyn.tasks.ui.groupBySheduled"
-            name="Grouped by Sheduled"
-            icon="icons/etool16/category.gif"
-            contentProvider="org.eclipse.mylyn.internal.sandbox.ui.GroupedTaskListContentProvider:Sheduled"/>
-   </extension>
-   -->
-   
-</plugin>
-
-
-   <!--
-   <extension point="org.eclipse.ui.viewActions"> 
-   <viewContribution
-         id="org.eclipse.mylyn.monitor.ui.reports.ui.switchTaskFolder"
-         targetID="org.eclipse.mylyn.tasks.ui.views.TaskListView">
-      <action
-            class="org.eclipse.mylyn.internal.sandbox.ui.actions.SwitchTaskDataFolderAction"
-            icon="icons/eview16/folder.gif"
-            id="org.eclipse.mylyn.monitor.ui.reports.ui.actions.switchTask"
-            label="Sandbox: Switch Task Data Folder..."
-            menubarPath="context"
-            style="push">
-      </action>
-   </viewContribution>
-   </extension>
-   -->
-   
-
-      <!--
-        <provider 
-         	markupProviderClass="org.eclipse.mylyn.sandbox.viz.MylynJavaMarkupProvider" 
-         	name="Mylyn Provider" 
-         	priority="9" 
-         	description="Provider that shows java declarations that are part of a Mylyn context for a task." 
-         	emptyMessage="No active Mylyn context to display" 
-         	contentProviderClass="org.eclipse.mylyn.sandbox.viz.MylynJavaContentProvider" 
-         	id="mylynprovider" />
-        -->
-        
-      
-		<!-- This schema works for the older (1.1?) CVS version of the Visualiser from AJDT  
-		<provider
-		    class="org.eclipse.mylyn.sandbox.viz.MylynJavaContentProvider"
-		    markupclass="org.eclipse.mylyn.sandbox.viz.MylynJavaMarkupProvider"
-		    name="Mylyn Java Provider"
-		    title="Mylyn Java Task Context"
-		    priority="8"
-		    description="Provider that shows java declarations that are part of a Mylyn context for a task."
-		    emptyMessage="No active Mylyn context to display"
-		    id="mylynprovider">
-		</provider>
-		 --> 
-  
-  <!--
-   <extension point = "org.eclipse.ui.popupMenus">
-     <objectContribution
-        id="org.eclipse.mylyn.interest"
-        objectClass="org.eclipse.jdt.core.IJavaElement">
-        <action id="org.eclipse.mylyn.ui.actions.OpenRelatedElementsQuickView" 
-              label="Related elements" 
-	      	  menubarPath="mylyn" 
-              icon="icons/eview16/active-search.gif" 
-              tooltip="Active Search quick view" 
-              class="org.eclipse.mylyn.ui.actions.OpenRelatedElementsQuickView" 
-              enablesFor="1"/> 
-	 </objectContribution>
-  </extension>
-  -->
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaContextLabelProvider.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaContextLabelProvider.java
deleted file mode 100644
index 8761362..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaContextLabelProvider.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.bridge.bugs;
-
-import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
-import org.eclipse.mylyn.context.core.ContextCore;
-import org.eclipse.mylyn.context.core.IInteractionElement;
-import org.eclipse.mylyn.context.core.IInteractionRelation;
-import org.eclipse.mylyn.internal.context.ui.AbstractContextLabelProvider;
-import org.eclipse.mylyn.internal.context.ui.ContextUiImages;
-import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
-import org.eclipse.mylyn.tasks.ui.TasksUiImages;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author Mik Kersten
- */
-public class BugzillaContextLabelProvider extends AbstractContextLabelProvider {
-
-	@Override
-	protected Image getImage(IInteractionElement node) {
-		return CommonImages.getImage(TasksUiImages.TASK_REMOTE);
-	}
-
-	@Override
-	protected Image getImage(IInteractionRelation edge) {
-		return ContextUiImages.getImage(MylynBugsManager.EDGE_REF_BUGZILLA);
-	}
-
-	@Override
-	protected Image getImageForObject(Object object) {
-		return CommonImages.getImage(TasksUiImages.TASK_REMOTE);
-	}
-
-	@Override
-	protected String getTextForObject(Object node) {
-		return "" + node;
-	}
-
-	/**
-	 * TODO: slow?
-	 */
-	@Override
-	protected String getText(IInteractionElement node) {
-		// try to get from the cache before downloading
-		Object report;
-		BugzillaReportInfo reportNode = MylynBugsManager.getReferenceProvider().getCached(node.getHandleIdentifier());
-		AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(
-				BugzillaStructureBridge.CONTENT_TYPE);
-
-		if (reportNode != null) {
-			report = reportNode;
-		} else {
-			report = bridge.getObjectForHandle(node.getHandleIdentifier());
-		}
-		return bridge.getLabel(report);
-	}
-
-	@Override
-	protected String getText(IInteractionRelation edge) {
-		return BugzillaReferencesProvider.NAME;
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaEditingMonitor.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaEditingMonitor.java
deleted file mode 100644
index c88f67b..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaEditingMonitor.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.bridge.bugs;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.mylyn.internal.tasks.ui.deprecated.AbstractRepositoryTaskEditor;
-import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskSelection;
-import org.eclipse.mylyn.monitor.ui.AbstractUserInteractionMonitor;
-import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
-import org.eclipse.ui.IWorkbenchPart;
-
-/**
- * @author Mik Kersten
- */
-public class BugzillaEditingMonitor extends AbstractUserInteractionMonitor {
-
-	public BugzillaEditingMonitor() {
-		super();
-	}
-
-	@Override
-	protected void handleWorkbenchPartSelection(IWorkbenchPart part, ISelection selection, boolean contributeToContext) {
-		if (!(part instanceof AbstractRepositoryTaskEditor) && !(part instanceof TaskEditor)) {
-			return;
-		}
-
-		if (selection instanceof StructuredSelection) {
-			StructuredSelection ss = (StructuredSelection) selection;
-			Object object = ss.getFirstElement();
-			if (object instanceof RepositoryTaskSelection) {
-				super.handleElementSelection(part, object, contributeToContext);
-			}
-		}
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaMylynSearch.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaMylynSearch.java
deleted file mode 100644
index a67242f..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaMylynSearch.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-/*
- * Created on Oct 13, 2004
- */
-package org.eclipse.mylyn.internal.sandbox.bridge.bugs;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IMember;
-import org.eclipse.mylyn.context.core.InterestComparator;
-import org.eclipse.mylyn.internal.context.core.IActiveSearchListener;
-import org.eclipse.mylyn.internal.context.core.IActiveSearchOperation;
-
-/**
- * Used to facilitate bugzilla searches based on IJavaElements
- * 
- * @author Shawn Minto
- */
-public class BugzillaMylynSearch implements IActiveSearchOperation {
-
-	// scope identifiers
-	public static final int LOCAL_QUAL = 1; // local implies a bugzilla task,
-
-	// not just an offline report
-
-	public static final int LOCAL_UNQUAL = 2;
-
-	public static final int FULLY_QUAL = 3;
-
-	public static final int UNQUAL = 4;
-
-	private final int scope;
-
-	private final IJavaElement element;
-
-	private String handle = "";
-
-	private String serverUrl = "";
-
-	/**
-	 * Constructor
-	 * 
-	 * @param scope
-	 *            The scope of this search
-	 */
-	public BugzillaMylynSearch(int scope, IJavaElement element, String serverUrl) {
-		this.scope = scope;
-		this.element = element;
-		this.serverUrl = serverUrl;
-	}
-
-	public IStatus run(IProgressMonitor monitor) {
-		return run(monitor, Job.DECORATE);
-	}
-
-	public IStatus run(IProgressMonitor monitor, int priority) {
-		handle = element.getHandleIdentifier() + " " + scope;
-		List<IJavaElement> landmarks = new ArrayList<IJavaElement>();
-		landmarks.add(element);
-
-		if (!BugzillaSearchManager.doesJobExist(handle)) {
-
-			// perform the bugzilla search
-			// get only the useful landmarks (IMember)
-			List<IMember> members = getMemberLandmarks(landmarks);
-
-			// go through all of the landmarks that we are given and perform a
-			// search on them
-			for (IMember m : members) {
-
-				// FIXME: decide whether to do leave the caching of searches in
-				// for now or not
-				// check if we have the info cached
-				// List<BugzillaReportNode> landmarkDoi =
-				// MylarTaskListPlugin.getBridge()
-				// .getFromLandmarksHash(m, scope);
-
-				// if (landmarkDoi != null) {
-				// //TODO decide when to queue up and do a refresh search
-				// notifySearchCompleted(landmarkDoi);
-				// continue;
-				// }
-
-				// create a search operation so that we can search
-				BugzillaMylynSearchOperation op = new BugzillaMylynSearchOperation(this, m, scope);
-
-				// create a new search job so that it can be scheduled and
-				// run as a background thread
-				Job searchJob = new BugzillaMylynSearchJob("Querying Bugzilla Server - Mylar - "
-						+ op.getSearchMemberName(), op);
-
-				// schedule the new search job
-				searchJob.setPriority(priority);
-				searchJob.schedule();
-
-				// save this searchJobs handle so that we can cancel it if need
-				// be
-				BugzillaSearchManager.addJob(handle, searchJob);
-			}
-		}
-		return Status.OK_STATUS;
-	}
-
-	/** List of listeners wanting to know about the searches */
-	private final List<IActiveSearchListener> listeners = new ArrayList<IActiveSearchListener>();
-
-	/**
-	 * Add a listener for when the bugzilla search is completed
-	 * 
-	 * @param l
-	 *            The listener to add
-	 */
-	public void addListener(IActiveSearchListener l) {
-		// add the listener to the list
-		listeners.add(l);
-	}
-
-	/**
-	 * Remove a listener for when the bugzilla search is completed
-	 * 
-	 * @param l
-	 *            The listener to remove
-	 */
-	public void removeListener(IActiveSearchListener l) {
-		// remove the listener from the list
-		listeners.remove(l);
-	}
-
-	/**
-	 * Notify all of the listeners that the bugzilla search is completed
-	 * 
-	 * @param doiList
-	 *            A list of BugzillaSearchHitDoiInfo
-	 * @param member
-	 *            The IMember that the search was performed on
-	 */
-	public void notifySearchCompleted(List<BugzillaReportInfo> doiList) {
-		// go through all of the listeners and call searchCompleted(colelctor,
-		// member)
-		BugzillaSearchManager.removeSearchJob(handle);
-		for (IActiveSearchListener listener : listeners) {
-			listener.searchCompleted(doiList);
-		}
-	}
-
-	/**
-	 * Get only the landmarks that are IMember and sort them according to their DOI value (highest to lowest)
-	 * 
-	 * @param landmarks
-	 *            The landmarks to check
-	 * @return List of IMember landmarks sorted by DOI value
-	 */
-	public static List<IMember> getMemberLandmarks(List<IJavaElement> landmarks) {
-		List<IMember> memberLandmarks = new ArrayList<IMember>();
-
-		for (IJavaElement je : landmarks) {
-
-			// keep only the IMember landmarks
-			if (je instanceof IMember) {
-				memberLandmarks.add((IMember) je);
-			}
-		}
-
-		// sort the landmarks
-		Collections.sort(memberLandmarks, new InterestComparator<IMember>());
-
-		return memberLandmarks;
-	}
-
-	public String getServerUrl() {
-		return serverUrl;
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaMylynSearchJob.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaMylynSearchJob.java
deleted file mode 100644
index f58354c..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaMylynSearchJob.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.bridge.bugs;
-
-import javax.security.auth.login.LoginException;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.dialogs.ErrorDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
-import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * The bugzilla search job used to search a bugzilla site
- * 
- * @author Shawn Minto
- * @author Mik Kersten
- */
-public class BugzillaMylynSearchJob extends Job {
-
-	/** The search operation used to perform the query */
-	private final BugzillaMylynSearchOperation operation;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param name
-	 *            Job name
-	 * @param operation
-	 *            The operation to perform the search query
-	 */
-	public BugzillaMylynSearchJob(String name, BugzillaMylynSearchOperation operation) {
-		super(name);
-		this.operation = operation;
-	}
-
-	@Override
-	protected IStatus run(IProgressMonitor monitor) {
-		final IStatus[] status = new IStatus[1];
-
-		try {
-			// execute the search operation
-			operation.execute(monitor);
-
-			// get the status of the search operation
-			status[0] = operation.getStatus();
-
-			// determine if there was an error, if it was cancelled, or if it is
-			// ok
-			if (status[0] == null) {
-
-			} else if (status[0].getCode() == IStatus.CANCEL) {
-				// it was cancelled, so just return
-				status[0] = Status.OK_STATUS;
-
-				// make sure that we know this job is not running anymore
-				BugzillaSearchManager.removeSearchJob(operation.getSearchMember().getHandleIdentifier() + " "
-						+ operation.getScope());// runningJobs.remove(operation.getSearchMember());
-				return status[0];
-			} else if (!status[0].isOK()) {
-				// there was an error, so display an error message
-				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-					public void run() {
-						ErrorDialog.openError(null, "Bugzilla Search Error", null, status[0]);
-					}
-				});
-				status[0] = Status.OK_STATUS;
-
-				// make sure we know that this job is not running anymore
-				BugzillaSearchManager.removeSearchJob(operation.getSearchMember().getHandleIdentifier() + " "
-						+ operation.getScope());// runningJobs.remove(operation.getSearchMember());
-				return status[0];
-			}
-		} catch (LoginException e) {
-			// we had a problem while searching that seems like a login info
-			// problem
-			// thrown in BugzillaSearchOperation
-			MessageDialog.openError(
-					null,
-					"Login Error",
-					"Bugzilla could not log you in to get the information you requested since login name or password is incorrect.\nPlease check your settings in the bugzilla preferences. ");
-			BugzillaCorePlugin.log(new Status(IStatus.ERROR, BugzillaUiPlugin.PLUGIN_ID, IStatus.OK, "", e));
-		} finally {
-			// make sure that we know that this job is not running anymore
-			BugzillaSearchManager.removeSearchJob(operation.getSearchMember().getHandleIdentifier() + " "
-					+ operation.getScope());// .runningJobs.remove(operation.getSearchMember());
-		}
-
-		return status[0];
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaMylynSearchOperation.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaMylynSearchOperation.java
deleted file mode 100644
index e3b37b4..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaMylynSearchOperation.java
+++ /dev/null
@@ -1,540 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-/*
- * Created on Oct 14, 2004
- */
-package org.eclipse.mylyn.internal.sandbox.bridge.bugs;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import javax.security.auth.login.LoginException;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IMember;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
-import org.eclipse.mylyn.internal.bugzilla.core.BugzillaTask;
-import org.eclipse.mylyn.internal.sandbox.ui.SandboxUiPlugin;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTaskCategory;
-import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData;
-import org.eclipse.mylyn.internal.tasks.core.deprecated.TaskComment;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.internal.tasks.ui.deprecated.TaskFactory;
-import org.eclipse.mylyn.internal.tasks.ui.search.AbstractRepositorySearchQuery;
-import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-import org.eclipse.mylyn.tasks.core.data.TaskData;
-import org.eclipse.mylyn.tasks.ui.TasksUi;
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-
-/**
- * Bugzilla search operation for Mylar
- * 
- * @author Shawn Minto
- * @author Mik Kersten
- */
-public class BugzillaMylynSearchOperation extends WorkspaceModifyOperation implements IBugzillaSearchOperation {
-
-	/** The IMember we are doing the search for */
-	private final IMember javaElement;
-
-	/** The bugzilla collector for the search */
-	private ProgressQueryHitCollector collector = null;//SearchHitCollector
-
-	/** The status of the search operation */
-	private IStatus status;
-
-	/** The LoginException that was thrown when trying to do the search */
-	private LoginException loginException = null;
-
-	/** The fully qualified name of the member we are searching for */
-	private final String name;
-
-	/** The bugzilla search query */
-	private AbstractRepositorySearchQuery query;
-
-	private final BugzillaMylynSearch search;
-
-	private final int scope;
-
-	public BugzillaMylynSearchOperation(BugzillaMylynSearch search, IMember m, int scope) {
-		this.javaElement = m;
-		this.search = search;
-		this.scope = scope;
-		name = getFullyQualifiedName(m);
-	}
-
-	/**
-	 * Get the fully qualified name of a IMember TODO: move to a more central location so that others can use this, but
-	 * don't want to add unecessary coupling
-	 * 
-	 * @return String representing the fully qualified name
-	 */
-	public static String getFullyQualifiedName(IJavaElement je) {
-		if (!(je instanceof IMember)) {
-			return null;
-		}
-
-		IMember m = (IMember) je;
-		if (m.getDeclaringType() == null) {
-			return ((IType) m).getFullyQualifiedName();
-		} else {
-			return m.getDeclaringType().getFullyQualifiedName() + "." + m.getElementName();
-		}
-	}
-
-	@Override
-	public void execute(IProgressMonitor monitor) {
-
-		ProgressQueryHitCollector searchCollector = null;
-
-		if (scope == BugzillaMylynSearch.FULLY_QUAL) {
-			searchCollector = searchQualified(search.getServerUrl(), monitor);
-		} else if (scope == BugzillaMylynSearch.UNQUAL) {
-			searchCollector = searchUnqualified(search.getServerUrl(), monitor);
-		} else if (scope == BugzillaMylynSearch.LOCAL_QUAL) {
-			searchCollector = searchLocalQual(monitor);
-		} else if (scope == BugzillaMylynSearch.LOCAL_UNQUAL) {
-			searchCollector = searchLocalUnQual(monitor);
-		} else {
-			status = Status.OK_STATUS;
-			return;
-		}
-
-		if (searchCollector == null) {
-			search.notifySearchCompleted(new ArrayList<BugzillaReportInfo>());
-			return;
-		}
-
-		Set<AbstractTask> l = searchCollector.getTasks();
-
-		// get the list of doi elements
-		List<BugzillaReportInfo> doiList = getDoiList(l);
-
-		// we completed the search, so notify all of the listeners
-		// that the search has been completed
-		MylynBugsManager.getBridge().addToLandmarksHash(doiList, javaElement, scope);
-		search.notifySearchCompleted(doiList);
-		// MIK: commmented out logging
-		// MonitorPlugin.log(this, "There were " + doiList.size() + " items
-		// found");
-	}
-
-	/**
-	 * Search the local bugs for the member using the qualified name
-	 * 
-	 * @param monitor
-	 *            The progress monitor to search with
-	 * @return The QueryHitCollector with the results of the search
-	 */
-	@SuppressWarnings("deprecation")
-	private ProgressQueryHitCollector searchLocalQual(IProgressMonitor monitor) {
-
-		// get the fully qualified name for searching
-		String elementName = getFullyQualifiedName(javaElement);
-
-		// setup the search result collector
-		collector = new ProgressQueryHitCollector(TasksUiInternal.getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskList());
-		//collector.setOperation(this);
-		collector.setProgressMonitor(monitor);
-
-		// get all of the root tasks and start the search
-		// FIXME
-//		Set<AbstractTask> tasks = TasksUiPlugin.getTaskList().getOrphanContainer(
-//				LocalRepositoryConnector.REPOSITORY_URL).getChildren();
-		Set<ITask> tasks = new HashSet<ITask>();
-		searchLocal(tasks, collector, elementName, monitor);
-		for (AbstractTaskCategory cat : TasksUiPlugin.getTaskList().getTaskCategories()) {
-			searchLocal(cat.getChildren(), collector, elementName, monitor);
-		}
-
-		// return the collector
-		return collector;
-	}
-
-	/**
-	 * Search the local bugs for the member using the unqualified name
-	 * 
-	 * @param monitor
-	 *            The progress monitor to search with
-	 * @return The QueryHitCollector with the results of the search
-	 */
-	@SuppressWarnings("deprecation")
-	private ProgressQueryHitCollector searchLocalUnQual(IProgressMonitor monitor) {
-
-		// get the element name for searching
-		String elementName = javaElement.getElementName();
-
-		// setup the search result collector
-		collector = new ProgressQueryHitCollector(TasksUiInternal.getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskList());
-		//collector.setOperation(this);
-		collector.setProgressMonitor(monitor);
-
-		// get all of the root tasks and start the search
-		// FIXME
-//		Set<AbstractTask> tasks = TasksUiPlugin.getTaskList().getOrphanContainer(
-//				LocalRepositoryConnector.REPOSITORY_URL).getChildren();
-		Set<ITask> tasks = new HashSet<ITask>();
-		searchLocal(tasks, collector, elementName, monitor);
-		for (AbstractTaskCategory cat : TasksUiPlugin.getTaskList().getTaskCategories()) {
-			searchLocal(cat.getChildren(), collector, elementName, monitor);
-		}
-		// return the collector
-		return collector;
-	}
-
-	/**
-	 * Search the local bugs for the member
-	 * 
-	 * @param tasks
-	 *            The tasks to search
-	 * @param searchCollector
-	 *            The collector to add the results to
-	 * @param elementName
-	 *            The name of the element that we are looking for
-	 * @param monitor
-	 *            The progress monitor
-	 */
-	private void searchLocal(Collection<ITask> tasks, ProgressQueryHitCollector searchCollector, String elementName,
-			IProgressMonitor monitor) {
-		if (tasks == null) {
-			return;
-		}
-
-		// go through all of the tasks
-		for (ITask task : tasks) {
-			monitor.worked(1);
-
-			// check what kind of task it is
-			if (task instanceof BugzillaTask) {
-
-				// we have a bugzilla task, so get the bug report
-				BugzillaTask bugTask = (BugzillaTask) task;
-				RepositoryTaskData bugTaskData = TasksUiPlugin.getTaskDataStorageManager().getNewTaskData(
-						bugTask.getRepositoryUrl(), bugTask.getTaskId());
-				//RepositoryTaskData bugTaskData = bugTask.getTaskData();
-
-				// parse the bug report for the element that we are searching
-				// for
-				boolean isHit = search(elementName, bugTaskData);
-
-				// determine if we have a hit or not
-				if (isHit) {
-//					// make a search hit from the bug and then add it to the collector
-//					BugzillaQueryHit hit = new BugzillaQueryHit(TasksUiPlugin.getTaskList(), bugTaskData.getDescription(), "", bugTaskData.getRepositoryUrl(), bugTaskData.getId(), null, "");
-//					BugzillaTask task = new BugzillaTask();
-					// FIXME
-					//					searchCollector.accept(bugTask);
-				}
-			}
-		}
-		status = Status.OK_STATUS;
-	}
-
-	/**
-	 * Search the bug for the given element name
-	 * 
-	 * @param elementName
-	 *            The name of the element to search for
-	 * @param bug
-	 *            The bug to search in
-	 */
-	private boolean search(String elementName, RepositoryTaskData bug) {
-
-		if (bug == null) {
-			return false; // MIK: added null check here
-		}
-		String description = bug.getDescription();
-		String summary = bug.getSummary();
-		List<TaskComment> taskComments = bug.getComments();
-
-		// search the summary and the summary
-		if (Util.hasElementName(elementName, summary)) {
-			return true;
-		}
-
-		if (Util.hasElementName(elementName, description)) {
-			return true;
-		}
-
-		Iterator<TaskComment> comItr = taskComments.iterator();
-		while (comItr.hasNext()) {
-			TaskComment taskComment = comItr.next();
-			String commentText = taskComment.getText();
-			// search the text for a reference to the element
-			if (Util.hasElementName(elementName, commentText)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Perform the actual search on the Bugzilla server
-	 * 
-	 * @param url
-	 *            The url to use for the search
-	 * @param searchCollector
-	 *            The collector to put the search results into
-	 * @param monitor
-	 *            The progress monitor to use for the search
-	 * @return The QueryHitCollector with the search results
-	 */
-	private ProgressQueryHitCollector search(String url, TaskRepository repository,
-			ProgressQueryHitCollector searchCollector, IProgressMonitor monitor) {
-
-		// set the initial number of matches to 0
-		int matches = 0;
-		// setup the progress monitor and start the search
-		searchCollector.setProgressMonitor(monitor);
-
-		BugzillaSearchEngine engine = new BugzillaSearchEngine(repository, url);
-		try {
-			// perform the search
-			status = engine.search(searchCollector, matches);
-
-			// check the status so that we don't keep searching if there
-			// is a problem
-			if (status.getCode() == IStatus.CANCEL) {
-				return null;
-			} else if (!status.isOK()) {
-				MultiStatus errorStatus = new MultiStatus(SandboxUiPlugin.ID_PLUGIN, 0, "Search error", null);
-				errorStatus.add(status);
-				StatusHandler.fail(errorStatus);
-				return null;
-			}
-			return searchCollector;
-		} catch (LoginException e) {
-			// save this exception to throw later
-			this.loginException = e;
-		}
-		return null;
-	}
-
-	/**
-	 * Perform a search for qualified instances of the member
-	 * 
-	 * @param monitor
-	 *            The progress monitor to use
-	 * @return The QueryHitCollector with the search results
-	 */
-	@SuppressWarnings("deprecation")
-	private ProgressQueryHitCollector searchQualified(String repositoryUrl, IProgressMonitor monitor) {
-		// create a new collector for the results
-		collector = new ProgressQueryHitCollector(TasksUiInternal.getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskList());
-		//collector.setOperation(this);
-		collector.setProgressMonitor(monitor);
-
-		// get the search url
-		String url = Util.getExactSearchURL(repositoryUrl, javaElement);
-		TaskRepository repository = TasksUi.getRepositoryManager().getRepository(BugzillaCorePlugin.CONNECTOR_KIND,
-				repositoryUrl);
-		return search(url, repository, collector, monitor);
-	}
-
-	/**
-	 * Perform a search for unqualified instances of the member
-	 * 
-	 * @param monitor
-	 *            The progress monitor to use
-	 * @return The QueryHitCollector with the search results
-	 */
-	@SuppressWarnings("deprecation")
-	private ProgressQueryHitCollector searchUnqualified(String repositoryUrl, IProgressMonitor monitor) {
-		// create a new collector for the results
-		collector = new ProgressQueryHitCollector(TasksUiInternal.getTaskList(), new TaskFactory(null));//SearchHitCollector(TasksUiPlugin.getTaskList());
-		//collector.setOperation(this);
-		collector.setProgressMonitor(monitor);
-
-		// get the search url
-		String url = Util.getInexactSearchURL(repositoryUrl, javaElement);
-		TaskRepository repository = TasksUi.getRepositoryManager().getRepository(BugzillaCorePlugin.CONNECTOR_KIND,
-				repositoryUrl);
-
-		return search(url, repository, collector, monitor);
-	}
-
-	/**
-	 * Perform a second pass parse to determine if there are any stack traces in the bug - currently only used for the
-	 * exact search results
-	 * 
-	 * @param doiList
-	 *            - the list of BugzillaSearchHitDOI elements to parse
-	 */
-	public static void secondPassBugzillaParser(List<BugzillaReportInfo> doiList) {
-
-		// go through each of the items in the doiList
-		for (BugzillaReportInfo info : doiList) {
-
-			// get the bug report so that we have all of the data
-			// - descriptions, comments, etc
-			TaskData b = null;
-			try {
-				b = info.getBug();
-			} catch (Exception e) {
-				// don't care since null will be caught
-			}
-
-			// if the report could not be downloaded, try the next one
-			if (b == null) {
-				continue;
-			}
-
-			// Add back:
-			// see if the summary has a stack trace in it
-//			StackTrace[] stackTrace = StackTrace.getStackTrace(b.getDescription(), b.getDescription());
-//			if (stackTrace != null) {
-//
-//				// add the stack trace to the doi info
-//				info.setExact(true);
-//				info.addStackTraces(stackTrace);
-//			}
-
-			// Add back:
-			// go through all of the comments for the bug
-//			Iterator<TaskComment> comItr = b.getComments().iterator();
-//			while (comItr.hasNext()) {
-//				TaskComment taskComment = comItr.next();
-//				String commentText = taskComment.getText();
-//
-//				// see if the comment has a stack trace in it
-//				stackTrace = StackTrace.getStackTrace(commentText, taskComment);
-//				if (stackTrace != null) {
-//
-//					// add the stack trace to the doi info
-//					info.setExact(true);
-//					info.addStackTraces(stackTrace);
-//				}
-//			}
-		}
-	}
-
-	/**
-	 * Add the results returned to the Hash of landmarks
-	 * 
-	 * @param results
-	 *            The list of results
-	 * @param isExact
-	 *            whether the search was exact or not
-	 */
-	private List<BugzillaReportInfo> getDoiList(Set<AbstractTask> results) {
-		List<BugzillaReportInfo> doiList = new ArrayList<BugzillaReportInfo>();
-
-		boolean isExact = (scope == BugzillaMylynSearch.FULLY_QUAL || scope == BugzillaMylynSearch.LOCAL_QUAL) ? true
-				: false;
-
-		BugzillaReportInfo info = null;
-		// go through all of the results and create a DoiInfo list
-		for (ITask hit : results) {
-
-			try {
-				float value = 0;
-				info = new BugzillaReportInfo(value, (BugzillaTask) hit, isExact);
-
-				// only download the bug for the exact matches
-				// downloading bugs kills the time - can we do this elsewhere? -
-				// different thread? persistant?
-				// if(isExact){
-				// // get the bug report for the doi info item
-				// BugReport b = BugzillaRepositoryUtil.getInstance().getBug(
-				// hit.getId());
-				// // add the bug to the doi info for future use
-				// info.setBug(b);
-				// }
-
-			} catch (Exception e) {
-				StatusHandler.log(new Status(IStatus.INFO, SandboxUiPlugin.ID_PLUGIN, "Search failed", e));
-			} finally {
-				doiList.add(info);
-			}
-		}
-		return doiList;
-	}
-
-	/**
-	 * @see org.eclipse.mylyn.internal.bugs.core.search.IBugzillaSearchOperation#getStatus()
-	 */
-	public IStatus getStatus() throws LoginException {
-		// if a LoginException was thrown while trying to search, throw this
-		if (loginException == null) {
-			return status;
-		} else {
-			throw loginException;
-		}
-	}
-
-	/**
-	 * @see org.eclipse.mylyn.internal.bugs.core.search.IBugzillaSearchOperation#getImageDescriptor()
-	 */
-	public ImageDescriptor getImageDescriptor() {
-		return null;
-	}
-
-	/**
-	 * Get the member that we are performing the search for
-	 * 
-	 * @return The member this search is being performed for
-	 */
-	public IMember getSearchMember() {
-		return javaElement;
-	}
-
-	/**
-	 * Get the name of the member that we are searching for
-	 * 
-	 * @return The fully qualified name of the member
-	 */
-	public String getSearchMemberName() {
-		return name;
-	}
-
-	/**
-	 * @see org.eclipse.mylyn.internal.bugs.core.search.IBugzillaSearchOperation#getQuery()
-	 */
-	public AbstractRepositorySearchQuery getQuery() {
-		return query;
-	}
-
-	/**
-	 * @see org.eclipse.mylyn.internal.bugs.core.search.IBugzillaSearchOperation#setQuery(org.eclipse.mylyn.internal.bugs.core.search.AbstractRepositorySearchQuery)
-	 */
-	public void setQuery(AbstractRepositorySearchQuery newQuery) {
-		this.query = newQuery;
-	}
-
-	/**
-	 * Get the name of the element that we are searching for
-	 * 
-	 * @return The name of the element
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * Get the scope of the search operation
-	 * 
-	 * @return The scope - defined in BugzillaMylarSearch
-	 */
-	public int getScope() {
-		return scope;
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaReferencesProvider.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaReferencesProvider.java
deleted file mode 100644
index 28ba13f..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaReferencesProvider.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-/*
- * Created on Feb 2, 2005
- */
-package org.eclipse.mylyn.internal.sandbox.bridge.bugs;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IMember;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.mylyn.context.core.IDegreeOfSeparation;
-import org.eclipse.mylyn.context.core.IInteractionContext;
-import org.eclipse.mylyn.context.core.IInteractionElement;
-import org.eclipse.mylyn.internal.context.core.AbstractRelationProvider;
-import org.eclipse.mylyn.internal.context.core.DegreeOfSeparation;
-import org.eclipse.mylyn.internal.context.core.IActiveSearchListener;
-import org.eclipse.mylyn.internal.context.core.IActiveSearchOperation;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @author Shawn Minto
- */
-public class BugzillaReferencesProvider extends AbstractRelationProvider {
-
-	public static final String ID = "org.eclipse.mylyn.bugs.search.references";
-
-	public static final String NAME = "referenced by";
-
-	public static final int DEFAULT_DEGREE = 0;
-
-	public BugzillaReferencesProvider() {
-		super(BugzillaStructureBridge.CONTENT_TYPE, ID);
-	}
-
-	@Override
-	public List<IDegreeOfSeparation> getDegreesOfSeparation() {
-		List<IDegreeOfSeparation> separations = new ArrayList<IDegreeOfSeparation>();
-		separations.add(new DegreeOfSeparation("disabled", 0));
-		separations.add(new DegreeOfSeparation("local, fully qualified matches", 1));
-		separations.add(new DegreeOfSeparation("local, unqualified matches", 2));
-		separations.add(new DegreeOfSeparation("server, fully quaified matches", 3));
-		separations.add(new DegreeOfSeparation("server, unqualified matches", 4));
-
-		return separations;
-	}
-
-	protected boolean acceptElement(IJavaElement javaElement) {
-		return javaElement != null && (javaElement instanceof IMember || javaElement instanceof IType)
-				&& javaElement.exists();
-	}
-
-	/**
-	 * HACK: checking kind as string - don't want the dependancy to mylar.java
-	 */
-	@Override
-	protected void findRelated(final IInteractionElement node, int degreeOfSeparation) {
-		if (!node.getContentType().equals("java")) {
-			return;
-		}
-		IJavaElement javaElement = JavaCore.create(node.getHandleIdentifier());
-		if (!acceptElement(javaElement)) {
-			return;
-		}
-		runJob(node, degreeOfSeparation);
-	}
-
-	@Override
-	public IActiveSearchOperation getSearchOperation(IInteractionElement node, int limitTo, int degreeOfSepatation) {
-		IJavaElement javaElement = JavaCore.create(node.getHandleIdentifier());
-
-		ITask task = TasksUiPlugin.getTaskListManager().getActiveTask();
-		TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(task.getConnectorKind(),
-				task.getRepositoryUrl());
-		return new BugzillaMylynSearch(degreeOfSepatation, javaElement, repository.getRepositoryUrl());
-	}
-
-	private void runJob(final IInteractionElement node, final int degreeOfSeparation) {
-		BugzillaMylynSearch search = (BugzillaMylynSearch) getSearchOperation(node, 0, degreeOfSeparation);
-
-		search.addListener(new IActiveSearchListener() {
-
-			private boolean gathered = false;
-
-			public void searchCompleted(List<?> nodes) {
-				Iterator<?> itr = nodes.iterator();
-
-				if (MylynBugsManager.getDefault() == null) {
-					return;
-				}
-
-				while (itr.hasNext()) {
-					Object o = itr.next();
-					if (o instanceof BugzillaReportInfo) {
-						BugzillaReportInfo bugzillaNode = (BugzillaReportInfo) o;
-						final String handle = bugzillaNode.getElementHandle();
-//						if (MylarBugsPlugin.getDefault().getCache().getCached(handle) == null)
-//							cache(handle, bugzillaNode);
-
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								incrementInterest(node, BugzillaStructureBridge.CONTENT_TYPE, handle,
-										degreeOfSeparation);
-							}
-						});
-					}
-				}
-				gathered = true;
-				BugzillaReferencesProvider.this.searchCompleted(node);
-			}
-
-			public boolean resultsGathered() {
-				return gathered;
-			}
-
-		});
-		search.run(new NullProgressMonitor(), Job.DECORATE - 10);
-	}
-
-	@Override
-	public String getGenericId() {
-		return ID;
-	}
-
-	@Override
-	protected String getSourceId() {
-		return ID;
-	}
-
-	@Override
-	public String getName() {
-		return NAME;
-	}
-
-	/*
-	 * 
-	 * STUFF FOR TEMPORARILY CACHING A PROXY REPORT
-	 * 
-	 * TODO remove the proxys and update the BugzillaStructureBridge cache so
-	 * that on restart, we dont have to get all of the bugs
-	 * 
-	 */
-	private static final Map<String, BugzillaReportInfo> reports = new HashMap<String, BugzillaReportInfo>();
-
-	public BugzillaReportInfo getCached(String handle) {
-		return reports.get(handle);
-	}
-
-	protected void cache(String handle, BugzillaReportInfo bugzillaNode) {
-		reports.put(handle, bugzillaNode);
-	}
-
-	public void clearCachedReports() {
-		reports.clear();
-	}
-
-	public Collection<? extends String> getCachedHandles() {
-		return reports.keySet();
-	}
-
-	@Override
-	public void stopAllRunningJobs() {
-		BugzillaSearchManager.cancelAllRunningJobs();
-
-	}
-
-	@Override
-	protected int getDefaultDegreeOfSeparation() {
-		return DEFAULT_DEGREE;
-	}
-
-	public void contextPreActivated(IInteractionContext context) {
-		// ignore	
-	}
-
-	public void elementsDeleted(List<IInteractionElement> elements) {
-		// ignore
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaReportInfo.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaReportInfo.java
deleted file mode 100644
index 256f84d..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaReportInfo.java
+++ /dev/null
@@ -1,186 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.bridge.bugs;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
-import org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector;
-import org.eclipse.mylyn.internal.bugzilla.core.BugzillaTask;
-import org.eclipse.mylyn.internal.bugzilla.core.BugzillaTaskDataHandler;
-import org.eclipse.mylyn.internal.bugzilla.ui.tasklist.StackTrace;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-import org.eclipse.mylyn.tasks.core.data.TaskData;
-import org.eclipse.mylyn.tasks.ui.TasksUi;
-
-/**
- * Class to store the DoiInfo of a BugzillaSearchHit
- * 
- * TODO: refactor
- * 
- * @author Shawn Minto
- */
-public class BugzillaReportInfo {
-
-	private static final int MAX_LABEL_LENGTH = 150;
-
-	private static final long serialVersionUID = 3257004367222419506L;
-
-	/** The BugzillaSearchHit associated with this DoiInfo */
-	private final BugzillaTask hit;
-
-	/** Whether this search hit was from an exact search like a stack trace */
-	private boolean isExact = false;
-
-	/** List of all of the StackTrace's in the given bug */
-	private final List<StackTrace> stackTraces;
-
-	/** The bug report associated with this DoiInfo */
-	private TaskData bug;
-
-	/**
-	 * Constructor
-	 * 
-	 * @param initialValue
-	 *            The initial Doi value
-	 * @param hit
-	 *            The BugzillaSearchHit associated with this DoiInfo
-	 * @param isExact
-	 *            Whether the search was exact or not
-	 */
-	public BugzillaReportInfo(float initialValue, BugzillaTask hit, boolean isExact) {
-		this.hit = hit;
-		this.isExact = isExact;
-		bug = null;
-		stackTraces = new ArrayList<StackTrace>();
-	}
-
-	/**
-	 * Get the bugzilla search hit relating to this DoiInfo
-	 * 
-	 * @return The BugzillaSearchHit related to this DoiInfo
-	 */
-	public BugzillaTask getHit() {
-		return hit;
-	}
-
-	@Override
-	public String toString() {
-		return hit.toString();
-	}
-
-	/**
-	 * Determine if the search hit this represents is exact or not
-	 * 
-	 * @return <code>true</code> if the search was exact otherwise <code>false</code>
-	 */
-	public boolean isExact() {
-		return isExact;
-	}
-
-	/**
-	 * Set whether this bug has any exact elements in it - the search used was fully qualified
-	 * 
-	 * @param isExact
-	 *            - Whether there are any exact element matches in it
-	 */
-	public void setExact(boolean isExact) {
-		this.isExact = isExact;
-	}
-
-	/**
-	 * Get the bug report associated with this DoiInfo<br>
-	 * The bug is downloaded if it was not previously
-	 * 
-	 * @return Returns the BugReport
-	 */
-	public TaskData getBug() throws CoreException {
-		if (bug == null) {
-			// get the bug report
-			TaskRepository repository = TasksUi.getRepositoryManager().getRepository(BugzillaCorePlugin.CONNECTOR_KIND,
-					hit.getRepositoryUrl());
-			BugzillaRepositoryConnector bugzillaConnector = (BugzillaRepositoryConnector) TasksUi.getRepositoryManager()
-					.getRepositoryConnector(BugzillaCorePlugin.CONNECTOR_KIND);
-			BugzillaTaskDataHandler handler = new BugzillaTaskDataHandler(bugzillaConnector);
-			bug = handler.getTaskData(repository, hit.getTaskId(), new NullProgressMonitor());
-		}
-		return bug;
-	}
-
-	/**
-	 * Set the bug report associated with this DoiInfo
-	 * 
-	 * @param bug
-	 *            - BugReport that this is associated with
-	 */
-	public void setBug(TaskData bug) {
-		this.bug = bug;
-	}
-
-	/**
-	 * Get all of the stack traces contained in the bug
-	 * 
-	 * @return Returns a list of StackTrace's
-	 */
-	public List<StackTrace> getStackTraces() {
-		return stackTraces;
-	}
-
-	/**
-	 * Determine whether the doi info has any stack traces associated with it
-	 * 
-	 * @return <code>true</code> if there are some stack traces else <code>false</code>
-	 */
-	public boolean hasStackTraces() {
-		return !stackTraces.isEmpty();
-	}
-
-	/**
-	 * Add a stack trace to this DoiInfo
-	 * 
-	 * @param stackTrace
-	 *            - The StackTrace to add
-	 */
-	public void addStackTrace(StackTrace stackTrace) {
-		this.stackTraces.add(stackTrace);
-	}
-
-	/**
-	 * Add an array of stack traces to this DoiInfo
-	 * 
-	 * @param stackTracesToAdd
-	 *            - The StackTraces to add
-	 */
-	public void addStackTraces(StackTrace[] stackTracesToAdd) {
-		for (StackTrace element : stackTracesToAdd) {
-			this.stackTraces.add(element);
-		}
-	}
-
-	/**
-	 * Get the name of the bug report
-	 * 
-	 * @return The name of the bug report, max 20 characters
-	 */
-	public String getName() {
-		String description = hit.getSummary();
-		int length = description.length();
-		if (length > MAX_LABEL_LENGTH) {
-			description = description.substring(0, MAX_LABEL_LENGTH) + "..";
-		}
-		return "bug " + hit.getTaskId() + ": " + description;
-	}
-
-	public String getElementHandle() {
-		return hit.getRepositoryUrl() + ";" + hit.getTaskId();
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaSearchEngine.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaSearchEngine.java
deleted file mode 100644
index 208058b..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaSearchEngine.java
+++ /dev/null
@@ -1,558 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.sandbox.bridge.bugs;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.util.regex.Pattern;
-
-import javax.security.auth.login.LoginException;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient;
-import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
-import org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryConnector;
-import org.eclipse.mylyn.internal.bugzilla.core.BugzillaRepositoryQuery;
-import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
-import org.eclipse.mylyn.internal.bugzilla.core.UnrecognizedReponseException;
-import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.internal.tasks.ui.util.WebBrowserDialog;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-import org.eclipse.mylyn.tasks.ui.TasksUi;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Queries the Bugzilla server for the list of bugs matching search criteria.
- * 
- * @author Mik Kersten (hardening of initial prototype)
- */
-// TODO: Delete once not needed by sandbox
-public class BugzillaSearchEngine {
-
-	protected static final String QUERYING_SERVER = "Querying Bugzilla Server...";
-
-	/**
-	 * regular expression matching values of query matches' attributes in Eclipse.org Bugzilla
-	 */
-	public static final Pattern reValue = Pattern.compile("<td><nobr>([^<]*)</nobr>");
-
-	public static final Pattern reValueBugzilla220 = Pattern.compile("<td style=\"white-space: nowrap\">([^<]*)");
-
-	private final String urlString;
-
-	private final TaskRepository repository;
-
-	private final boolean maxReached = false;
-
-//	private String queryStringWithoutLogin;
-
-	public BugzillaSearchEngine(TaskRepository repository, String queryUrl) {
-		urlString = queryUrl;
-//		queryStringWithoutLogin = urlString;
-		// urlString = urlString.concat(IBugzillaConstants.CONTENT_TYPE_RDF);
-		this.repository = repository;
-		// this.proxySettings = proxySettings;
-		// if (repository.hasCredentials()) {
-		// try {
-		// urlString = BugzillaClient.addCredentials(urlString,
-		// repository.getCharacterEncoding(), repository
-		// .getUserName(), repository.getPassword());
-		// } catch (UnsupportedEncodingException e) {
-		// /*
-		// * Do nothing. Every implementation of the Java platform is
-		// * required to support the standard charset "UTF-8"
-		// */
-		// }
-		// }
-	}
-
-	/**
-	 * Wrapper for search
-	 * 
-	 * @param collector
-	 *            - The collector for the results to go into
-	 */
-	public IStatus search(ProgressQueryHitCollector collector) throws LoginException {
-		return this.search(collector, 0, IBugzillaConstants.RETURN_ALL_HITS);
-	}
-
-	/**
-	 * Wrapper for search
-	 * 
-	 * @param collector
-	 *            - The collector for the results to go into
-	 * @param startMatches
-	 *            - The number of matches to start with for the progress monitor
-	 */
-	public IStatus search(ProgressQueryHitCollector collector, int startMatches) throws LoginException {
-		return this.search(collector, startMatches, BugzillaUiPlugin.getDefault().getMaxResults());
-	}
-
-	/**
-	 * Executes the query, parses the response, and adds hits to the search result collector.
-	 * 
-	 * @param collector
-	 *            - The collector for the search results
-	 * @param startMatches
-	 *            - The number of matches to start with for the progress monitor
-	 * @param maxHits
-	 *            - the maximum number of matches to return or IBugzillaConstants.RETURN_ALL_HITS for unlimited
-	 */
-	public IStatus search(ProgressQueryHitCollector collector, int startMatches, int maxHits) throws LoginException {
-		IProgressMonitor monitor = collector.getProgressMonitor();
-		IStatus status = null;
-		boolean possibleBadLogin = false;
-		int numCollected = 0;
-		BufferedReader in = null;
-
-		try {
-			monitor.beginTask(QUERYING_SERVER, maxHits);// IProgressMonitor.UNKNOWN
-			collector.aboutToStart(startMatches);
-
-			if (monitor.isCanceled()) {
-				throw new OperationCanceledException("Search cancelled");
-			}
-
-			BugzillaRepositoryQuery query = new BugzillaRepositoryQuery(repository.getRepositoryUrl(), urlString,
-					"summary");
-
-			BugzillaRepositoryConnector bugzillaConnector = (BugzillaRepositoryConnector) TasksUi.getRepositoryManager()
-					.getRepositoryConnector(BugzillaCorePlugin.CONNECTOR_KIND);
-
-			BugzillaClient client = bugzillaConnector.getClientManager().getClient(repository,
-					new NullProgressMonitor());
-			client.getSearchHits(query, collector, bugzillaConnector.getTaskDataHandler()
-					.getAttributeMapper(repository), new NullProgressMonitor());
-		} catch (CoreException e) {
-			status = new MultiStatus(BugzillaUiPlugin.PLUGIN_ID, IStatus.ERROR,
-					"Core Exception occurred while querying Bugzilla Server " + repository.getRepositoryUrl() + ".\n"
-							+ "\nClick Details for more information.", e);
-			((MultiStatus) status).add(e.getStatus());
-
-			// write error to log
-			BugzillaCorePlugin.log(status);
-		} catch (OperationCanceledException e) {
-			status = new Status(IStatus.CANCEL, BugzillaUiPlugin.PLUGIN_ID, IStatus.CANCEL, "", null);
-//		} catch (LoginException e) {
-//			status = new MultiStatus(BugzillaUiPlugin.PLUGIN_ID, IStatus.ERROR,
-//					"Login error occurred while querying Bugzilla Server " + repository.getUrl() + ".\n"
-//							+ "\nEnsure proper configuration in " + TasksUiPlugin.LABEL_VIEW_REPOSITORIES + ".", e);
-//
-//			IStatus s = new Status(IStatus.ERROR, BugzillaUiPlugin.PLUGIN_ID, IStatus.ERROR, e.getClass().toString()
-//					+ ":  ", e);
-//			((MultiStatus) status).add(s);
-//			s = new Status(IStatus.ERROR, BugzillaUiPlugin.PLUGIN_ID, IStatus.OK, "search failed for query "
-//					+ queryStringWithoutLogin, e);
-//			((MultiStatus) status).add(s);
-		} catch (final UnrecognizedReponseException e) {
-
-			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					WebBrowserDialog.openAcceptAgreement(null, "Report Download Failed",
-							"Unrecognized response from server", e.getMessage());
-				}
-			});
-			status = new MultiStatus(BugzillaUiPlugin.PLUGIN_ID, IStatus.ERROR,
-					"Unrecognized response from Bugzilla server " + repository.getRepositoryUrl(), e);
-
-			IStatus s = new Status(IStatus.ERROR, BugzillaUiPlugin.PLUGIN_ID, IStatus.ERROR, e.getClass().toString()
-					+ ":  ", e);
-			((MultiStatus) status).add(s);
-			s = new Status(IStatus.ERROR, BugzillaUiPlugin.PLUGIN_ID, IStatus.OK, "search failed", e);
-			((MultiStatus) status).add(s);
-
-		} catch (Exception e) {
-			status = new MultiStatus(BugzillaUiPlugin.PLUGIN_ID, IStatus.ERROR,
-					"An error occurred while querying Bugzilla Server " + repository.getRepositoryUrl() + ".\n"
-							+ "\nCheck network connection and repository configuration in "
-							+ TasksUiPlugin.LABEL_VIEW_REPOSITORIES + ".", e);
-
-			IStatus s = new Status(IStatus.ERROR, BugzillaUiPlugin.PLUGIN_ID, IStatus.ERROR, e.getClass().toString()
-					+ ":  ", e);
-			((MultiStatus) status).add(s);
-			s = new Status(IStatus.ERROR, BugzillaUiPlugin.PLUGIN_ID, IStatus.OK, "search failed", e);
-			((MultiStatus) status).add(s);
-		} finally {
-			if (monitor != null) {
-				monitor.done();
-			}
-			collector.done();
-			try {
-				if (in != null) {
-					in.close();
-				}
-			} catch (IOException e) {
-				BugzillaCorePlugin.log(new Status(IStatus.ERROR, BugzillaUiPlugin.PLUGIN_ID, IStatus.ERROR,
-						"Problem closing the stream", e));
-			}
-		}
-
-		// if we haven't collected any serach results and we suspect a bad
-		// login, we assume it was a bad login
-		if (numCollected == 0 && possibleBadLogin) {
-			throw new LoginException(IBugzillaConstants.MESSAGE_LOGIN_FAILURE + " for repository: "
-					+ repository.getRepositoryUrl() + " username: " + repository.getUserName());
-		}
-
-		if (status == null) {
-			return new Status(IStatus.OK, BugzillaUiPlugin.PLUGIN_ID, IStatus.OK, "", null);
-		} else {
-			return status;
-		}
-	}
-
-	// /** Old code used by a unit test. */
-//	public static BugzillaQueryHit createHit(Pattern regularExpression, IProgressMonitor monitor, BufferedReader in,
-//			String serverUrl, int id) throws IOException {
-//		String line;
-//		// String severity = null;
-//		String priority = null;
-//		// String platform = null;
-//		// String owner = null;
-//		String state = null;
-//		// String result = null;
-//		for (int i = 0; i < 6; i++) {
-//			Matcher matcher;
-//			do {
-//				matcher = null;
-//				if (monitor.isCanceled()) {
-//					throw new OperationCanceledException("Search cancelled");
-//				}
-//				line = in.readLine();
-//				if (line == null)
-//					break;
-//				line = line.trim();
-//				matcher = regularExpression.matcher(line);
-//			} while (!matcher.find());
-//			if (null != matcher) {
-//				switch (i) {
-//				// case 0:
-//				// severity = matcher.group(1);
-//				// break;
-//				case 1:
-//					priority = matcher.group(1);
-//					break;
-//				// case 2:
-//				// platform = matcher.group(1);
-//				// break;
-//				// case 3:
-//				// owner = matcher.group(1);
-//				// break;
-//				case 4:
-//					state = matcher.group(1);
-//					break;
-//				case 5:
-//					// result = matcher.group(1);
-//					// break;
-//				}
-//			}
-//		}
-//
-//		// two more
-//		line = in.readLine();
-//		line = in.readLine();
-//
-//		String description = "<activate to view summary>";
-//		if (line != null) {
-//			description = line.substring(8);
-//		}
-//		if (description.startsWith(">")) {
-//			description = description.substring(1);
-//		}
-//
-//		// String query = "";
-//		// try {
-//		// String recentQuery = BugzillaUiPlugin.getMostRecentQuery();
-//		// if (recentQuery != null)
-//		// query = recentQuery;
-//		// } catch (Exception e) {
-//		// // ignore, for testing
-//		// }
-//
-//		BugzillaQueryHit hit = new BugzillaQueryHit(TasksUiPlugin.getTaskList(), description,
-//				priority, serverUrl, String.valueOf(id), null, state);
-//
-//		return hit;
-//	}
-
-	public boolean isMaxReached() {
-		return maxReached;
-	}
-}
-
-// /** regular expression matching Bugzilla query results format used in
-// Eclipse.org Bugzilla */
-// protected static final Pattern re = Pattern.compile("<a
-// href=\"show_bug.cgi\\?taskId=(\\d+)\">", Pattern.CASE_INSENSITIVE);
-//
-//	
-// /** regular expression matching Bugzilla query results format used in
-// v2.12 */
-// protected static final Pattern reOld = Pattern.compile("<a
-// href=\"show_bug.cgi\\?taskId=(\\d+)\">\\d+</a>\\s*<td
-// class=severity><nobr>([^>]+)</nobr><td
-// class=priority><nobr>([^>]+)</nobr><td
-// class=platform><nobr>([^>]*)</nobr><td
-// class=owner><nobr>([^>]*)</nobr><td class=status><nobr>([^>]*)</nobr><td
-// class=resolution><nobr>([^>]*)</nobr><td class=summary>(.*)$",
-// Pattern.CASE_INSENSITIVE);
-
-// /**
-// * Executes the query, parses the response, and adds hits to the search
-// result collector.
-// *
-// * <p>
-// * The output for a single match looks like this:
-// * <pre>
-// * <tr class="bz_enhancement bz_P5 ">
-// *
-// * <td>
-// * <a href="show_bug.cgi?taskId=6747">6747</a>
-// * </td>
-// *
-// * <td><nobr>enh</nobr>
-// * </td>
-// * <td><nobr>P5</nobr>
-// * </td>
-// * <td><nobr>All</nobr>
-// * </td>
-// * <td><nobr>Olivier_Thomann@oti.com</nobr>
-// * </td>
-// * <td><nobr>ASSI</nobr>
-// * </td>
-// * <td><nobr></nobr>
-// * </td>
-// * <td>Code Formatter exchange several blank lines w/ one
-// * </td>
-// *
-// * </tr>
-// * <pre>
-// *
-// * <p>Or in the older format:
-// * <pre>
-// * <A HREF="show_bug.cgi?taskId=8">8</A> <td
-// class=severity><nobr>blo</nobr><td class=priority><nobr>P1</nobr><td
-// class=platform><nobr>PC</nobr><td
-// class=owner><nobr>cubranic@cs.ubc.ca</nobr><td
-// class=status><nobr>CLOS</nobr><td class=resolution><nobr>DUPL</nobr><td
-// class=summary>"Document root" missing when querying on files and
-// revisions
-// * </pre>
-// * @param collector - The collector for the search results
-// * @param startMatches - The number of matches to start with for the
-// progress monitor
-// * @param maxMatches - the maximum number of matches to return or -1 for
-// unlimited
-// */
-// public IStatus search(IBugzillaSearchResultCollector collector, int
-// startMatches, int maxMatches)
-// throws LoginException {
-// IProgressMonitor monitor = collector.getProgressMonitor();
-// IStatus status = null;
-// boolean possibleBadLogin = false;
-// int numCollected = 0;
-// BufferedReader in = null;
-//
-// try {
-// monitor.beginTask(QUERYING_SERVER, IProgressMonitor.UNKNOWN);
-// collector.aboutToStart(startMatches);
-//
-// URLConnection cntx = BugzillaPlugin.getDefault().getUrlConnection(new
-// URL(urlString));
-// if (cntx == null || !(cntx instanceof HttpURLConnection)) {
-// return null;
-// }
-//
-// HttpURLConnection connect = (HttpURLConnection) cntx;
-// connect.connect();
-// int responseCode = connect.getResponseCode();
-// if (responseCode != HttpURLConnection.HTTP_OK) {
-// String msg;
-// if (responseCode == -1 || responseCode ==
-// HttpURLConnection.HTTP_FORBIDDEN)
-// msg = repository.getUrl()
-// + " does not seem to be a valid Bugzilla server. Check Bugzilla
-// preferences.";
-// else
-// msg = "HTTP Error " + responseCode + " (" + connect.getResponseMessage()
-// + ") while querying Bugzilla Server. Check Bugzilla preferences.";
-//
-// throw new BugzillaException(msg);
-// }
-//
-// if (monitor.isCanceled()) {
-// throw new OperationCanceledException("Search cancelled");
-// }
-//
-// in = new BufferedReader(new InputStreamReader(connect.getInputStream()));
-// if (monitor.isCanceled()) {
-// throw new OperationCanceledException("Search cancelled");
-// }
-//
-// String line;
-// while ((line = in.readLine()) != null) {
-// if (maxMatches != -1 && numCollected >= maxMatches) {
-// maxReached = true;
-// break;
-// }
-//
-// if (monitor.isCanceled()) {
-// throw new OperationCanceledException("Search cancelled");
-// }
-//
-// // create regular expressions that can be mathced to check if we
-// // have
-// // bad login information
-// Pattern loginRe = Pattern.compile("<title>.*login.*</title>.*");
-// Pattern invalidRe =
-// Pattern.compile(".*<title>.*invalid.*password.*</title>.*");
-// Pattern passwordRe =
-// Pattern.compile(".*<title>.*password.*invalid.*</title>.*");
-// Pattern emailRe = Pattern.compile(".*<title>.*check e-mail.*</title>.*");
-// Pattern errorRe = Pattern.compile(".*<title>.*error.*</title>.*");
-//
-// String lowerLine = line.toLowerCase(Locale.ENGLISH);
-//
-// // check if we have anything that suggests bad login info
-// if (loginRe.matcher(lowerLine).find() ||
-// invalidRe.matcher(lowerLine).find() ||
-// passwordRe.matcher(lowerLine).find()
-// || emailRe.matcher(lowerLine).find() ||
-// errorRe.matcher(lowerLine).find())
-// possibleBadLogin = true;
-//
-// Matcher matcher = reOld.matcher(line);
-// if (matcher.find()) {
-// int taskId = Integer.parseInt(matcher.group(1));
-// String severity = matcher.group(2);
-// String priority = matcher.group(3);
-// String platform = matcher.group(4);
-// String owner = matcher.group(5);
-// String state = matcher.group(6);
-// String result = matcher.group(7);
-// String summary = matcher.group(8);
-// String query = BugzillaPlugin.getMostRecentQuery();
-// if (query == null)
-// query = "";
-//
-// String server = repository.getUrl();
-//
-// BugzillaSearchHit hit = new BugzillaSearchHit(server, taskId, summary,
-// severity, priority,
-// platform, state, result, owner, query);
-// collector.accept(hit);
-// numCollected++;
-//
-// } else {
-// matcher = re.matcher(line);
-// if (matcher.find()) {
-// Pattern regularExpression;
-//						
-// BugzillaServerVersion bugzillaServerVersion =
-// IBugzillaConstants.BugzillaServerVersion.fromString(repository.getVersion());
-// if (bugzillaServerVersion != null &&
-// bugzillaServerVersion.compareTo(BugzillaServerVersion.SERVER_220) >= 0) {
-// regularExpression = reValueBugzilla220;
-// } else {
-// regularExpression = reValue;
-// }
-//	
-// int taskId = Integer.parseInt(matcher.group(1));
-// BugzillaSearchHit hit = createHit(regularExpression, monitor, in,
-// repository.getUrl(), taskId);
-// collector.accept(hit);
-// numCollected++;
-// }
-// }
-//				
-// // } else if (re.matches(line, match)) {
-// // RegularExpression regularExpression;
-// // if
-// (repository.getVersion().equals(BugzillaServerVersion.SERVER_220.toString()))
-// {
-// // regularExpression = reValueBugzilla220;
-// // } else {
-// // regularExpression = reValue;
-// // }
-// //
-// // int taskId = Integer.parseInt(match.getCapturedText(1));
-// // BugzillaSearchHit hit = createHit(regularExpression, monitor, in,
-// match, repository.getUrl()
-// // .toExternalForm(), taskId);
-// // collector.accept(hit);
-// // numCollected++;
-// // }
-// if (monitor.isCanceled()) {
-// throw new OperationCanceledException("Search cancelled");
-// }
-// }
-// } catch (CoreException e) {
-// status = new MultiStatus(IBugzillaConstants.PLUGIN_ID, IStatus.ERROR,
-// "Core Exception occurred while querying Bugzilla Server " +
-// repository.getUrl()
-// + ".\n" + "\nClick Details for more information.", e);
-// ((MultiStatus) status).add(e.getStatus());
-//
-// // write error to log
-// BugzillaPlugin.log(status);
-// } catch (OperationCanceledException e) {
-// status = new Status(IStatus.CANCEL, IBugzillaConstants.PLUGIN_ID,
-// IStatus.CANCEL, "", null);
-// } catch (Exception e) {
-// status = new MultiStatus(IBugzillaConstants.PLUGIN_ID, IStatus.ERROR, "An
-// error occurred while querying Bugzilla Server " + repository.getUrl() +
-// ".\n"
-// + "\nCheck network connection repository configuration in Task
-// Repositories view.", e);
-//
-// IStatus s = new Status(IStatus.ERROR, IBugzillaConstants.PLUGIN_ID,
-// IStatus.ERROR, e.getClass().toString()
-// + ": ", e);
-// ((MultiStatus) status).add(s);
-// s = new Status(IStatus.ERROR, IBugzillaConstants.PLUGIN_ID, IStatus.OK,
-// "search failed", e);
-// ((MultiStatus) status).add(s);
-//
-// // write error to log
-// //BugzillaPlugin.log(status);
-//			
-// 
-// } finally {
-// monitor.done();
-// collector.done();
-// try {
-// if (in != null)
-// in.close();
-// } catch (IOException e) {
-// BugzillaPlugin.log(new Status(IStatus.ERROR,
-// IBugzillaConstants.PLUGIN_ID, IStatus.ERROR,
-// "Problem closing the stream", e));
-// }
-// }
-//
-// // if we haven't collected any serach results and we suspect a bad
-// // login, we assume it was a bad login
-// if (numCollected == 0 && possibleBadLogin) {
-// throw new LoginException(IBugzillaConstants.MESSAGE_LOGIN_FAILURE + " for
-// repository: " + repository.getUrl() + " username: " +
-// repository.getUserName());
-// }
-//
-// if (status == null)
-// return new Status(IStatus.OK, NewSearchUI.PLUGIN_ID, IStatus.OK, "",
-// null);
-// else
-// return status;
-// }
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaSearchManager.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaSearchManager.java
deleted file mode 100644
index abbef8e..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaSearchManager.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.bridge.bugs;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IMember;
-
-/**
- * Class to handle the bridge between Mylyn and bugzilla
- * 
- * @author Shawn Minto
- */
-public class BugzillaSearchManager {
-
-	/** The hash of all of the landmarks and their related search hits */
-	private final Map<String, Map<Integer, List<BugzillaReportInfo>>> landmarksHash;
-
-	/**
-	 * The currently running search jobs so that we can cancel it if necessary <br>
-	 * KEY: IMember VALUE: Job
-	 */
-	static Map<String, Job> runningJobs = Collections.synchronizedMap(new HashMap<String, Job>());
-
-	/**
-	 * Constructor
-	 */
-	public BugzillaSearchManager() {
-		landmarksHash = Collections.synchronizedMap(new HashMap<String, Map<Integer, List<BugzillaReportInfo>>>());
-	}
-
-	/**
-	 * Remove a landmark from the hash
-	 * 
-	 * @param removed
-	 *            This landmark to remove (IJavaElement)
-	 */
-	public void removeFromLandmarksHash(IJavaElement removed) {
-		landmarksHash.remove(removed.getHandleIdentifier());
-	}
-
-	/**
-	 * Remove all of the landmarks from the hash that are in the list
-	 * 
-	 * @param removed
-	 *            This list of landmarks to remove (IJavaElements)
-	 */
-	public void removeFromLandmarksHash(List<IJavaElement> removed) {
-
-		for (IJavaElement je : removed) {
-			landmarksHash.remove(je.getHandleIdentifier());
-		}
-	}
-
-	/**
-	 * Add data to the landmarks hash
-	 * 
-	 * @param doiList
-	 *            The list of BugzillaSearchHitDoiInfo
-	 * @param m
-	 *            The member that this list is for
-	 */
-	public void addToLandmarksHash(List<BugzillaReportInfo> doiList, IMember m, int scope) {
-		Map<Integer, List<BugzillaReportInfo>> searches = landmarksHash.get(m.getHandleIdentifier());
-
-		if (searches == null) {
-			searches = new HashMap<Integer, List<BugzillaReportInfo>>();
-		}
-		searches.put(scope, doiList);
-		landmarksHash.put(m.getHandleIdentifier(), searches);
-	}
-
-	/**
-	 * Get the doiList for the given IMember from the landmarks hash
-	 * 
-	 * @param m
-	 *            The member to get the doiList for
-	 * @return The doiList or null if it doesn't exist
-	 */
-	public List<BugzillaReportInfo> getFromLandmarksHash(IMember m, int scope) {
-		Map<Integer, List<BugzillaReportInfo>> scopes = landmarksHash.get(m.getHandleIdentifier());
-		if (scopes == null) {
-			return null;
-		} else {
-			return scopes.get(scope);
-		}
-	}
-
-	/**
-	 * Determine whether the current element has a search job running for it
-	 * 
-	 * @param e
-	 *            The element that we want to know whether there is a search job or not
-	 * @return <code>true</code> if it does else <code>false</code>
-	 */
-	public static boolean doesJobExist(String handle) {
-		return runningJobs.containsKey(handle);
-	}
-
-	/**
-	 * Remove search job for the given element
-	 * 
-	 * @param m
-	 *            The element that we want to make sure that the search is canceled for
-	 */
-	public static void removeSearchJob(String handle) {
-
-		// make sure that there wasn't a previous search job that we know
-		// of. If there was, cancel it
-		if (doesJobExist(handle)) {
-			// get the search job and wait until it is cancelled
-			Job prevJob = runningJobs.get(handle);
-			prevJob.cancel();
-			runningJobs.remove(handle);
-		}
-	}
-
-	/**
-	 * Add a search job to our list
-	 * 
-	 * @param handle
-	 *            The handle of the element that we are searching for
-	 * @param searchJob
-	 *            The job that represents the search
-	 */
-	public static void addJob(String handle, Job searchJob) {
-		runningJobs.put(handle, searchJob);
-	}
-
-	public static void cancelAllRunningJobs() {
-		Collection<Job> jobs = runningJobs.values();
-		for (Job j : jobs) {
-			j.cancel();
-		}
-		runningJobs.clear();
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaStructureBridge.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaStructureBridge.java
deleted file mode 100644
index 449a0c0..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaStructureBridge.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.bridge.bugs;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
-import org.eclipse.mylyn.internal.bugzilla.core.BugzillaTask;
-import org.eclipse.mylyn.internal.context.core.AbstractRelationProvider;
-import org.eclipse.mylyn.internal.tasks.ui.editors.ContentOutlineTools;
-import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskOutlineNode;
-import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskSelection;
-import org.eclipse.ui.views.markers.internal.ProblemMarker;
-
-/**
- * @author Mik Kersten
- * @author Shawn Minto
- */
-public class BugzillaStructureBridge extends AbstractContextStructureBridge {
-
-	public final static String CONTENT_TYPE = "bugzilla";
-
-	public List<AbstractRelationProvider> providers;
-
-	@Override
-	public String getContentType() {
-		return CONTENT_TYPE;
-	}
-
-	public BugzillaStructureBridge() {
-		super();
-		providers = new ArrayList<AbstractRelationProvider>();
-	}
-
-	/**
-	 * Handle format: <server-name:port>;<bug-taskId>;<comment#>
-	 * 
-	 * Use: OutlineTools ???
-	 */
-	@Override
-	public String getHandleIdentifier(Object object) {
-		if (object instanceof RepositoryTaskOutlineNode) {
-			RepositoryTaskOutlineNode node = (RepositoryTaskOutlineNode) object;
-			return ContentOutlineTools.getHandle(node);
-		} else if (object instanceof RepositoryTaskSelection) {
-			RepositoryTaskSelection n = (RepositoryTaskSelection) object;
-			return ContentOutlineTools.getHandle(n);
-		}
-		return null;
-	}
-
-//	private BugzillaReport result;
-
-	/**
-	 * TODO: this will not return a non-cached handle
-	 */
-	@Override
-	public Object getObjectForHandle(final String handle) {
-		return null;
-	}
-
-	@Override
-	public String getParentHandle(String handle) {
-
-		// check so that we don't need to try to get the parent if we are
-		// already at the bug report
-		if (!handle.matches(".*;.*;.*")) {
-			return null;
-		}
-
-		RepositoryTaskOutlineNode bon = (RepositoryTaskOutlineNode) getObjectForHandle(handle);
-		if (bon != null && bon.getParent() != null) {
-			return ContentOutlineTools.getHandle(bon.getParent());
-		} else {
-			return null;
-		}
-	}
-
-	@Override
-	public String getLabel(Object object) {
-		if (object instanceof RepositoryTaskOutlineNode) {
-			RepositoryTaskOutlineNode b = (RepositoryTaskOutlineNode) object;
-			return ContentOutlineTools.getName(b);
-		} else if (object instanceof BugzillaReportInfo) {
-			BugzillaTask hit = ((BugzillaReportInfo) object).getHit();
-			return hit.getRepositoryUrl() + ": Bug#: " + hit.getTaskId() + ": " + hit.getSummary();
-		}
-		return "";
-	}
-
-	@Override
-	public boolean canBeLandmark(String handle) {
-		return false;
-	}
-
-	@Override
-	public boolean acceptsObject(Object object) {
-		return object instanceof RepositoryTaskOutlineNode || object instanceof RepositoryTaskSelection;
-	}
-
-	@Override
-	public boolean canFilter(Object element) {
-		return true;
-	}
-
-	@Override
-	public boolean isDocument(String handle) {
-		return (handle.indexOf(';') == handle.lastIndexOf(';') && handle.indexOf(";") != -1);
-	}
-
-	public String getHandleForMarker(ProblemMarker marker) {
-		return null;
-	}
-
-	@Override
-	public String getContentType(String elementHandle) {
-		return getContentType();
-	}
-
-	@Override
-	public String getHandleForOffsetInObject(Object resource, int offset) {
-		return null;
-	}
-
-	@Override
-	public List<String> getChildHandles(String handle) {
-		return Collections.emptyList();
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaUiBridge.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaUiBridge.java
deleted file mode 100644
index 8f6a535..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/BugzillaUiBridge.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-/*
- * Created on Apr 6, 2005
- */
-package org.eclipse.mylyn.internal.sandbox.bridge.bugs;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.mylyn.context.core.IInteractionElement;
-import org.eclipse.mylyn.context.ui.AbstractContextUiBridge;
-import org.eclipse.mylyn.internal.bugzilla.core.BugzillaClient;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.internal.tasks.ui.deprecated.AbstractRepositoryTaskEditor;
-import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTaskOutlinePage;
-import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
-import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorReference;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @author Mik Kersten
- * @author Shawn Minto
- */
-public class BugzillaUiBridge extends AbstractContextUiBridge {
-
-	protected BugzillaContextLabelProvider labelProvider = new BugzillaContextLabelProvider();
-
-	@Override
-	public void open(IInteractionElement node) {
-		String handle = node.getHandleIdentifier();
-		String bugHandle = handle;
-		String server = handle.substring(0, handle.indexOf(";"));
-
-		handle = handle.substring(handle.indexOf(";") + 1);
-		int next = handle.indexOf(";");
-
-		int bugId;
-		if (next == -1) {
-			bugId = Integer.parseInt(handle);
-		} else {
-			bugId = Integer.parseInt(handle.substring(0, handle.indexOf(";")));
-			bugHandle = bugHandle.substring(0, next);
-		}
-
-		final AbstractTask task = TasksUiPlugin.getTaskList().getTask(handle);
-		if (task != null) {
-			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					TasksUiUtil.openTask(task);
-				}
-			});
-		} else {
-			String bugUrl = BugzillaClient.getBugUrlWithoutLogin(server, "" + bugId);
-			TasksUiUtil.openTask(server, "" + bugId, bugUrl);
-		}
-	}
-
-	public ILabelProvider getLabelProvider() {
-		return labelProvider;
-	}
-
-	@Override
-	public void close(IInteractionElement node) {
-		IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-		if (page != null) {
-			IEditorReference[] references = page.getEditorReferences();
-			for (IEditorReference reference : references) {
-				IEditorPart part = reference.getEditor(false);
-				if (part != null) {
-					if (part instanceof AbstractRepositoryTaskEditor) {
-						((AbstractRepositoryTaskEditor) part).close();
-					} else if (part instanceof TaskEditor) {
-						((TaskEditor) part).close(true);
-					}
-				}
-			}
-		}
-	}
-
-	@Override
-	public boolean acceptsEditor(IEditorPart editorPart) {
-		return editorPart instanceof AbstractRepositoryTaskEditor;
-	}
-
-	@Override
-	public List<TreeViewer> getContentOutlineViewers(IEditorPart editor) {
-		List<TreeViewer> viewers = new ArrayList<TreeViewer>();
-		TreeViewer outline = getOutlineTreeViewer(editor);
-		if (outline != null) {
-			viewers.add(outline);
-		}
-		return viewers;
-	}
-
-	protected TreeViewer getOutlineTreeViewer(IEditorPart editor) {
-		if (editor instanceof AbstractRepositoryTaskEditor) {
-			AbstractRepositoryTaskEditor abe = (AbstractRepositoryTaskEditor) editor;
-			RepositoryTaskOutlinePage outline = abe.getOutline();
-			if (outline != null) {
-				return outline.getOutlineTreeViewer();
-			}
-		}
-		return null;
-	}
-
-	@Override
-	public Object getObjectForTextSelection(TextSelection selection, IEditorPart editor) {
-		return null;
-	}
-
-	public void restoreEditor(IInteractionElement document) {
-		// ignore
-	}
-
-	@Override
-	public IInteractionElement getElement(IEditorInput input) {
-		return null;
-	}
-
-	@Override
-	public String getContentType() {
-		return BugzillaStructureBridge.CONTENT_TYPE;
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/IBugzillaSearchOperation.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/IBugzillaSearchOperation.java
deleted file mode 100644
index 8951517..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/IBugzillaSearchOperation.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.bridge.bugs;
-
-import javax.security.auth.login.LoginException;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.mylyn.internal.tasks.ui.search.AbstractRepositorySearchQuery;
-
-/**
- * Interface for the bugzilla search operation
- * 
- * @author Shawn Minto
- * 
- * TODO: Delete once not requred by sandbox
- */
-public interface IBugzillaSearchOperation extends IRunnableWithProgress {
-
-	/**
-	 * Get the status of the search operation
-	 * 
-	 * @return The status of the search operation
-	 * @throws LoginException
-	 */
-	public IStatus getStatus() throws LoginException;
-
-	/**
-	 * Get the bugzilla search query
-	 * 
-	 * @return The bugzilla search query
-	 */
-	public AbstractRepositorySearchQuery getQuery();
-
-	/**
-	 * Sets the bugzilla search query
-	 * 
-	 * @param newQuery
-	 *            The bugzilla search query to be set
-	 */
-	public void setQuery(AbstractRepositorySearchQuery newQuery);
-
-	public String getName();
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/MylynBugsManager.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/MylynBugsManager.java
deleted file mode 100644
index 2afca72..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/MylynBugsManager.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.sandbox.bridge.bugs;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The main plugin class to be used in the desktop.
- * 
- * @author Mik Kersten
- * @author Shawn Minto
- */
-public class MylynBugsManager {
-
-	public static ImageDescriptor EDGE_REF_BUGZILLA = getImageDescriptor("icons/elcl16/edge-ref-bug.gif");
-
-	private static BugzillaSearchManager bridge = null;
-
-	private static BugzillaReferencesProvider referencesProvider = new BugzillaReferencesProvider();
-
-	private static MylynBugsManager INSTANCE;
-
-//	private BugzillaReportCache cache
-
-	public MylynBugsManager() {
-		INSTANCE = this;
-//		cache = new BugzillaReportCache();
-//		cache.readCacheFile();
-
-		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-		if (window != null) {
-			// create a new bridge and initialize it
-			bridge = new BugzillaSearchManager();
-		}
-		final IWorkbench workbench = PlatformUI.getWorkbench();
-		workbench.getDisplay().asyncExec(new Runnable() {
-			public void run() {
-				// bugzillaEditingMonitor = new BugzillaEditingMonitor();
-				// ContextCore.getSelectionMonitors().add(bugzillaEditingMonitor);
-			}
-		});
-	}
-
-	public void dispose(BundleContext context) throws Exception {
-		// ContextCore.getSelectionMonitors().remove(bugzillaEditingMonitor);
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static MylynBugsManager getDefault() {
-		return INSTANCE;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given plug-in relative path.
-	 * 
-	 * @param path
-	 *            the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.mylyn.internal.bugs.bridge", path);
-	}
-
-	public static BugzillaSearchManager getBridge() {
-		// make sure that the bridge initialized, if not, make a new one
-		if (bridge == null) {
-			bridge = new BugzillaSearchManager();
-		}
-		return bridge;
-	}
-
-	public static BugzillaReferencesProvider getReferenceProvider() {
-		return referencesProvider;
-
-	}
-
-//	public BugzillaReportCache getCache() {
-//		return cache;
-//	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/ProgressQueryHitCollector.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/ProgressQueryHitCollector.java
deleted file mode 100644
index f0eabf2..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/ProgressQueryHitCollector.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.bridge.bugs;
-
-import java.text.MessageFormat;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.core.ITaskList;
-import org.eclipse.mylyn.internal.tasks.core.deprecated.ITaskFactory;
-import org.eclipse.mylyn.internal.tasks.core.deprecated.LegacyTaskDataCollector;
-import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData;
-
-public class ProgressQueryHitCollector extends LegacyTaskDataCollector {
-
-	public static final int MAX_HITS = 5000;
-
-	public static final String MAX_HITS_REACHED = "Max allowed number of hits returned exceeded. Some hits may not be displayed. Please narrow query scope.";
-
-	protected Set<AbstractTask> taskResults = new HashSet<AbstractTask>();
-
-	/** The progress monitor for the search operation */
-	private IProgressMonitor monitor = new NullProgressMonitor();
-
-	/** The number of matches found */
-	private int matchCount;
-
-	/** The string to display to the user while querying */
-	private static final String STARTING = "querying the server";
-
-	/** The string to display to the user when we have 1 match */
-	private static final String MATCH = "1 match";
-
-	/** The string to display to the user when we have multiple or no matches */
-	private static final String MATCHES = "{0} matches";
-
-	/** The string to display to the user when the query is done */
-	private static final String DONE = "done";
-
-	protected ITaskList taskList;
-
-	protected ITaskFactory taskFactory;
-
-	public ProgressQueryHitCollector(ITaskList tasklist, ITaskFactory taskFactory) {
-		this.taskList = tasklist;
-		this.taskFactory = taskFactory;
-	}
-
-	public void aboutToStart(int startMatchCount) throws CoreException {
-		taskResults.clear();
-		matchCount = startMatchCount;
-		monitor.setTaskName(STARTING);
-	}
-
-//	public void accept(AbstractTask task) {
-//
-//		if (!getProgressMonitor().isCanceled()) {
-//			getProgressMonitor().subTask(getFormattedMatchesString(matchCount));
-//			getProgressMonitor().worked(1);
-//		}
-//
-//		if (task == null) {
-//			return;
-//		}
-//
-//		AbstractTask hitTask = taskList.getTask(task.getHandleIdentifier());
-//		if (hitTask == null) {
-//			hitTask = task;
-//			// task is new, add to tasklist
-//			taskList.addTask(hitTask);
-//		}
-//		taskResults.add(hitTask);
-//		matchCount++;
-//	}
-
-	@Override
-	public void accept(RepositoryTaskData taskData) {
-		if (taskData == null) {
-			return;
-		}
-
-		if (!getProgressMonitor().isCanceled()) {
-			getProgressMonitor().subTask(getFormattedMatchesString(matchCount));
-			getProgressMonitor().worked(1);
-		}
-
-		AbstractTask task;
-		try {
-			task = taskFactory.createTask(taskData, new SubProgressMonitor(monitor, 1));
-			taskResults.add(task);
-			matchCount++;
-		} catch (CoreException e) {
-			// FIXME
-			e.printStackTrace();
-		}
-	}
-
-	public void done() {
-		if (monitor != null && !monitor.isCanceled()) {
-			// if the operation is cancelled, finish with the data that we
-			// already have
-			String matchesString = getFormattedMatchesString(matchCount);
-			monitor.setTaskName(MessageFormat.format(DONE, new Object[] { matchesString }));
-			monitor.done();
-		}
-
-		// Cut no longer used references because the collector might be re-used
-		monitor = null;
-	}
-
-	protected String getFormattedMatchesString(int count) {
-		if (count == 1) {
-			return MATCH;
-		}
-		Object[] messageFormatArgs = { new Integer(count) };
-		return MessageFormat.format(MATCHES, messageFormatArgs);
-	}
-
-	public IProgressMonitor getProgressMonitor() {
-		return monitor;
-	}
-
-	public void setProgressMonitor(IProgressMonitor monitor) {
-		this.monitor = monitor;
-	}
-
-	public Set<AbstractTask> getTasks() {
-		return taskResults;
-	}
-
-	public void clear() {
-		taskResults.clear();
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/Util.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/Util.java
deleted file mode 100644
index 7ab44de..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/bridge/bugs/Util.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-/*
- * Created on Nov 19, 2004
- */
-package org.eclipse.mylyn.internal.sandbox.bridge.bugs;
-
-import java.io.UnsupportedEncodingException;
-import java.net.URLEncoder;
-import java.nio.charset.Charset;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jdt.core.IMember;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.mylyn.internal.bugzilla.core.BugzillaCorePlugin;
-import org.eclipse.mylyn.internal.bugzilla.core.IBugzillaConstants;
-import org.eclipse.mylyn.internal.bugzilla.core.RepositoryConfiguration;
-import org.eclipse.mylyn.internal.bugzilla.ui.BugzillaUiPlugin;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-import org.eclipse.mylyn.tasks.ui.TasksUi;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Utilities methods for the BugzillaMylarBridge
- * 
- * @author Shawn Minto
- * @author Mik Kersten
- */
-public class Util {
-
-	/**
-	 * List of all of the search repositoryOperations that can be done <br>
-	 * all words, any words, regex
-	 */
-	private static final String[] patternOperationValues = { "allwordssubstr", "anywordssubstr", "regexp" };
-
-	/**
-	 * Sugzilla preferences so that we can get the search params
-	 */
-	// private static IPreferenceStore prefs =
-	// BugzillaPlugin.getDefault().getPreferenceStore();
-	// private static String[] resolutionValues =
-	// BugzillaRepositoryUtil.convertQueryOptionsToArray(prefs.getString(IBugzillaConstants.VALUES_RESOLUTION));
-	//   
-	// private static String[] statusValues =
-	// BugzillaRepositoryUtil.convertQueryOptionsToArray(prefs.getString(IBugzillaConstants.VALUES_STATUS));
-	/**
-	 * Get the bugzilla url used for searching for exact matches
-	 * 
-	 * @param je
-	 * 		The IMember to create the query string for
-	 * @return A url string for the search
-	 */
-	public static String getExactSearchURL(String repositoryUrl, IMember je) {
-		StringBuffer sb = getQueryURLStart(repositoryUrl);
-
-		String long_desc = "";
-
-		// get the fully qualified name of the element
-		long_desc += BugzillaMylynSearchOperation.getFullyQualifiedName(je);
-
-		try {
-			// encode the string to be used as a url
-			sb.append(URLEncoder.encode(long_desc, Charset.defaultCharset().toString()));
-		} catch (UnsupportedEncodingException e) {
-			// should never get here since we are using the default encoding
-		}
-		sb.append(getQueryURLEnd(repositoryUrl));
-
-		return sb.toString();
-	}
-
-	/**
-	 * Get the bugzilla url used for searching for inexact matches
-	 * 
-	 * @param je
-	 * 		The IMember to create the query string for
-	 * @return A url string for the search
-	 */
-	public static String getInexactSearchURL(String repositoryUrl, IMember je) {
-		StringBuffer sb = getQueryURLStart(repositoryUrl);
-
-		String long_desc = "";
-
-		// add the member, qualified with just its parents name
-		if (!(je instanceof IType)) {
-			long_desc += je.getParent().getElementName() + ".";
-		}
-		long_desc += je.getElementName();
-
-		try {
-			// encode the string to be used as a url
-			sb.append(URLEncoder.encode(long_desc, Charset.defaultCharset().toString()));
-		} catch (UnsupportedEncodingException e) {
-			// should never get here since we are using the default encoding
-		}
-		sb.append(getQueryURLEnd(repositoryUrl));
-
-		return sb.toString();
-	}
-
-	/**
-	 * Create the end of the bugzilla query URL with all of the status' and resolutions that we want
-	 * 
-	 * @return StringBuffer with the end of the query URL in it
-	 */
-	public static StringBuffer getQueryURLEnd(String repositoryUrl) {
-
-		StringBuffer sb = new StringBuffer();
-		TaskRepository repository = TasksUiPlugin.getRepositoryManager().getRepository(repositoryUrl);
-		RepositoryConfiguration repositoryConfiguration = null;
-		try {
-			repositoryConfiguration = BugzillaCorePlugin.getRepositoryConfiguration(repository, false,
-					new NullProgressMonitor());
-		} catch (final CoreException e) {
-			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					MessageDialog.openError(Display.getDefault().getActiveShell(), "Bugzilla Search Page",
-							"Unable to get configuration. Ensure proper repository configuration in "
-									+ TasksUiPlugin.LABEL_VIEW_REPOSITORIES + ".\n\n");
-				}
-			});
-		}
-
-		String[] resolutionValues = BugzillaUiPlugin.getQueryOptions(IBugzillaConstants.VALUES_RESOLUTION, null,
-				repositoryConfiguration);
-
-		String[] statusValues = BugzillaUiPlugin.getQueryOptions(IBugzillaConstants.VALUES_STATUS, null,
-				repositoryConfiguration);
-
-		// add the status and resolutions that we care about
-		sb.append("&bug_status=" + statusValues[0]); // UNCONFIRMED
-		sb.append("&bug_status=" + statusValues[1]); // NEW
-		sb.append("&bug_status=" + statusValues[2]); // ASSIGNED
-		sb.append("&bug_status=" + statusValues[3]); // REOPENED
-		sb.append("&bug_status=" + statusValues[4]); // RESOLVED
-		sb.append("&bug_status=" + statusValues[5]); // VERIFIED
-		sb.append("&bug_status=" + statusValues[6]); // CLOSED
-
-		sb.append("&resolution=" + resolutionValues[0]); // FIXED
-		sb.append("&resolution=" + resolutionValues[3]); // LATER
-		sb.append("&resolution=" + "---"); // ---
-		return sb;
-	}
-
-	/**
-	 * Create the bugzilla query URL start.
-	 * 
-	 * @return The start of the query url as a StringBuffer <br>
-	 * 	Example: https://bugs.eclipse.org/bugs/buglist.cgi?long_desc_type=allwordssubstr&long_desc=
-	 */
-	public static StringBuffer getQueryURLStart(String repositoryUrl) {
-		StringBuffer sb = new StringBuffer(repositoryUrl);
-
-		if (sb.charAt(sb.length() - 1) != '/') {
-			sb.append('/');
-		}
-		sb.append("buglist.cgi?");
-
-		TaskRepository repository = TasksUi.getRepositoryManager().getRepository(BugzillaCorePlugin.CONNECTOR_KIND,
-				repositoryUrl);
-		if (repository != null && repository.hasCredentials()) {
-			// if (BugzillaPreferencePage.getUserName() != null
-			// && !BugzillaPreferencePage.getUserName().equals("")
-			// && BugzillaPreferencePage.getPassword() != null
-			// && !BugzillaPreferencePage.getPassword().equals("")) {
-			try {
-				sb.append("GoAheadAndLogIn=1&Bugzilla_login=" + URLEncoder.encode(repository.getUserName(), // BugzillaPreferencePage.getUserName(),
-						Charset.defaultCharset().toString()) + "&Bugzilla_password="
-						+ URLEncoder.encode(repository.getPassword(), // BugzillaPreferencePage.getPassword(),
-								Charset.defaultCharset().toString()) + "&");
-			} catch (UnsupportedEncodingException e) {
-				// should never get here since we are using the default encoding
-			}
-		}
-		// add the summary search type
-		sb.append("long_desc_type=");
-		sb.append(patternOperationValues[0]); // search for all words
-		sb.append("&long_desc=");
-
-		return sb;
-	}
-
-	/**
-	 * Search the given string for another string
-	 * 
-	 * @param elementName
-	 * 		The name of the element that we are looking for
-	 * @param comment
-	 * 		The text to search for this element name
-	 * @return <code>true</code> if the element is found in the text else <code>false</code>
-	 */
-	public static boolean hasElementName(String elementName, String comment) {
-
-		// setup a regex for the element name
-		String regexElement = ".*" + elementName + ".*";
-
-		// get all of the individual lines for the string
-		String[] lines = comment.split("\n");
-
-		// go through each of the lines of the string
-		for (String line : lines) {
-
-			if (line.matches(regexElement)) {
-				return true;
-			}
-		}
-		return false;
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/ActiveSearchViewTracker.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/ActiveSearchViewTracker.java
deleted file mode 100644
index 77e1839..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/ActiveSearchViewTracker.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui;
-
-import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
-import org.eclipse.mylyn.internal.sandbox.ui.views.ActiveSearchView;
-import org.eclipse.ui.IPageListener;
-import org.eclipse.ui.IPartListener2;
-import org.eclipse.ui.IWindowListener;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPartReference;
-import org.eclipse.ui.IWorkbenchWindow;
-
-/**
- * TODO: support multiple workbench windows properly
- * 
- * @author Mik Kersten
- */
-public class ActiveSearchViewTracker implements IPartListener2, IWindowListener, IPageListener {
-
-	public void partClosed(IWorkbenchPartReference partRef) {
-		if (partRef.getId().equals(ActiveSearchView.ID)) {
-			ContextCorePlugin.getContextManager().setActiveSearchEnabled(false);
-		}
-	}
-
-	public void partOpened(IWorkbenchPartReference partRef) {
-		if (partRef.getId().equals(ActiveSearchView.ID)) {
-			ContextCorePlugin.getContextManager().setActiveSearchEnabled(true);
-		}
-	}
-
-	public void partDeactivated(IWorkbenchPartReference partRef) {
-
-	}
-
-	public void windowActivated(IWorkbenchWindow window) {
-	}
-
-	public void windowDeactivated(IWorkbenchWindow window) {
-	}
-
-	public void windowClosed(IWorkbenchWindow window) {
-		window.removePageListener(this);
-	}
-
-	public void windowOpened(IWorkbenchWindow window) {
-		window.addPageListener(this);
-	}
-
-	public void partActivated(IWorkbenchPartReference partRef) {
-		// TODO Auto-generated method stub
-
-	}
-
-	public void partBroughtToTop(IWorkbenchPartReference partRef) {
-		// TODO Auto-generated method stub
-
-	}
-
-	public void pageActivated(IWorkbenchPage page) {
-	}
-
-	public void pageClosed(IWorkbenchPage page) {
-		page.removePartListener(this);
-	}
-
-	public void pageOpened(IWorkbenchPage page) {
-		page.addPartListener(this);
-	}
-
-	public void partHidden(IWorkbenchPartReference partRef) {
-		// TODO Auto-generated method stub
-
-	}
-
-	public void partVisible(IWorkbenchPartReference partRef) {
-		// TODO Auto-generated method stub
-
-	}
-
-	public void partInputChanged(IWorkbenchPartReference partRef) {
-		// TODO Auto-generated method stub
-
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/DelegatingContextLabelProvider.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/DelegatingContextLabelProvider.java
deleted file mode 100644
index c0103c6..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/DelegatingContextLabelProvider.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-/*
- * Created on Apr 18, 2005
- */
-package org.eclipse.mylyn.internal.sandbox.ui;
-
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
-import org.eclipse.mylyn.context.core.ContextCore;
-import org.eclipse.mylyn.context.core.IInteractionObject;
-import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * TODO: refactor edge stuff
- * 
- * @author Mik Kersten
- */
-public class DelegatingContextLabelProvider implements ILabelProvider {
-
-	private static boolean qualifyNamesMode = false; // TODO: make non-static
-
-	public static boolean isQualifyNamesMode() {
-		return qualifyNamesMode;
-	}
-
-	public static void setQualifyNamesMode(boolean qualify) {
-		qualifyNamesMode = qualify;
-	}
-
-	public Image getImage(Object element) {
-		if (element instanceof IInteractionObject) {
-			ILabelProvider provider = ContextUiPlugin.getDefault().getContextLabelProvider(
-					((IInteractionObject) element).getContentType());
-			return provider.getImage(element);
-		} else {
-			AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(element);
-			ILabelProvider provider = ContextUiPlugin.getDefault().getContextLabelProvider(bridge.getContentType());
-			if (provider != null) {
-				return provider.getImage(element);
-			}
-		}
-		return null;
-	}
-
-	public String getText(Object object) {
-		if (object instanceof IInteractionObject) {
-			IInteractionObject element = (IInteractionObject) object;
-			ILabelProvider provider = ContextUiPlugin.getDefault().getContextLabelProvider(element.getContentType());
-
-//			ContextUiPlugin.getDefault().getPreferenceStore().getBoolean(ContextUiPrefContstants.DECORATE_INTEREST_LEVEL);
-//			if (ContextUiPlugin.getDefault().isDecorateInterestMode()) { 
-//				return provider.getText(element) + " [" + element.getInterest().getValue() + "]";
-//			} else {
-			return provider.getText(element);
-//			}
-		} else {
-			AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(object);
-			ILabelProvider provider = ContextUiPlugin.getDefault().getContextLabelProvider(bridge.getContentType());
-			if (provider != null) {
-//				if (ContextUiPlugin.getDefault().isDecorateInterestMode()) {
-//					IInteractionElement element = ContextCorePlugin.getContextManager().getElement(
-//							bridge.getHandleIdentifier(object));
-//					return provider.getText(object) + " [" + element.getInterest().getValue() + "]";
-//				} else {
-				return provider.getText(object);
-//				}
-			}
-		}
-		return "? " + object;
-	}
-
-	public boolean isLabelProperty(Object element, String property) {
-		// TODO: implement?
-		return false;
-	}
-
-	public void addListener(ILabelProviderListener listener) {
-		// TODO: implement?
-	}
-
-	public void dispose() {
-		// TODO: implement?
-	}
-
-	public void removeListener(ILabelProviderListener listener) {
-		// TODO: implement?
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/GroupBy.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/GroupBy.java
deleted file mode 100644
index f9d850f..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/GroupBy.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.sandbox.ui;
-
-import java.util.Date;
-
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.core.DateRange;
-import org.eclipse.mylyn.tasks.core.ITask;
-
-/**
- * @author Eugene Kuleshov
- */
-public enum GroupBy {
-
-	None() {
-		@Override
-		public String getKey(ITask task) {
-			return null;
-		}
-	},
-
-	Owner() {
-		@Override
-		public String getKey(ITask task) {
-			return task.getOwner();
-		}
-	},
-
-	Priority() {
-		@Override
-		public String getKey(ITask task) {
-			return task.getPriority();
-		}
-	},
-	Kind() {
-		@Override
-		public String getKey(ITask task) {
-			return task.getTaskKind();
-		}
-
-	},
-	Repository() {
-		@Override
-		public String getKey(ITask task) {
-			return task.getRepositoryUrl();
-		}
-	},
-	Due() {
-		@Override
-		public String getKey(ITask task) {
-			Date date = task.getDueDate();
-			return date == null ? null : date.toString();
-		}
-	},
-	Sheduled() {
-		@Override
-		public String getKey(ITask task) {
-			DateRange date = ((AbstractTask) task).getScheduledForDate();
-			return date == null ? null : date.toString();
-		}
-	};
-
-	public abstract String getKey(ITask task);
-
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/GroupedPresentation.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/GroupedPresentation.java
deleted file mode 100644
index 043d9fd..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/GroupedPresentation.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.sandbox.ui;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.core.runtime.IExecutableExtension;
-import org.eclipse.mylyn.internal.tasks.ui.views.AbstractTaskListContentProvider;
-import org.eclipse.mylyn.internal.tasks.ui.views.AbstractTaskListPresentation;
-import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
-
-/**
- * @author Eugene Kuleshov
- */
-public class GroupedPresentation extends AbstractTaskListPresentation implements IExecutableExtension {
-
-	private GroupBy groupBy;
-
-	public GroupedPresentation() {
-		super(null);
-	}
-
-	@Override
-	protected AbstractTaskListContentProvider createContentProvider(TaskListView taskListView) {
-		return new GroupedTaskListContentProvider(taskListView, groupBy);
-	}
-
-	@Override
-	public String getId() {
-		return "org.eclipse.mylyn.tasks.ui.groupBy" + groupBy;
-	}
-
-	// IExecutableExtension
-
-	public void setInitializationData(IConfigurationElement config, String propertyName, Object data)
-			throws CoreException {
-		try {
-			groupBy = GroupBy.valueOf((String) data);
-		} catch (IllegalArgumentException ex) {
-			// ignore
-		}
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/GroupedTaskListContentProvider.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/GroupedTaskListContentProvider.java
deleted file mode 100644
index 1956fbc..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/GroupedTaskListContentProvider.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui;
-
-import java.util.TreeMap;
-
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.core.TaskGroup;
-import org.eclipse.mylyn.internal.tasks.ui.views.TaskListContentProvider;
-import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
-import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.mylyn.tasks.core.IRepositoryElement;
-
-/**
- * @author Eugene Kuleshov
- */
-public class GroupedTaskListContentProvider extends TaskListContentProvider {
-
-	public static final String MEMENTO_KEY_GROUP_BY = "groupBy";
-
-	private GroupBy groupBy = GroupBy.None;
-
-	public GroupedTaskListContentProvider(TaskListView taskListView, GroupBy groupBy) {
-		super(taskListView);
-		this.groupBy = groupBy;
-	}
-
-	@Override
-	public Object[] getChildren(Object parent) {
-		Object[] children = super.getChildren(parent);
-
-		if ((parent instanceof IRepositoryQuery) && groupBy != GroupBy.None) {
-			return getGroups((IRepositoryElement) parent, children);
-		} else if (parent instanceof TaskGroup) {
-			return ((TaskGroup) parent).getChildren().toArray();
-		} else {
-			return children;
-		}
-	}
-
-	private TaskGroup[] getGroups(IRepositoryElement parent, Object[] children) {
-		TreeMap<String, TaskGroup> groups = new TreeMap<String, TaskGroup>();
-
-		for (Object container : children) {
-			if (container instanceof ITask) {
-				AbstractTask task = (AbstractTask) container;
-				String key = groupBy.getKey(task);
-				if (key == null || key.length() == 0) {
-					key = "<unknown>";
-				}
-				TaskGroup group = groups.get(key);
-				if (group == null) {
-					group = new TaskGroup(parent.getHandleIdentifier(), key, groupBy.name());
-					groups.put(key, group);
-				}
-				group.internalAddChild(task);
-			}
-		}
-
-		return groups.values().toArray(new TaskGroup[groups.size()]);
-	}
-
-	public GroupBy getGroupBy() {
-		return groupBy;
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/IncomingPresentation.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/IncomingPresentation.java
deleted file mode 100644
index 9dc386f..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/IncomingPresentation.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.sandbox.ui;
-
-import org.eclipse.mylyn.internal.tasks.ui.views.AbstractTaskListContentProvider;
-import org.eclipse.mylyn.internal.tasks.ui.views.AbstractTaskListPresentation;
-import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
-
-/**
- * @author Rob Elves
- */
-public class IncomingPresentation extends AbstractTaskListPresentation {
-
-	private static final String PRESENTATION_ID = "org.eclipse.mylyn.tasks.ui.incoming";
-
-	public IncomingPresentation() {
-		super(PRESENTATION_ID);
-	}
-
-	@Override
-	protected AbstractTaskListContentProvider createContentProvider(TaskListView taskListView) {
-		return new IncomingTaskListContentProvider(taskListView);
-	}
-
-	@Override
-	public String getId() {
-		return PRESENTATION_ID;
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/IncomingTaskListContentProvider.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/IncomingTaskListContentProvider.java
deleted file mode 100644
index cfcb532..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/IncomingTaskListContentProvider.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
-import org.eclipse.mylyn.internal.tasks.core.Person;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.internal.tasks.ui.views.TaskListContentProvider;
-import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.mylyn.tasks.core.ITaskContainer;
-
-/**
- * @author Rob Elves
- */
-public class IncomingTaskListContentProvider extends TaskListContentProvider {
-
-	Set<AbstractTaskContainer> people = new HashSet<AbstractTaskContainer>();
-
-	public IncomingTaskListContentProvider(TaskListView taskListView) {
-		super(taskListView);
-	}
-
-	@Override
-	public Object[] getElements(Object parent) {
-		people.clear();
-		if (parent instanceof Person) {
-			return getChildren(parent);
-		} else {
-			for (ITaskContainer container : applyFilter(TasksUiPlugin.getTaskListManager()
-					.getTaskList()
-					.getRootElements())) {
-				for (ITask task : container.getChildren()) {
-					if (task.getOwner() != null && task.getSynchronizationState().isIncoming()) {
-						people.add(new Person(task.getOwner(), task.getConnectorKind(), task.getRepositoryUrl()));
-					}
-				}
-			}
-		}
-		return people.toArray();
-	}
-
-	@Override
-	public Object[] getChildren(Object parent) {
-		Set<ITask> children = new HashSet<ITask>();
-		if (parent instanceof Person) {
-			for (ITaskContainer container : applyFilter(TasksUiPlugin.getTaskListManager()
-					.getTaskList()
-					.getRootElements())) {
-				for (ITask task : container.getChildren()) {
-					if (task.getOwner() != null && task.getOwner().equals(((Person) parent).getHandleIdentifier())
-							&& task.getSynchronizationState().isIncoming()) {
-						children.add(task);
-					}
-				}
-			}
-		}
-		return children.toArray();
-	}
-
-	@Override
-	public boolean hasChildren(Object parent) {
-		return parent instanceof Person;
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/InterestInducingProblemListener.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/InterestInducingProblemListener.java
deleted file mode 100644
index c844118..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/InterestInducingProblemListener.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-import org.eclipse.jdt.internal.ui.viewsupport.IProblemChangedListener;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.context.core.ContextCore;
-import org.eclipse.mylyn.context.core.IInteractionElement;
-import org.eclipse.mylyn.internal.context.core.InteractionContextManager;
-import org.eclipse.mylyn.internal.java.ui.JavaStructureBridge;
-import org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin;
-
-/**
- * @author Mik Kersten
- * @since 3.0
- */
-public class InterestInducingProblemListener implements IProblemChangedListener, IPropertyChangeListener {
-
-	public static final String PREDICTED_INTEREST_ERRORS = "org.eclipse.mylyn.java.ui.interest.prediction.errors";
-
-	// TODO: consider getting rid of this
-	private final JavaStructureBridge javaStructureBridge = new JavaStructureBridge();
-
-	public void problemsChanged(IResource[] changedResources, boolean isMarkerChange) {
-		try {
-			if (!ContextCore.getContextManager().isContextActive()) {
-				return;
-			} else {
-				for (IResource resource : changedResources) {
-					if (resource instanceof IFile) {
-						IJavaElement javaElement = (IJavaElement) resource.getAdapter(IJavaElement.class);
-						if (javaElement != null) {
-							IInteractionElement element = ContextCore.getContextManager().getElement(
-									javaElement.getHandleIdentifier());
-							if (!javaStructureBridge.containsProblem(element)) {
-								((InteractionContextManager) ContextCore.getContextManager()).removeErrorPredictedInterest(
-										element.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE, true);
-							} else {
-								((InteractionContextManager) ContextCore.getContextManager()).addErrorPredictedInterest(
-										element.getHandleIdentifier(), JavaStructureBridge.CONTENT_TYPE, true);
-							}
-						}
-					}
-				}
-			}
-		} catch (Exception e) {
-			StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN, "Could not update marker change",
-					e));
-		}
-	}
-
-	public void propertyChange(PropertyChangeEvent event) {
-		if (PREDICTED_INTEREST_ERRORS.equals(event.getProperty())) {
-			if (JavaUiBridgePlugin.getDefault().getPreferenceStore().getBoolean(PREDICTED_INTEREST_ERRORS)) {
-				enable();
-			} else {
-				disable();
-			}
-		}
-	}
-
-	public void enable() {
-		JavaPlugin.getDefault().getProblemMarkerManager().addListener(this);
-	}
-
-	public void disable() {
-		JavaPlugin.getDefault().getProblemMarkerManager().removeListener(this);
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/JavaContextLabelProvider.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/JavaContextLabelProvider.java
deleted file mode 100644
index 090d010..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/JavaContextLabelProvider.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-/*
- * Created on Aug 6, 2004
- */
-package org.eclipse.mylyn.internal.sandbox.ui;
-
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IMember;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.internal.ui.viewsupport.AppearanceAwareLabelProvider;
-import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider;
-import org.eclipse.jdt.internal.ui.viewsupport.TreeHierarchyLayoutProblemsDecorator;
-import org.eclipse.jdt.ui.JavaElementLabels;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.mylyn.context.core.IInteractionElement;
-import org.eclipse.mylyn.context.core.IInteractionRelation;
-import org.eclipse.mylyn.internal.context.core.InteractionContextManager;
-import org.eclipse.mylyn.internal.context.ui.ContextUiImages;
-import org.eclipse.mylyn.internal.java.ui.JavaStructureBridge;
-import org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin;
-import org.eclipse.mylyn.internal.java.ui.search.AbstractJavaRelationProvider;
-import org.eclipse.mylyn.internal.java.ui.search.JUnitReferencesProvider;
-import org.eclipse.mylyn.internal.java.ui.search.JavaImplementorsProvider;
-import org.eclipse.mylyn.internal.java.ui.search.JavaReadAccessProvider;
-import org.eclipse.mylyn.internal.java.ui.search.JavaReferencesProvider;
-import org.eclipse.mylyn.internal.java.ui.search.JavaWriteAccessProvider;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author Mik Kersten
- * @since 3.0
- */
-public class JavaContextLabelProvider extends AppearanceAwareLabelProvider {
-
-	private static final String LABEL_ELEMENT_MISSING = "<missing element>";
-
-	private static final ImageDescriptor EDGE_REF_JUNIT = JavaUiBridgePlugin.getImageDescriptor("icons/elcl16/edge-ref-junit.gif");
-
-	public JavaContextLabelProvider() {
-		super(AppearanceAwareLabelProvider.DEFAULT_TEXTFLAGS | JavaElementLabels.P_COMPRESSED,
-				AppearanceAwareLabelProvider.DEFAULT_IMAGEFLAGS | JavaElementImageProvider.SMALL_ICONS);
-	}
-
-	@Override
-	public String getText(Object object) {
-		if (object instanceof IInteractionElement) {
-			IInteractionElement node = (IInteractionElement) object;
-			if (JavaStructureBridge.CONTENT_TYPE.equals(node.getContentType())) {
-				IJavaElement element = JavaCore.create(node.getHandleIdentifier());
-				if (element == null) {
-					return LABEL_ELEMENT_MISSING;
-				} else {
-					return getTextForElement(element);
-				}
-			}
-		} else if (object instanceof IInteractionRelation) {
-			return getNameForRelationship(((IInteractionRelation) object).getRelationshipHandle());
-		} else if (object instanceof IJavaElement) {
-			return getTextForElement((IJavaElement) object);
-		}
-		return super.getText(object);
-	}
-
-	private String getTextForElement(IJavaElement element) {
-		if (DelegatingContextLabelProvider.isQualifyNamesMode()) {
-			if (element instanceof IMember && !(element instanceof IType)) {
-				String parentName = ((IMember) element).getParent().getElementName();
-				if (parentName != null && parentName != "") {
-					return parentName + '.' + super.getText(element);
-				}
-			}
-		}
-		if (element.exists()) {
-			return super.getText(element);
-		} else {
-			return LABEL_ELEMENT_MISSING;
-		}
-	}
-
-	@Override
-	public Image getImage(Object object) {
-		if (object instanceof IInteractionElement) {
-			IInteractionElement node = (IInteractionElement) object;
-			if (node.getContentType().equals(JavaStructureBridge.CONTENT_TYPE)) {
-				return super.getImage(JavaCore.create(node.getHandleIdentifier()));
-			}
-		} else if (object instanceof IInteractionRelation) {
-			ImageDescriptor descriptor = getIconForRelationship(((IInteractionRelation) object).getRelationshipHandle());
-			if (descriptor != null) {
-				return ContextUiImages.getImage(descriptor);
-			} else {
-				return null;
-			}
-		}
-		return super.getImage(object);
-	}
-
-	private ImageDescriptor getIconForRelationship(String relationshipHandle) {
-		if (relationshipHandle.equals(AbstractJavaRelationProvider.ID_GENERIC)) {
-			return ContextUiImages.EDGE_REFERENCE;
-		} else if (relationshipHandle.equals(JavaReferencesProvider.ID)) {
-			return ContextUiImages.EDGE_REFERENCE;
-		} else if (relationshipHandle.equals(JavaImplementorsProvider.ID)) {
-			return ContextUiImages.EDGE_INHERITANCE;
-		} else if (relationshipHandle.equals(JUnitReferencesProvider.ID)) {
-			return EDGE_REF_JUNIT;
-		} else if (relationshipHandle.equals(JavaWriteAccessProvider.ID)) {
-			return ContextUiImages.EDGE_ACCESS_WRITE;
-		} else if (relationshipHandle.equals(JavaReadAccessProvider.ID)) {
-			return ContextUiImages.EDGE_ACCESS_READ;
-		} else {
-			return null;
-		}
-	}
-
-	private String getNameForRelationship(String relationshipHandle) {
-		if (relationshipHandle.equals(AbstractJavaRelationProvider.ID_GENERIC)) {
-			return AbstractJavaRelationProvider.NAME;
-		} else if (relationshipHandle.equals(JavaReferencesProvider.ID)) {
-			return JavaReferencesProvider.NAME;
-		} else if (relationshipHandle.equals(JavaImplementorsProvider.ID)) {
-			return JavaImplementorsProvider.NAME;
-		} else if (relationshipHandle.equals(JUnitReferencesProvider.ID)) {
-			return JUnitReferencesProvider.NAME;
-		} else if (relationshipHandle.equals(JavaWriteAccessProvider.ID)) {
-			return JavaWriteAccessProvider.NAME;
-		} else if (relationshipHandle.equals(JavaReadAccessProvider.ID)) {
-			return JavaReadAccessProvider.NAME;
-		} else if (relationshipHandle.equals(InteractionContextManager.CONTAINMENT_PROPAGATION_ID)) {
-			return "Containment"; // TODO: make this generic?
-		} else {
-			return null;
-		}
-	}
-
-	public static AppearanceAwareLabelProvider createJavaUiLabelProvider() {
-		AppearanceAwareLabelProvider javaUiLabelProvider = new AppearanceAwareLabelProvider(
-				AppearanceAwareLabelProvider.DEFAULT_TEXTFLAGS | JavaElementLabels.P_COMPRESSED,
-				AppearanceAwareLabelProvider.DEFAULT_IMAGEFLAGS | JavaElementImageProvider.SMALL_ICONS);
-		javaUiLabelProvider.addLabelDecorator(new TreeHierarchyLayoutProblemsDecorator());
-		return javaUiLabelProvider;
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/SandboxUiPlugin.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/SandboxUiPlugin.java
deleted file mode 100644
index 06bb4c6..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/SandboxUiPlugin.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui;
-
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
-import org.eclipse.mylyn.internal.sandbox.ui.highlighters.Highlighter;
-import org.eclipse.mylyn.internal.sandbox.ui.highlighters.HighlighterList;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * @author Mik Kersten
- */
-public class SandboxUiPlugin extends AbstractUIPlugin {
-
-	public static final String HIGHLIGHTER_PREFIX = "org.eclipse.mylyn.ui.interest.highlighters";
-
-	public static final String TASK_HIGHLIGHTER_PREFIX = "org.eclipse.mylyn.ui.interest.highlighters.task.";
-
-	public final static String ID_PLUGIN = "org.eclipse.mylyn.sandbox.ui";
-
-	private static SandboxUiPlugin plugin;
-
-	private final SharedDataDirectoryManager sharedDataDirectoryManager = new SharedDataDirectoryManager();
-
-	public static final String OVERLAYS_INCOMING_TIGHT = "org.eclipse.mylyn.tasks.ui.overlays.incoming.tight";
-
-	private final ActiveSearchViewTracker activeSearchViewTracker = new ActiveSearchViewTracker();
-
-	private InterestInducingProblemListener problemListener;
-
-	private HighlighterList highlighters;
-
-	public SandboxUiPlugin() {
-		super();
-		plugin = this;
-	}
-
-	@Override
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-
-		getPreferenceStore().setDefault(InterestInducingProblemListener.PREDICTED_INTEREST_ERRORS, false);
-
-		problemListener = new InterestInducingProblemListener();
-		getPreferenceStore().addPropertyChangeListener(problemListener);
-		if (getPreferenceStore().getBoolean(InterestInducingProblemListener.PREDICTED_INTEREST_ERRORS)) {
-			problemListener.enable();
-		}
-
-		final IWorkbench workbench = PlatformUI.getWorkbench();
-		workbench.getDisplay().asyncExec(new Runnable() {
-			public void run() {
-				try {
-					workbench.addWindowListener(activeSearchViewTracker);
-					IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
-					for (IWorkbenchWindow window : windows) {
-						window.addPageListener(activeSearchViewTracker);
-						IWorkbenchPage[] pages = window.getPages();
-						for (IWorkbenchPage page : pages) {
-							page.addPartListener(activeSearchViewTracker);
-						}
-					}
-				} catch (Exception e) {
-					StatusHandler.log(new Status(IStatus.ERROR, SandboxUiPlugin.ID_PLUGIN,
-							"Sandbox UI initialization failed", e));
-				}
-			}
-		});
-	}
-
-	@Override
-	public void stop(BundleContext context) throws Exception {
-		if (highlighters != null) {
-			highlighters.dispose();
-			highlighters = null;
-		}
-
-		if (problemListener != null) {
-			getPreferenceStore().removePropertyChangeListener(problemListener);
-		}
-
-		IWorkbench workbench = PlatformUI.getWorkbench();
-		if (workbench != null) {
-			workbench.removeWindowListener(activeSearchViewTracker);
-			IWorkbenchWindow[] windows = workbench.getWorkbenchWindows();
-			for (IWorkbenchWindow window : windows) {
-				IWorkbenchPage[] pages = window.getPages();
-				window.removePageListener(activeSearchViewTracker);
-				for (IWorkbenchPage page : pages) {
-					page.removePartListener(activeSearchViewTracker);
-				}
-			}
-		}
-
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance.
-	 */
-	public static SandboxUiPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given plug-in relative path.
-	 * 
-	 * @param path
-	 *            the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.mylyn.internal.sandbox", path);
-	}
-
-	public SharedDataDirectoryManager getSharedDataDirectoryManager() {
-		return sharedDataDirectoryManager;
-	}
-
-	private void initializeHighlighters() {
-		String hlist = getPreferenceStore().getString(HIGHLIGHTER_PREFIX);
-		if (hlist.equals("")) {
-			// migrate from context ui
-			hlist = ContextUiPlugin.getDefault().getPreferenceStore().getString(HIGHLIGHTER_PREFIX);
-			getPreferenceStore().setValue(HIGHLIGHTER_PREFIX, hlist);
-			ContextUiPlugin.getDefault().getPreferenceStore().setToDefault(HIGHLIGHTER_PREFIX);
-		}
-		if (hlist != null && hlist.length() != 0) {
-			highlighters = new HighlighterList(hlist);
-		} else {
-			highlighters = new HighlighterList();
-			highlighters.setToDefaultList();
-		}
-	}
-
-	public HighlighterList getHighlighterList() {
-		if (this.highlighters == null) {
-			initializeHighlighters();
-		}
-		return this.highlighters;
-	}
-
-	public List<Highlighter> getHighlighters() {
-		if (highlighters == null) {
-			initializeHighlighters();
-		}
-		return highlighters.getHighlighters();
-	}
-
-	/**
-	 * @return null if not found
-	 */
-	public Highlighter getHighlighter(String name) {
-		if (highlighters == null) {
-			initializeHighlighters();
-		}
-		return highlighters.getHighlighter(name);
-	}
-
-	public Highlighter getHighlighterForContextId(String id) {
-		String prefId = TASK_HIGHLIGHTER_PREFIX + id;
-		String highlighterName = getPreferenceStore().getString(prefId);
-		if (highlighterName.equals("")) {
-			highlighterName = ContextUiPlugin.getDefault().getPreferenceStore().getString(prefId);
-			getPreferenceStore().setValue(prefId, highlighterName);
-			ContextUiPlugin.getDefault().getPreferenceStore().setToDefault(prefId);
-		}
-		return getHighlighter(highlighterName);
-	}
-
-	public void setHighlighterMapping(String id, String name) {
-		String prefId = TASK_HIGHLIGHTER_PREFIX + id;
-		getPreferenceStore().putValue(prefId, name);
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/SandboxUiPreferencePage.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/SandboxUiPreferencePage.java
deleted file mode 100644
index c1a46f4..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/SandboxUiPreferencePage.java
+++ /dev/null
@@ -1,655 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui;
-
-import java.util.Arrays;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ColorCellEditor;
-import org.eclipse.jface.viewers.ComboBoxCellEditor;
-import org.eclipse.jface.viewers.ICellEditorListener;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
-import org.eclipse.mylyn.internal.context.ui.HighlighterImageDescriptor;
-import org.eclipse.mylyn.internal.sandbox.ui.highlighters.Highlighter;
-import org.eclipse.mylyn.internal.sandbox.ui.highlighters.HighlighterList;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants;
-import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.RGB;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-/**
- * @author Ken Sueda
- * @author Mik Kersten
- * @author Eugene Kuleshov
- */
-public class SandboxUiPreferencePage extends PreferencePage implements IWorkbenchPreferencePage, ICellEditorListener {
-
-	private Table table;
-
-	private TableViewer tableViewer;
-
-	private Button enableErrorInterest = null;
-
-	private ColorCellEditor colorDialogEditor;
-
-	private Button incomingOverlaysButton = null;
-
-	private Button activateOnOpen;
-
-	private Button enableLocalSubTasksButton;
-
-	private Button showTaskTrimButton;
-
-	private Highlighter selection = null;
-
-	private HighlighterContentProvider contentProvider = null;
-
-	private static final String LABEL_COLUMN = "Label";
-
-	private static final String COLOR_COLUMN = "Color";
-
-	private static final String TYPE_COLUMN = "Type";
-
-	private static String[] columnNames = new String[] { LABEL_COLUMN, COLOR_COLUMN, TYPE_COLUMN, };
-
-	static final String[] TYPE_ARRAY = { "Gradient", "Solid" };
-
-	public SandboxUiPreferencePage() {
-		super();
-		setPreferenceStore(ContextUiPlugin.getDefault().getPreferenceStore());
-	}
-
-	@Override
-	protected Control createContents(Composite parent) {
-		Composite container = new Composite(parent, SWT.NULL);
-		GridLayout layout = new GridLayout(1, false);
-		container.setLayout(layout);
-
-		createTaskNavigationGroup(container);
-		createTaskListGroup(container);
-		createJavaGroup(container);
-
-		createHighlightersTable(container);
-		createTableViewer();
-
-		contentProvider = new HighlighterContentProvider();
-		tableViewer.setContentProvider(contentProvider);
-		tableViewer.setLabelProvider(new HighlighterLabelProvider());
-		tableViewer.setInput(SandboxUiPlugin.getDefault().getHighlighterList());
-
-		return container;
-	}
-
-	public void init(IWorkbench workbench) {
-		// ignore
-	}
-
-	private void createTaskNavigationGroup(Composite parent) {
-		Group navigationGroup = new Group(parent, SWT.NONE);
-		navigationGroup.setText("Task Navigation");
-		navigationGroup.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
-		navigationGroup.setLayout(new GridLayout());
-
-		IPreferenceStore uiPreferenceStore = TasksUiPlugin.getDefault().getPreferenceStore();
-
-		showTaskTrimButton = new Button(navigationGroup, SWT.CHECK);
-		showTaskTrimButton.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false));
-		showTaskTrimButton.setText("Show Task Trim widget");
-		showTaskTrimButton.setSelection(uiPreferenceStore.getBoolean(ITasksUiPreferenceConstants.SHOW_TRIM));
-	}
-
-	private void createTaskListGroup(Composite parent) {
-		Group group = new Group(parent, SWT.SHADOW_ETCHED_IN);
-		group.setText("Task List");
-		group.setLayout(new GridLayout(1, false));
-		group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		IPreferenceStore uiPreferenceStore = TasksUiPlugin.getDefault().getPreferenceStore();
-
-		incomingOverlaysButton = new Button(group, SWT.CHECK);
-		incomingOverlaysButton.setText("Use Synchronize View style incoming overlays and placement");
-		incomingOverlaysButton.setSelection(uiPreferenceStore.getBoolean(ITasksUiPreferenceConstants.OVERLAYS_INCOMING_TIGHT));
-
-		activateOnOpen = new Button(group, SWT.CHECK);
-		activateOnOpen.setText("Activate tasks on open");
-		activateOnOpen.setSelection(uiPreferenceStore.getBoolean(ITasksUiPreferenceConstants.ACTIVATE_WHEN_OPENED));
-
-		enableLocalSubTasksButton = new Button(group, SWT.CHECK);
-		enableLocalSubTasksButton.setText("Enable subtasks for local tasks");
-		enableLocalSubTasksButton.setSelection(uiPreferenceStore.getBoolean(ITasksUiPreferenceConstants.LOCAL_SUB_TASKS_ENABLED));
-	}
-
-	private void createJavaGroup(Composite parent) {
-		Group group = new Group(parent, SWT.SHADOW_ETCHED_IN);
-		group.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
-		group.setText("Java");
-		GridLayout gl = new GridLayout(1, false);
-		group.setLayout(gl);
-
-		enableErrorInterest = new Button(group, SWT.CHECK);
-		enableErrorInterest.setText("Enable predicted interest of errors (significantly increases view refresh).");
-		enableErrorInterest.setSelection(SandboxUiPlugin.getDefault().getPreferenceStore().getBoolean(
-				InterestInducingProblemListener.PREDICTED_INTEREST_ERRORS));
-	}
-
-	private void createHighlightersTable(Composite parent) {
-		Group tableComposite = new Group(parent, SWT.SHADOW_ETCHED_IN);
-		tableComposite.setText("Context Highlighters");
-		tableComposite.setLayout(new GridLayout(2, false));
-		tableComposite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-
-		int style = SWT.SINGLE | SWT.BORDER | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION;
-
-		table = new Table(tableComposite, style);
-
-		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1);
-		table.setLayoutData(gridData);
-		table.setLinesVisible(true);
-		table.setHeaderVisible(true);
-
-		// 1st column with Label
-		TableColumn column = new TableColumn(table, SWT.NONE, 0);
-		column.setText("Label");
-		column.setWidth(150);
-		column.addSelectionListener(new SelectionAdapter() {
-
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				tableViewer.setSorter(new HighlighterTableSorter(HighlighterTableSorter.LABEL));
-			}
-		});
-
-		// 2nd column with highlighter Description
-		column = new TableColumn(table, SWT.LEAD, 1);
-		column.setResizable(false);
-		column.setText("Color");
-		column.setWidth(100);
-		column.addSelectionListener(new SelectionAdapter() {
-
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				tableViewer.setSorter(new HighlighterTableSorter(HighlighterTableSorter.COLOR));
-			}
-		});
-
-		// 3rd column with Type
-		column = new TableColumn(table, SWT.LEAD, 2);
-		column.setResizable(false);
-		column.setText("Kind");
-		column.setWidth(80);
-		column.addSelectionListener(new SelectionAdapter() {
-
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				tableViewer.setSorter(new HighlighterTableSorter(HighlighterTableSorter.TYPE));
-			}
-		});
-
-		createAddRemoveButtons(tableComposite);
-	}
-
-	@Override
-	public boolean performOk() {
-		IPreferenceStore uiPreferenceStore = TasksUiPlugin.getDefault().getPreferenceStore();
-
-		uiPreferenceStore.setValue(ITasksUiPreferenceConstants.SHOW_TRIM, showTaskTrimButton.getSelection());
-
-		uiPreferenceStore.setValue(ITasksUiPreferenceConstants.ACTIVATE_WHEN_OPENED, activateOnOpen.getSelection());
-
-		uiPreferenceStore.setValue(ITasksUiPreferenceConstants.LOCAL_SUB_TASKS_ENABLED,
-				enableLocalSubTasksButton.getSelection());
-
-		uiPreferenceStore.setValue(ITasksUiPreferenceConstants.OVERLAYS_INCOMING_TIGHT,
-				incomingOverlaysButton.getSelection());
-		TaskListView view = TaskListView.getFromActivePerspective();
-		if (view != null) {
-			view.setSynchronizationOverlaid(incomingOverlaysButton.getSelection());
-		}
-
-		SandboxUiPlugin.getDefault().getPreferenceStore().setValue(
-				InterestInducingProblemListener.PREDICTED_INTEREST_ERRORS, enableErrorInterest.getSelection());
-
-		getPreferenceStore().setValue(SandboxUiPlugin.HIGHLIGHTER_PREFIX,
-				SandboxUiPlugin.getDefault().getHighlighterList().externalizeToString());
-		return true;
-	}
-
-	@Override
-	public boolean performCancel() {
-		enableErrorInterest.setSelection(SandboxUiPlugin.getDefault().getPreferenceStore().getBoolean(
-				InterestInducingProblemListener.PREDICTED_INTEREST_ERRORS));
-
-		String highlighters = getPreferenceStore().getString(SandboxUiPlugin.HIGHLIGHTER_PREFIX);
-		SandboxUiPlugin.getDefault().getHighlighterList().internalizeFromString(highlighters);
-
-		IPreferenceStore uiPreferenceStore = TasksUiPlugin.getDefault().getPreferenceStore();
-		activateOnOpen.setSelection(uiPreferenceStore.getBoolean(ITasksUiPreferenceConstants.ACTIVATE_WHEN_OPENED));
-		enableLocalSubTasksButton.setSelection(uiPreferenceStore.getBoolean(ITasksUiPreferenceConstants.LOCAL_SUB_TASKS_ENABLED));
-		showTaskTrimButton.setSelection(uiPreferenceStore.getBoolean(ITasksUiPreferenceConstants.SHOW_TRIM));
-
-		contentProvider = new HighlighterContentProvider();
-		tableViewer.setContentProvider(contentProvider);
-		return true;
-	}
-
-	@Override
-	public void performDefaults() {
-		super.performDefaults();
-		enableErrorInterest.setSelection(SandboxUiPlugin.getDefault().getPreferenceStore().getDefaultBoolean(
-				InterestInducingProblemListener.PREDICTED_INTEREST_ERRORS));
-
-		contentProvider = new HighlighterContentProvider();
-		tableViewer.setContentProvider(contentProvider);
-		SandboxUiPlugin.getDefault().getHighlighterList().setToDefaultList();
-	}
-
-	/**
-	 * Class HighlighterLabelProvider - Label and image provider for tableViewer
-	 */
-	private static class HighlighterLabelProvider extends LabelProvider implements ITableLabelProvider {
-
-		public HighlighterLabelProvider() {
-			// don't have any initialization to do
-		}
-
-		/**
-		 * getColumnText - returns text for label and combo box cells
-		 */
-		public String getColumnText(Object obj, int columnIndex) {
-			String result = "";
-			if (obj instanceof Highlighter) {
-				Highlighter h = (Highlighter) obj;
-				switch (columnIndex) {
-				case 0:
-					// return name for label column
-					result = h.getName();
-					break;
-				case 2:
-					// return type for type column
-					result = h.getHighlightKind();
-					break;
-				default:
-					break;
-				}
-			}
-			return result;
-		}
-
-		/**
-		 * getColumnImage - returns image for color column
-		 */
-		public Image getColumnImage(Object obj, int columnIndex) {
-			if (obj instanceof Highlighter) {
-				Highlighter h = (Highlighter) obj;
-				switch (columnIndex) {
-				case 1:
-					HighlighterImageDescriptor des;
-					if (h.isGradient()) {
-						des = new HighlighterImageDescriptor(h.getBase(), h.getHighlightColor());
-					} else {
-						des = new HighlighterImageDescriptor(h.getHighlightColor(), h.getHighlightColor());
-					}
-					return des.getImage();
-				default:
-					break;
-				}
-			}
-			return null;
-		}
-	}
-
-	/**
-	 * Class HighLighterContentProvider - content provider for table viewer
-	 */
-	private class HighlighterContentProvider implements IStructuredContentProvider {
-
-		/**
-		 * getElements - returns array of Highlighters for table
-		 */
-		public Object[] getElements(Object inputElement) {
-			return SandboxUiPlugin.getDefault().getHighlighterList().getHighlighters().toArray();
-		}
-
-		public void dispose() {
-			// don't care when we are disposed
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			// don't care when the input changes
-		}
-
-		/**
-		 * addHighlighter - notify the tableViewer to add a highlighter called when a highlighter is added to the
-		 * HighlighterList
-		 */
-		public void addHighlighter(Highlighter hl) {
-			tableViewer.add(hl);
-		}
-
-		/**
-		 * removeHighlighter - notify the tableViewer to remove a highlighter called when a highlighter is removed from
-		 * the HighlighterList
-		 */
-		public void removeHighlighter(Highlighter hl) {
-			tableViewer.remove(hl);
-		}
-
-		/**
-		 * updateHighlighter - notify the tableViewer to update a highlighter called when a highlighter property has
-		 * been changed
-		 */
-		public void updateHighlighter(Highlighter hl) {
-			tableViewer.update(hl, null);
-		}
-	}
-
-	/**
-	 * class HighlighterCellModifier - cellModifier for tableViewer handles all modification to the table
-	 */
-	private class HighlighterCellModifier implements ICellModifier {
-
-		HighlighterCellModifier() {
-			super();
-		}
-
-		public boolean canModify(Object element, String property) {
-			if (element instanceof Highlighter) {
-				if (!((Highlighter) element).getName().equals(HighlighterList.DEFAULT_HIGHLIGHTER.getName())) {
-					return true;
-				}
-			}
-			return false;
-		}
-
-		/**
-		 * getValue - returns content of the current selection
-		 */
-		public Object getValue(Object element, String property) {
-			// Find the index of the column
-			int columnIndex = Arrays.asList(columnNames).indexOf(property);
-			Object res = null;
-			if (element instanceof Highlighter) {
-				Highlighter hl = (Highlighter) element;
-				switch (columnIndex) {
-				case 0: // LABEL_COLUMN
-					res = hl.getName();
-					break;
-				case 1: // COLOR_COLUMN
-					selection = hl;
-					if (selection.getCore() != null) {
-						return selection.getCore().getRGB();
-					} else {
-						return Display.getCurrent().getSystemColor(SWT.COLOR_WIDGET_BACKGROUND).getRGB();
-					}
-				case 2: // KIND_COLUMN
-					// return index of current value
-					if (hl.isGradient()) {
-						res = new Integer(0);
-					} else if (hl.isIntersection()) {
-						res = new Integer(2);
-					} else {
-						res = new Integer(1);
-					}
-					break;
-				default:
-					return null;
-				}
-			}
-			return res;
-		}
-
-		/**
-		 * modify - modifies Highlighter with new property
-		 */
-		public void modify(Object element, String property, Object value) {
-			// Find the index of the column
-			int columnIndex = Arrays.asList(columnNames).indexOf(property);
-
-			TableItem item = (TableItem) element;
-			Highlighter hl = (Highlighter) item.getData();
-			switch (columnIndex) {
-			case 0: // LABEL_COLUMN
-				// change value of name
-				if (value instanceof String) {
-					// TableItem ti = (TableItem) element;
-					hl.setName((String) value);
-
-					// update contentprovider
-					contentProvider.updateHighlighter(hl);
-				}
-				break;
-			case 1: // COLOR_COLUMN
-				// never gets called since color dialog is used.
-				break;
-			case 2: // KIND_COLUMN
-				// sets new type
-				if (value instanceof Integer) {
-					int choice = ((Integer) value).intValue();
-					switch (choice) {
-					case 0:
-						// Gradient
-						hl.setGradient(true);
-						hl.setIntersection(false);
-						break;
-					case 1:
-						// Solid
-						hl.setGradient(false);
-						hl.setIntersection(false);
-						break;
-					case 2:
-						// Instersection
-						hl.setGradient(false);
-						hl.setIntersection(true);
-						break;
-					default:
-						break;
-					}
-					// update content provider
-					contentProvider.updateHighlighter(hl);
-				}
-			default:
-				break;
-			}
-			return;
-		}
-
-	}
-
-	/**
-	 * class HighlighterTableSorter - sort columns of table added to every column as a sorter
-	 */
-	private static class HighlighterTableSorter extends ViewerSorter {
-
-		public final static int LABEL = 1;
-
-		public final static int COLOR = 2;
-
-		public final static int TYPE = 3;
-
-		private final int criteria;
-
-		/**
-		 * set the criteria
-		 */
-		public HighlighterTableSorter(int criteria) {
-			super();
-			this.criteria = criteria;
-		}
-
-		/**
-		 * compare - invoked when column is selected calls the actual comparison method for particular criteria
-		 */
-		@Override
-		public int compare(Viewer viewer, Object o1, Object o2) {
-			Highlighter h1 = (Highlighter) o1;
-			Highlighter h2 = (Highlighter) o2;
-			switch (criteria) {
-			case LABEL:
-				return compareLabel(h1, h2);
-			case COLOR:
-				return compareImage(h1, h2);
-			case TYPE:
-				return compareType(h1, h2);
-			default:
-				return 0;
-			}
-		}
-
-		/**
-		 * compareLabel - compare by label
-		 */
-		protected int compareLabel(Highlighter h1, Highlighter h2) {
-			return h1.getName().compareTo(h2.getName());
-		}
-
-		/**
-		 * compareImage - do nothing
-		 */
-		protected int compareImage(Highlighter h1, Highlighter h2) {
-			return 0;
-		}
-
-		/**
-		 * compareType - compare by type
-		 */
-		protected int compareType(Highlighter h1, Highlighter h2) {
-			return h1.getHighlightKind().compareTo(h2.getHighlightKind());
-		}
-
-		/**
-		 * getCriteria
-		 */
-		public int getCriteria() {
-			return criteria;
-		}
-	}
-
-	private void createTableViewer() {
-
-		tableViewer = new TableViewer(table);
-		tableViewer.setUseHashlookup(true);
-		tableViewer.setColumnProperties(columnNames);
-
-		CellEditor[] editors = new CellEditor[columnNames.length];
-
-		TextCellEditor textEditor = new TextCellEditor(table);
-		((Text) textEditor.getControl()).setTextLimit(20);
-		((Text) textEditor.getControl()).setOrientation(SWT.LEFT_TO_RIGHT);
-		editors[0] = textEditor;
-
-		colorDialogEditor = new ColorCellEditor(table);
-		colorDialogEditor.addListener(this);
-		editors[1] = colorDialogEditor;
-
-		editors[2] = new ComboBoxCellEditor(table, TYPE_ARRAY, SWT.READ_ONLY);
-
-		tableViewer.setCellEditors(editors);
-		tableViewer.setCellModifier(new HighlighterCellModifier());
-	}
-
-	private void createAddRemoveButtons(Composite parent) {
-
-		Composite addRemoveComposite = new Composite(parent, SWT.LEAD);
-		addRemoveComposite.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false));
-		addRemoveComposite.setLayout(new GridLayout(2, false));
-
-		Button add = new Button(addRemoveComposite, SWT.PUSH | SWT.CENTER);
-		add.setText("Add");
-		GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
-		gridData.widthHint = 80;
-		add.setLayoutData(gridData);
-
-		add.addSelectionListener(new SelectionAdapter() {
-
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				Highlighter hl = SandboxUiPlugin.getDefault().getHighlighterList().addHighlighter();
-				contentProvider.addHighlighter(hl);
-			}
-		});
-
-		Button delete = new Button(addRemoveComposite, SWT.PUSH | SWT.CENTER);
-		delete.setText("Delete");
-		gridData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
-		gridData.widthHint = 80;
-		delete.setLayoutData(gridData);
-
-		delete.addSelectionListener(new SelectionAdapter() {
-
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				Highlighter hl = (Highlighter) ((IStructuredSelection) tableViewer.getSelection()).getFirstElement();
-				if (hl != null) {
-					SandboxUiPlugin.getDefault().getHighlighterList().removeHighlighter(hl);
-					contentProvider.removeHighlighter(hl);
-				}
-			}
-		});
-	}
-
-	/**
-	 * applyEditorValue - method called when Color selected
-	 */
-	public void applyEditorValue() {
-		Object obj = colorDialogEditor.getValue();
-		if (!colorDialogEditor.isDirty() || !colorDialogEditor.isValueValid()) {
-			return;
-		}
-
-		if (obj instanceof RGB) {
-			// create new color
-			RGB rgb = (RGB) obj;
-			Color c = new Color(Display.getCurrent(), rgb.red, rgb.green, rgb.blue);
-			if (selection != null) {
-				selection.setCore(c);
-				contentProvider.updateHighlighter(selection);
-			}
-		} else {
-			// ignore
-		}
-	}
-
-	public void cancelEditor() {
-		// don't care about this
-	}
-
-	public void editorValueChanged(boolean oldValidState, boolean newValidState) {
-		// don't care when the value is changed
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/SharedDataDirectoryManager.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/SharedDataDirectoryManager.java
deleted file mode 100644
index 2437900..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/SharedDataDirectoryManager.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-
-/**
- * @author Wesley Coelho
- * @author Mik Kersten
- */
-public class SharedDataDirectoryManager {
-
-	/**
-	 * True if the shared data directory has been temporarily set for reporting purposes
-	 */
-	private boolean sharedDataDirectoryInUse = false;
-
-	private String sharedDataDirectory = null;
-
-	/**
-	 * Sets the path of a shared data directory to be temporarily used (for reporting). Call useMainDataDirectory() to
-	 * return to using the main data directory.
-	 */
-	public void setSharedDataDirectory(String dirPath) {
-		sharedDataDirectory = dirPath;
-	}
-
-	/**
-	 * Returns the shared data directory path if one has been set. If not, the empty string is returned. Note that the
-	 * directory may not currently be in use.
-	 */
-	public String getSharedDataDirectory() {
-		if (sharedDataDirectory != null) {
-			return sharedDataDirectory;
-		} else {
-			return "";
-		}
-	}
-
-	/**
-	 * Set to true to use the shared data directory set with setSharedDataDirectory(String) Set to false to return to
-	 * using the main data directory
-	 */
-	public void setSharedDataDirectoryEnabled(boolean enable) {
-		if (enable && sharedDataDirectory == null) {
-			StatusHandler.fail(new Status(IStatus.ERROR, SandboxUiPlugin.ID_PLUGIN,
-					"Could not enable shared data directory because no shared data directory was specifed.",
-					new Exception("EnableDataDirectoryException")));
-			return;
-		}
-		sharedDataDirectoryInUse = enable;
-	}
-
-	/**
-	 * True if a shared data directory rather than the main data directory is currently in use
-	 */
-	public boolean isSharedDataDirectoryEnabled() {
-		return sharedDataDirectoryInUse;
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/ContextCapturePauseAction.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/ContextCapturePauseAction.java
deleted file mode 100644
index 083bc27..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/ContextCapturePauseAction.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.mylyn.context.core.AbstractContextListener;
-import org.eclipse.mylyn.context.core.ContextCore;
-import org.eclipse.mylyn.context.core.IInteractionContext;
-import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IActionDelegate2;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-
-/**
- * This action is not persistent, in order to avoid Mylyn not working on startup.
- * 
- * @author Mik Kersten
- */
-public class ContextCapturePauseAction extends Action implements IViewActionDelegate, IActionDelegate2 {
-
-	protected IAction initAction = null;
-
-	private final AbstractContextListener CONTEXT_LISTENER = new AbstractContextListener() {
-		@Override
-		public void contextActivated(IInteractionContext context) {
-			resume();
-			setChecked(false);
-			if (initAction != null) {
-				initAction.setChecked(false);
-			}
-		}
-	};
-
-	public ContextCapturePauseAction() {
-		ContextCore.getContextManager().addListener(CONTEXT_LISTENER);
-	}
-
-	public void init(IViewPart view) {
-		// ignore
-	}
-
-	public void init(IAction action) {
-		// ignore
-	}
-
-	public void dispose() {
-		ContextCore.getContextManager().removeListener(CONTEXT_LISTENER);
-	}
-
-	public void run(IAction action) {
-		initAction = action;
-		setChecked(!action.isChecked());
-		if (isChecked()) {
-			resume();
-		} else {
-			pause();
-		}
-	}
-
-	public void pause() {
-		ContextCore.getContextManager().setContextCapturePaused(true);
-		TaskListView.getFromActivePerspective().indicatePaused(true);
-	}
-
-	public void resume() {
-		ContextCore.getContextManager().setContextCapturePaused(false);
-		if (TaskListView.getFromActivePerspective() != null) {
-			TaskListView.getFromActivePerspective().indicatePaused(false);
-		}
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-		// ignore
-	}
-
-	public void runWithEvent(IAction action, Event event) {
-		// ignore
-
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/FindReferencesInContextAction.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/FindReferencesInContextAction.java
deleted file mode 100644
index bffe08b..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/FindReferencesInContextAction.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.actions;
-
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.search.IJavaSearchConstants;
-import org.eclipse.jdt.core.search.IJavaSearchScope;
-import org.eclipse.jdt.internal.ui.actions.SelectionConverter;
-import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
-import org.eclipse.jdt.internal.ui.search.JavaSearchQuery;
-import org.eclipse.jdt.internal.ui.search.JavaSearchScopeFactory;
-import org.eclipse.jdt.ui.search.ElementQuerySpecification;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.mylyn.internal.context.ui.ContextWorkingSetManager;
-import org.eclipse.search.ui.NewSearchUI;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.progress.IProgressService;
-
-/**
- * @author Shawn Minto
- */
-public class FindReferencesInContextAction extends Action implements IWorkbenchWindowActionDelegate {
-
-	public void run(IAction action) {
-		IEditorPart editor = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor();
-		if (editor != null && editor instanceof JavaEditor) {
-			IJavaElement[] resolved;
-			try {
-				resolved = SelectionConverter.codeResolve((JavaEditor) editor);
-				if (resolved != null && resolved.length == 1 && resolved[0] != null) {
-					IJavaElement element = resolved[0];
-
-					ContextWorkingSetManager updater = ContextWorkingSetManager.getDefault().getWorkingSetUpdater();
-					if (updater != null && updater.getWorkingSet() != null) {
-						IJavaSearchScope scope = JavaSearchScopeFactory.getInstance().createJavaSearchScope(
-								updater.getWorkingSet(), false);
-						JavaSearchQuery query = new JavaSearchQuery(new ElementQuerySpecification(element,
-								IJavaSearchConstants.REFERENCES, scope, "Mylyn Current Task Context"));
-						NewSearchUI.activateSearchResultView();
-
-						if (query.canRunInBackground()) {
-							NewSearchUI.runQueryInBackground(query);
-						} else {
-							IProgressService progressService = PlatformUI.getWorkbench().getProgressService();
-							NewSearchUI.runQueryInForeground(progressService, query);
-						}
-					}
-				}
-			} catch (JavaModelException e) {
-				// ignore search if can't resolve
-			}
-
-		}
-
-	}
-
-	public void dispose() {
-	}
-
-	public void init(IWorkbenchWindow window) {
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/LinkActiveSearchWithEditorAction.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/LinkActiveSearchWithEditorAction.java
deleted file mode 100644
index 1dfa24c..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/LinkActiveSearchWithEditorAction.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.actions;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.Preferences.PropertyChangeEvent;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.context.ui.AbstractContextUiBridge;
-import org.eclipse.mylyn.context.ui.ContextUi;
-import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
-import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
-import org.eclipse.mylyn.internal.sandbox.ui.views.ActiveSearchView;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.ISelectionService;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @author Mik Kersten
- * @since 3.0
- */
-public class LinkActiveSearchWithEditorAction extends Action {
-
-	public static final String ID = "org.eclipse.mylyn.ui.views.active.search.link";
-
-	private static final String LABEL = "Link with Editor";
-
-	private final SelectionTracker selectionTracker = new SelectionTracker();
-
-	private static LinkActiveSearchWithEditorAction INSTANCE;
-
-	public LinkActiveSearchWithEditorAction() {
-		super(LABEL, IAction.AS_CHECK_BOX);
-		INSTANCE = this;
-		setId(ID);
-		setImageDescriptor(CommonImages.LINK_EDITOR);
-		setText(LABEL);
-		setToolTipText(LABEL);
-		ContextUiPlugin.getDefault().getPreferenceStore().setDefault(ID, true);
-		update(ContextUiPlugin.getDefault().getPreferenceStore().getBoolean(ID));
-	}
-
-	@Override
-	public void run() {
-		update(isChecked());
-	}
-
-	public void update(boolean on) {
-		setChecked(on);
-		ContextUiPlugin.getDefault().getPreferenceStore().setValue(ID, on);
-		ISelectionService service = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService();
-		if (on) {
-			service.addPostSelectionListener(selectionTracker);
-		} else {
-			service.removePostSelectionListener(selectionTracker);
-		}
-	}
-
-	private static class SelectionTracker implements ISelectionListener {
-		public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-			try {
-				if (selection instanceof TextSelection && part instanceof IEditorPart) {
-					ActiveSearchView view = ActiveSearchView.getFromActivePerspective();
-					if (view == null || !view.getViewer().getControl().isVisible()) {
-						return;
-					}
-					AbstractContextUiBridge bridge = ContextUi.getUiBridgeForEditor((IEditorPart) part);
-					Object toSelect = bridge.getObjectForTextSelection((TextSelection) selection, (IEditorPart) part);
-					if (toSelect != null && view.getViewer().testFindItem(toSelect) != null) {
-						view.getViewer().setSelection(new StructuredSelection(toSelect), true);
-					}
-				}
-			} catch (Throwable t) {
-				StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
-						"Could not update package explorer", t));
-			}
-		}
-	}
-
-	public void dispose() {
-		// TODO Auto-generated method stub
-
-	}
-
-	public void runWithEvent(IAction action, Event event) {
-		// TODO Auto-generated method stub
-
-	}
-
-	public static LinkActiveSearchWithEditorAction getDefault() {
-		return INSTANCE;
-	}
-
-	public void propertyChange(PropertyChangeEvent event) {
-		// TODO Auto-generated method stub
-
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/OpenActiveSearchQuickView.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/OpenActiveSearchQuickView.java
deleted file mode 100644
index c274d04..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/OpenActiveSearchQuickView.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.actions;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.mylyn.context.core.ContextCore;
-import org.eclipse.mylyn.context.core.IInteractionElement;
-import org.eclipse.mylyn.internal.sandbox.ui.views.ActiveSearchQuickView;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @author Mik Kersten
- * @since 3.0
- */
-public class OpenActiveSearchQuickView implements IWorkbenchWindowActionDelegate {
-
-	private ActiveSearchQuickView inplaceDialog;
-
-	public void dispose() {
-		inplaceDialog = null;
-	}
-
-	public void init(IWorkbenchWindow window) {
-		// don't have anything to initialize
-	}
-
-	public void run(IAction action) {
-		IInteractionElement activeNode = ContextCore.getContextManager().getActiveElement();
-
-		Shell parent = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
-		inplaceDialog = new ActiveSearchQuickView(parent);
-		// inplaceDialog.setLastSelection(XRefUIUtils.getCurrentSelection());
-		inplaceDialog.setWorkbenchPart(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow()
-				.getActivePage()
-				.getActivePart());
-		inplaceDialog.open(activeNode);
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-		// Have selected something in the editor - therefore
-		// want to close the inplace view if haven't already done so
-		if (inplaceDialog != null && inplaceDialog.isOpen()) {
-			inplaceDialog.dispose();
-			inplaceDialog = null;
-		}
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/OpenRelatedElementsPopupDialogAction.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/OpenRelatedElementsPopupDialogAction.java
deleted file mode 100644
index 6044b75..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/OpenRelatedElementsPopupDialogAction.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.actions;
-
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.mylyn.internal.sandbox.ui.views.RelatedElementsPopupDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Class to activate the inplace ActiveSearch view, via the key binding defined in the plugin.xml.
- * 
- * @author Tracy Mew
- */
-public class OpenRelatedElementsPopupDialogAction implements IWorkbenchWindowActionDelegate {
-
-	private static RelatedElementsPopupDialog inplaceDialog;
-
-	public void dispose() {
-		inplaceDialog = null;
-	}
-
-	public void init(IWorkbenchWindow window) {
-		// ignore
-	}
-
-	public void run(IAction action) {
-		Shell parent = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
-		inplaceDialog = new RelatedElementsPopupDialog(parent, SWT.NULL);
-		inplaceDialog.open();
-		inplaceDialog.setFocus();
-
-	}
-
-	public static RelatedElementsPopupDialog getFromRelatedDialogPerspective() {
-		return inplaceDialog;
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-		// ignore
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/ShowQualifiedNamesAction.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/ShowQualifiedNamesAction.java
deleted file mode 100644
index 2dcc0a3..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/ShowQualifiedNamesAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.actions;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.mylyn.internal.context.ui.ContextUiImages;
-import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
-import org.eclipse.mylyn.internal.sandbox.ui.views.ActiveSearchView;
-
-/**
- * @author Mik Kersten
- * @since 3.0
- */
-public class ShowQualifiedNamesAction extends Action {
-
-	public static final String LABEL = "Qualify Member Names";
-
-	public static final String ID = "org.eclipse.mylyn.ui.views.elements.qualify";
-
-	private final ActiveSearchView view;
-
-	public ShowQualifiedNamesAction(ActiveSearchView view) {
-		super(LABEL, IAction.AS_CHECK_BOX);
-		this.view = view;
-		setId(ID);
-		setText(LABEL);
-		setToolTipText(LABEL);
-		setImageDescriptor(ContextUiImages.QUALIFY_NAMES);
-		update(ContextUiPlugin.getDefault().getPreferenceStore().getBoolean(ID));
-	}
-
-	public void update(boolean on) {
-		view.setQualifiedNameMode(on);
-		setChecked(on);
-		ContextUiPlugin.getDefault().getPreferenceStore().setValue(ID, on);
-	}
-
-	@Override
-	public void run() {
-		update(!ContextUiPlugin.getDefault().getPreferenceStore().getBoolean(ID));
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/SwitchTaskDataFolderAction.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/SwitchTaskDataFolderAction.java
deleted file mode 100644
index 7ffc5ce..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/SwitchTaskDataFolderAction.java
+++ /dev/null
@@ -1,180 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.sandbox.ui.actions;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
-import org.eclipse.mylyn.internal.sandbox.ui.SandboxUiPlugin;
-import org.eclipse.mylyn.internal.tasks.core.ITasksCoreConstants;
-import org.eclipse.mylyn.internal.tasks.ui.ComboSelectionDialog;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-
-/**
- * Contributes a menu item to the task list that opens a dialog box that allows the user to select a task data directory
- * to use.
- * 
- * @author Wesley Coelho
- */
-public class SwitchTaskDataFolderAction extends Action implements IViewActionDelegate {
-
-	protected final static String TITLE = "Switch Task Data Folder";
-
-	protected final static String PROMPT = "Select the folder to switch to:";
-
-	protected final static String MAIN_LOCAL_DATA_DIR = "Main Task Data Folder";
-
-	protected Shell shell = null;
-
-	public void init(IViewPart view) {
-		shell = view.getViewSite().getShell();
-	}
-
-	public void run(IAction action) {
-
-		String[] folderStrings = getFolderStrings();
-		String targetFolder = null;
-		if (folderStrings != null) {
-			targetFolder = showComboSelectionDialog(folderStrings);
-		}
-
-		if (targetFolder != null && !targetFolder.trim().equals("")) {
-			switchTaskDataFolder(targetFolder);
-		}
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-		// No action required
-	}
-
-	/**
-	 * Prompts the user for the name of the task data folder to switch to. Returns the string selected by the user or
-	 * the empty string if no valid input was given.
-	 */
-	protected String showComboSelectionDialog(String[] folderStrings) {
-		ComboSelectionDialog dialog = new ComboSelectionDialog(shell, TITLE, PROMPT, folderStrings, 0);
-		dialog.open();
-
-		return dialog.getSelectedString();
-	}
-
-	/**
-	 * Returns an array of the string names of the folders in the main data directory plus the default folder.
-	 * 
-	 * This performs validation and will alert the user of the following failures: - No shared task folder specified -
-	 * No subfolders with task data
-	 * 
-	 * Will return null on failure (Public for testing only)
-	 */
-	public String[] getFolderStrings() {
-		try {
-			List<String> folders = new ArrayList<String>();
-
-			// Check that a shared data path has been specified
-			String sharedDataPath = "<not implemented>";
-			if (sharedDataPath.trim().equals("")) {
-				MessageDialog.openError(shell, "Switch Task Folder Error",
-						"Please specify a root shared task folder in the Mylyn Reports preference page.");
-				return null;
-			}
-
-			// Check that the directory is accessible
-			File rootDir = new File(sharedDataPath);
-			if (!rootDir.exists() || !rootDir.isDirectory()) {
-				MessageDialog.openError(shell, "Switch Task Folder Error",
-						"The root folder specified in the Mylyn Reports preference page could not be found.");
-				return null;
-			}
-
-			// Add the option to switch back to the main local data directory
-			if (SandboxUiPlugin.getDefault().getSharedDataDirectoryManager().isSharedDataDirectoryEnabled()) {
-				folders.add(MAIN_LOCAL_DATA_DIR);
-			}
-
-			// Add the list of folders with task data
-			File[] files = rootDir.listFiles();
-			for (File currFile : files) {
-				if (currFile.isDirectory() && containsTaskData(currFile)
-						&& !TasksUiPlugin.getDefault().getDataDirectory().endsWith(currFile.getName())) {
-					folders.add(currFile.getName());
-				}
-			}
-
-			// Check that at least one folder was found to switch to
-			if (!(folders.size() > 0)) {
-				MessageDialog.openError(shell, "Switch Task Folder Error",
-						"No task data folders were found in the root folder specified in the Mylyn Reports preference page.");
-				return null;
-			}
-
-			String[] folderStrings = new String[folders.size()];
-			for (int i = 0; i < folderStrings.length; i++) {
-				folderStrings[i] = folders.get(i);
-			}
-
-			return folderStrings;
-		} catch (RuntimeException e) {
-			StatusHandler.fail(new Status(IStatus.ERROR, SandboxUiPlugin.ID_PLUGIN,
-					"Could not create list of task folders to switch to.", e));
-			return null;
-		}
-	}
-
-	/**
-	 * Returns true if the specified folder contains task data. Currently just checks if it contains a task list file.
-	 */
-	protected boolean containsTaskData(File folder) {
-		File[] files = folder.listFiles();
-		for (File currFile : files) {
-			if (currFile.isFile() && currFile.getName().equals(ITasksCoreConstants.DEFAULT_TASK_LIST_FILE)) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-	/**
-	 * Switches the current data folder to the specified folder. Specify only the folder name and not the full path.
-	 * 
-	 * Note: This currently always resumes capture when returning to the main data directory (and suspends capture when
-	 * switching to a shared directory).
-	 * 
-	 * (Public for testing only)
-	 */
-	public void switchTaskDataFolder(String targetFolder) {
-
-		TasksUiPlugin.getTaskListManager().saveTaskList();
-
-		if (targetFolder.equals(MAIN_LOCAL_DATA_DIR)) {
-			SandboxUiPlugin.getDefault().getSharedDataDirectoryManager().setSharedDataDirectoryEnabled(false);
-			(new ContextCapturePauseAction()).resume();
-			// TODO: don't use actions directly
-			ContextCorePlugin.getContextManager().setActivationHistorySuppressed(false);
-		} else {
-			String dataDirPath = "<not implemented>";
-			SandboxUiPlugin.getDefault().getSharedDataDirectoryManager().setSharedDataDirectory(dataDirPath);
-			SandboxUiPlugin.getDefault().getSharedDataDirectoryManager().setSharedDataDirectoryEnabled(true);
-			(new ContextCapturePauseAction()).pause();
-			ContextCorePlugin.getContextManager().setActivationHistorySuppressed(true);
-		}
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/ToggleRelationshipProviderAction.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/ToggleRelationshipProviderAction.java
deleted file mode 100644
index 7c4819b..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/actions/ToggleRelationshipProviderAction.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-/*
- * Created on Jul 27, 2004
- */
-package org.eclipse.mylyn.internal.sandbox.ui.actions;
-
-import java.util.Set;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IMenuCreator;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.context.core.IDegreeOfSeparation;
-import org.eclipse.mylyn.context.ui.AbstractContextUiBridge;
-import org.eclipse.mylyn.internal.context.core.AbstractRelationProvider;
-import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
-import org.eclipse.mylyn.internal.sandbox.ui.views.ActiveSearchView;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.MenuItem;
-
-/**
- * @author Mik Kersten
- * @since 3.0
- */
-public class ToggleRelationshipProviderAction extends Action implements IMenuCreator {
-
-	private static final String LABEL_DEGREE_OF_SEPARATION = "Degree of Separation:";
-
-	public static final String ID = "org.eclipse.mylyn.ui.actions.active.search.toggle";
-
-	private final ActiveSearchView view;
-
-	private final Set<AbstractRelationProvider> providers;
-
-	private Menu dropDownMenu = null;
-
-	public ToggleRelationshipProviderAction(ActiveSearchView view, Set<AbstractRelationProvider> providers,
-			AbstractContextUiBridge uiBridge) {
-		super();
-		this.providers = providers;
-		this.view = view;
-		setImageDescriptor(ContextUiPlugin.getDefault().getActiveSearchIcon(uiBridge));
-		setId(ID);
-		setText(ContextUiPlugin.getDefault().getActiveSearchLabel(uiBridge));
-		setToolTipText(ContextUiPlugin.getDefault().getActiveSearchLabel(uiBridge));
-		setMenuCreator(this);
-
-		degreeOfSeparation = getCurrentProvider().getCurrentDegreeOfSeparation();
-
-		if (degreeOfSeparation > 0) {
-			run();
-		}
-	}
-
-	// HACK: this should be specified
-	private AbstractRelationProvider getCurrentProvider() {
-		return providers.iterator().next();
-	}
-
-	@Override
-	public void run() {
-		view.updateDegreesOfSeparation(providers, degreeOfSeparation);
-	}
-
-	public void dispose() {
-		if (dropDownMenu != null) {
-			dropDownMenu.dispose();
-			dropDownMenu = null;
-		}
-	}
-
-	public Menu getMenu(Control parent) {
-		if (dropDownMenu != null) {
-			dropDownMenu.dispose();
-		}
-		dropDownMenu = new Menu(parent);
-		addActionsToMenu();
-		return dropDownMenu;
-	}
-
-	public Menu getMenu(Menu parent) {
-		if (dropDownMenu != null) {
-			dropDownMenu.dispose();
-		}
-		dropDownMenu = new Menu(parent);
-		addActionsToMenu();
-		return dropDownMenu;
-	}
-
-	private int degreeOfSeparation = 0;
-
-	public void addActionsToMenu() {
-		// HACK: if there are multiple providers, all store the same current DOS
-		degreeOfSeparation = getCurrentProvider().getCurrentDegreeOfSeparation();
-
-		MenuItem menuItem = new MenuItem(dropDownMenu, SWT.NONE);
-		menuItem.setText(LABEL_DEGREE_OF_SEPARATION);
-		// menuItem.setEnabled(false);
-
-		new MenuItem(dropDownMenu, SWT.SEPARATOR);
-
-		for (IDegreeOfSeparation separation : getCurrentProvider().getDegreesOfSeparation()) {
-
-			Action degreeOfSeparationSelectionAction = new Action(
-					separation.getDegree() + ": " + separation.getLabel(), AS_CHECK_BOX) {
-				@Override
-				public void run() {
-					try {
-						degreeOfSeparation = Integer.parseInt(getId());
-						ActiveSearchView.getFromActivePerspective().updateDegreesOfSeparation(providers,
-								degreeOfSeparation);
-					} catch (NumberFormatException e) {
-						StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
-								"Invalid degree of separation", e));
-					}
-				}
-			};
-			degreeOfSeparationSelectionAction.setId("" + separation.getDegree());
-			degreeOfSeparationSelectionAction.setEnabled(true);
-			degreeOfSeparationSelectionAction.setToolTipText(separation.getLabel());
-			ActionContributionItem item = new ActionContributionItem(degreeOfSeparationSelectionAction);
-			item.fill(dropDownMenu, -1);
-
-			degreeOfSeparationSelectionAction.setChecked(false);
-			if (degreeOfSeparation == 0 && separation.getDegree() == 0) {
-				degreeOfSeparationSelectionAction.setChecked(true);
-			} else if (degreeOfSeparation != 0 && separation.getDegree() != 0
-					&& degreeOfSeparation == separation.getDegree()) {
-				degreeOfSeparationSelectionAction.setChecked(true);
-			}
-		}
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/commands/ContextCapturePauseHandler.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/commands/ContextCapturePauseHandler.java
deleted file mode 100644
index b691a24..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/commands/ContextCapturePauseHandler.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.commands;
-
-import java.util.Map;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.mylyn.context.core.AbstractContextListener;
-import org.eclipse.mylyn.context.core.ContextCore;
-import org.eclipse.mylyn.context.core.IInteractionContext;
-import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.commands.ICommandService;
-import org.eclipse.ui.commands.IElementUpdater;
-import org.eclipse.ui.menus.UIElement;
-
-/**
- * @author Eugene Kuleshov
- * @since 3.0
- */
-// TODO remove dependency on tasks ui
-public class ContextCapturePauseHandler extends AbstractHandler //
-		implements IElementUpdater {
-
-	private final AbstractContextListener CONTEXT_LISTENER = new AbstractContextListener() {
-
-		@Override
-		public void contextActivated(IInteractionContext context) {
-			resume();
-		}
-
-		@Override
-		public void contextDeactivated(IInteractionContext context) {
-			resume();
-		}
-	};
-
-	public ContextCapturePauseHandler() {
-		ContextCore.getContextManager().addListener(CONTEXT_LISTENER);
-	}
-
-	@Override
-	public void dispose() {
-		ContextCore.getContextManager().removeListener(CONTEXT_LISTENER);
-		super.dispose();
-	}
-
-	public Object execute(ExecutionEvent e) throws ExecutionException {
-		if (ContextCore.getContextManager().isContextCapturePaused()) {
-			resume();
-		} else {
-			pause();
-		}
-		return null;
-	}
-
-	public void resume() {
-		ContextCore.getContextManager().setContextCapturePaused(false);
-		if (TaskListView.getFromActivePerspective() != null) {
-			TaskListView.getFromActivePerspective().indicatePaused(false);
-		}
-		refreshCommands();
-	}
-
-	public void pause() {
-		ContextCore.getContextManager().setContextCapturePaused(true);
-		TaskListView.getFromActivePerspective().indicatePaused(true);
-
-		refreshCommands();
-	}
-
-	private void refreshCommands() {
-		ICommandService service = (ICommandService) PlatformUI.getWorkbench().getService(ICommandService.class);
-		if (service != null) {
-			service.refreshElements("org.eclipse.mylyn.tasks.ui.command.previousTask", null);
-			service.refreshElements("org.eclipse.mylyn.ui.context.capture.pause.command", null);
-		}
-	}
-
-	@SuppressWarnings("unchecked")
-	public void updateElement(UIElement element, Map parameters) {
-		element.setChecked(ContextCore.getContextManager().isContextCapturePaused());
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/highlighters/ColorCoordinatesChange.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/highlighters/ColorCoordinatesChange.java
deleted file mode 100644
index 558e688..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/highlighters/ColorCoordinatesChange.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.highlighters;
-
-class ColorCoordinatesChange {
-	/**
-	 * Change RGB colors to HSV colors
-	 * 
-	 * @param R
-	 *            The red component of the color (0 - 255)
-	 * @param G
-	 *            The green component of the color (0 - 255)
-	 * @param B
-	 *            The blue component of the color (0 - 255)
-	 * @return The HSV colors in an array of doubles. This means that position 0 = H, position 1 = S, and position 2 = V
-	 */
-	public static double[] RGBToHSV(double R, double G, double B) {
-		double minVal = Math.min(Math.min(R, G), B);
-		double V = Math.max(Math.max(R, G), B);
-
-		double Delta = V - minVal;
-
-		double S = 0;
-		double H = 0;
-
-		// Calculate saturation: saturation is 0 if r, g and b are all 0
-		if (V == 0) {
-			S = 0.0;
-		} else {
-			S = Delta / V;
-		}
-
-		if (S == 0) {
-			H = 0; // Achromatic: When s = 0, h is undefined but who cares
-		} else // Chromatic
-		{
-			if (R == V) {
-				H = 60.0 * (G - B) / Delta;
-			} else {
-				if (G == V) {
-					H = 120.0 + 60.0 * (B - R) / Delta;
-				} else {
-					// between magenta and cyan
-					H = 240.0 + 60.0 * (R - G) / Delta;
-				}
-
-			}
-		}
-
-		if (H < 0) {
-			H = H + 360.0;
-		}
-		// return a list of values as an rgb object would not be sensible
-		return new double[] { H, S, V / 255.0 };
-	}
-
-	/**
-	 * Change HSV colors to RGB colors
-	 * 
-	 * @param H
-	 *            The hue of the color (0 - 360)
-	 * @param S
-	 *            The saturation of the color (0 - 1)
-	 * @param V
-	 *            The value of the color (0 - 1)
-	 * @return The RGB colors in an array of ints. This means that position 0 = R, position 1 = G, and position 2 = B
-	 */
-	public static int[] HSVtoRGB(double H, double S, double V) {
-		double R = 0, G = 0, B = 0;
-		double hTemp, f, p, q, t;
-		int i;
-		if (S == 0) // color is on black-and-white center line
-		{
-			R = V; // achromatic: shades of gray
-			G = V; // supposedly invalid for h=0 but who cares
-			B = V;
-		} else // chromatic color
-		{
-			if (H == 360.0) {
-				hTemp = 0.0;
-			} else {
-				hTemp = H;
-			}
-
-			hTemp = hTemp / 60.0; // h is now in [0,6)
-			i = new Double(hTemp).intValue(); // largest integer <= h
-			f = hTemp - i; // fractional part of h
-
-			p = V * (1.0 - S);
-			q = V * (1.0 - (S * f));
-			t = V * (1.0 - (S * (1.0 - f)));
-
-			switch (i) {
-			case 0:
-				R = V;
-				G = t;
-				B = p;
-				break;
-			case 1:
-				R = q;
-				G = V;
-				B = p;
-				break;
-			case 2:
-				R = p;
-				G = V;
-				B = t;
-				break;
-			case 3:
-				R = p;
-				G = q;
-				B = V;
-				break;
-			case 4:
-				R = t;
-				G = p;
-				B = V;
-				break;
-			case 5:
-				R = V;
-				G = p;
-				B = q;
-				break;
-			}
-		}
-		return new int[] { new Double(R * 255).intValue(), new Double(G * 255).intValue(),
-				new Double(B * 255).intValue() };
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/highlighters/EditHighlightersAction.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/highlighters/EditHighlightersAction.java
deleted file mode 100644
index a9422a6..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/highlighters/EditHighlightersAction.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.highlighters;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.preference.PreferenceDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.mylyn.internal.context.ui.ContextUiImages;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.PreferencesUtil;
-
-/**
- * @author Mik Kersten
- */
-public class EditHighlightersAction extends Action implements IViewActionDelegate {
-
-	private static final String ID_PREFS_HIGHLIGHTERS = "org.eclipse.mylyn.sandbox.ui.preferences";
-
-	public static final String ID = "org.eclipse.mylyn.tasklist.actions.context.highlighters.edit";
-
-	public EditHighlightersAction() {
-		setText("Edit Highlighters...");
-		setToolTipText("Edit Highlighters...");
-		setId(ID);
-		setImageDescriptor(ContextUiImages.COLOR_PALETTE);
-	}
-
-	@Override
-	public void run() {
-		PreferenceDialog dlg = PreferencesUtil.createPreferenceDialogOn(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow()
-				.getShell(), ID_PREFS_HIGHLIGHTERS, new String[] { ID_PREFS_HIGHLIGHTERS }, null);
-		dlg.open();
-	}
-
-	public void init(IViewPart view) {
-
-	}
-
-	public void run(IAction action) {
-		run();
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/highlighters/Highlighter.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/highlighters/Highlighter.java
deleted file mode 100644
index 8606704..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/highlighters/Highlighter.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.highlighters;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.context.core.IInteractionElement;
-import org.eclipse.mylyn.internal.context.ui.ColorMap;
-import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * @author Mik Kersten
- */
-public class Highlighter {
-
-	private static final String LABEL_SOLID = "Solid";
-
-	private static final String LABEL_INTERSECTION = "Intersection";
-
-	private static final String LABEL_GRADIENT = "Gradient";
-
-	private static final int NUM_LEVELS = 17;
-
-	private static final String VAL_DEFAULT = "";
-
-	private final List<Color> gradients = new ArrayList<Color>();
-
-	private String name;
-
-	private Color core;
-
-	private Color highlightColor;
-
-	private boolean isGradient;
-
-	private boolean isIntersection;
-
-	public boolean isIntersection() {
-		return isIntersection;
-	}
-
-	public void setIntersection(boolean isIntersection) {
-		this.isIntersection = isIntersection;
-	}
-
-	public Highlighter(String name, Color coreColor, boolean isGradient) {
-		this.name = name;
-		this.core = coreColor;
-		this.isGradient = isGradient;
-		if (coreColor != null) {
-			initializeHighlight();
-			initializeGradients();
-		}
-	}
-
-	public Highlighter(String attributes) {
-		if (initializeFromString(attributes)) {
-			initializeHighlight();
-			initializeGradients();
-		}
-	}
-
-	public void dispose() {
-		for (Color color : gradients) {
-			color.dispose();
-		}
-	}
-
-	public Color getHighlightColor() {
-		return highlightColor;
-	}
-
-	public Color getHighlight(IInteractionElement info, boolean isLandmark) {
-		if (info.getInterest().getValue() > 0) {
-			if (isGradient) {
-				return mapDoiToElevation(info);
-			} else {
-				return highlightColor;
-			}
-		} else {
-			return ColorMap.COLOR_WHITE;
-		}
-	}
-
-	public Color mapDoiToElevation(IInteractionElement element) {
-		if (element == null) {
-			return ColorMap.COLOR_WHITE;
-		}
-		if (element.getInterest().getValue() < 0) {
-			return highlightColor;
-		}
-
-		int step = 2;
-		Color color = ColorMap.COLOR_WHITE;
-		for (Iterator<Color> it = gradients.iterator(); it.hasNext();) {
-			color = it.next();
-			if (element.getInterest().getValue() < step) {
-				return color;
-			}
-			step += 2;
-		}
-		return color;
-	}
-
-	private void initializeHighlight() {
-		try {
-			int redStep = (int) Math.ceil((core.getRed() + 2 * ColorMap.COLOR_WHITE.getRed()) / 3);
-			int greenStep = (int) Math.ceil((core.getGreen() + 2 * ColorMap.COLOR_WHITE.getGreen()) / 3);
-			int blueStep = (int) Math.ceil((core.getBlue() + 2 * ColorMap.COLOR_WHITE.getBlue()) / 3);
-
-			highlightColor = new Color(Display.getDefault(), redStep, greenStep, blueStep);
-		} catch (Throwable t) {
-			StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN, "Highlighter initialization failed",
-					t));
-		}
-	}
-
-	private void initializeGradients() {
-		try {
-			int redStep = (int) Math.ceil((highlightColor.getRed() - ColorMap.COLOR_WHITE.getRed()) / NUM_LEVELS);
-			int greenStep = (int) Math.ceil((highlightColor.getGreen() - ColorMap.COLOR_WHITE.getGreen()) / NUM_LEVELS);
-			int blueStep = (int) Math.ceil((highlightColor.getBlue() - ColorMap.COLOR_WHITE.getBlue()) / NUM_LEVELS);
-
-			int OFFSET = 1;
-			int red = ColorMap.COLOR_WHITE.getRed() + redStep * OFFSET;
-			int green = ColorMap.COLOR_WHITE.getGreen() + greenStep * OFFSET;
-			int blue = ColorMap.COLOR_WHITE.getBlue() + blueStep * OFFSET;
-			for (int i = 0; i < NUM_LEVELS - OFFSET; i++) {
-				if (red > 255) {
-					red = 255; // TODO: fix this mess
-				}
-				if (green > 255) {
-					green = 255;
-				}
-				if (blue > 255) {
-					blue = 255;
-				}
-				if (red < 0) {
-					red = 0;
-				}
-				if (green < 0) {
-					green = 0;
-				}
-				if (blue < 0) {
-					blue = 0;
-				}
-				gradients.add(new Color(Display.getDefault(), red, green, blue));
-				red += redStep;
-				blue += blueStep;
-				green += greenStep;
-			}
-		} catch (Throwable t) {
-			StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN, "Gradients initialization failed", t));
-		}
-	}
-
-	@Override
-	public String toString() {
-		return name;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public void setName(String name) {
-		this.name = name;
-	}
-
-	public Color getBase() {
-		return ColorMap.COLOR_WHITE;
-	}
-
-//	public void setBase(Color base) {
-//		ColorMap.COLOR_WHITE = base;
-//	}
-
-	public static Color blend(List<Highlighter> highlighters, IInteractionElement info, boolean isLandmark) {
-		int red = 0;
-		int green = 0;
-		int blue = 0;
-		int num = highlighters.size();
-		for (Highlighter highlighter : highlighters) {
-			Color color = highlighter.getHighlight(info, isLandmark);
-			red += color.getRed();
-			green += color.getGreen();
-			blue += color.getBlue();
-		}
-		return new Color(Display.getDefault(), red / num, green / num, blue / num);
-	}
-
-	public boolean isGradient() {
-		return isGradient;
-	}
-
-	public void setGradient(boolean isGradient) {
-		this.isGradient = isGradient;
-	}
-
-	public Color getCore() {
-		return core;
-	}
-
-	public void setCore(Color core) {
-		this.core = core;
-		this.initializeGradients();
-		this.initializeHighlight();
-	}
-
-	public String getHighlightKind() {
-		String res = VAL_DEFAULT;
-		if (this.isGradient) {
-			res = LABEL_GRADIENT;
-		} else if (this.isIntersection) {
-			res = LABEL_INTERSECTION;
-		} else {
-			res = LABEL_SOLID;
-		}
-		return res;
-	}
-
-	public String externalizeToString() {
-		if (core == null) {
-			return VAL_DEFAULT;
-		} else {
-			Integer r = new Integer(this.core.getRed());
-			Integer g = new Integer(this.core.getGreen());
-			Integer b = new Integer(this.core.getBlue());
-			return r.toString() + ";" + g.toString() + ";" + b.toString() + ";" + this.name + ";"
-					+ this.getHighlightKind();
-		}
-	}
-
-	private boolean initializeFromString(String attributes) {
-		if (!VAL_DEFAULT.equals(attributes)) {
-			String[] data = attributes.split(";");
-			Integer r = new Integer(data[0]);
-			Integer g = new Integer(data[1]);
-			Integer b = new Integer(data[2]);
-			this.core = new Color(Display.getCurrent(), r.intValue(), g.intValue(), b.intValue());
-			this.name = data[3];
-			if (data[4].compareTo(LABEL_GRADIENT) == 0) {
-				this.isGradient = true;
-				this.isIntersection = false;
-			} else if (data[4].compareTo(LABEL_INTERSECTION) == 0) {
-				this.isGradient = false;
-				this.isIntersection = true;
-			} else {
-				this.isGradient = false;
-				this.isIntersection = false;
-			}
-			return true;
-		} else {
-			this.name = HighlighterList.DEFAULT_HIGHLIGHTER.getName();
-			this.core = HighlighterList.DEFAULT_HIGHLIGHTER.getCore();
-			return false;
-		}
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/highlighters/HighlighterList.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/highlighters/HighlighterList.java
deleted file mode 100644
index 89cdb05..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/highlighters/HighlighterList.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.sandbox.ui.highlighters;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.mylyn.internal.context.ui.ColorMap;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-
-/**
- * List class that wraps List of highlighters
- * 
- */
-public class HighlighterList {
-
-	public static final Highlighter DEFAULT_HIGHLIGHTER = new Highlighter("<none>", ColorMap.DEFAULT, false);
-
-	private final List<Highlighter> highlighters;
-
-	public HighlighterList() {
-		highlighters = new ArrayList<Highlighter>();
-	}
-
-	public HighlighterList(List<Highlighter> hlist) {
-		highlighters = new ArrayList<Highlighter>();
-		for (Highlighter highlighter : hlist) {
-			highlighters.add(highlighter);
-		}
-	}
-
-	public HighlighterList(String attributes) {
-		highlighters = new ArrayList<Highlighter>();
-		this.internalizeFromString(attributes);
-	}
-
-	public void dispose() {
-		for (Highlighter highlighter : highlighters) {
-			highlighter.dispose();
-		}
-	}
-
-	public void setToDefaultList() {
-		this.highlighters.clear();
-		highlighters.add(DEFAULT_HIGHLIGHTER);
-		highlighters.add(new Highlighter("yellow", ColorMap.HIGHLIGHTER_YELLOW, false));
-		highlighters.add(new Highlighter("rose", ColorMap.PANTONE_PASTEL_ROSE, false));
-		highlighters.add(new Highlighter("purple", ColorMap.PANTONE_PASTEL_PURPLE, false));
-		highlighters.add(new Highlighter("blue", ColorMap.PANTONE_PASTEL_BLUE, false));
-		highlighters.add(new Highlighter("green", ColorMap.PANTONE_PASTERL_GREEN, false));
-		highlighters.add(new Highlighter("blue gradient", ColorMap.HIGLIGHTER_BLUE_GRADIENT, true));
-		highlighters.add(new Highlighter("orange gradient", ColorMap.HIGHLIGHTER_ORANGE_GRADIENT, true));
-
-		Highlighter intersectionHighlighter = new Highlighter("intersection", ColorMap.HIGLIGHTER_RED_INTERSECTION,
-				false);
-		intersectionHighlighter.setIntersection(true);
-//		ContextUiPlugin.getDefault().setIntersectionHighlighter(intersectionHighlighter);
-	}
-
-	public void add(Highlighter hl) {
-		this.highlighters.add(hl);
-	}
-
-	/**
-	 * @return Returns the list.
-	 */
-	public List<Highlighter> getHighlighters() {
-		return highlighters;
-	}
-
-	public Highlighter addHighlighter() {
-//		ColorMap colorMap = new ColorMap();
-		Highlighter hl = new Highlighter("new", ColorMap.GRAY_DARK, false);
-		this.highlighters.add(hl);
-		return hl;
-	}
-
-	public Highlighter getHighlighter(String name) {
-		for (Highlighter highlighter : highlighters) {
-			if (highlighter.getName().equals(name)) {
-				return highlighter;
-			}
-		}
-		return null;
-	}
-
-	public void removeHighlighter(Highlighter hl) {
-		this.highlighters.remove(hl);
-	}
-
-	public String externalizeToString() {
-		// Add an initial flag so that we know if the highlighterlist has been
-		// save before.
-		// This is only used when Mylyn is first launched with eclipse.
-		// if the preference store returns a null string, then we would
-		// initialize
-		// the default highlighter.
-		// but if this flag is in place, we will know if highlighterlist has
-		// ever been saved
-		String result = "flag:";
-		for (Highlighter highlighter : highlighters) {
-			result += highlighter.externalizeToString() + ":";
-		}
-		return result;
-	}
-
-	public void internalizeFromString(String attributes) {
-		if (attributes != null) {
-			this.highlighters.clear();
-			String[] data = attributes.split(":");
-			// skip the flag
-			//
-			for (int i = 1; i < data.length; i++) {
-				Highlighter hl = new Highlighter(data[i]);
-				this.highlighters.add(hl);
-			}
-		}
-	}
-
-	public void updateHighlighterWithGamma(ColorMap.GammaSetting prev, ColorMap.GammaSetting curr) {
-		int res = ColorMap.GammaSetting.compare(prev, curr);
-		if (res < 0) {
-			lightenAllColors(Math.abs(res));
-
-		} else if (res > 0) {
-			darkenAllColors(Math.abs(res));
-		}
-	}
-
-	private void darkenAllColors(int degree) {
-		for (Highlighter hl : highlighters) {
-			Color c = hl.getCore();
-			double[] HSV = ColorCoordinatesChange.RGBToHSV(c.getRed(), c.getGreen(), c.getBlue());
-			if (degree != 2) {
-				HSV[1] *= 2;
-			} else {
-				HSV[1] *= 3;
-			}
-			if (HSV[1] > 1) {
-				HSV[1] = 1;
-			}
-
-			int[] newRGB = ColorCoordinatesChange.HSVtoRGB(HSV[0], HSV[1], HSV[2]);
-			Color rgb = new Color(Display.getDefault(), newRGB[0], newRGB[1], newRGB[2]);
-			hl.setCore(rgb);
-		}
-	}
-
-	private void lightenAllColors(int degree) {
-		for (Highlighter hl : highlighters) {
-			Color c = hl.getCore();
-			double[] HSV = ColorCoordinatesChange.RGBToHSV(c.getRed(), c.getGreen(), c.getBlue());
-			if (degree != 2) {
-				HSV[1] *= 0.5;
-			} else {
-				HSV[1] *= 0.333;
-			}
-			int[] newRGB = ColorCoordinatesChange.HSVtoRGB(HSV[0], HSV[1], HSV[2]);
-			Color rgb = new Color(Display.getDefault(), newRGB[0], newRGB[1], newRGB[2]);
-			hl.setCore(rgb);
-		}
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/highlighters/TaskHighlighter.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/highlighters/TaskHighlighter.java
deleted file mode 100644
index 724cdb5..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/highlighters/TaskHighlighter.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.highlighters;
-
-import org.eclipse.jface.viewers.IDecoration;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ILightweightLabelDecorator;
-import org.eclipse.mylyn.internal.sandbox.ui.SandboxUiPlugin;
-import org.eclipse.mylyn.internal.tasks.ui.ITaskHighlighter;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.swt.graphics.Color;
-
-/**
- * Decorator that provides a background color for tasks.
- * 
- * NOTE: Setting the background color through a ILightweightLabelDecorator does not seem to work on the task list.
- * 
- * TODO remove ITaskHighlighter and replace by ILightweightLabelDecorator
- * 
- * @author Steffen Pingel
- */
-public class TaskHighlighter implements ILightweightLabelDecorator, ITaskHighlighter {
-
-	public TaskHighlighter() {
-		TasksUiPlugin.getDefault().setHighlighter(this);
-	}
-
-	public void addListener(ILabelProviderListener listener) {
-		// ignore
-	}
-
-	public void decorate(Object element, IDecoration decoration) {
-		if (element instanceof ITask) {
-			ITask task = (ITask) element;
-			Highlighter highlighter = SandboxUiPlugin.getDefault().getHighlighterForContextId(
-					"" + task.getHandleIdentifier());
-			if (highlighter != null) {
-				decoration.setBackgroundColor(highlighter.getHighlightColor());
-			}
-		}
-	}
-
-	public void dispose() {
-		// ignore
-	}
-
-	public Color getHighlightColor(ITask task) {
-		Highlighter highlighter = SandboxUiPlugin.getDefault().getHighlighterForContextId(
-				"" + task.getHandleIdentifier());
-		if (highlighter != null) {
-			return highlighter.getHighlightColor();
-		}
-		return null;
-	}
-
-	public boolean isLabelProperty(Object element, String property) {
-		// ignore
-		return false;
-	}
-
-	public void removeListener(ILabelProviderListener listener) {
-		// ignore
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/highlighters/TaskHighlighterMenuContributor.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/highlighters/TaskHighlighterMenuContributor.java
deleted file mode 100644
index d6eba15..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/highlighters/TaskHighlighterMenuContributor.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.highlighters;
-
-import java.util.List;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.mylyn.internal.context.ui.HighlighterImageDescriptor;
-import org.eclipse.mylyn.internal.sandbox.ui.SandboxUiPlugin;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.ui.IDynamicSubMenuContributor;
-import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
-import org.eclipse.mylyn.tasks.core.IRepositoryElement;
-import org.eclipse.mylyn.tasks.core.ITask;
-
-/**
- * @author Mik Kersten
- */
-public class TaskHighlighterMenuContributor implements IDynamicSubMenuContributor {
-
-	private static final String CHOOSE_HIGHLIGHTER = "Highlighter";
-
-	public MenuManager getSubMenuManager(final List<IRepositoryElement> selectedElements) {
-		final MenuManager subMenuManager = new MenuManager(CHOOSE_HIGHLIGHTER);
-		for (final Highlighter highlighter : SandboxUiPlugin.getDefault().getHighlighters()) {
-			Action action = new Action() {
-				@Override
-				public void run() {
-					AbstractTask task = null;
-					for (IRepositoryElement selectedElement : selectedElements) {
-						if (selectedElement instanceof ITask) {
-							task = (AbstractTask) selectedElement;
-						}
-						if (task != null) {
-							SandboxUiPlugin.getDefault().setHighlighterMapping(task.getHandleIdentifier(),
-									highlighter.getName());
-							TasksUiInternal.getTaskList().notifyElementChanged(task);
-						}
-					}
-				}
-			};
-			if (highlighter.isGradient()) {
-				action.setImageDescriptor(new HighlighterImageDescriptor(highlighter.getBase(),
-						highlighter.getHighlightColor()));
-			} else {
-				action.setImageDescriptor(new HighlighterImageDescriptor(highlighter.getHighlightColor(),
-						highlighter.getHighlightColor()));
-			}
-			action.setText(highlighter.toString());
-			subMenuManager.add(action);
-		}
-		subMenuManager.add(new Separator());
-		subMenuManager.add(new EditHighlightersAction());
-		return subMenuManager;
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/ActivityReportAction.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/ActivityReportAction.java
deleted file mode 100644
index 2f45515..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/ActivityReportAction.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.planner;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.mylyn.tasks.ui.TasksUiImages;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @author Rob Elves
- */
-public class ActivityReportAction extends Action {
-
-	private static final String LABEL = "Activity Report";
-
-	public static final String ID = "org.eclipse.mylyn.tasklist.actions.report.activity";
-
-	public ActivityReportAction() {
-		super(LABEL);
-		setId(ID);
-		setText(LABEL);
-		setToolTipText(LABEL);
-		setImageDescriptor(TasksUiImages.TASKS_VIEW);
-	}
-
-	@Override
-	public void run() {
-		TaskActivityWizard wizard = new TaskActivityWizard();
-
-		Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
-		if (shell != null && !shell.isDisposed()) {
-
-			WizardDialog dialog = new WizardDialog(shell, wizard);
-			dialog.setBlockOnOpen(true);
-			dialog.open();
-
-		} else {
-			// ignore
-		}
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/CompletedTaskCollector.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/CompletedTaskCollector.java
deleted file mode 100644
index 243daf1..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/CompletedTaskCollector.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.planner;
-
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-
-/**
- * @author Ken Sueda
- */
-public class CompletedTaskCollector implements ITaskCollector {
-
-	private final Map<String, AbstractTask> completedTasks = new HashMap<String, AbstractTask>();
-
-	private final Date periodStartDate;
-
-	private final Date periodEndDate;
-
-	public CompletedTaskCollector(Date periodStartDate, Date periodEndDate) {
-		this.periodStartDate = periodStartDate;
-		this.periodEndDate = periodEndDate;
-
-	}
-
-	public String getLabel() {
-		return "Completed Tasks";
-	}
-
-	public void consumeTask(AbstractTask task) {
-		if (task.isCompleted() && task.getCompletionDate() != null
-				&& task.getCompletionDate().compareTo(periodStartDate) >= 0
-				&& task.getCompletionDate().compareTo(periodEndDate) <= 0
-				&& !completedTasks.containsKey(task.getHandleIdentifier())) {
-			completedTasks.put(task.getHandleIdentifier(), task);
-		}
-	}
-
-	public Set<AbstractTask> getTasks() {
-		Set<AbstractTask> tasks = new HashSet<AbstractTask>();
-		tasks.addAll(completedTasks.values());
-		return tasks;
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/ITaskCollector.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/ITaskCollector.java
deleted file mode 100644
index d25864d..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/ITaskCollector.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.planner;
-
-import java.util.Set;
-
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-
-/**
- * @author Ken Sueda
- */
-public interface ITaskCollector {
-
-	public abstract void consumeTask(AbstractTask task);
-
-	public abstract Set<AbstractTask> getTasks();
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/ITaskPlannerContentProvider.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/ITaskPlannerContentProvider.java
deleted file mode 100644
index a1b34cb..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/ITaskPlannerContentProvider.java
+++ /dev/null
@@ -1,19 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.planner;
-
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.tasks.core.ITask;
-
-public interface ITaskPlannerContentProvider {
-
-	public void removeTask(ITask task);
-
-	public void addTask(AbstractTask task);
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/InProgressTaskCollector.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/InProgressTaskCollector.java
deleted file mode 100644
index 1d6bd96..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/InProgressTaskCollector.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.sandbox.ui.planner;
-
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.tasks.core.ITask;
-
-/**
- * Collects tasks that are not complete but have been worked on during the specified date range.
- * 
- * @author Wesley Coelho (Adapted from CompletedTaskCollector by Key Sueda)
- * @author Mik Kersten
- */
-public class InProgressTaskCollector implements ITaskCollector {
-
-	private final Map<String, AbstractTask> inProgressTasks = new HashMap<String, AbstractTask>();
-
-	private final Date periodStartDate;
-
-	private final Date periodEndDate;
-
-	protected static boolean hasActivity(ITask task, Date startDate, Date endDate) {
-		Calendar startCal = Calendar.getInstance();
-		startCal.setTime(startDate);
-
-		Calendar endCal = Calendar.getInstance();
-		endCal.setTime(endDate);
-
-		return TasksUiPlugin.getTaskActivityManager().getElapsedTime(task, startCal, endCal) > 0;
-//		IInteractionContext interactionContext = ContextCorePlugin.getContextManager().loadContext(
-//				task.getHandleIdentifier());
-//		if (interactionContext != null) {
-//			List<InteractionEvent> events = interactionContext.getInteractionHistory();
-//			if (events.size() > 0) {
-//				InteractionEvent latestEvent = events.get(events.size() - 1);
-//				if (latestEvent.getDate().compareTo(startDate) > 0) {
-//					return true;
-//				}
-//			}
-//		}
-//		return false;
-	}
-
-	public InProgressTaskCollector(Date periodStartDate, Date periodEndDate) {
-		this.periodStartDate = periodStartDate;
-		this.periodEndDate = periodEndDate;
-	}
-
-	public String getLabel() {
-		return "Tasks in Progress";
-	}
-
-	public void consumeTask(AbstractTask task) {
-		if (!task.isCompleted() && hasActivity(task, periodStartDate, periodEndDate)
-				&& !inProgressTasks.containsKey(task.getHandleIdentifier())) {
-			inProgressTasks.put(task.getHandleIdentifier(), task);
-		}
-	}
-
-	public Set<AbstractTask> getTasks() {
-		Set<AbstractTask> tasks = new HashSet<AbstractTask>();
-		tasks.addAll(inProgressTasks.values());
-		return tasks;
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/OpenTaskEditorAction.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/OpenTaskEditorAction.java
deleted file mode 100644
index 6c236f3..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/OpenTaskEditorAction.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.planner;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
-
-/**
- * @author Mik Kersten
- * @author Ken Sueda
- * @author Rob Elves
- */
-public class OpenTaskEditorAction extends Action {
-
-	public static final String ID = "org.eclipse.mylyn.taskplannereditor.actions.open";
-
-	private final TreeViewer viewer;
-
-	/**
-	 * @param view
-	 */
-	public OpenTaskEditorAction(TreeViewer view) {
-		this.viewer = view;
-		setText("Open");
-		setToolTipText("Open Element");
-		setId(ID);
-	}
-
-	@Override
-	public void run() {
-		ISelection selection = viewer.getSelection();
-		Object object = ((IStructuredSelection) selection).getFirstElement();
-		if (object instanceof ITask) {
-			TasksUiUtil.openTask((ITask) object);
-		}
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/PlannedTasksContentProvider.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/PlannedTasksContentProvider.java
deleted file mode 100644
index 2043727..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/PlannedTasksContentProvider.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.planner;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.mylyn.tasks.core.ITaskContainer;
-
-/**
- * @author Rob Elves
- * @author Ken Sueda
- */
-public class PlannedTasksContentProvider implements ITreeContentProvider, ITaskPlannerContentProvider {
-
-	TaskActivityEditorInput editorInput;
-
-	public PlannedTasksContentProvider(TaskActivityEditorInput editorInput) {
-		this.editorInput = editorInput;
-	}
-
-	public Object[] getElements(Object inputElement) {
-		return editorInput.getCategories().toArray();
-	}
-
-	public void dispose() {
-	}
-
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-	}
-
-	public void addTask(AbstractTask task) {
-		editorInput.addPlannedTask(task);
-	}
-
-	public void removeTask(ITask task) {
-		editorInput.removePlannedTask(task);
-	}
-
-	public Object[] getChildren(Object parentElement) {
-		Set<ITask> plannedChildren = new HashSet<ITask>();
-		if (parentElement instanceof ITaskContainer) {
-			ITaskContainer parent = (ITaskContainer) parentElement;
-			plannedChildren.addAll(editorInput.getPlannedTasks());
-			plannedChildren.retainAll(parent.getChildren());
-		}
-		return plannedChildren.toArray();
-	}
-
-	public Object getParent(Object element) {
-		// ignore
-		return null;
-	}
-
-	public boolean hasChildren(Object element) {
-		return (getChildren(element).length > 0);
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/ReminderCellEditor.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/ReminderCellEditor.java
deleted file mode 100644
index 6a9b638..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/ReminderCellEditor.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.sandbox.ui.planner;
-
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.Locale;
-
-import org.eclipse.jface.viewers.DialogCellEditor;
-import org.eclipse.jface.window.Window;
-import org.eclipse.mylyn.internal.provisional.commons.ui.DatePicker;
-import org.eclipse.mylyn.internal.provisional.commons.ui.DateSelectionDialog;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/**
- * @author Ken Sueda
- * @author Mik Kersten
- * @author Rob Elves
- */
-public class ReminderCellEditor extends DialogCellEditor {
-
-	private Date reminderDate;
-
-	private DateSelectionDialog dialog;
-
-	private final String formatString = "dd-MMM-yyyy";
-
-	private final SimpleDateFormat format = new SimpleDateFormat(formatString, Locale.ENGLISH);
-
-	public ReminderCellEditor(Composite parent) {
-		super(parent, SWT.NONE);
-	}
-
-	@Override
-	protected Object openDialogBox(Control cellEditorWindow) {
-		Calendar initialCalendar = null;
-		String value = (String) super.getValue();
-
-		if (value != null) {
-			try {
-				Date tempDate = format.parse(value);
-				if (tempDate != null) {
-					initialCalendar = Calendar.getInstance();
-					initialCalendar.setTime(tempDate);
-				}
-			} catch (ParseException e) {
-				// ignore
-			}
-		}
-		Calendar newCalendar = Calendar.getInstance();
-		if (initialCalendar != null) {
-			newCalendar.setTime(initialCalendar.getTime());
-		}
-
-		dialog = new DateSelectionDialog(cellEditorWindow.getShell(), newCalendar, DatePicker.TITLE_DIALOG, true,
-				TasksUiPlugin.getDefault().getPreferenceStore().getInt(ITasksUiPreferenceConstants.PLANNING_ENDHOUR));
-		int dialogResponse = dialog.open();
-
-		if (dialogResponse == Window.CANCEL) {
-			if (initialCalendar != null) {
-				reminderDate = initialCalendar.getTime();
-			} else {
-				reminderDate = null;
-			}
-		} else {
-			reminderDate = dialog.getDate();
-		}
-
-		String result = null;
-		if (reminderDate != null) {
-			result = format.format(reminderDate);
-		}
-		return result;
-	}
-
-	public Date getReminderDate() {
-		return reminderDate;
-	}
-
-	@Override
-	protected void doSetFocus() {
-		reminderDate = null;
-		super.doSetFocus();
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/RemoveTaskAction.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/RemoveTaskAction.java
deleted file mode 100644
index 7008328..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/RemoveTaskAction.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.planner;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
-import org.eclipse.mylyn.tasks.core.ITask;
-
-/**
- * @author Rob Elves
- */
-public class RemoveTaskAction extends Action {
-	public static final String ID = "org.eclipse.mylyn.taskplannereditor.actions.remove";
-
-	private final TreeViewer viewer;
-
-	public RemoveTaskAction(TreeViewer view) {
-		this.viewer = view;
-		setText("Remove Selected");
-		setId(ID);
-		setImageDescriptor(CommonImages.REMOVE);
-	}
-
-	@Override
-	public void run() {
-		for (Object object : ((IStructuredSelection) viewer.getSelection()).toList()) {
-			if (object instanceof ITask) {
-				ITask task = (ITask) object;
-				((ITaskPlannerContentProvider) (viewer.getContentProvider())).removeTask(task);
-			}
-		}
-		viewer.refresh();
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskActivityContentProvider.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskActivityContentProvider.java
deleted file mode 100644
index 4c49d9b..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskActivityContentProvider.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.planner;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.mylyn.tasks.core.ITaskContainer;
-
-/**
- * @author Rob Elves
- */
-public class TaskActivityContentProvider implements ITreeContentProvider, ITaskPlannerContentProvider {
-
-	private final TaskActivityEditorInput editorInput;
-
-	public TaskActivityContentProvider(TaskActivityEditorInput editorInput) {
-		this.editorInput = editorInput;
-	}
-
-	public Object[] getElements(Object inputElement) {
-		return editorInput.getCategories().toArray();
-//		List<AbstractTask> allTasks = new ArrayList<AbstractTask>();
-//		allTasks.addAll(editorInput.getCompletedTasks());
-//		allTasks.addAll(editorInput.getInProgressTasks());
-//		return allTasks.toArray();
-	}
-
-	public void removeTask(ITask task) {
-		editorInput.removeCompletedTask(task);
-		editorInput.removeInProgressTask(task);
-	}
-
-	public void addTask(AbstractTask task) {
-		// ignore
-	}
-
-	public Object[] getChildren(Object parentElement) {
-		Set<ITask> result = new HashSet<ITask>();
-		if (parentElement instanceof ITaskContainer) {
-			ITaskContainer parent = (ITaskContainer) parentElement;
-			Set<ITask> completedChildren = new HashSet<ITask>();
-			completedChildren.addAll(editorInput.getCompletedTasks());
-			completedChildren.retainAll(parent.getChildren());
-			result.addAll(completedChildren);
-
-			Set<ITask> inProgressChildren = new HashSet<ITask>();
-			inProgressChildren.addAll(editorInput.getInProgressTasks());
-			inProgressChildren.retainAll(parent.getChildren());
-			result.addAll(inProgressChildren);
-		}
-		return result.toArray();
-	}
-
-	public Object getParent(Object element) {
-		// ignore
-		return null;
-	}
-
-	public boolean hasChildren(Object element) {
-		return (getChildren(element).length > 0);
-	}
-
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		// ignore
-	}
-
-	public void dispose() {
-		// ignore
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskActivityEditorInput.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskActivityEditorInput.java
deleted file mode 100644
index 09678aa..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskActivityEditorInput.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.planner;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
-import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
-import org.eclipse.mylyn.internal.tasks.core.TaskList;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IPersistableElement;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.progress.IProgressService;
-
-/**
- * @author Ken Sueda
- * @author Mik Kersten
- */
-public class TaskActivityEditorInput implements IEditorInput {
-
-	private static final String TASK_ACTIVITY_REPORT = "Task Activity Report";
-
-	private Set<AbstractTask> completedTasks = new HashSet<AbstractTask>();
-
-	private Set<AbstractTask> inProgressTasks = new HashSet<AbstractTask>();
-
-	private final Set<AbstractTask> plannedTasks = new HashSet<AbstractTask>();
-
-	private TaskReportGenerator taskReportGenerator = null;
-
-	private Date reportStartDate = null;
-
-	private Date reportEndDate = null;
-
-	private final Set<AbstractTaskContainer> categories;
-
-	public TaskActivityEditorInput(Date reportStartDate, Date reportEndDate,
-			Set<AbstractTaskContainer> chosenCategories, TaskList tlist) {
-		this.reportStartDate = reportStartDate;
-		this.reportEndDate = reportEndDate;
-		this.categories = chosenCategories;
-		taskReportGenerator = new TaskReportGenerator(tlist, chosenCategories);
-
-		ITaskCollector completedTaskCollector = new CompletedTaskCollector(reportStartDate, reportEndDate);
-		taskReportGenerator.addCollector(completedTaskCollector);
-
-		ITaskCollector inProgressTaskCollector = new InProgressTaskCollector(reportStartDate, reportEndDate);
-		taskReportGenerator.addCollector(inProgressTaskCollector);
-
-		try {
-			// TODO consider using IProgressService.busyCursorWhile(): bug 210710
-			IProgressService service = PlatformUI.getWorkbench().getProgressService();
-			service.run(false, true, taskReportGenerator);
-			while (!taskReportGenerator.isFinished()) {
-				Thread.sleep(500);
-			}
-		} catch (InvocationTargetException e) {
-			// operation was canceled
-		} catch (InterruptedException e) {
-			StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not generate report", e));
-		}
-
-		completedTasks = completedTaskCollector.getTasks();
-		inProgressTasks = inProgressTaskCollector.getTasks();
-
-		plannedTasks.addAll(TasksUiPlugin.getTaskActivityManager().getActiveTasks(
-				TaskActivityUtil.getCurrentWeek().getStartDate(), TaskActivityUtil.getCurrentWeek().getEndDate()));
-		plannedTasks.addAll(TasksUiPlugin.getTaskActivityManager().getAllScheduledTasksInternal());
-
-		//plannedTasks = new HashSet<ITask>();
-	}
-
-	public boolean exists() {
-		return true;
-	}
-
-	public ImageDescriptor getImageDescriptor() {
-		return null;
-	}
-
-	public String getName() {
-		return TASK_ACTIVITY_REPORT;
-	}
-
-	public IPersistableElement getPersistable() {
-		return null;
-	}
-
-	public String getToolTipText() {
-		return "Task Planner";
-	}
-
-	@SuppressWarnings("unchecked")
-	public Object getAdapter(Class adapter) {
-		return null;
-	}
-
-	public Set<AbstractTask> getCompletedTasks() {
-		return completedTasks;
-	}
-
-	public Set<AbstractTask> getInProgressTasks() {
-		return inProgressTasks;
-	}
-
-	public Set<AbstractTask> getPlannedTasks() {
-		return plannedTasks;
-	}
-
-	public long getTotalTimeSpentOnCompletedTasks() {
-		long duration = 0;
-		for (ITask t : completedTasks) {
-			duration += TasksUiPlugin.getTaskActivityManager().getElapsedTime(t);
-		}
-		return duration;
-	}
-
-	public long getTotalTimeSpentOnInProgressTasks() {
-		long duration = 0;
-		for (ITask t : inProgressTasks) {
-			duration += TasksUiPlugin.getTaskActivityManager().getElapsedTime(t);
-		}
-		return duration;
-	}
-
-	public TaskReportGenerator getReportGenerator() {
-		return taskReportGenerator;
-	}
-
-	public boolean createdDuringReportPeriod(ITask task) {
-		Date creationDate = task.getCreationDate();
-		if (creationDate != null) {
-			return creationDate.compareTo(reportStartDate) > 0;
-		} else {
-			return false;
-		}
-	}
-
-	public int getTotalTimeEstimated() {
-		int duration = 0;
-		for (AbstractTask task : inProgressTasks) {
-			duration += task.getEstimatedTimeHours();
-		}
-		return duration;
-	}
-
-	public void removeCompletedTask(ITask task) {
-		completedTasks.remove(task);
-	}
-
-	public void removeInProgressTask(ITask task) {
-		inProgressTasks.remove(task);
-	}
-
-	public void addPlannedTask(AbstractTask task) {
-		plannedTasks.add(task);
-	}
-
-	public void removePlannedTask(ITask task) {
-		plannedTasks.remove(task);
-	}
-
-	public int getPlannedEstimate() {
-		int estimated = 0;
-		for (AbstractTask task : plannedTasks) {
-			estimated += task.getEstimatedTimeHours();
-		}
-		return estimated;
-	}
-
-	public Date getReportStartDate() {
-		return reportStartDate;
-	}
-
-	public Date getReportEndDate() {
-		return reportEndDate;
-	}
-
-	public Set<AbstractTaskContainer> getCategories() {
-		return categories;
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskActivityEditorPart.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskActivityEditorPart.java
deleted file mode 100644
index e3cd11e..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskActivityEditorPart.java
+++ /dev/null
@@ -1,697 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.planner;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.mylyn.commons.core.DateUtil;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.core.DateRange;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.SashForm;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.forms.widgets.TableWrapLayout;
-import org.eclipse.ui.part.EditorPart;
-
-/**
- * 
- * Note: Some methods have been generalized to remove duplicate code but the design still isn't right (long parameter
- * lists, inflexible table creation). Needs refactoring. (Planned tasks section is currently disabled but should also
- * use the new common methods)
- * 
- * @author Mik Kersten
- * @author Ken Sueda (original prototype)
- * @author Wesley Coelho (added tasks in progress section, refactored-out similar code)
- * @author Mik Kersten (rewrite)
- */
-public class TaskActivityEditorPart extends EditorPart {
-
-	private static final String LABEL_PLANNED_ACTIVITY = "Planned Activity";
-
-	private static final String LABEL_DIALOG = "Summary";
-
-	private static final String LABEL_PAST_ACTIVITY = "Past Activity";
-
-	private TaskActivityEditorInput editorInput = null;
-
-	private final String[] activityColumnNames = new String[] { " ", " !", "Description", "Elapsed", "Estimated",
-			"Created", "Completed" };
-
-	private final int[] activityColumnWidths = new int[] { 100, 30, 200, 70, 70, 90, 90 };
-
-	private final int[] activitySortConstants = new int[] { TaskActivitySorter.ICON, TaskActivitySorter.PRIORITY,
-			TaskActivitySorter.DESCRIPTION, TaskActivitySorter.DURATION, TaskActivitySorter.ESTIMATED,
-			TaskActivitySorter.CREATION_DATE, TaskActivitySorter.COMPLETED_DATE };
-
-//	private String[] planColumnNames = new String[] { " ", " !", "Description", "Elapsed", "Estimated", "Reminder" };
-//
-//	private int[] planSortConstants = new int[] { TaskPlanSorter.ICON, TaskPlanSorter.PRIORITY,
-//			TaskPlanSorter.DESCRIPTION, TaskPlanSorter.DURATION, TaskPlanSorter.ESTIMATED, TaskPlanSorter.REMINDER };
-//
-//	private int[] planColumnWidths = new int[] { 100, 30, 200, 90, 90, 100 };
-
-	private static final String LABEL_ESTIMATED = "Total estimated time: ";
-
-	private static final String NO_TIME_ELAPSED = "&nbsp;";
-
-	private static final String BLANK_CELL = "&nbsp;";
-
-	private Label totalEstimatedHoursLabel;
-
-	private Label numberCompleted;
-
-	private Label totalTimeOnCompleted;
-
-	private Label numberInProgress;
-
-	private Label totalTimeOnIncomplete;
-
-	private Label totalEstimatedTime;
-
-	private Label totalTime;
-
-	private TaskActivityContentProvider activityContentProvider;
-
-	private PlannedTasksContentProvider planContentProvider;
-
-	@Override
-	public void doSave(IProgressMonitor monitor) {
-	}
-
-	@Override
-	public void doSaveAs() {
-	}
-
-	@Override
-	public void init(IEditorSite site, IEditorInput input) throws PartInitException {
-		setSite(site);
-		setInput(input);
-		editorInput = (TaskActivityEditorInput) input;
-		setPartName(editorInput.getName());
-		setTitleToolTip(editorInput.getToolTipText());
-	}
-
-	@Override
-	public boolean isDirty() {
-		return false;
-	}
-
-	@Override
-	public boolean isSaveAsAllowed() {
-		return false;
-	}
-
-	@Override
-	public void createPartControl(Composite parent) {
-		FormToolkit toolkit = new FormToolkit(parent.getDisplay());
-		ScrolledForm sform = toolkit.createScrolledForm(parent);
-		Composite editorComposite = sform.getBody();
-
-		editorComposite.setLayout(new GridLayout());
-		GridData gridData = new GridData();
-		gridData.horizontalAlignment = GridData.FILL_BOTH;
-		gridData.grabExcessHorizontalSpace = true;
-		gridData.grabExcessVerticalSpace = true;
-		editorComposite.setLayoutData(gridData);
-
-		createSummarySection(editorComposite, toolkit, editorInput.getReportStartDate(), editorInput.getReportEndDate());
-		String label = LABEL_PAST_ACTIVITY;
-
-		List<ITask> allTasks = new ArrayList<ITask>();
-		allTasks.addAll(editorInput.getCompletedTasks());
-		allTasks.addAll(editorInput.getInProgressTasks());
-
-		SashForm sashForm = new SashForm(editorComposite, SWT.VERTICAL);
-
-		sashForm.setLayout(new GridLayout());
-		sashForm.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		activityContentProvider = new TaskActivityContentProvider(editorInput);
-
-		final TreeViewer activityViewer = createTableSection(sashForm, toolkit, label, activityColumnNames,
-				activityColumnWidths, activitySortConstants);
-		activityViewer.setContentProvider(activityContentProvider);
-		activityViewer.setLabelProvider(new TaskPlannerLabelProvider(activityViewer, editorInput.getReportStartDate(),
-				editorInput.getReportEndDate()));
-		setSorters(activityColumnNames, activitySortConstants, activityViewer.getTree(), activityViewer, false);
-		activityViewer.setInput(editorInput);
-		activityViewer.addSelectionChangedListener(new ISelectionChangedListener() {
-			public void selectionChanged(SelectionChangedEvent event) {
-				updateLabels();
-			}
-		});
-
-		MenuManager activityContextMenuMgr = new MenuManager("#ActivityPlannerPopupMenu");
-		activityContextMenuMgr.setRemoveAllWhenShown(true);
-		activityContextMenuMgr.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				TaskActivityEditorPart.this.fillContextMenu(activityViewer, manager);
-
-			}
-		});
-		Menu menu = activityContextMenuMgr.createContextMenu(activityViewer.getControl());
-		activityViewer.getControl().setMenu(menu);
-		getSite().registerContextMenu(activityContextMenuMgr, activityViewer);
-
-		planContentProvider = new PlannedTasksContentProvider(editorInput);
-		final TreeViewer planViewer = createTableSection(sashForm, toolkit, LABEL_PLANNED_ACTIVITY,
-				activityColumnNames, activityColumnWidths, activitySortConstants);
-		planViewer.setContentProvider(planContentProvider);
-		planViewer.setLabelProvider(new TaskPlannerLabelProvider(planViewer, editorInput.getReportStartDate(),
-				editorInput.getReportEndDate()));
-		// planViewer.setLabelProvider(new TaskPlanLabelProvider());
-		// createPlanCellEditorListener(planViewer.getTable(), planViewer);
-		// planViewer.setCellModifier(new PlannedTasksCellModifier(planViewer));
-		// initDrop(planViewer, planContentProvider);
-		setSorters(activityColumnNames, activitySortConstants, planViewer.getTree(), planViewer, true);
-		planViewer.setInput(editorInput);
-
-		// planViewer.addSelectionChangedListener(new
-		// ISelectionChangedListener() {
-		// public void selectionChanged(SelectionChangedEvent event) {
-		// updateLabels();
-		// }
-		// });
-
-		// MenuManager planContextMenuMgr = new
-		// MenuManager("#PlanPlannerPopupMenu");
-		// planContextMenuMgr.setRemoveAllWhenShown(true);
-		// planContextMenuMgr.addMenuListener(new IMenuListener() {
-		// public void menuAboutToShow(IMenuManager manager) {
-		// TaskActivityEditorPart.this.fillContextMenu(planViewer, manager);
-		// }
-		// });
-		// Menu planMenu =
-		// planContextMenuMgr.createContextMenu(planViewer.getControl());
-		// planViewer.getControl().setMenu(planMenu);
-		// getSite().registerContextMenu(planContextMenuMgr, planViewer);
-
-		totalEstimatedHoursLabel = toolkit.createLabel(editorComposite, LABEL_ESTIMATED + "0 hours  ", SWT.NULL);
-		createButtons(editorComposite, toolkit, planViewer, planContentProvider);
-		updateLabels();
-	}
-
-	private void fillContextMenu(TreeViewer viewer, IMenuManager manager) {
-		if (!viewer.getSelection().isEmpty()) {
-			manager.add(new OpenTaskEditorAction(viewer));
-			manager.add(new RemoveTaskAction(viewer));
-			manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-		} else {
-			manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-		}
-	}
-
-	@Override
-	public void setFocus() {
-	}
-
-	private void createSummarySection(Composite parent, FormToolkit toolkit, Date startDate, Date endDate) {
-		Section summarySection = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR);
-		summarySection.setText(LABEL_DIALOG);
-		summarySection.setLayout(new GridLayout());
-		summarySection.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		Composite summaryContainer = toolkit.createComposite(summarySection);
-		summarySection.setClient(summaryContainer);
-		TableWrapLayout layout = new TableWrapLayout();
-		layout.numColumns = 2;
-		summaryContainer.setLayout(layout);
-
-		String formatString = "yyyy-MM-dd, h:mm a";
-		SimpleDateFormat formater = new SimpleDateFormat(formatString, Locale.ENGLISH);
-
-		if (startDate != null) {
-			String dateLabel = "Date start: " + formater.format(startDate);
-			toolkit.createLabel(summaryContainer, dateLabel, SWT.NULL);
-		}
-
-		if (endDate != null) {
-			String dateLabel = "Date end: " + formater.format(endDate);
-			toolkit.createLabel(summaryContainer, dateLabel, SWT.NULL);
-		}
-
-		String numComplete = "Number completed: " + editorInput.getCompletedTasks().size();
-		numberCompleted = toolkit.createLabel(summaryContainer, numComplete, SWT.NULL);
-//		numberCompleted.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
-
-		String totalCompletedTaskTime = "Total time on completed: "
-				+ DateUtil.getFormattedDuration(editorInput.getTotalTimeSpentOnCompletedTasks(), false);
-		totalTimeOnCompleted = toolkit.createLabel(summaryContainer, totalCompletedTaskTime, SWT.NULL);
-//		totalTimeOnCompleted.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
-
-		String numInProgress = "Number in progress: " + editorInput.getInProgressTasks().size();
-		numberInProgress = toolkit.createLabel(summaryContainer, numInProgress, SWT.NULL);
-//		numberInProgress.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
-
-		String totalInProgressTaskTime = "Total time on incomplete: "
-				+ DateUtil.getFormattedDuration(editorInput.getTotalTimeSpentOnInProgressTasks(), false);
-		totalTimeOnIncomplete = toolkit.createLabel(summaryContainer, totalInProgressTaskTime, SWT.NULL);
-//		totalTimeOnIncomplete.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
-
-		String spacer = "        ";
-		String totalEstimated = "Total estimated time: " + editorInput.getTotalTimeEstimated() + " hours" + spacer;
-		totalEstimatedTime = toolkit.createLabel(summaryContainer, totalEstimated, SWT.NULL);
-//		totalEstimatedTime.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
-
-		String grandTotalTime = "Total time: " + getTotalTime();
-		totalTime = toolkit.createLabel(summaryContainer, grandTotalTime, SWT.NULL);
-//		totalTime.setForeground(toolkit.getColors().getColor(FormColors.TITLE));
-
-	}
-
-	private void updateSummarySection() {
-		String numComplete = "Number completed: " + editorInput.getCompletedTasks().size();
-		numberCompleted.setText(numComplete);
-
-		String totalCompletedTaskTime = "Total time on completed: "
-				+ DateUtil.getFormattedDuration(editorInput.getTotalTimeSpentOnCompletedTasks(), false);
-		totalTimeOnCompleted.setText(totalCompletedTaskTime);
-
-		String numInProgress = "Number in progress: " + editorInput.getInProgressTasks().size();
-		numberInProgress.setText(numInProgress);
-
-		String totalInProgressTaskTime = "Total time on incomplete: "
-				+ DateUtil.getFormattedDuration(editorInput.getTotalTimeSpentOnInProgressTasks(), false);
-		totalTimeOnIncomplete.setText(totalInProgressTaskTime);
-
-		String spacer = "        ";
-		String totalEstimated = "Total estimated time: " + editorInput.getTotalTimeEstimated() + " hours" + spacer;
-		totalEstimatedTime.setText(totalEstimated);
-
-		String grandTotalTime = "Total time: " + getTotalTime();
-		totalTime.setText(grandTotalTime);
-
-	}
-
-	// private void createPlanCellEditorListener(final Table planTable, final
-	// TableViewer planTableViewer) {
-	// CellEditor[] editors = new CellEditor[planColumnNames.length + 1];
-	// final ComboBoxCellEditor estimateEditor = new
-	// ComboBoxCellEditor(planTable, TaskListManager.ESTIMATE_TIMES,
-	// SWT.READ_ONLY);
-	// final ReminderCellEditor reminderEditor = new
-	// ReminderCellEditor(planTable);
-	// editors[0] = null; // not used
-	// editors[1] = null;// not used
-	// editors[2] = null;// not used
-	// editors[3] = null;// not used
-	// editors[4] = estimateEditor;
-	// editors[5] = reminderEditor;
-	// reminderEditor.addListener(new ICellEditorListener() {
-	// public void applyEditorValue() {
-	// Object selection = ((IStructuredSelection)
-	// planTableViewer.getSelection()).getFirstElement();
-	// if (selection instanceof ITask) {
-	// ((ITask) selection).setReminderDate(reminderEditor.getReminderDate());
-	// planTableViewer.refresh();
-	// }
-	// }
-	//
-	// public void cancelEditor() {
-	// }
-	//
-	// public void editorValueChanged(boolean oldValidState, boolean
-	// newValidState) {
-	// }
-	//
-	// });
-	// estimateEditor.addListener(new ICellEditorListener() {
-	// public void applyEditorValue() {
-	// Object selection = ((IStructuredSelection)
-	// planTableViewer.getSelection()).getFirstElement();
-	// if (selection instanceof ITask) {
-	// ITask task = (ITask) selection;
-	// int estimate = (Integer) estimateEditor.getValue();
-	// if (estimate == -1) {
-	// estimate = 0;
-	// }
-	// task.setEstimatedTimeHours(estimate);
-	// updateLabels();
-	// planTableViewer.refresh();
-	// }
-	// }
-	//
-	// public void cancelEditor() {
-	// }
-	//
-	// public void editorValueChanged(boolean oldValidState, boolean
-	// newValidState) {
-	// }
-	//
-	// });
-	// planTableViewer.setCellEditors(editors);
-	// }
-
-	private String getTotalTime() {
-		return DateUtil.getFormattedDuration(editorInput.getTotalTimeSpentOnCompletedTasks()
-				+ editorInput.getTotalTimeSpentOnInProgressTasks(), false);
-	}
-
-	private TreeViewer createTableSection(Composite parent, FormToolkit toolkit, String title, String[] columnNames,
-			int[] columnWidths, int[] sortConstants) {
-		Section tableSection = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR); // |
-		// ExpandableComposite.TWISTIE
-		tableSection.setText(title);
-		// tableSection.setExpanded(true);
-		tableSection.marginHeight = 8;
-		tableSection.setLayout(new GridLayout());
-		tableSection.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		Composite detailContainer = toolkit.createComposite(tableSection);
-		tableSection.setClient(detailContainer);
-		detailContainer.setLayout(new GridLayout());
-		detailContainer.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		return createTable(detailContainer, toolkit, columnNames, columnWidths, sortConstants);
-	}
-
-	private TreeViewer createTable(Composite parent, FormToolkit toolkit, String[] columnNames, int[] columnWidths,
-			int[] sortConstants) {
-		int style = SWT.MULTI | SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION | SWT.HIDE_SELECTION;
-		Tree tree = toolkit.createTree(parent, style);
-
-		tree.setLayout(new GridLayout());
-		GridData tableGridData = new GridData(GridData.FILL_BOTH);
-		tableGridData.heightHint = 100;
-		tree.setLayoutData(tableGridData);
-		tree.setLinesVisible(true);
-		tree.setHeaderVisible(true);
-		tree.setEnabled(true);
-
-		for (int i = 0; i < columnNames.length; i++) {
-			TreeColumn column = new TreeColumn(tree, SWT.LEFT, i);
-			column.setText(columnNames[i]);
-			column.setWidth(columnWidths[i]);
-		}
-
-		TreeViewer treeViewer = new TreeViewer(tree);
-		treeViewer.setUseHashlookup(true);
-		treeViewer.setColumnProperties(columnNames);
-
-		final OpenTaskEditorAction openAction = new OpenTaskEditorAction(treeViewer);
-		treeViewer.addDoubleClickListener(new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				openAction.run();
-			}
-		});
-
-		return treeViewer;
-	}
-
-	private void setSorters(String[] columnNames, int[] sortConstants, Tree tree, TreeViewer treeViewer, boolean plan) {
-		for (int i = 0; i < columnNames.length; i++) {
-			TreeColumn column = tree.getColumn(i);
-			addColumnSelectionListener(treeViewer, column, sortConstants[i], plan);
-		}
-	}
-
-	private void addColumnSelectionListener(final TreeViewer tableViewer, TreeColumn column, final int sorterConstant,
-			final boolean plan) {
-		column.addSelectionListener(new SelectionAdapter() {
-
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-//				if (plan) { // TODO: bad modularity
-//					tableViewer.setSorter(new TaskPlanSorter(sorterConstant));
-//				} else {
-//					tableViewer.setSorter(new TaskActivitySorter(sorterConstant));
-//				}
-			}
-		});
-	}
-
-	private void createButtons(Composite parent, FormToolkit toolkit, final TreeViewer viewer,
-			final PlannedTasksContentProvider contentProvider) {
-		Composite container = new Composite(parent, SWT.NULL);
-		container.setBackground(parent.getBackground());
-		GridLayout layout = new GridLayout();
-		container.setLayout(layout);
-		layout.numColumns = 3;
-
-		// Button addIncomplete = toolkit.createButton(container, "Add
-		// Incomplete", SWT.PUSH | SWT.CENTER);
-		// addIncomplete.addSelectionListener(new SelectionAdapter() {
-		// @Override
-		// public void widgetSelected(SelectionEvent e) {
-		// Set<ITask> incompleteTasks = editorInput.getInProgressTasks();
-		// for (ITask task : incompleteTasks) {
-		// contentProvider.addTask(task);
-		// viewer.refresh();
-		// updateLabels();
-		// }
-		// }
-		// });
-		//
-		// Button addToCategory = toolkit.createButton(container, "Add Planned
-		// to Category...", SWT.PUSH | SWT.CENTER);
-		// addToCategory.addSelectionListener(new SelectionAdapter() {
-		// @Override
-		// public void widgetSelected(SelectionEvent e) {
-		// addPlannedTasksToCategory(contentProvider);
-		// }
-		// });
-
-		Button exportToHTML = toolkit.createButton(container, "Export to HTML...", SWT.PUSH | SWT.CENTER);
-		exportToHTML.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				exportToHtml();
-			}
-		});
-	}
-
-	private void updateLabels() {
-		totalEstimatedHoursLabel.setText(LABEL_ESTIMATED + editorInput.getPlannedEstimate() + " hours");
-		updateSummarySection();
-	}
-
-	private void exportToHtml() {
-		File outputFile;
-		try {
-			FileDialog dialog = new FileDialog(getSite().getWorkbenchWindow().getShell());
-			dialog.setText("Specify a file name");
-			dialog.setFilterExtensions(new String[] { "*.html", "*.*" });
-			String filename = dialog.open();
-
-			if (filename == null || filename.equals("")) {
-				return;
-			}
-
-			if (!filename.endsWith(".html")) {
-				filename += ".html";
-			}
-			outputFile = new File(filename);
-			// outputStream = new FileOutputStream(outputFile, true);
-			BufferedWriter writer = new BufferedWriter(new FileWriter(outputFile));
-			writer.write("<html><head></head><body>");
-
-			exportSummarySection(writer);
-
-			exportActivitySection(writer);
-
-			exportPlanSection(writer);
-
-			writer.write("</body></html>");
-			writer.close();
-		} catch (IOException e) {
-			StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not write to file", e));
-		}
-	}
-
-	private void exportPlanSection(BufferedWriter writer) throws IOException {
-
-		writer.write("<H2>" + LABEL_PLANNED_ACTIVITY + "</H2>");
-
-		writer.write("<table border=\"1\" width=\"100%\" id=\"plannedActivityTable\">");
-		writer.write("<tr>");
-		writer.write("<td width=\"59\"><b>Type</b></td><td width=\"55\"><b>Priority</b></td><td width=\"495\"><b>Description</b></td>");
-		writer.write("<td><b>Elapsed</b></td><td><b>Estimated</b></td><td><b>Reminder</b></td>");
-		writer.write("</tr>");
-
-		for (Object element : planContentProvider.getElements(null)) {
-			if (element instanceof ITask) {
-				AbstractTask currentTask = (AbstractTask) element;
-
-				String formatString = "dd-MM-yyyy";
-				SimpleDateFormat format = new SimpleDateFormat(formatString, Locale.ENGLISH);
-
-				String elapsedTimeString = DateUtil.getFormattedDuration(TasksUiPlugin.getTaskActivityManager()
-						.getElapsedTime(currentTask), false);
-				String estimatedTimeString = currentTask.getEstimatedTimeHours() + " hours";
-				if (elapsedTimeString.equals("")) {
-					elapsedTimeString = BLANK_CELL;
-				}
-
-				DateRange reminderDate = currentTask.getScheduledForDate();
-				String reminderDateString = BLANK_CELL;
-				if (reminderDate != null) {
-					reminderDateString = format.format(reminderDate);
-				}
-
-				writer.write("<tr>");
-				writer.write("<td width=\"59\">ICON</td><td width=\"55\">" + currentTask.getPriority()
-						+ "</td><td width=\"495\">");
-				if (TasksUiInternal.isValidUrl(currentTask.getUrl())) {
-					writer.write("<a href='" + currentTask.getUrl() + "'>" + currentTask.getSummary() + "</a>");
-				} else {
-					writer.write(currentTask.getSummary());
-				}
-				writer.write("</td><td>" + elapsedTimeString + "</td><td>" + estimatedTimeString + "</td><td>"
-						+ reminderDateString + "</td>");
-				writer.write("</tr>");
-
-			}
-		}
-		writer.write("</table>");
-		writer.write("<BR></BR>");
-		writer.write("<H3>" + totalEstimatedHoursLabel.getText() + "</H3>");
-
-	}
-
-	private void exportActivitySection(BufferedWriter writer) throws IOException {
-
-		writer.write("<H2>" + LABEL_PAST_ACTIVITY + "</H2>");
-
-		writer.write("<table border=\"1\" width=\"100%\" id=\"activityTable\">");
-		writer.write("<tr>");
-		writer.write("<td width=\"59\"><b>Type</b></td><td width=\"55\"><b>Priority</b></td><td width=\"495\"><b>Description</b></td>");
-		writer.write("<td><b>Created</b></td><td><b>Completed</b></td><td><b>Elapsed</b></td><td><b>Estimated</b></td>");
-		writer.write("</tr>");
-
-		for (Object element : activityContentProvider.getElements(null)) {
-			if (element instanceof ITask) {
-				AbstractTask currentTask = (AbstractTask) element;
-
-				String formatString = "dd-MM-yyyy";
-				SimpleDateFormat format = new SimpleDateFormat(formatString, Locale.ENGLISH);
-
-				String elapsedTimeString = DateUtil.getFormattedDuration(TasksUiPlugin.getTaskActivityManager()
-						.getElapsedTime(currentTask), false);
-				String estimatedTimeString = currentTask.getEstimatedTimeHours() + " hours";
-				if (elapsedTimeString.equals("")) {
-					elapsedTimeString = NO_TIME_ELAPSED;
-				}
-
-				Date creationDate = currentTask.getCreationDate();
-				String creationDateString = BLANK_CELL;
-				if (creationDate != null) {
-					creationDateString = format.format(creationDate);
-				}
-
-				String completionDateString = BLANK_CELL;
-				Date completedDate = currentTask.getCompletionDate();
-				if (completedDate != null) {
-					completionDateString = format.format(completedDate);
-				}
-
-				writer.write("<tr>");
-				writer.write("<td width=\"59\">ICON</td><td width=\"55\">" + currentTask.getPriority()
-						+ "</td><td width=\"495\">");
-
-				if (TasksUiInternal.isValidUrl(currentTask.getUrl())) {
-					writer.write("<a href='" + currentTask.getUrl() + "'>" + currentTask.getSummary() + "</a>");
-				} else {
-					writer.write(currentTask.getSummary());
-				}
-
-				writer.write("</td><td>" + creationDateString + "</td>");
-				writer.write("<td>" + completionDateString + "</td><td>" + elapsedTimeString + "</td><td>"
-						+ estimatedTimeString + "</td>");
-				writer.write("</tr>");
-			}
-		}
-		writer.write("</table>");
-	}
-
-	private void exportSummarySection(BufferedWriter writer) throws IOException {
-		Date startDate = editorInput.getReportStartDate();
-		Date endDate = editorInput.getReportEndDate();
-		writer.write("<H2>" + LABEL_DIALOG + "</H2>");
-
-		String formatString = "yyyy-MM-dd, h:mm a";
-		SimpleDateFormat format = new SimpleDateFormat(formatString, Locale.ENGLISH);
-
-		writer.write("<table border=\"0\" width=\"75%\" id=\"table1\">\n<tr>\n");
-		writer.write("<td width=\"138\">Date start:</td> ");
-		String dateLabel = "Not Available";
-		if (startDate != null) {
-			dateLabel = format.format(startDate);
-		}
-		writer.write("<td>" + dateLabel + "</td>");
-
-		writer.write("<td width=\"138\">Date end:</td> ");
-		String endLabel = "Not Available";
-		if (endDate != null) {
-			endLabel = format.format(endDate);
-		}
-		writer.write("<td>" + endLabel + "</td>");
-		//writer.write("<td width=\"169\">&nbsp;</td></tr>");
-
-		writer.write("<tr><td width=\"138\">Number Completed:</td><td>" + editorInput.getCompletedTasks().size()
-				+ "</td>");
-
-		writer.write("<td width=\"169\">Total time on completed:</td><td width=\"376\">"
-				+ DateUtil.getFormattedDuration(editorInput.getTotalTimeSpentOnCompletedTasks(), false) + "</td>");
-		writer.write("</tr>");
-
-		writer.write("<tr><td width=\"138\">Number in Progress:</td><td>" + editorInput.getInProgressTasks().size()
-				+ "</td>");
-		writer.write("<td width=\"169\">Total time on incompleted:</td><td width=\"376\">"
-				+ DateUtil.getFormattedDuration(editorInput.getTotalTimeSpentOnInProgressTasks(), false) + "</td>");
-		writer.write("</tr>");
-
-		writer.write("<tr><td width=\"138\">Outstanding estimated hours:</td><td>"
-				+ editorInput.getTotalTimeEstimated() + "</td>");
-		writer.write("<td width=\"169\">Total time:</td><td width=\"376\">" + getTotalTime() + "</td>");
-		writer.write("</tr>");
-
-		writer.write("</table>");
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskActivityLabelProvider.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskActivityLabelProvider.java
deleted file mode 100644
index 781ec84..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskActivityLabelProvider.java
+++ /dev/null
@@ -1,174 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.planner;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.IFontProvider;
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.mylyn.commons.core.DateUtil;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.provisional.commons.ui.CommonFonts;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.core.ScheduledTaskContainer;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.mylyn.tasks.core.ITaskActivityManager;
-import org.eclipse.mylyn.tasks.core.ITaskContainer;
-import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
-import org.eclipse.mylyn.tasks.ui.TaskElementLabelProvider;
-import org.eclipse.mylyn.tasks.ui.TasksUiImages;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author Rob Elves
- */
-public class TaskActivityLabelProvider extends TaskElementLabelProvider implements ITableLabelProvider, IColorProvider,
-		IFontProvider {
-
-	private static final String UNITS_HOURS = " hours";
-
-	private static final String NO_MINUTES = "0 minutes";
-
-	private final ITaskActivityManager activityManager;
-
-	private Color categoryBackgroundColor;
-
-	private final ITreeContentProvider contentProvider;
-
-	public TaskActivityLabelProvider(ILabelProvider provider, ILabelDecorator decorator, Color parentBacground,
-			ITreeContentProvider contentProvider) {
-		super(true);
-		this.categoryBackgroundColor = parentBacground;
-		this.activityManager = TasksUiPlugin.getTaskActivityManager();
-		this.contentProvider = contentProvider;
-	}
-
-	public Image getColumnImage(Object element, int columnIndex) {
-		if (columnIndex == 0) {
-			if (element instanceof ScheduledTaskContainer) {
-				super.getImage(element);
-			} else {
-				return super.getImage(element);
-			}
-		} else if (columnIndex == 1) {
-			if (element instanceof ITask) {
-				ITask taskElement = (ITask) element;
-				return TasksUiImages.getImageForPriority(PriorityLevel.fromString(taskElement.getPriority()));
-			}
-		}
-		return null;
-	}
-
-	public String getColumnText(Object element, int columnIndex) {
-		if (element instanceof ITask) {
-			AbstractTask task = (AbstractTask) element;
-			switch (columnIndex) {
-			case 2:
-				if (task != null) {
-					return task.getSummary();
-				}
-			case 3:
-				ScheduledTaskContainer container = (ScheduledTaskContainer) contentProvider.getParent(task);
-				if (container != null) {
-					return DateUtil.getFormattedDurationShort(activityManager.getElapsedTime(task,
-							container.getDateRange().getStartDate(), container.getDateRange().getEndDate()));
-				} else {
-					return "na";
-				}
-			case 4:
-				return task.getEstimatedTimeHours() + UNITS_HOURS;
-			case 5:
-				if (task.getScheduledForDate() != null) {
-					return task.getScheduledForDate().toString();//DateFormat.getDateInstance(DateFormat.MEDIUM).format(task.getScheduledForDate());
-				} else {
-					return "";
-				}
-//			case 6:
-//				if (activityDelegate.getStart() > 0
-//						&& activityDelegate.getDateRangeContainer().getElapsed(activityDelegate) > 0) {
-//					return DateFormat.getDateInstance(DateFormat.MEDIUM).format(activityDelegate.getStart());
-//				} else {
-//					return "";
-//				}
-			}
-		} else if (element instanceof ScheduledTaskContainer) {
-			ScheduledTaskContainer taskCategory = (ScheduledTaskContainer) element;
-			switch (columnIndex) {
-			case 2:
-				if (taskCategory.isPresent()) {
-					return taskCategory.getSummary() + " - Today";
-				}
-
-				return taskCategory.getSummary();
-			case 3:
-				String elapsedTimeString = NO_MINUTES;
-				try {
-
-					long elapsed = 0;
-					for (Object o : contentProvider.getChildren(taskCategory)) {
-						AbstractTask task = (AbstractTask) o;
-						elapsed += activityManager.getElapsedTime(task, taskCategory.getStart(), taskCategory.getEnd());
-					}
-
-					elapsedTimeString = DateUtil.getFormattedDurationShort(elapsed);
-					if (elapsedTimeString.equals("")) {
-						elapsedTimeString = NO_MINUTES;
-					}
-				} catch (RuntimeException e) {
-					StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
-							"Could not format elapsed time", e));
-				}
-				return elapsedTimeString;
-			case 4:
-				long estimated = 0;
-				for (Object o : contentProvider.getChildren(taskCategory)) {
-					if (o instanceof AbstractTask) {
-						estimated += ((AbstractTask) o).getEstimatedTimeHours();
-					}
-				}
-				return estimated + UNITS_HOURS;
-			}
-		}
-		return null;
-	}
-
-	@Override
-	public Color getBackground(Object element) {
-		if (element instanceof ITaskContainer && !(element instanceof ITask)) {
-			return categoryBackgroundColor;
-		} else {
-			return super.getBackground(element);
-		}
-	}
-
-	@Override
-	public Font getFont(Object element) {
-		if (element instanceof ScheduledTaskContainer) {
-			ScheduledTaskContainer container = (ScheduledTaskContainer) element;
-			if (container.isPresent()) {
-				return CommonFonts.BOLD;
-			}
-		} else if (element instanceof ITask) {
-			AbstractTask task = (AbstractTask) element;
-			return super.getFont(task);
-		}
-		return super.getFont(element);
-	}
-
-	public void setCategoryBackgroundColor(Color categoryBackgroundColor) {
-		this.categoryBackgroundColor = categoryBackgroundColor;
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskActivitySorter.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskActivitySorter.java
deleted file mode 100644
index 2ab499d..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskActivitySorter.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.planner;
-
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.tasks.core.ITask;
-
-/**
- * @author Ken Sueda
- * @author Mik Kersten
- */
-public class TaskActivitySorter extends ViewerSorter {
-
-	public final static int DESCRIPTION = 1;
-
-	public final static int PRIORITY = 2;
-
-	public final static int CREATION_DATE = 3;
-
-	public final static int COMPLETED_DATE = 4;
-
-	public final static int DURATION = 5;
-
-	public final static int ESTIMATED = 6;
-
-	public static final int ICON = 0;
-
-	private final int criteria;
-
-	public TaskActivitySorter(int criteria) {
-		super();
-		this.criteria = criteria;
-	}
-
-	@Override
-	public int compare(Viewer viewer, Object obj1, Object obj2) {
-		AbstractTask t1 = (AbstractTask) obj1;
-		AbstractTask t2 = (AbstractTask) obj2;
-
-		switch (criteria) {
-		case DESCRIPTION:
-			return compareDescription(t1, t2);
-		case PRIORITY:
-			return comparePriority(t1, t2);
-		case CREATION_DATE:
-			return compareCreationDate(t1, t2);
-		case COMPLETED_DATE:
-			return compareCompletedDate(t1, t2);
-		case DURATION:
-			return compareDuration(t1, t2);
-		case ESTIMATED:
-			return compareEstimated(t1, t2);
-		default:
-			return 0;
-		}
-	}
-
-	protected int compareDescription(ITask task1, ITask task2) {
-		return task1.getSummary().compareToIgnoreCase(task2.getSummary());
-	}
-
-	protected int comparePriority(ITask task1, ITask task2) {
-		return task1.getPriority().compareTo(task2.getPriority());
-	}
-
-	protected int compareCompletedDate(ITask task1, ITask task2) {
-		return task2.getCompletionDate().compareTo(task1.getCompletionDate());
-	}
-
-	protected int compareEstimated(AbstractTask task1, AbstractTask task2) {
-		return task2.getEstimatedTimeHours() - task1.getEstimatedTimeHours();
-	}
-
-	protected int compareCreationDate(ITask task1, ITask task2) {
-		if (task1.getCreationDate() == null) {
-			return 1;
-		} else if (task2.getCreationDate() == null) {
-			return -1;
-		} else {
-			return task2.getCreationDate().compareTo(task1.getCreationDate());
-		}
-	}
-
-	protected int compareDuration(ITask task1, ITask task2) {
-		return TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1) < TasksUiPlugin.getTaskActivityManager()
-				.getElapsedTime(task2) ? 1 : -1;
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskActivityWizard.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskActivityWizard.java
deleted file mode 100644
index 7161c9d..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskActivityWizard.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.planner;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.tasks.ui.ITasksUiConstants;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-
-/**
- * @author Ken Sueda
- * @author Mik Kersten
- */
-public class TaskActivityWizard extends Wizard implements INewWizard {
-
-	private static final String TITLE = "New Task Activity Report";
-
-	private TaskActivityWizardPage planningGamePage;
-
-	public TaskActivityWizard() {
-		super();
-		init();
-		setWindowTitle(TITLE);
-	}
-
-	@Override
-	public boolean performFinish() {
-		try {
-			IWorkbenchPage page = TasksUiPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow().getActivePage();
-			if (page == null) {
-				return false;
-			}
-			IEditorInput input = new TaskActivityEditorInput(planningGamePage.getReportStartDate(),
-					planningGamePage.getReportEndDate(), planningGamePage.getSelectedContainers(),
-					TasksUiPlugin.getTaskList());
-			page.openEditor(input, ITasksUiConstants.ID_PAGE_PLANNING);
-		} catch (PartInitException e) {
-			StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not open summary editor", e));
-		}
-		return true;
-	}
-
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-	}
-
-	private void init() {
-		planningGamePage = new TaskActivityWizardPage();
-		super.setForcePreviousAndNextButtons(true);
-	}
-
-	@Override
-	public void addPages() {
-		addPage(planningGamePage);
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskActivityWizardPage.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskActivityWizardPage.java
deleted file mode 100644
index b49abb9..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskActivityWizardPage.java
+++ /dev/null
@@ -1,368 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.planner;
-
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.mylyn.internal.provisional.commons.ui.DatePicker;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
-import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.internal.tasks.ui.ITasksUiPreferenceConstants;
-import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
-import org.eclipse.mylyn.tasks.core.ITaskContainer;
-import org.eclipse.mylyn.tasks.core.IRepositoryElement;
-import org.eclipse.mylyn.tasks.ui.TaskElementLabelProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * @author Mik Kersten
- * @author Ken Sueda (original prototype)
- * @author Rob Elves
- */
-public class TaskActivityWizardPage extends WizardPage {
-
-	private static final int DEFAULT_DAYS = 1;
-
-	private static final String TITLE = "Mylyn Task Activity Report";
-
-	private static final String DESCRIPTION = "Summarizes task activity and assists planning future tasks.";
-
-	private final long DAY = 24 * 3600 * 1000;
-
-	protected String[] columnNames = new String[] { "", "Description" };
-
-	private Date reportStartDate = null;
-
-	private Date reportEndDate = null;
-
-	private Button daysRadioButton = null;
-
-	private Button dateRadioButton = null;
-
-	private Text numDays;
-
-	private int numDaysToReport = 0;
-
-	private Table filtersTable;
-
-	private final TaskElementLabelProvider labelProvider = new TaskElementLabelProvider(false);
-
-	public TaskActivityWizardPage() {
-		super(TITLE);
-		setTitle(TITLE);
-		setDescription(DESCRIPTION);
-	}
-
-	public void createControl(Composite parent) {
-		Composite container = new Composite(parent, SWT.FILL);
-		GridLayout layout = new GridLayout();
-		container.setLayout(layout);
-		layout.numColumns = 1;
-
-		createReportPeriodGroup(container);
-
-		Label spacer = new Label(container, SWT.NONE);
-		spacer.setText(" ");
-
-		createCategorySelectionGroup(container);
-
-		setControl(container);
-		numDays.setFocus();
-	}
-
-	private void createReportPeriodGroup(Composite parent) {
-		Group reportPeriodGroup = new Group(parent, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 4;
-		reportPeriodGroup.setLayout(layout);
-		reportPeriodGroup.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.GRAB_HORIZONTAL));
-		reportPeriodGroup.setText("Report Period");
-		reportPeriodGroup.setFont(parent.getFont());
-
-		daysRadioButton = new Button(reportPeriodGroup, SWT.RADIO | SWT.LEFT | SWT.NO_FOCUS);
-		daysRadioButton.setText("Number of days prior: ");
-		daysRadioButton.setSelection(true);
-
-		numDays = new Text(reportPeriodGroup, SWT.BORDER);
-		GridData gd = new GridData();
-		gd.widthHint = 50;
-		numDays.setLayoutData(gd);
-		numDays.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				try {
-					numDaysToReport = Integer.parseInt(numDays.getText());
-					setErrorMessage(null);
-				} catch (Exception ex) {
-					setErrorMessage("Must be integer");
-					numDaysToReport = 0;
-				}
-			}
-		});
-
-		numDays.setText("" + DEFAULT_DAYS);
-		numDaysToReport = DEFAULT_DAYS;
-
-		Label spacer = new Label(reportPeriodGroup, SWT.NONE);
-		GridDataFactory.fillDefaults().span(2, SWT.DEFAULT).applyTo(spacer);
-
-		dateRadioButton = new Button(reportPeriodGroup, SWT.RADIO | SWT.LEFT | SWT.NO_FOCUS);
-		dateRadioButton.setText("Date range        Start:");
-
-		final DatePicker datePicker = new DatePicker(reportPeriodGroup, SWT.BORDER, "<start date>", true,
-				TasksUiPlugin.getDefault().getPreferenceStore().getInt(ITasksUiPreferenceConstants.PLANNING_ENDHOUR));
-		datePicker.setEnabled(false);
-		Calendar startCal = Calendar.getInstance();
-		TaskActivityUtil.snapStartOfDay(startCal);
-		reportStartDate = startCal.getTime();
-		datePicker.setDate(startCal);
-		datePicker.addPickerSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent arg0) {
-				if (datePicker.getDate() != null) {
-					reportStartDate = datePicker.getDate().getTime();
-				}
-			}
-
-			public void widgetDefaultSelected(SelectionEvent arg0) {
-				// ignore
-			}
-		});
-
-		new Label(reportPeriodGroup, SWT.NONE).setText("End:");
-
-		final DatePicker endDatePicker = new DatePicker(reportPeriodGroup, SWT.BORDER, "<end date>", true,
-				TasksUiPlugin.getDefault().getPreferenceStore().getInt(ITasksUiPreferenceConstants.PLANNING_ENDHOUR));
-		endDatePicker.setEnabled(false);
-		Calendar endCal = Calendar.getInstance();
-		TaskActivityUtil.snapEndOfWorkDay(endCal);
-		reportEndDate = endCal.getTime();
-		endDatePicker.setDate(endCal);
-		endDatePicker.addPickerSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent arg0) {
-				if (datePicker.getDate() != null) {
-					reportEndDate = endDatePicker.getDate().getTime();
-				}
-			}
-		});
-
-		SelectionListener radioListener = new SelectionAdapter() {
-
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				numDays.setEnabled(daysRadioButton.getSelection());
-				datePicker.setEnabled(dateRadioButton.getSelection());
-				endDatePicker.setEnabled(dateRadioButton.getSelection());
-				if (daysRadioButton.getSelection()) {
-					numDays.setFocus();
-				}
-				if (dateRadioButton.getSelection()) {
-					datePicker.setFocus();
-				}
-			}
-
-		};
-
-		daysRadioButton.addSelectionListener(radioListener);
-		dateRadioButton.addSelectionListener(radioListener);
-
-	}
-
-	/**
-	 * Selection of specific category to report on in the Task Planner
-	 * 
-	 * @param composite
-	 * 		container to add categories combo box to
-	 */
-	private void createCategorySelectionGroup(Composite composite) {
-
-		Group categorySelectionGroup = new Group(composite, SWT.NONE);
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 1;
-		categorySelectionGroup.setLayout(layout);
-		categorySelectionGroup.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL));
-		categorySelectionGroup.setText("Category Selection");
-		categorySelectionGroup.setFont(composite.getFont());
-
-		createFilterTable(categorySelectionGroup, true);
-
-		List<AbstractTaskContainer> containers = new ArrayList<AbstractTaskContainer>();
-		containers.addAll(TasksUiInternal.getTaskList().getCategories());
-		containers.addAll(TasksUiInternal.getTaskList().getQueries());
-		//containers.add(manager.getTaskList().getArchiveContainer());
-		Collections.sort(containers, new Comparator<AbstractTaskContainer>() {
-
-			public int compare(AbstractTaskContainer c1, AbstractTaskContainer c2) {
-				if (c1.equals(TasksUiPlugin.getTaskList().getDefaultCategory())) {
-					return -1;
-				} else if (c2.equals(TasksUiPlugin.getTaskList().getDefaultCategory())) {
-					return 1;
-				} else {
-					return c1.getSummary().compareToIgnoreCase(c2.getSummary());
-				}
-			}
-
-		});
-
-		// populate table
-		for (IRepositoryElement container : containers) {
-			TableItem item = new TableItem(filtersTable, SWT.NONE);
-			item.setImage(labelProvider.getImage(container));
-			item.setText(container.getSummary());
-			item.setData(container);
-		}
-
-		for (int i = 0; i < columnNames.length; i++) {
-			filtersTable.getColumn(i).pack();
-		}
-
-		createButtonsGroup(categorySelectionGroup);
-
-		// default to all categories selected
-		setChecked(true);
-	}
-
-	/**
-	 * 
-	 * Creates the buttons for selecting all or none of the categories.
-	 * 
-	 * @param parent
-	 * 		parent composite
-	 */
-	private final void createButtonsGroup(Composite parent) {
-
-		Font font = parent.getFont();
-		new Label(parent, SWT.NONE); // Blank cell on left
-
-		Composite buttonComposite = new Composite(parent, SWT.NONE);
-		buttonComposite.setFont(parent.getFont());
-
-		GridLayout layout = new GridLayout();
-		layout.numColumns = 3;
-		layout.makeColumnsEqualWidth = true;
-		buttonComposite.setLayout(layout);
-		buttonComposite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL));
-
-		Button selectButton = new Button(buttonComposite, SWT.NONE);
-		selectButton.setText("Select All");
-
-		selectButton.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				setChecked(true);
-			}
-		});
-
-		selectButton.setFont(font);
-		setButtonLayoutData(selectButton);
-
-		Button deselectButton = new Button(buttonComposite, SWT.NONE);
-		deselectButton.setText("Deselect All");
-
-		deselectButton.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				setChecked(false);
-			}
-		});
-
-		deselectButton.setFont(font);
-		setButtonLayoutData(deselectButton);
-
-	}
-
-	private void setChecked(boolean checked) {
-		for (TableItem item : filtersTable.getItems()) {
-			item.setChecked(checked);
-		}
-	}
-
-	private void createFilterTable(Composite composite, boolean enabled) {
-
-		Font font = composite.getFont();
-		this.filtersTable = new Table(composite, SWT.BORDER | SWT.MULTI | SWT.CHECK | SWT.H_SCROLL | SWT.V_SCROLL);
-		this.filtersTable.setEnabled(enabled);
-		GridData data = new GridData();
-		// Set heightHint with a small value so the list size will be defined by
-		// the space available in the dialog instead of resizing the dialog to
-		// fit all the items in the list.
-		data.heightHint = filtersTable.getItemHeight();
-		data.verticalAlignment = GridData.FILL;
-		data.horizontalAlignment = GridData.FILL;
-		data.grabExcessHorizontalSpace = true;
-		data.grabExcessVerticalSpace = true;
-		this.filtersTable.setLayoutData(data);
-		this.filtersTable.setFont(font);
-
-		for (String columnName : columnNames) {
-			TableColumn column = new TableColumn(filtersTable, SWT.NONE);
-			column.setText(columnName);
-		}
-
-	}
-
-	public Set<AbstractTaskContainer> getSelectedContainers() {
-		Set<AbstractTaskContainer> result = new HashSet<AbstractTaskContainer>();
-		TableItem[] items = filtersTable.getItems();
-		for (TableItem item : items) {
-			if (item.getChecked() && item.getData() instanceof ITaskContainer) {
-				result.add((AbstractTaskContainer) item.getData());
-			}
-		}
-		return result;
-	}
-
-	public Date getReportStartDate() {
-		if (dateRadioButton.getSelection() && reportStartDate != null) {
-			return reportStartDate;
-		} else {
-			long today = new Date().getTime();
-			long lastDay = numDaysToReport * DAY;
-
-			int offsetToday = Calendar.getInstance().get(Calendar.HOUR) * 60 * 60 * 1000
-					+ Calendar.getInstance().get(Calendar.MINUTE) * 60 * 1000
-					+ Calendar.getInstance().get(Calendar.SECOND) * 1000;
-			return new Date(today - offsetToday - lastDay);
-		}
-	}
-
-	public Date getReportEndDate() {
-		if (dateRadioButton.getSelection() && reportEndDate != null) {
-			return reportEndDate;
-		} else {
-			return new Date();
-		}
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskPlanContentProvider.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskPlanContentProvider.java
deleted file mode 100644
index 82d889b..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskPlanContentProvider.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.planner;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.tasks.core.ITask;
-
-/**
- * @author Ken Sueda
- */
-public class TaskPlanContentProvider implements IStructuredContentProvider {
-
-	private final List<AbstractTask> tasks = new ArrayList<AbstractTask>();
-
-	public Object[] getElements(Object inputElement) {
-		return tasks.toArray();
-	}
-
-	public void dispose() {
-	}
-
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-	}
-
-	public void addTask(AbstractTask t) {
-		if (!tasks.contains(t)) {
-			tasks.add(t);
-		}
-	}
-
-	public void removeTask(ITask t) {
-		tasks.remove(t);
-	}
-
-	public List<AbstractTask> getTasks() {
-		return tasks;
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskPlanSorter.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskPlanSorter.java
deleted file mode 100644
index b2203c3..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskPlanSorter.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.planner;
-
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-
-/**
- * @author Mik Kersten
- */
-public class TaskPlanSorter extends TaskActivitySorter {
-
-	// {".", "Description", "Priority", "Estimated Time", "Reminder Date"};
-	public final static int PRIORITY = 1;
-
-	public final static int DESCRIPTION = 2;
-
-	public final static int DURATION = 3;
-
-	public final static int ESTIMATE = 4;
-
-	public final static int REMINDER = 5;
-
-	public static final int ICON = 0;
-
-	private final int criteria;
-
-	public TaskPlanSorter(int criteria) {
-		super(criteria);
-		this.criteria = criteria;
-	}
-
-	@Override
-	public int compare(Viewer viewer, Object obj1, Object obj2) {
-		AbstractTask t1 = (AbstractTask) obj1;
-		AbstractTask t2 = (AbstractTask) obj2;
-
-		switch (criteria) {
-		case PRIORITY:
-			return comparePriority(t1, t2);
-		case DESCRIPTION:
-			return compareDescription(t1, t2);
-		case DURATION:
-			return compareDuration(t1, t2);
-		case ESTIMATE:
-			return compareEstimated(t1, t2);
-		case REMINDER:
-			return compareReminder(t1, t2);
-		default:
-			return 0;
-		}
-	}
-
-	private int compareReminder(AbstractTask task1, AbstractTask task2) {
-		if (task2.getScheduledForDate() == null) {
-			return -1;
-		}
-		if (task1.getScheduledForDate() == null) {
-			return 1;
-		}
-		if (task1.getScheduledForDate() == null && task2.getScheduledForDate() == null) {
-			return 0;
-		}
-		return task2.getScheduledForDate().compareTo(task1.getScheduledForDate());
-	}
-
-	// protected int compareEstimated(ITask task1, ITask task2) {
-	// if (task1.getEstimateTimeHours() > task2.getEstimateTimeHours()) {
-	// return 1;
-	// } else {
-	// return -1;
-	// }
-
-	// private int compareDescription(ITask task1, ITask task2) {
-	// return
-	// task1.getDescription(false).compareTo(task2.getDescription(false));
-	// }
-	//	
-	// private int comparePriority(ITask task1, ITask task2) {
-	// return task1.getPriority().compareTo(task2.getPriority());
-	// }
-	//	
-
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskPlannerLabelProvider.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskPlannerLabelProvider.java
deleted file mode 100644
index 379f203..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskPlannerLabelProvider.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.planner;
-
-import java.text.DateFormat;
-import java.util.Calendar;
-import java.util.Date;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.viewers.IColorProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.mylyn.commons.core.DateUtil;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.mylyn.tasks.core.ITaskContainer;
-import org.eclipse.mylyn.tasks.core.IRepositoryElement;
-import org.eclipse.mylyn.tasks.ui.TaskElementLabelProvider;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author Ken Sueda
- * @author Rob Elves
- */
-public class TaskPlannerLabelProvider extends TaskElementLabelProvider implements ITableLabelProvider, IColorProvider {
-
-	private final Calendar startDate;
-
-	private final Calendar endDate;
-
-	private final TreeViewer viewer;
-
-	public TaskPlannerLabelProvider(TreeViewer viewer, Date startDate, Date endDate) {
-		super(true);
-		this.viewer = viewer;
-		this.startDate = Calendar.getInstance();
-		this.startDate.setTime(startDate);
-		this.endDate = Calendar.getInstance();
-		this.endDate.setTime(endDate);
-	}
-
-	private final TaskElementLabelProvider taskListLabelProvider = new TaskElementLabelProvider(true);
-
-	public Image getColumnImage(Object element, int columnIndex) {
-		if (columnIndex == 0) {
-			return super.getImage(element);
-		} else {
-			return null;
-		}
-	}
-
-	public String getColumnText(Object element, int columnIndex) {
-		try {
-			if (element instanceof AbstractTask) {
-				AbstractTask task = (AbstractTask) element;
-				switch (columnIndex) {
-				case 1:
-					return task.getPriority();
-				case 2:
-					return task.getSummary();
-				case 3:
-					return DateUtil.getFormattedDurationShort(TasksUiPlugin.getTaskActivityManager().getElapsedTime(
-							task, startDate, endDate));
-				case 4:
-					return task.getEstimatedTimeHours() + " hours";
-				case 5:
-					if (task.getCreationDate() != null) {
-						return DateFormat.getDateInstance(DateFormat.MEDIUM).format(task.getCreationDate());
-					} else {
-						StatusHandler.log(new Status(IStatus.WARNING, TasksUiPlugin.ID_PLUGIN,
-								"Task has no creation date: " + task.getSummary()));
-						return "[unknown]";
-					}
-				case 6:
-					if (task.getCompletionDate() != null) {
-						return DateFormat.getDateInstance(DateFormat.MEDIUM).format(task.getCompletionDate());
-					} else {
-						return "";
-					}
-				}
-			} else if (element instanceof ITaskContainer) {
-				IRepositoryElement container = (IRepositoryElement) element;
-				switch (columnIndex) {
-				case 1:
-					return null;
-				case 2:
-					return container.getSummary();
-				case 3: {
-					ITreeContentProvider contentProvider = ((ITreeContentProvider) viewer.getContentProvider());
-					long duration = 0;
-					for (Object o : contentProvider.getChildren(container)) {
-						if (o instanceof ITask) {
-							duration += TasksUiPlugin.getTaskActivityManager().getElapsedTime((ITask) o, startDate,
-									endDate);
-						}
-					}
-					return DateUtil.getFormattedDurationShort(duration);
-				}
-				case 4: {
-					ITreeContentProvider contentProvider = ((ITreeContentProvider) viewer.getContentProvider());
-					long estimated = 0;
-					for (Object o : contentProvider.getChildren(container)) {
-						if (o instanceof AbstractTask) {
-							estimated += ((AbstractTask) o).getEstimatedTimeHours();
-						}
-					}
-					return estimated + " hours";
-				}
-				case 5:
-					return null;
-				case 6:
-					return null;
-				}
-			}
-		} catch (RuntimeException e) {
-			StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN,
-					"Could not produce completed task label", e));
-			return "";
-		}
-		return null;
-	}
-
-	@Override
-	public Color getForeground(Object element) {
-		return taskListLabelProvider.getForeground(element);
-	}
-
-	@Override
-	public Color getBackground(Object element) {
-		return taskListLabelProvider.getBackground(element);
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskReportGenerator.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskReportGenerator.java
deleted file mode 100644
index 854861d..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/planner/TaskReportGenerator.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.planner;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
-import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
-import org.eclipse.mylyn.internal.tasks.core.TaskList;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.mylyn.tasks.core.ITaskContainer;
-
-/**
- * @author Ken Sueda
- * @author Mik Kersten
- * @author Rob Elves (scope report to specific categories and queries)
- */
-public class TaskReportGenerator implements IRunnableWithProgress {
-
-	private static final String LABEL_JOB = "Mylyn Task Activity Report";
-
-	private boolean finished;
-
-	private TaskList tasklist = null;
-
-	private final List<ITaskCollector> collectors = new ArrayList<ITaskCollector>();
-
-	private final List<ITask> tasks = new ArrayList<ITask>();
-
-	private final Set<AbstractTaskContainer> filterCategories;
-
-	public TaskReportGenerator(TaskList tlist) {
-		this(tlist, null);
-	}
-
-	public TaskReportGenerator(TaskList tlist, Set<AbstractTaskContainer> filterCategories) {
-		tasklist = tlist;
-		this.filterCategories = filterCategories != null ? filterCategories : new HashSet<AbstractTaskContainer>();
-	}
-
-	public void addCollector(ITaskCollector collector) {
-		collectors.add(collector);
-	}
-
-	public void collectTasks() {
-		try {
-			run(new NullProgressMonitor());
-		} catch (InvocationTargetException e) {
-			// operation was canceled
-		} catch (InterruptedException e) {
-			StatusHandler.log(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, "Could not collect tasks", e));
-		}
-	}
-
-	public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-
-		Set<AbstractTaskContainer> rootElements;
-		if (filterCategories.size() == 0) {
-			rootElements = tasklist.getRootElements();
-		} else {
-			rootElements = filterCategories;
-		}
-
-		int estimatedItemsToProcess = rootElements.size();
-		monitor.beginTask(LABEL_JOB, estimatedItemsToProcess);
-
-		for (Object element : rootElements) {
-			monitor.worked(1);
-			if (element instanceof ITask) {
-				AbstractTask task = (AbstractTask) element;
-				for (ITaskCollector collector : collectors) {
-					collector.consumeTask(task);
-				}
-			} else if (element instanceof IRepositoryQuery) {
-				// process queries
-				RepositoryQuery repositoryQuery = (RepositoryQuery) element;
-				for (ITask task : repositoryQuery.getChildren()) {
-					for (ITaskCollector collector : collectors) {
-						if (task instanceof AbstractTask) {
-							collector.consumeTask((AbstractTask) task);
-						}
-					}
-				}
-			} else if (element instanceof ITaskContainer) {
-				ITaskContainer cat = (ITaskContainer) element;
-				for (ITask task : cat.getChildren()) {
-					for (ITaskCollector collector : collectors) {
-						if (task instanceof AbstractTask) {
-							collector.consumeTask((AbstractTask) task);
-						}
-					}
-				}
-
-			}
-		}
-		// Put the results all into one list (tasks)
-		for (ITaskCollector collector : collectors) {
-			tasks.addAll(collector.getTasks());
-		}
-		finished = true;
-		monitor.done();
-	}
-
-	public List<ITask> getAllCollectedTasks() {
-		return tasks;
-	}
-
-	public boolean isFinished() {
-		return finished;
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/ActiveSearchQuickView.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/ActiveSearchQuickView.java
deleted file mode 100644
index ed2a48e..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/ActiveSearchQuickView.java
+++ /dev/null
@@ -1,993 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.views;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.GroupMarker;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.util.Geometry;
-import org.eclipse.jface.viewers.DecoratingLabelProvider;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.mylyn.context.core.IInteractionElement;
-import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
-import org.eclipse.mylyn.internal.context.ui.DoiOrderSorter;
-import org.eclipse.mylyn.internal.context.ui.views.ContextContentProvider;
-import org.eclipse.mylyn.internal.context.ui.views.ContextNodeOpenListener;
-import org.eclipse.mylyn.internal.sandbox.ui.DelegatingContextLabelProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.MouseMoveListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.ShellAdapter;
-import org.eclipse.swt.events.ShellEvent;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Item;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Layout;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Monitor;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.ToolBar;
-import org.eclipse.swt.widgets.ToolItem;
-import org.eclipse.swt.widgets.Tracker;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @author Mik Kersten
- * 
- * TODO there is redundancy between this and RelatedElementsPopupDialog
- */
-public class ActiveSearchQuickView {
-
-	/**
-	 * Dialog constants telling whether this control can be resized or move.
-	 */
-	private static final String STORE_DISABLE_RESTORE_SIZE = "DISABLE_RESTORE_SIZE"; //$NON-NLS-1$
-
-	private static final String STORE_DISABLE_RESTORE_LOCATION = "DISABLE_RESTORE_LOCATION"; //$NON-NLS-1$
-
-	/**
-	 * Dialog store constant for the location's x-coordinate, location's y-coordinate and the size's width and height.
-	 */
-	private static final String STORE_LOCATION_X = "location.x"; //$NON-NLS-1$
-
-	private static final String STORE_LOCATION_Y = "location.y"; //$NON-NLS-1$
-
-	private static final String STORE_SIZE_WIDTH = "size.width"; //$NON-NLS-1$
-
-	private static final String STORE_SIZE_HEIGHT = "size.height"; //$NON-NLS-1$
-
-	/**
-	 * The name of the dialog store's section associated with the inplace XReference view.
-	 */
-	private static final String sectionName = "org.eclipse.contribution.internal.xref.QuickXRef"; //$NON-NLS-1$
-
-	/**
-	 * Fields for text matching and filtering
-	 */
-	private Text filterText;
-
-	// private StringMatcher stringMatcher;
-	private Font statusTextFont;
-
-	/**
-	 * Remembers the bounds for this information control.
-	 */
-	private Rectangle bounds;
-
-	private Rectangle trim;
-
-	/**
-	 * Fields for view menu support.
-	 */
-	private ToolBar toolBar;
-
-	private MenuManager viewMenuManager;
-
-//	/**
-//	 * Fields which are updated by the IWorkbenchWindowActionDelegate to record
-//	 * the selection in the editor
-//	 */
-//	private ISelection lastSelection;
-//
-//	private IWorkbenchPart workbenchPart;
-
-	private boolean isDeactivateListenerActive = false;
-
-	private Composite composite, viewMenuButtonComposite;
-
-	private final int shellStyle;
-
-	private Listener deactivateListener;
-
-	private Shell parentShell;
-
-	private Shell dialogShell;
-
-	private TreeViewer viewer;
-
-	/**
-	 * Constructor which takes the parent shell
-	 */
-	public ActiveSearchQuickView(Shell parent) {
-		parentShell = parent;
-		shellStyle = SWT.RESIZE;
-	}
-
-	/**
-	 * Open the dialog
-	 */
-	public void open(IInteractionElement focusNode) {
-		// If the dialog is already open, dispose the shell and recreate it
-		if (dialogShell != null) {
-			close();
-		}
-		createShell();
-		createComposites();
-		filterText = createFilterText(viewMenuButtonComposite);
-		createViewMenu(viewMenuButtonComposite);
-		createHorizontalSeparator(composite);
-		viewer = createTreeViewer(composite, SWT.V_SCROLL | SWT.H_SCROLL);
-
-		// customFiltersActionGroup = new CustomFiltersActionGroup(
-		// "org.eclipse.contribution.xref.QuickXRef", viewer);//$NON-NLS-1$
-
-		addListenersToTree(viewer);
-		// set the tab order
-		viewMenuButtonComposite.setTabList(new Control[] { filterText });
-		composite.setTabList(new Control[] { viewMenuButtonComposite, viewer.getTree() });
-
-		setInfoSystemColor();
-		installFilter();
-		addListenersToShell();
-
-		viewer.addOpenListener(new ContextNodeOpenListener(viewer));
-		viewer.setSorter(new DoiOrderSorter());
-		createContents();
-		initializeBounds();
-		// open the window
-
-		viewer.expandToLevel(focusNode, 3);
-		// TreeItem[] items = viewer.getTree().getItems();
-		// for (int i = 0; i < items.length; i++) {
-		// if (items[i].getData().equals(focusNode)) {
-		// items[i].setExpanded(true);
-		// TreeItem[] children = items[i].getItems();
-		// for (int j = 0; j < items.length; j++) {
-		// items[j].setExpanded(true);
-		// }
-		// }
-		// }
-		dialogShell.open();
-	}
-
-	private void createShell() {
-		// Create the shell
-		dialogShell = new Shell(parentShell, shellStyle);
-
-		// To handle "ESC" case
-		dialogShell.addShellListener(new ShellAdapter() {
-
-			@Override
-			public void shellClosed(ShellEvent event) {
-				event.doit = false; // don't close now
-				close();
-			}
-		});
-
-		Display display = dialogShell.getDisplay();
-		dialogShell.setBackground(display.getSystemColor(SWT.COLOR_BLACK));
-
-		int border = ((shellStyle & SWT.NO_TRIM) == 0) ? 0 : 1;
-		dialogShell.setLayout(new BorderFillLayout(border));
-
-	}
-
-	private void createComposites() {
-		// Composite for filter text and tree
-		composite = new Composite(dialogShell, SWT.RESIZE);
-		GridLayout layout = new GridLayout(1, false);
-		composite.setLayout(layout);
-		composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		viewMenuButtonComposite = new Composite(composite, SWT.NONE);
-		layout = new GridLayout(2, false);
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		viewMenuButtonComposite.setLayout(layout);
-		viewMenuButtonComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-	}
-
-	private TreeViewer createTreeViewer(Composite parent, int style) {
-		viewer = new TreeViewer(parent, SWT.SINGLE | (style & ~SWT.MULTI));
-		viewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		viewer.setContentProvider(new ContextContentProvider(dialogShell, true));
-		viewer.setLabelProvider(new DecoratingLabelProvider(new DelegatingContextLabelProvider(),
-				PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()));
-
-		// adding these filters which restrict the contents of
-		// the view according to what has been typed in the
-		// text bar
-		viewer.addFilter(new NamePatternFilter());
-		viewer.setInput(dialogShell);
-		return viewer;
-	}
-
-	private void createHorizontalSeparator(Composite parent) {
-		Label separator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL | SWT.LINE_DOT);
-		separator.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-	}
-
-	private void setInfoSystemColor() {
-		Display display = dialogShell.getDisplay();
-
-		// set the foreground colour
-		viewer.getTree().setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
-		filterText.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
-		composite.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
-		viewMenuButtonComposite.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
-		toolBar.setForeground(display.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
-
-		// set the background colour
-		viewer.getTree().setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
-		filterText.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
-		composite.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
-		viewMenuButtonComposite.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
-		toolBar.setBackground(display.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
-	}
-
-	// --------------------- adding listeners ---------------------------
-
-	private void addListenersToTree(TreeViewer treeViewer) {
-		final Tree tree = treeViewer.getTree();
-		tree.addKeyListener(new KeyListener() {
-			public void keyPressed(KeyEvent e) {
-				if (e.character == 0x1B) {
-					dispose();
-				}
-			}
-
-			public void keyReleased(KeyEvent e) {
-				// do nothing
-			}
-		});
-
-		// tree.addSelectionListener(new SelectionListener() {
-		// public void widgetSelected(SelectionEvent e) {
-		// // do nothing
-		// }
-		//
-		// public void widgetDefaultSelected(SelectionEvent e) {
-		// gotoSelectedElement();
-		// }
-		// });
-
-		tree.addMouseMoveListener(new MouseMoveListener() {
-			TreeItem fLastItem = null;
-
-			public void mouseMove(MouseEvent e) {
-				if (tree.equals(e.getSource())) {
-					Object o = tree.getItem(new Point(e.x, e.y));
-					if (o instanceof TreeItem) {
-						if (!o.equals(fLastItem)) {
-							fLastItem = (TreeItem) o;
-							tree.setSelection(new TreeItem[] { fLastItem });
-						} else if (e.y < tree.getItemHeight() / 4) {
-							// Scroll up
-							Point p = tree.toDisplay(e.x, e.y);
-							Item item = viewer.scrollUp(p.x, p.y);
-							if (item instanceof TreeItem) {
-								fLastItem = (TreeItem) item;
-								tree.setSelection(new TreeItem[] { fLastItem });
-							}
-						} else if (e.y > tree.getBounds().height - tree.getItemHeight() / 4) {
-							// Scroll down
-							Point p = tree.toDisplay(e.x, e.y);
-							Item item = viewer.scrollDown(p.x, p.y);
-							if (item instanceof TreeItem) {
-								fLastItem = (TreeItem) item;
-								tree.setSelection(new TreeItem[] { fLastItem });
-							}
-						}
-					}
-				}
-			}
-		});
-
-		tree.addMouseListener(new MouseAdapter() {
-
-			@Override
-			public void mouseUp(MouseEvent e) {
-
-				if (tree.getSelectionCount() < 1) {
-					return;
-				}
-
-				if (e.button != 1) {
-					return;
-				}
-
-				if (tree.equals(e.getSource())) {
-					Object o = tree.getItem(new Point(e.x, e.y));
-					TreeItem selection = tree.getSelection()[0];
-					if (selection.equals(o)) {
-						gotoSelectedElement();
-					}
-				}
-			}
-		});
-
-	}
-
-	private void addListenersToShell() {
-		dialogShell.addDisposeListener(new DisposeListener() {
-
-			public void widgetDisposed(DisposeEvent e) {
-				close();
-				if (statusTextFont != null && !statusTextFont.isDisposed()) {
-					statusTextFont.dispose();
-				}
-
-				dialogShell = null;
-				viewer = null;
-				composite = null;
-				filterText = null;
-				statusTextFont = null;
-
-			}
-		});
-
-		deactivateListener = new Listener() {
-			/*
-			 * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event)
-			 */
-			public void handleEvent(Event event) {
-				if (isDeactivateListenerActive) {
-					dispose();
-				}
-			}
-		};
-
-		dialogShell.addListener(SWT.Deactivate, deactivateListener);
-		isDeactivateListenerActive = true;
-		dialogShell.addShellListener(new ShellAdapter() {
-
-			@Override
-			public void shellActivated(ShellEvent e) {
-				if (e.widget == dialogShell && dialogShell.getShells().length == 0) {
-					isDeactivateListenerActive = true;
-				}
-			}
-		});
-
-		dialogShell.addControlListener(new ControlAdapter() {
-
-			@Override
-			public void controlMoved(ControlEvent e) {
-				bounds = dialogShell.getBounds();
-				if (trim != null) {
-					Point location = composite.getLocation();
-					bounds.x = bounds.x - trim.x + location.x;
-					bounds.y = bounds.y - trim.y + location.y;
-				}
-
-			}
-
-			@Override
-			public void controlResized(ControlEvent e) {
-				bounds = dialogShell.getBounds();
-				if (trim != null) {
-					Point location = composite.getLocation();
-					bounds.x = bounds.x - trim.x + location.x;
-					bounds.y = bounds.y - trim.y + location.y;
-				}
-			}
-		});
-	}
-
-	// --------------------- creating and filling the menu
-	// ---------------------------
-
-	private void createViewMenu(Composite parent) {
-		toolBar = new ToolBar(parent, SWT.FLAT);
-		ToolItem viewMenuToolItem = new ToolItem(toolBar, SWT.PUSH, 0);
-
-		GridData data = new GridData();
-		data.horizontalAlignment = GridData.END;
-		data.verticalAlignment = GridData.BEGINNING;
-		toolBar.setLayoutData(data);
-
-		// viewMenuButton.setImage(JavaPluginImages
-		// .get(JavaPluginImages.IMG_ELCL_VIEW_MENU));
-		// viewMenuButton.setDisabledImage(JavaPluginImages
-		// .get(JavaPluginImages.IMG_DLCL_VIEW_MENU));
-
-		// viewMenuButton.setToolTipText(XReferenceUIPlugin.getResourceString("XReferenceInplaceDialog.viewMenu.toolTipText"));
-		// //$NON-NLS-1$
-		viewMenuToolItem.addSelectionListener(new SelectionAdapter() {
-
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				showViewMenu();
-			}
-		});
-	}
-
-	private void showViewMenu() {
-		isDeactivateListenerActive = false;
-
-		Menu aMenu = getViewMenuManager().createContextMenu(dialogShell);
-
-		Rectangle toolbarBounds = toolBar.getBounds();
-		Point topLeft = new Point(toolbarBounds.x, toolbarBounds.y + toolbarBounds.height);
-		topLeft = dialogShell.toDisplay(topLeft);
-		aMenu.setLocation(topLeft.x, topLeft.y);
-
-		aMenu.setVisible(true);
-	}
-
-	private MenuManager getViewMenuManager() {
-		if (viewMenuManager == null) {
-			viewMenuManager = new MenuManager();
-			fillViewMenu(viewMenuManager);
-		}
-		return viewMenuManager;
-	}
-
-	private void fillViewMenu(IMenuManager viewMenu) {
-		viewMenu.add(new GroupMarker("SystemMenuStart")); //$NON-NLS-1$
-		viewMenu.add(new MoveAction());
-		viewMenu.add(new ResizeAction());
-		viewMenu.add(new RememberBoundsAction());
-		viewMenu.add(new Separator("SystemMenuEnd")); //$NON-NLS-1$
-
-		// customFiltersActionGroup.fillViewMenu(viewMenu);
-	}
-
-	// ----------- all to do with setting the bounds of the dialog -------------
-
-	/**
-	 * Initialize the shell's bounds.
-	 */
-	private void initializeBounds() {
-		// if we don't remember the dialog bounds then reset
-		// to be the defaults (behaves like inplace outline view)
-		Rectangle oldBounds = restoreBounds();
-		if (oldBounds != null) {
-			dialogShell.setBounds(oldBounds);
-			return;
-		}
-		Point size = dialogShell.computeSize(SWT.DEFAULT, SWT.DEFAULT, true);
-		Point location = getDefaultLocation(size);
-		dialogShell.setBounds(new Rectangle(location.x, location.y, size.x, size.y));
-	}
-
-	private Point getDefaultLocation(Point initialSize) {
-		Monitor monitor = dialogShell.getDisplay().getPrimaryMonitor();
-		if (parentShell != null) {
-			monitor = parentShell.getMonitor();
-		}
-
-		Rectangle monitorBounds = monitor.getClientArea();
-		Point centerPoint;
-		if (parentShell != null) {
-			centerPoint = Geometry.centerPoint(parentShell.getBounds());
-		} else {
-			centerPoint = Geometry.centerPoint(monitorBounds);
-		}
-
-		return new Point(centerPoint.x - (initialSize.x / 2), Math.max(monitorBounds.y, Math.min(centerPoint.y
-				- (initialSize.y * 2 / 3), monitorBounds.y + monitorBounds.height - initialSize.y)));
-	}
-
-	private IDialogSettings getDialogSettings() {
-		IDialogSettings settings = ContextUiPlugin.getDefault().getDialogSettings().getSection(sectionName);
-		if (settings == null) {
-			settings = ContextUiPlugin.getDefault().getDialogSettings().addNewSection(sectionName);
-		}
-
-		return settings;
-	}
-
-	private void storeBounds() {
-		IDialogSettings dialogSettings = getDialogSettings();
-
-		boolean controlRestoresSize = !dialogSettings.getBoolean(STORE_DISABLE_RESTORE_SIZE);
-		boolean controlRestoresLocation = !dialogSettings.getBoolean(STORE_DISABLE_RESTORE_LOCATION);
-
-		if (bounds == null) {
-			return;
-		}
-
-		if (controlRestoresSize) {
-			dialogSettings.put(STORE_SIZE_WIDTH, bounds.width);
-			dialogSettings.put(STORE_SIZE_HEIGHT, bounds.height);
-		}
-		if (controlRestoresLocation) {
-			dialogSettings.put(STORE_LOCATION_X, bounds.x);
-			dialogSettings.put(STORE_LOCATION_Y, bounds.y);
-		}
-	}
-
-	private Rectangle restoreBounds() {
-
-		IDialogSettings dialogSettings = getDialogSettings();
-
-		boolean controlRestoresSize = !dialogSettings.getBoolean(STORE_DISABLE_RESTORE_SIZE);
-		boolean controlRestoresLocation = !dialogSettings.getBoolean(STORE_DISABLE_RESTORE_LOCATION);
-
-		if (controlRestoresSize) {
-			try {
-				bounds.width = dialogSettings.getInt(STORE_SIZE_WIDTH);
-				bounds.height = dialogSettings.getInt(STORE_SIZE_HEIGHT);
-			} catch (NumberFormatException ex) {
-				bounds.width = -1;
-				bounds.height = -1;
-			}
-		}
-
-		if (controlRestoresLocation) {
-			try {
-				bounds.x = dialogSettings.getInt(STORE_LOCATION_X);
-				bounds.y = dialogSettings.getInt(STORE_LOCATION_Y);
-			} catch (NumberFormatException ex) {
-				bounds.x = -1;
-				bounds.y = -1;
-			}
-		}
-
-		// sanity check
-		if (bounds.x == -1 && bounds.y == -1 && bounds.width == -1 && bounds.height == -1) {
-			return null;
-		}
-
-		Rectangle maxBounds = null;
-		if (dialogShell != null && !dialogShell.isDisposed()) {
-			maxBounds = dialogShell.getDisplay().getBounds();
-		} else {
-			// fallback
-			Display display = Display.getCurrent();
-			if (display == null) {
-				display = Display.getDefault();
-			}
-			if (display != null && !display.isDisposed()) {
-				maxBounds = display.getBounds();
-			}
-		}
-
-		if (bounds.width > -1 && bounds.height > -1) {
-			if (maxBounds != null) {
-				bounds.width = Math.min(bounds.width, maxBounds.width);
-				bounds.height = Math.min(bounds.height, maxBounds.height);
-			}
-			// Enforce an absolute minimal size
-			bounds.width = Math.max(bounds.width, 30);
-			bounds.height = Math.max(bounds.height, 30);
-		}
-
-		if (bounds.x > -1 && bounds.y > -1 && maxBounds != null) {
-			bounds.x = Math.max(bounds.x, maxBounds.x);
-			bounds.y = Math.max(bounds.y, maxBounds.y);
-
-			if (bounds.width > -1 && bounds.height > -1) {
-				bounds.x = Math.min(bounds.x, maxBounds.width - bounds.width);
-				bounds.y = Math.min(bounds.y, maxBounds.height - bounds.height);
-			}
-		}
-		return bounds;
-	}
-
-	// ----------- all to do with filtering text
-
-	private Text createFilterText(Composite parent) {
-		filterText = new Text(parent, SWT.NONE);
-
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		GC gc = new GC(parent);
-		gc.setFont(parent.getFont());
-		FontMetrics fontMetrics = gc.getFontMetrics();
-		gc.dispose();
-
-		data.heightHint = Dialog.convertHeightInCharsToPixels(fontMetrics, 1);
-		data.horizontalAlignment = GridData.FILL;
-		data.verticalAlignment = GridData.CENTER;
-		filterText.setLayoutData(data);
-
-		filterText.addKeyListener(new KeyListener() {
-			public void keyPressed(KeyEvent e) {
-				if (e.keyCode == 0x0D) {
-					gotoSelectedElement();
-				}
-				if (e.keyCode == SWT.ARROW_DOWN) {
-					viewer.getTree().setFocus();
-				}
-				if (e.keyCode == SWT.ARROW_UP) {
-					viewer.getTree().setFocus();
-				}
-				if (e.character == 0x1B) {
-					dispose();
-				}
-			}
-
-			public void keyReleased(KeyEvent e) {
-				// do nothing
-			}
-		});
-
-		return filterText;
-	}
-
-	private void gotoSelectedElement() {
-		Object selectedElement = getSelectedElement();
-		if (selectedElement instanceof IStructuredSelection) {
-			// Object sel =(IStructuredSelection) selectedElement;
-			// Object data = ((TreeObject) sel).getData();
-			// if (data != null) {
-			// if (data instanceof IXReferenceNode) {
-			// XRefUIUtils.revealInEditor(((IXReferenceNode)data).getJavaElement());
-			// } else if (data instanceof IJavaElement) {
-			// XRefUIUtils.revealInEditor((IJavaElement) data);
-			// }
-			// dispose();
-			// }
-		}
-	}
-
-	private Object getSelectedElement() {
-		if (viewer == null) {
-			return null;
-		}
-		return ((IStructuredSelection) viewer.getSelection()).getFirstElement();
-	}
-
-	private void installFilter() {
-		filterText.setText(""); //$NON-NLS-1$
-
-		filterText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-//				String text = ((Text) e.widget).getText();
-//				int length = text.length();
-//				if (length > 0 && text.charAt(length - 1) != '*') {
-//					text = text + '*';
-//				}
-//				 setMatcherString(text);
-			}
-		});
-	}
-
-	protected static class NamePatternFilter extends ViewerFilter {
-
-		public NamePatternFilter() {
-			// don't have anything to initialize
-		}
-
-		@Override
-		public boolean select(Viewer selectedViewer, Object parentElement, Object element) {
-			// StringMatcher matcher = getMatcher();
-			// if (matcher == null || !(selectedViewer instanceof TreeViewer))
-			// return true;
-			TreeViewer treeViewer = (TreeViewer) selectedViewer;
-
-			// String matchName = ((ILabelProvider)
-			// treeViewer.getLabelProvider())
-			// .getText(element);
-			// if (matchName != null && matcher.match(matchName))
-			// return true;
-
-			return hasUnfilteredChild(treeViewer, element);
-		}
-
-		private boolean hasUnfilteredChild(TreeViewer treeViewer, Object element) {
-			// if (element instanceof TreeParent) {
-			// Object[] children = ((ITreeContentProvider) viewer
-			// .getContentProvider()).getChildren(element);
-			// for (int i = 0; i < children.length; i++)
-			// if (select(viewer, element, children[i]))
-			// return true;
-			// }
-			return false;
-		}
-	}
-
-	// private StringMatcher getMatcher() {
-	// return stringMatcher;
-	// }
-
-	/**
-	 * Static inner class which sets the layout for the inplace view. Without this, the inplace view will not be
-	 * populated.
-	 * 
-	 * @see org.eclipse.jdt.internal.ui.text.AbstractInformationControl
-	 */
-	private static class BorderFillLayout extends Layout {
-
-		/** The border widths. */
-		final int fBorderSize;
-
-		/**
-		 * Creates a fill layout with a border.
-		 */
-		public BorderFillLayout(int borderSize) {
-			if (borderSize < 0) {
-				throw new IllegalArgumentException();
-			}
-			fBorderSize = borderSize;
-		}
-
-		/**
-		 * Returns the border size.
-		 */
-		public int getBorderSize() {
-			return fBorderSize;
-		}
-
-		@Override
-		protected Point computeSize(Composite composite, int wHint, int hHint, boolean flushCache) {
-
-			Control[] children = composite.getChildren();
-			Point minSize = new Point(0, 0);
-
-			if (children != null) {
-				for (Control element : children) {
-					Point size = element.computeSize(wHint, hHint, flushCache);
-					minSize.x = Math.max(minSize.x, size.x);
-					minSize.y = Math.max(minSize.y, size.y);
-				}
-			}
-
-			minSize.x += fBorderSize * 2 + 3;
-			minSize.y += fBorderSize * 2;
-
-			return minSize;
-		}
-
-		@Override
-		protected void layout(Composite composite, boolean flushCache) {
-
-			Control[] children = composite.getChildren();
-			Point minSize = new Point(composite.getClientArea().width, composite.getClientArea().height);
-
-			if (children != null) {
-				for (Control child : children) {
-					child.setSize(minSize.x - fBorderSize * 2, minSize.y - fBorderSize * 2);
-					child.setLocation(fBorderSize, fBorderSize);
-				}
-			}
-		}
-	}
-
-	// ---------- shuts down the dialog ---------------
-
-	/**
-	 * Close the dialog
-	 */
-	public void close() {
-		storeBounds();
-		toolBar = null;
-		viewMenuManager = null;
-	}
-
-	public void dispose() {
-		filterText = null;
-		if (dialogShell != null) {
-			if (!dialogShell.isDisposed()) {
-				dialogShell.dispose();
-			}
-			dialogShell = null;
-			parentShell = null;
-			viewer = null;
-			composite = null;
-		}
-	}
-
-	// ------------------ moving actions --------------------------
-
-	/**
-	 * Move action for the dialog.
-	 */
-	private class MoveAction extends Action {
-
-		MoveAction() {
-			super("move", IAction.AS_PUSH_BUTTON); //$NON-NLS-1$
-		}
-
-		@Override
-		public void run() {
-			performTrackerAction(SWT.NONE);
-			isDeactivateListenerActive = true;
-		}
-
-	}
-
-	/**
-	 * Remember bounds action for the dialog.
-	 */
-	private class RememberBoundsAction extends Action {
-
-		RememberBoundsAction() {
-			super("remember-bounds", IAction.AS_CHECK_BOX); //$NON-NLS-1$
-			setChecked(!getDialogSettings().getBoolean(STORE_DISABLE_RESTORE_LOCATION));
-		}
-
-		@Override
-		public void run() {
-			IDialogSettings settings = getDialogSettings();
-
-			boolean newValue = !isChecked();
-			// store new value
-			settings.put(STORE_DISABLE_RESTORE_LOCATION, newValue);
-			settings.put(STORE_DISABLE_RESTORE_SIZE, newValue);
-
-			isDeactivateListenerActive = true;
-		}
-	}
-
-	/**
-	 * Resize action for the dialog.
-	 */
-	private class ResizeAction extends Action {
-
-		ResizeAction() {
-			super("resize", IAction.AS_PUSH_BUTTON); //$NON-NLS-1$
-		}
-
-		@Override
-		public void run() {
-			performTrackerAction(SWT.RESIZE);
-			isDeactivateListenerActive = true;
-		}
-
-	}
-
-	/**
-	 * Perform the requested tracker action (resize or move).
-	 * 
-	 * @param style
-	 *            The track style (resize or move).
-	 */
-	private void performTrackerAction(int style) {
-		Tracker tracker = new Tracker(dialogShell.getDisplay(), style);
-		tracker.setStippled(true);
-		Rectangle[] r = new Rectangle[] { dialogShell.getBounds() };
-		tracker.setRectangles(r);
-
-		if (tracker.open()) {
-			dialogShell.setBounds(tracker.getRectangles()[0]);
-
-		}
-	}
-
-	// -------------------- all to do with the contents of the view
-	// --------------------
-
-	private void createContents() {
-//		if (lastSelection != null && workbenchPart != null) {
-// IXReferenceAdapter xra =
-// XRefUIUtils.getXRefAdapterForSelection(workbenchPart,lastSelection);
-// if (xra != null) {
-// viewer.setInput(xra);
-// }
-//		}
-	}
-
-	/**
-	 * @param lastSelection
-	 *            The lastSelection to set.
-	 */
-	public void setLastSelection(ISelection lastSelection) {
-//		this.lastSelection = lastSelection;
-	}
-
-	/**
-	 * @param workbenchPart
-	 *            The workbenchPart to set.
-	 */
-	public void setWorkbenchPart(IWorkbenchPart workbenchPart) {
-//		this.workbenchPart = workbenchPart;
-	}
-
-	public boolean isOpen() {
-		return dialogShell != null;
-	}
-}
-
-// private void setMatcherString(String pattern) {
-// if (pattern.length() == 0) {
-// stringMatcher = null;
-// } else {
-// boolean ignoreCase = pattern.toLowerCase(Locale.ENGLISH).equals(pattern);
-// stringMatcher = new StringMatcher(pattern, ignoreCase, false);
-// }
-// stringMatcherUpdated();
-// }
-
-// private void stringMatcherUpdated() {
-// // refresh viewer to refilter
-// viewer.getControl().setRedraw(false);
-// viewer.refresh();
-// viewer.expandAll();
-// selectFirstMatch();
-// viewer.getControl().setRedraw(true);
-// }
-
-// private void selectFirstMatch() {
-// Tree tree = viewer.getTree();
-// Object element = findElement(tree.getItems());
-// if (element != null)
-// viewer.setSelection(new StructuredSelection(element), true);
-// else
-// viewer.setSelection(StructuredSelection.EMPTY);
-// }
-
-// private Object findElement(TreeItem[] items) {
-// for (int i = 0; i < items.length; i++) {
-// Object o = items[i].getData();
-// TreeParent treeParent = null;
-// TreeObject treeObject = null;
-// if (o instanceof TreeParent) {
-// treeParent = (TreeParent) o;
-// } else if (o instanceof TreeObject) {
-// treeObject = (TreeObject) o;
-// }
-// Object element = null;
-// if (treeParent == null) {
-// element = treeObject;
-// } else {
-// element = treeParent;
-// }
-// if (stringMatcher == null)
-// return element;
-//
-// if (element != null) {
-// String label = labelProvider.getText(element);
-// if (stringMatcher.match(label))
-// return element;
-// }
-//
-// element = findElement(items[i].getItems());
-// if (element != null)
-// return element;
-// }
-// return null;
-// }
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/ActiveSearchView.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/ActiveSearchView.java
deleted file mode 100644
index f498be5..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/ActiveSearchView.java
+++ /dev/null
@@ -1,383 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.views;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionManager;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.util.LocalSelectionTransfer;
-import org.eclipse.jface.util.TransferDragSourceListener;
-import org.eclipse.jface.viewers.DecoratingLabelProvider;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.context.core.AbstractContextListener;
-import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
-import org.eclipse.mylyn.context.core.ContextCore;
-import org.eclipse.mylyn.context.core.IInteractionContext;
-import org.eclipse.mylyn.context.core.IInteractionElement;
-import org.eclipse.mylyn.context.ui.AbstractContextUiBridge;
-import org.eclipse.mylyn.internal.context.core.AbstractRelationProvider;
-import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
-import org.eclipse.mylyn.internal.context.core.IRelationsListener;
-import org.eclipse.mylyn.internal.context.ui.ActiveViewSelectionDragAdapter;
-import org.eclipse.mylyn.internal.context.ui.ContextUiImages;
-import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
-import org.eclipse.mylyn.internal.context.ui.DoiOrderSorter;
-import org.eclipse.mylyn.internal.context.ui.views.ActiveViewDelegatingDragAdapter;
-import org.eclipse.mylyn.internal.context.ui.views.ContextContentProvider;
-import org.eclipse.mylyn.internal.context.ui.views.ContextNodeOpenListener;
-import org.eclipse.mylyn.internal.sandbox.ui.DelegatingContextLabelProvider;
-import org.eclipse.mylyn.internal.sandbox.ui.actions.LinkActiveSearchWithEditorAction;
-import org.eclipse.mylyn.internal.sandbox.ui.actions.ShowQualifiedNamesAction;
-import org.eclipse.mylyn.internal.sandbox.ui.actions.ToggleRelationshipProviderAction;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.ViewPart;
-
-/**
- * TODO: this view won't work properly if visible on initial startup, due to the relation providers not being available
- * as a result of lazy loading.
- * 
- * @author Mik Kersten
- */
-public class ActiveSearchView extends ViewPart {
-
-	private final class ContextListener extends AbstractContextListener implements IRelationsListener {
-		@Override
-		public void interestChanged(List<IInteractionElement> nodes) {
-			refresh(nodes.get(nodes.size() - 1), false);
-		}
-
-		@Override
-		public void contextActivated(IInteractionContext taskscape) {
-			refreshRelatedElements();
-			refresh(null, true);
-		}
-
-		@Override
-		public void contextDeactivated(IInteractionContext taskscape) {
-			refresh(null, true);
-		}
-
-		@Override
-		public void contextCleared(IInteractionContext context) {
-			refresh(null, true);
-		}
-
-		@Override
-		public void landmarkAdded(IInteractionElement node) {
-			refresh(null, true);
-		}
-
-		@Override
-		public void landmarkRemoved(IInteractionElement node) {
-			refresh(null, true);
-		}
-
-		public void relationsChanged(IInteractionElement node) {
-			refresh(node, true);
-		}
-
-		@Override
-		public void elementsDeleted(List<IInteractionElement> elements) {
-			refresh(null, true);
-		}
-	}
-
-	private static final String STOP_JOBS_LABEL = "Stop Active Search Jobs";
-
-	public static final String ID = "org.eclipse.mylyn.ui.views.active.search";
-
-	private TreeViewer viewer;
-
-	private final List<ToggleRelationshipProviderAction> relationshipProviderActions = new ArrayList<ToggleRelationshipProviderAction>();
-
-	private final DelegatingContextLabelProvider labelProvider = new DelegatingContextLabelProvider();
-
-	public void refreshRelatedElements() {
-		try {
-			for (AbstractRelationProvider provider : ContextCorePlugin.getDefault().getRelationProviders()) {
-				List<AbstractRelationProvider> providerList = new ArrayList<AbstractRelationProvider>();
-				providerList.add(provider);
-				updateDegreesOfSeparation(providerList, provider.getCurrentDegreeOfSeparation());
-			}
-		} catch (Throwable t) {
-			StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
-					"Could not refresh related elements", t));
-		}
-	}
-
-	/**
-	 * For testing.
-	 */
-	private boolean syncExecForTesting = true;
-
-	private final AbstractContextListener REFRESH_UPDATE_LISTENER = new ContextListener();
-
-	public static ActiveSearchView getFromActivePerspective() {
-		if (PlatformUI.getWorkbench() == null) {
-			return null;
-		}
-		IWorkbenchPage activePage = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-		if (activePage == null) {
-			return null;
-		}
-		IViewPart view = activePage.findView(ID);
-		if (view instanceof ActiveSearchView) {
-			return (ActiveSearchView) view;
-		}
-		return null;
-	}
-
-	public ActiveSearchView() {
-		ContextCore.getContextManager().addListener(REFRESH_UPDATE_LISTENER);
-		for (AbstractRelationProvider provider : ContextCorePlugin.getDefault().getRelationProviders()) {
-			provider.setEnabled(true);
-		}
-		refreshRelatedElements();
-	}
-
-	public void updateDegreesOfSeparation(Collection<AbstractRelationProvider> providers, int degreeOfSeparation) {
-		for (AbstractRelationProvider provider : providers) {
-			updateDegreeOfSeparation(provider, degreeOfSeparation);
-		}
-	}
-
-	public void updateDegreeOfSeparation(AbstractRelationProvider provider, int degreeOfSeparation) {
-		ContextCorePlugin.getContextManager().resetLandmarkRelationshipsOfKind(provider.getId());
-		ContextUiPlugin.getDefault().getPreferenceStore().setValue(provider.getGenericId(), degreeOfSeparation);
-		provider.setDegreeOfSeparation(degreeOfSeparation);
-		for (IInteractionElement element : ContextCore.getContextManager().getActiveContext().getInteresting()) {
-			if (element.getInterest().isLandmark()) {
-				provider.landmarkAdded(element);
-			}
-		}
-	}
-
-	@Override
-	public void dispose() {
-		super.dispose();
-		ContextCore.getContextManager().removeListener(REFRESH_UPDATE_LISTENER);
-	}
-
-	/**
-	 * fix for bug 109235
-	 * 
-	 * @param node
-	 * @param updateLabels
-	 */
-	void refresh(final IInteractionElement node, final boolean updateLabels) {
-		if (!syncExecForTesting) { // for testing
-			// if (viewer != null && !viewer.getTree().isDisposed()) {
-			// internalRefresh(node, updateLabels);
-			// }
-			PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
-				public void run() {
-					try {
-						internalRefresh(node, updateLabels);
-					} catch (Throwable t) {
-						StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
-								"Refresh of active search failed", t));
-					}
-				}
-			});
-		} else {
-			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					try {
-						internalRefresh(node, updateLabels);
-					} catch (Throwable t) {
-						StatusHandler.log(new Status(IStatus.ERROR, ContextUiPlugin.ID_PLUGIN,
-								"Refresh of active search failed", t));
-					}
-				}
-			});
-		}
-	}
-
-	private void internalRefresh(final IInteractionElement node, boolean updateLabels) {
-		Object toRefresh = null;
-		if (node != null) {
-			AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(node.getContentType());
-			toRefresh = bridge.getObjectForHandle(node.getHandleIdentifier());
-		}
-		if (viewer != null && !viewer.getTree().isDisposed()) {
-			viewer.getControl().setRedraw(false);
-			if (toRefresh != null && containsNode(viewer.getTree(), toRefresh)) {
-				viewer.refresh(toRefresh, updateLabels);
-			} else if (node == null) {
-				viewer.refresh();
-			}
-			viewer.expandToLevel(3);
-			viewer.getControl().setRedraw(true);
-		}
-	}
-
-	private boolean containsNode(Tree tree, Object object) {
-		boolean contains = false;
-		for (int i = 0; i < tree.getItems().length; i++) {
-			TreeItem item = tree.getItems()[i];
-			if (object.equals(item.getData())) {
-				contains = true;
-			}
-		}
-		return contains;
-	}
-
-	private void initDrop() {
-		Transfer[] types = new Transfer[] { LocalSelectionTransfer.getTransfer() };
-		viewer.addDropSupport(DND.DROP_MOVE, types, new ActiveViewDropAdapter(viewer));
-	}
-
-	private void initDrag() {
-		int ops = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK;
-		Transfer[] transfers = new Transfer[] { LocalSelectionTransfer.getTransfer() };
-		TransferDragSourceListener[] dragListeners = new TransferDragSourceListener[] { new ActiveViewSelectionDragAdapter(
-				viewer) };//, new ActiveViewResourceDragAdapter(viewer) };
-		viewer.addDragSupport(ops, transfers, new ActiveViewDelegatingDragAdapter(dragListeners));
-	}
-
-	/**
-	 * This is a callback that will allow us to create the viewer and initialize it.
-	 */
-	@Override
-	public void createPartControl(Composite parent) {
-
-		viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-		viewer.setUseHashlookup(true);
-		viewer.setContentProvider(new ContextContentProvider(viewer.getTree(), this.getViewSite(), true));
-		// viewer.setLabelProvider(labelProvider);
-		viewer.setLabelProvider(new DecoratingLabelProvider(labelProvider, PlatformUI.getWorkbench()
-				.getDecoratorManager()
-				.getLabelDecorator()));
-		viewer.setSorter(new DoiOrderSorter());
-		viewer.setInput(getViewSite());
-		hookContextMenu();
-		initDrop();
-		initDrag();
-		getSite().setSelectionProvider(getViewer());
-
-		viewer.addOpenListener(new ContextNodeOpenListener(viewer));
-
-		contributeToActionBars();
-		viewer.expandToLevel(2);
-	}
-
-	private void hookContextMenu() {
-		MenuManager menuMgr = new MenuManager("#PopupMenu");
-		menuMgr.setRemoveAllWhenShown(true);
-		menuMgr.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				ActiveSearchView.this.fillContextMenu(manager);
-			}
-		});
-		Menu menu = menuMgr.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-		getSite().registerContextMenu(menuMgr, viewer);
-	}
-
-	private void contributeToActionBars() {
-		IActionBars bars = getViewSite().getActionBars();
-		fillLocalPullDown(bars.getMenuManager());
-		fillLocalToolBar(bars.getToolBarManager());
-	}
-
-	private void fillContextMenu(IMenuManager manager) {
-		manager.add(new Separator());
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-	private void fillLocalToolBar(IToolBarManager manager) {
-		IAction qualifyElements = new ShowQualifiedNamesAction(this);
-		manager.add(qualifyElements);
-		fillActions(manager);
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-	private void fillLocalPullDown(IMenuManager manager) {
-		fillActions(manager);
-		IAction stopAction = new Action() {
-			@Override
-			public void run() {
-				for (AbstractRelationProvider provider : ContextCorePlugin.getDefault().getRelationProviders()) {
-					provider.stopAllRunningJobs();
-				}
-			}
-		};
-		stopAction.setToolTipText(STOP_JOBS_LABEL);
-		stopAction.setText(STOP_JOBS_LABEL);
-		stopAction.setImageDescriptor(ContextUiImages.STOP_SEARCH);
-		manager.add(stopAction);
-		manager.add(new Separator());
-		manager.add(new LinkActiveSearchWithEditorAction());
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-	private void fillActions(IContributionManager manager) {
-		List<AbstractContextUiBridge> bridges = ContextUiPlugin.getDefault().getUiBridges();
-		for (AbstractContextUiBridge uiBridge : bridges) {
-			Set<AbstractRelationProvider> providers = ContextCorePlugin.getDefault().getRelationProviders(
-					uiBridge.getContentType());
-			if (providers != null && providers.size() > 0) {
-				ToggleRelationshipProviderAction action = new ToggleRelationshipProviderAction(this, providers,
-						uiBridge);
-				relationshipProviderActions.add(action);
-				manager.add(action);
-			}
-		}
-	}
-
-	/**
-	 * Passing the focus request to the viewer's control.
-	 */
-	@Override
-	public void setFocus() {
-		viewer.refresh();
-		viewer.getControl().setFocus();
-		// TODO: foo
-	}
-
-	public TreeViewer getViewer() {
-		return viewer;
-	}
-
-	/**
-	 * Set to false for testing
-	 */
-	public void setSyncExecForTesting(boolean asyncRefreshMode) {
-		this.syncExecForTesting = asyncRefreshMode;
-	}
-
-	public void setQualifiedNameMode(boolean qualifiedNameMode) {
-		DelegatingContextLabelProvider.setQualifyNamesMode(qualifiedNameMode);
-		refresh(null, true);
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/ActiveViewDropAdapter.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/ActiveViewDropAdapter.java
deleted file mode 100644
index cf87986..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/ActiveViewDropAdapter.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.views;
-
-import org.eclipse.jface.util.LocalSelectionTransfer;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerDropAdapter;
-import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
-import org.eclipse.mylyn.context.core.ContextCore;
-import org.eclipse.mylyn.context.core.IInteractionElement;
-import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
-import org.eclipse.mylyn.internal.context.ui.UiUtil;
-import org.eclipse.swt.dnd.TransferData;
-
-/**
- * @author Mik Kersten
- */
-public class ActiveViewDropAdapter extends ViewerDropAdapter {
-
-	public static final String ID_MANIPULATION = "org.eclipse.mylyn.ui.views.active.drop.landmark";
-
-	public ActiveViewDropAdapter(Viewer viewer) {
-		super(viewer);
-		setFeedbackEnabled(false);
-	}
-
-	@Override
-	public boolean performDrop(Object data) {
-		if (data instanceof StructuredSelection) {
-			Object firstElement = ((StructuredSelection) data).getFirstElement();
-			AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(firstElement);
-			String handle = bridge.getHandleIdentifier(firstElement);
-			IInteractionElement node = ContextCore.getContextManager().getElement(handle);
-			boolean manipulated = ContextCorePlugin.getContextManager().manipulateInterestForElement(node, true, true,
-					false, ID_MANIPULATION);
-			if (!manipulated) {
-				UiUtil.displayInterestManipulationFailure();
-			}
-		}
-		return false; // to ensure that the sender doesn't treat this as a
-		// move
-	}
-
-	@Override
-	public boolean validateDrop(Object targetObject, int operation, TransferData transferType) {
-		return LocalSelectionTransfer.getTransfer().isSupportedType(transferType);
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/ContextHierarchyView.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/ContextHierarchyView.java
deleted file mode 100644
index 1828d3e..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/ContextHierarchyView.java
+++ /dev/null
@@ -1,401 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.views;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jdt.core.IJavaElement;
-import org.eclipse.jdt.core.IType;
-import org.eclipse.jdt.core.ITypeHierarchy;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.util.TransferDragSourceListener;
-import org.eclipse.jface.viewers.DecoratingLabelProvider;
-import org.eclipse.jface.viewers.IOpenListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.OpenEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.context.core.AbstractContextListener;
-import org.eclipse.mylyn.context.core.ContextCore;
-import org.eclipse.mylyn.context.core.IInteractionContext;
-import org.eclipse.mylyn.context.core.IInteractionElement;
-import org.eclipse.mylyn.internal.context.ui.ActiveViewSelectionDragAdapter;
-import org.eclipse.mylyn.internal.context.ui.views.ActiveViewDelegatingDragAdapter;
-import org.eclipse.mylyn.internal.java.ui.JavaStructureBridge;
-import org.eclipse.mylyn.internal.java.ui.JavaUiBridgePlugin;
-import org.eclipse.mylyn.internal.sandbox.ui.JavaContextLabelProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.ResourceTransfer;
-import org.eclipse.ui.part.ViewPart;
-import org.eclipse.ui.views.navigator.LocalSelectionTransfer;
-
-/**
- * @author Mik Kersten
- */
-public class ContextHierarchyView extends ViewPart {
-
-	public static final String ID = "org.eclipse.mylyn.ui.views.active.hierarchy";
-
-	private final TreeParent root = new TreeParent("<no hierarchy>");
-
-	private TreeViewer viewer;
-
-	private final Map<String, TreeParent> nodeMap = new HashMap<String, TreeParent>();
-
-	final AbstractContextListener MODEL_LISTENER = new AbstractContextListener() {
-
-		@Override
-		public void contextActivated(IInteractionContext taskscape) {
-			refreshHierarchy();
-		}
-
-		@Override
-		public void contextDeactivated(IInteractionContext taskscape) {
-			refreshHierarchy();
-		}
-
-		@Override
-		public void contextCleared(IInteractionContext context) {
-			refreshHierarchy();
-		}
-
-		@Override
-		public void landmarkAdded(IInteractionElement element) {
-			refreshHierarchy();
-		}
-
-		@Override
-		public void landmarkRemoved(IInteractionElement element) {
-			refreshHierarchy();
-		}
-	};
-
-	class ViewContentProvider implements IStructuredContentProvider, ITreeContentProvider {
-
-		public void inputChanged(Viewer v, Object oldInput, Object newInput) {
-			// ignore
-		}
-
-		public void dispose() {
-			// don't care when we are disposed
-		}
-
-		public Object[] getElements(Object parent) {
-			Object[] types = new Object[root.getChildren().length];
-			for (int i = 0; i < root.getChildren().length; i++) {
-				types[i] = root.getChildren()[i].getElement();
-			}
-			return types;
-		}
-
-		public Object getParent(Object child) {
-			return null;
-			// return ((TreeParent)child).getParent();
-		}
-
-		public Object[] getChildren(Object parent) {
-			if (parent instanceof IType) {
-				TreeParent node = nodeMap.get(((IType) parent).getHandleIdentifier());
-				if (node != null) {
-					Object[] types = new Object[node.getChildren().length];
-					for (int i = 0; i < node.getChildren().length; i++) {
-						types[i] = node.getChildren()[i].getElement();
-					}
-					return types;
-				}
-			}
-			// if (parent instanceof TreeParent) {
-			// return ((TreeParent)parent).getChildren();
-			// }
-			return new Object[0];
-		}
-
-		public boolean hasChildren(Object parent) {
-			if (parent instanceof IType) {
-				TreeParent node = nodeMap.get(((IType) parent).getHandleIdentifier());
-				if (node != null) {
-					return node.getChildren().length > 0;
-				}
-			}
-			return false;
-		}
-	}
-
-	private void refreshHierarchy() {
-		refreshHierarchy(true);
-	}
-
-	/**
-	 * Public for testing.
-	 */
-	public void refreshHierarchy(boolean asyncRefreshMode) {
-		try {
-			if (root != null && root.getChildren().length > 0) {
-				root.removeAllChildren();
-			}
-			nodeMap.clear();
-			Set<IInteractionElement> landmarks = ContextCore.getContextManager().getActiveLandmarks();
-			for (IInteractionElement node : landmarks) {
-				IJavaElement element = null;
-				if (node.getContentType().equals(JavaStructureBridge.CONTENT_TYPE)) {
-					element = JavaCore.create(node.getHandleIdentifier());
-				}
-				if (element != null && element instanceof IType && element.exists()) {
-					IType type = (IType) element;
-					ITypeHierarchy hierarchy = type.newSupertypeHierarchy(null);
-					if (hierarchy != null) {
-						IType[] supertypes = hierarchy.getAllSuperclasses(type);
-						List<IType> hierarchyTypes = new ArrayList<IType>(Arrays.asList(supertypes));
-						Collections.reverse(hierarchyTypes);
-						hierarchyTypes.add(type);
-						addHierarchy(root, hierarchyTypes);
-					}
-				}
-			}
-
-			if (!asyncRefreshMode) { // for testing
-				refreshViewer();
-			} else {
-				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-					public void run() {
-						refreshViewer();
-					}
-				});
-			}
-		} catch (Throwable t) {
-			StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN, "Could not update viewer", t));
-		}
-	}
-
-	private void addHierarchy(TreeParent node, List<IType> hierarchyTypes) {
-		if (hierarchyTypes.isEmpty()) {
-			return;
-		}
-		IType type = hierarchyTypes.get(0);
-		if (!type.equals(node.getElement())) {
-			TreeParent newNode = nodeMap.get(type.getHandleIdentifier());
-			if (newNode == null) {
-				newNode = new TreeParent(type);
-				nodeMap.put(type.getHandleIdentifier(), newNode);
-				node.addChild(newNode);
-			}
-			addHierarchy(newNode, hierarchyTypes.subList(1, hierarchyTypes.size()));
-		}
-	}
-
-	private void refreshViewer() {
-		try {
-			if (viewer != null && !viewer.getTree().isDisposed()) {
-				viewer.getControl().setRedraw(false);
-				viewer.refresh();
-				viewer.expandAll();
-				viewer.getControl().setRedraw(true);
-			}
-		} catch (Throwable t) {
-			StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN, "Could not update viewer", t));
-		}
-	}
-
-	@Override
-	public void createPartControl(Composite parent) {
-		try {
-			ContextCore.getContextManager().addListener(MODEL_LISTENER);
-			refreshHierarchy();
-
-			viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-			viewer.setContentProvider(new ViewContentProvider());
-			viewer.setLabelProvider(new DecoratingLabelProvider(JavaContextLabelProvider.createJavaUiLabelProvider(),
-					PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator()));
-			viewer.setInput(getViewSite());
-
-			viewer.addOpenListener(new IOpenListener() {
-				public void open(OpenEvent event) {
-					StructuredSelection selection = (StructuredSelection) viewer.getSelection();
-					if (selection.getFirstElement() != null && selection.getFirstElement() instanceof IJavaElement) {
-						IJavaElement element = (IJavaElement) selection.getFirstElement();
-						try {
-							IEditorPart part = JavaUI.openInEditor(element);
-							JavaUI.revealInEditor(part, element);
-						} catch (Throwable t) {
-							StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN,
-									"Could not open type", t));
-						}
-					}
-				}
-			});
-			hookContextMenu();
-			contributeToActionBars();
-
-			initDrop();
-			initDrag();
-			getSite().setSelectionProvider(getViewer());
-		} catch (Throwable t) {
-			StatusHandler.log(new Status(IStatus.ERROR, JavaUiBridgePlugin.ID_PLUGIN, "Create failed", t));
-		}
-	}
-
-	private void initDrop() {
-		Transfer[] types = new Transfer[] { LocalSelectionTransfer.getInstance() };
-		viewer.addDropSupport(DND.DROP_MOVE, types, new ActiveViewDropAdapter(viewer));
-	}
-
-	private void initDrag() {
-		int ops = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK;
-		Transfer[] transfers = new Transfer[] { LocalSelectionTransfer.getInstance(), ResourceTransfer.getInstance() };
-		TransferDragSourceListener[] dragListeners = new TransferDragSourceListener[] { new ActiveViewSelectionDragAdapter(
-				viewer) };//, new ActiveViewResourceDragAdapter(viewer) };
-		viewer.addDragSupport(ops, transfers, new ActiveViewDelegatingDragAdapter(dragListeners));
-	}
-
-	private void hookContextMenu() {
-		MenuManager menuMgr = new MenuManager("#PopupMenu");
-		menuMgr.setRemoveAllWhenShown(true);
-		menuMgr.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				ContextHierarchyView.this.fillContextMenu(manager);
-			}
-		});
-		Menu menu = menuMgr.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-		getSite().registerContextMenu(menuMgr, viewer);
-	}
-
-	private void contributeToActionBars() {
-		IActionBars bars = getViewSite().getActionBars();
-		fillLocalPullDown(bars.getMenuManager());
-		fillLocalToolBar(bars.getToolBarManager());
-	}
-
-	private void fillLocalPullDown(IMenuManager manager) {
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-	private void fillContextMenu(IMenuManager manager) {
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-	private void fillLocalToolBar(IToolBarManager manager) {
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-	/**
-	 * Passing the focus request to the viewer's control.
-	 */
-	@Override
-	public void setFocus() {
-		viewer.getControl().setFocus();
-	}
-
-	public TreeViewer getViewer() {
-		return viewer;
-	}
-}
-
-class TreeParent implements IAdaptable {
-	protected IJavaElement element;
-
-	protected TreeParent parent;
-
-	private final List<TreeParent> children;
-
-	private String relationshipName;
-
-	public TreeParent(IJavaElement element) {
-		this.element = element;
-		children = new ArrayList<TreeParent>();
-	}
-
-	public TreeParent(String relationshipName) {
-		this.relationshipName = relationshipName;
-		children = new ArrayList<TreeParent>();
-	}
-
-	public String getName() {
-		return element.getElementName();
-	}
-
-	public void setParent(TreeParent parent) {
-		this.parent = parent;
-	}
-
-	public TreeParent getParent() {
-		return parent;
-	}
-
-	@SuppressWarnings("unchecked")
-	public Object getAdapter(Class key) {
-		return element;
-	}
-
-	public IJavaElement getElement() {
-		return element;
-	}
-
-	@Override
-	public String toString() {
-		if (getElement() == null) {
-			return relationshipName;
-		} else {
-			return getName();
-		}
-	}
-
-	public void addChild(TreeParent child) {
-		children.add(child);
-		child.setParent(this);
-	}
-
-	public void removeAllChildren() {
-		for (TreeParent node : children) {
-			if (node != null) {
-				node.setParent(null);
-			}
-		}
-		children.clear();
-	}
-
-	public void removeChild(TreeParent child) {
-		children.remove(child);
-		child.setParent(null);
-	}
-
-	public TreeParent[] getChildren() {
-		return children.toArray(new TreeParent[children.size()]);
-	}
-
-	public boolean hasChildren() {
-		return children.size() > 0;
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/RelatedElementsPopupDialog.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/RelatedElementsPopupDialog.java
deleted file mode 100644
index 05a25a8..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/RelatedElementsPopupDialog.java
+++ /dev/null
@@ -1,831 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.views;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.PopupDialog;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jface.text.IInformationControl;
-import org.eclipse.jface.text.IInformationControlExtension;
-import org.eclipse.jface.text.IInformationControlExtension2;
-import org.eclipse.jface.viewers.DecoratingLabelProvider;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.context.core.AbstractContextListener;
-import org.eclipse.mylyn.context.core.AbstractContextStructureBridge;
-import org.eclipse.mylyn.context.core.ContextCore;
-import org.eclipse.mylyn.context.core.IInteractionContext;
-import org.eclipse.mylyn.context.core.IInteractionElement;
-import org.eclipse.mylyn.context.core.IInteractionRelation;
-import org.eclipse.mylyn.context.ui.ContextUi;
-import org.eclipse.mylyn.internal.context.core.AbstractRelationProvider;
-import org.eclipse.mylyn.internal.context.core.ContextCorePlugin;
-import org.eclipse.mylyn.internal.context.ui.ContextUiImages;
-import org.eclipse.mylyn.internal.context.ui.ContextUiPlugin;
-import org.eclipse.mylyn.internal.context.ui.DoiOrderSorter;
-import org.eclipse.mylyn.internal.context.ui.views.ContextContentProvider;
-import org.eclipse.mylyn.internal.context.ui.views.QuickOutlinePatternAndInterestFilter;
-import org.eclipse.mylyn.internal.sandbox.ui.DelegatingContextLabelProvider;
-import org.eclipse.mylyn.internal.sandbox.ui.SandboxUiPlugin;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.FocusListener;
-import org.eclipse.swt.events.KeyEvent;
-import org.eclipse.swt.events.KeyListener;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.internal.misc.StringMatcher;
-
-/**
- * Derived from {@link QuickOutlinePopupDialog}
- * 
- * @author Tracy Mew
- */
-public class RelatedElementsPopupDialog extends PopupDialog implements IInformationControl,
-		IInformationControlExtension, IInformationControlExtension2, DisposeListener {
-
-	public static final String ID = "org.eclipse.mylyn.context.ui.navigator.context.related";
-
-	private TreeViewer viewer;
-
-	private Text fFilterText;
-
-	private StringMatcher fStringMatcher;
-
-	private QuickOutlinePatternAndInterestFilter namePatternFilter;
-
-	private final DelegatingContextLabelProvider labelProvider = new DelegatingContextLabelProvider();
-
-	private final DegreeZeroAction zero = new DegreeZeroAction();
-
-	private final DegreeOneAction one = new DegreeOneAction();
-
-	private final DegreeTwoAction two = new DegreeTwoAction();
-
-	private final DegreeThreeAction three = new DegreeThreeAction();
-
-	private final DegreeFourAction four = new DegreeFourAction();
-
-	private final DegreeFiveAction five = new DegreeFiveAction();
-
-	private int degree = 2;
-
-	// TODO e3.4 move to new api
-	@SuppressWarnings("deprecation")
-	public RelatedElementsPopupDialog(Shell parent, int shellStyle) {
-		super(parent, shellStyle, true, true, true, true, null, "Context Search");
-		ContextCore.getContextManager().addListener(REFRESH_UPDATE_LISTENER);
-		for (AbstractRelationProvider provider : ContextCorePlugin.getDefault().getRelationProviders()) {
-			provider.setEnabled(true);
-		}
-		create();
-	}
-
-	/**
-	 * For testing.
-	 */
-	private boolean syncExecForTesting = true;
-
-	private final AbstractContextListener REFRESH_UPDATE_LISTENER = new AbstractContextListener() {
-
-		@Override
-		public void interestChanged(List<IInteractionElement> nodes) {
-			refresh(nodes.get(nodes.size() - 1), false);
-		}
-
-		@Override
-		public void contextActivated(IInteractionContext taskscape) {
-			refreshRelatedElements();
-			refresh(null, true);
-		}
-
-		@Override
-		public void contextDeactivated(IInteractionContext taskscape) {
-			refresh(null, true);
-		}
-
-		@Override
-		public void contextCleared(IInteractionContext context) {
-			refresh(null, true);
-		}
-
-		@Override
-		public void landmarkAdded(IInteractionElement node) {
-			refresh(null, true);
-		}
-
-		@Override
-		public void landmarkRemoved(IInteractionElement node) {
-			refresh(null, true);
-		}
-
-		public void relationsChanged(IInteractionElement node) {
-			refresh(node, true);
-		}
-
-		@Override
-		public void elementsDeleted(List<IInteractionElement> elements) {
-			refresh(null, true);
-		}
-	};
-
-	@Override
-	protected Control createDialogArea(Composite parent) {
-		createViewer(parent);
-		createUIListenersTreeViewer();
-		addDisposeListener(this);
-
-		return viewer.getControl();
-	}
-
-	private void createViewer(Composite parent) {
-		viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-
-		viewer.setUseHashlookup(true);
-
-		viewer.setContentProvider(new ContextContentProvider(viewer.getTree(), parent.getShell(), true));
-
-		viewer.setLabelProvider(new DecoratingLabelProvider(labelProvider, PlatformUI.getWorkbench()
-				.getDecoratorManager()
-				.getLabelDecorator()));
-
-		viewer.setSorter(new DoiOrderSorter());
-
-		try {
-			viewer.getControl().setRedraw(false);
-			viewer.setInput(getShell());
-		} finally {
-			refreshRelatedElements();
-			viewer.getControl().setRedraw(true);
-		}
-	}
-
-	private void createUIListenersTreeViewer() {
-		final Tree tree = viewer.getTree();
-		tree.addKeyListener(new KeyListener() {
-			public void keyPressed(KeyEvent e) {
-				if (e.character == 0x1B) {
-					// Dispose on ESC key press
-					dispose();
-				}
-			}
-
-			public void keyReleased(KeyEvent e) {
-				// ignore
-			}
-		});
-
-		tree.addMouseListener(new MouseAdapter() {
-			@Override
-			public void mouseDoubleClick(MouseEvent e) {
-				handleTreeViewerMouseUp(tree, e);
-			}
-		});
-
-		tree.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				// ignore
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-				gotoSelectedElement();
-			}
-		});
-	}
-
-	private void handleTreeViewerMouseUp(final Tree tree, MouseEvent e) {
-		if ((tree.getSelectionCount() < 1) || (e.button != 1) || (tree.equals(e.getSource()) == false)) {
-			return;
-		}
-		// Selection is made in the selection changed listener
-		Object object = tree.getItem(new Point(e.x, e.y));
-		TreeItem selection = tree.getSelection()[0];
-		if (selection.equals(object)) {
-			gotoSelectedElement();
-		}
-	}
-
-	private void gotoSelectedElement() {
-		Object selectedElement = getSelectedElement();
-		if (selectedElement == null) {
-			return;
-		}
-		IInteractionElement node = null;
-		if (selectedElement instanceof IInteractionElement) {
-			node = (IInteractionElement) selectedElement;
-		} else if (!(selectedElement instanceof IInteractionRelation)) {
-			AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(selectedElement);
-			String handle = bridge.getHandleIdentifier(selectedElement);
-			node = ContextCore.getContextManager().getElement(handle);
-		}
-		if (node != null) {
-			ContextUi.getUiBridge(node.getContentType()).open(node);
-		}
-		dispose();
-	}
-
-	private Object getSelectedElement() {
-		if (viewer == null) {
-			return null;
-		}
-		return ((IStructuredSelection) viewer.getSelection()).getFirstElement();
-	}
-
-	public void addDisposeListener(DisposeListener listener) {
-		getShell().addDisposeListener(listener);
-	}
-
-	public void addFocusListener(FocusListener listener) {
-		getShell().addFocusListener(listener);
-	}
-
-	public Point computeSizeHint() {
-		// Note that it already has the persisted size if persisting is enabled.
-		return getShell().getSize();
-	}
-
-	public boolean isFocusControl() {
-		if (viewer.getControl().isFocusControl() || fFilterText.isFocusControl()) {
-			return true;
-		}
-		return false;
-	}
-
-	public void removeDisposeListener(DisposeListener listener) {
-		getShell().removeDisposeListener(listener);
-	}
-
-	public void removeFocusListener(FocusListener listener) {
-		getShell().removeFocusListener(listener);
-	}
-
-	public void setBackgroundColor(Color background) {
-		applyBackgroundColor(background, getContents());
-	}
-
-	public void setFocus() {
-		viewer.refresh();
-		viewer.getControl().setFocus();
-		fFilterText.setFocus();
-		getShell().forceFocus();
-	}
-
-	public void setForegroundColor(Color foreground) {
-		applyForegroundColor(foreground, getContents());
-	}
-
-	public void setInformation(String information) {
-		// See IInformationControlExtension2
-	}
-
-	// TODO e3.4 move to new api
-	@SuppressWarnings("deprecation")
-	public void setLocation(Point location) {
-		/*
-		 * If the location is persisted, it gets managed by PopupDialog - fine. Otherwise, the location is
-		 * computed in Window#getInitialLocation, which will center it in the parent shell / main
-		 * monitor, which is wrong for two reasons:
-		 * - we want to center over the editor / subject control, not the parent shell
-		 * - the center is computed via the initalSize, which may be also wrong since the size may 
-		 *   have been updated since via min/max sizing of AbstractInformationControlManager.
-		 * In that case, override the location with the one computed by the manager. Note that
-		 * the call to constrainShellSize in PopupDialog.open will still ensure that the shell is
-		 * entirely visible.
-		 */
-		if ((getPersistBounds() == false) || (getDialogSettings() == null)) {
-			getShell().setLocation(location);
-		}
-	}
-
-	public void setSize(int width, int height) {
-		getShell().setSize(width, height);
-	}
-
-	public void setSizeConstraints(int maxWidth, int maxHeight) {
-		// Ignore
-	}
-
-	public void setVisible(boolean visible) {
-		if (visible) {
-			open();
-		} else {
-			saveDialogBounds(getShell());
-			getShell().setVisible(false);
-		}
-	}
-
-	public boolean hasContents() {
-		if ((viewer == null) || (viewer.getInput() == null)) {
-			return false;
-		}
-		return true;
-	}
-
-	public void setInput(Object input) {
-		// Input comes from PDESourceInfoProvider.getInformation2()
-		// The input should be a model object of some sort
-		// Turn it into a structured selection and set the selection in the tree
-		if (input != null) {
-			viewer.setSelection(new StructuredSelection(input));
-		}
-	}
-
-	public void widgetDisposed(DisposeEvent e) {
-		// Note: We do not reuse the dialog
-		viewer = null;
-		fFilterText = null;
-	}
-
-	@Override
-	protected Control createTitleControl(Composite parent) {
-		// Applies only to dialog title - not body.  See createDialogArea
-		// Create the text widget
-		createUIWidgetFilterText(parent);
-		// Add listeners to the text widget
-		createUIListenersFilterText();
-		// Return the text widget
-		return fFilterText;
-	}
-
-	private void createUIWidgetFilterText(Composite parent) {
-		// Create the widget
-		fFilterText = new Text(parent, SWT.NONE);
-		// Set the font 
-		GC gc = new GC(parent);
-		gc.setFont(parent.getFont());
-		FontMetrics fontMetrics = gc.getFontMetrics();
-		gc.dispose();
-		// Create the layout
-		GridData data = new GridData(GridData.FILL_HORIZONTAL);
-		data.heightHint = Dialog.convertHeightInCharsToPixels(fontMetrics, 1);
-		data.horizontalAlignment = GridData.FILL;
-		data.verticalAlignment = GridData.CENTER;
-		fFilterText.setLayoutData(data);
-	}
-
-	private void createUIListenersFilterText() {
-		fFilterText.addKeyListener(new KeyListener() {
-			public void keyPressed(KeyEvent e) {
-				if (e.keyCode == 0x0D) {
-					// Return key was pressed
-					gotoSelectedElement();
-				} else if (e.keyCode == SWT.ARROW_DOWN) {
-					// Down key was pressed
-					viewer.getTree().setFocus();
-				} else if (e.keyCode == SWT.ARROW_UP) {
-					// Up key was pressed
-					viewer.getTree().setFocus();
-				} else if (e.character == 0x1B) {
-					// Escape key was pressed
-					dispose();
-				}
-			}
-
-			public void keyReleased(KeyEvent e) {
-				// NO-OP
-			}
-		});
-		// Handle text modify events
-		fFilterText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				String text = ((Text) e.widget).getText();
-				int length = text.length();
-				if (length > 0) {
-					// Append a '*' pattern to the end of the text value if it
-					// does not have one already
-					if (text.charAt(length - 1) != '*') {
-						text = text + '*';
-					}
-					// Prepend a '*' pattern to the beginning of the text value
-					// if it does not have one already
-					if (text.charAt(0) != '*') {
-						text = '*' + text;
-					}
-				}
-				// Set and update the pattern
-				setMatcherString(text, true);
-			}
-		});
-	}
-
-	/**
-	 * Sets the patterns to filter out for the receiver.
-	 * <p>
-	 * The following characters have special meaning: ? => any character * => any string
-	 * </p>
-	 * 
-	 * @param pattern
-	 *            the pattern
-	 * @param update
-	 *            <code>true</code> if the viewer should be updated
-	 */
-	private void setMatcherString(String pattern, boolean update) {
-		if (pattern.length() == 0) {
-			fStringMatcher = null;
-		} else {
-			fStringMatcher = new StringMatcher(pattern, true, false);
-		}
-		// Update the name pattern filter on the tree viewer
-		namePatternFilter.setStringMatcher(fStringMatcher);
-		// Update the tree viewer according to the pattern
-		if (update) {
-			stringMatcherUpdated();
-		}
-	}
-
-	/**
-	 * The string matcher has been modified. The default implementation refreshes the view and selects the first matched
-	 * element
-	 */
-	private void stringMatcherUpdated() {
-		// Refresh the tree viewer to re-filter
-		viewer.getControl().setRedraw(false);
-		viewer.refresh();
-		viewer.expandAll();
-		selectFirstMatch();
-		viewer.getControl().setRedraw(true);
-	}
-
-	/**
-	 * Selects the first element in the tree which matches the current filter pattern.
-	 */
-	private void selectFirstMatch() {
-		Tree tree = viewer.getTree();
-		Object element = findFirstMatchToPattern(tree.getItems());
-		if (element != null) {
-			viewer.setSelection(new StructuredSelection(element), true);
-		} else {
-			viewer.setSelection(StructuredSelection.EMPTY);
-		}
-	}
-
-	/**
-	 * @param items
-	 * @return
-	 */
-	private Object findFirstMatchToPattern(TreeItem[] items) {
-		// Match the string pattern against labels
-		ILabelProvider labelProvider = (ILabelProvider) viewer.getLabelProvider();
-		// Process each item in the tree
-		for (TreeItem item : items) {
-			Object element = item.getData();
-			// Return the first element if no pattern is set
-			if (fStringMatcher == null) {
-				return element;
-			}
-			// Return the element if it matches the pattern
-			if (element != null) {
-				String label = labelProvider.getText(element);
-				if (fStringMatcher.match(label)) {
-					return element;
-				}
-			}
-			// Recursively check the elements children for a match
-			element = findFirstMatchToPattern(item.getItems());
-			// Return the child element match if found
-			if (element != null) {
-				return element;
-			}
-		}
-		// No match found
-		return null;
-	}
-
-	/**
-	 * fix for bug 109235
-	 * 
-	 * @param node
-	 * @param updateLabels
-	 */
-	void refresh(final IInteractionElement node, final boolean updateLabels) {
-		if (!syncExecForTesting) { // for testing
-			// if (viewer != null && !viewer.getTree().isDisposed()) {
-			// internalRefresh(node, updateLabels);
-			// }
-			PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
-				public void run() {
-					try {
-						internalRefresh(node, updateLabels);
-					} catch (Throwable t) {
-						StatusHandler.log(new Status(IStatus.WARNING, SandboxUiPlugin.ID_PLUGIN,
-								"Context search refresh failed", t));
-					}
-				}
-			});
-		} else {
-			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					try {
-						internalRefresh(node, updateLabels);
-					} catch (Throwable t) {
-						StatusHandler.log(new Status(IStatus.WARNING, SandboxUiPlugin.ID_PLUGIN,
-								"Context search refresh failed", t));
-					}
-				}
-			});
-		}
-
-	}
-
-	private void internalRefresh(final IInteractionElement node, boolean updateLabels) {
-		Object toRefresh = null;
-		if (node != null) {
-			AbstractContextStructureBridge bridge = ContextCore.getStructureBridge(node.getContentType());
-			toRefresh = bridge.getObjectForHandle(node.getHandleIdentifier());
-		}
-		if (viewer != null && !viewer.getTree().isDisposed()) {
-			viewer.getControl().setRedraw(false);
-			if (toRefresh != null && containsNode(viewer.getTree(), toRefresh)) {
-				viewer.refresh(toRefresh, updateLabels);
-			} else if (node == null) {
-				viewer.refresh();
-			}
-			viewer.expandAll();
-			viewer.getControl().setRedraw(true);
-		}
-	}
-
-	private boolean containsNode(Tree tree, Object object) {
-		boolean contains = false;
-		for (int i = 0; i < tree.getItems().length; i++) {
-			TreeItem item = tree.getItems()[i];
-			if (object.equals(item.getData())) {
-				contains = true;
-			}
-		}
-		return contains;
-	}
-
-	public void refreshRelatedElements() {
-		try {
-			for (AbstractRelationProvider provider : ContextCorePlugin.getDefault().getRelationProviders()) {
-				List<AbstractRelationProvider> providerList = new ArrayList<AbstractRelationProvider>();
-				providerList.add(provider);
-				updateDegreesOfSeparation(providerList, provider.getCurrentDegreeOfSeparation());
-			}
-		} catch (Throwable t) {
-			StatusHandler.log(new Status(IStatus.WARNING, SandboxUiPlugin.ID_PLUGIN,
-					"Could not refresh related elements", t));
-		}
-	}
-
-	public void updateDegreesOfSeparation(Collection<AbstractRelationProvider> providers, int degreeOfSeparation) {
-		for (AbstractRelationProvider provider : providers) {
-			updateDegreeOfSeparation(provider, degreeOfSeparation);
-		}
-	}
-
-	public void updateDegreeOfSeparation(AbstractRelationProvider provider, int degreeOfSeparation) {
-		ContextCorePlugin.getContextManager().resetLandmarkRelationshipsOfKind(provider.getId());
-		ContextUiPlugin.getDefault().getPreferenceStore().setValue(provider.getGenericId(), degreeOfSeparation);
-		provider.setDegreeOfSeparation(degreeOfSeparation);
-		for (IInteractionElement element : ContextCore.getContextManager().getActiveContext().getInteresting()) {
-			if (element.getInterest().isLandmark()) {
-				provider.landmarkAdded(element);
-			}
-		}
-	}
-
-	@Override
-	protected void fillDialogMenu(IMenuManager dialogMenu) {
-		MenuManager degMenu = new MenuManager("Degree of Separation");
-		degMenu.add(zero);
-		degMenu.add(one);
-		degMenu.add(two);
-		degMenu.add(three);
-		degMenu.add(four);
-		degMenu.add(five);
-		check(getDegree());
-		dialogMenu.add(degMenu);
-		dialogMenu.add(new Separator());
-
-		IAction qualifyElements = new ShowQualifiedNamesAction(this);
-		dialogMenu.add(qualifyElements);
-		dialogMenu.add(new Separator());
-
-		super.fillDialogMenu(dialogMenu);
-	}
-
-	public void setQualifiedNameMode(boolean qualifiedNameMode) {
-		DelegatingContextLabelProvider.setQualifyNamesMode(qualifiedNameMode);
-		refresh(null, true);
-	}
-
-	private class DegreeZeroAction extends Action {
-		DegreeZeroAction() {
-			super(JFaceResources.getString("0: Disabled"), //$NON-NLS-1$
-					IAction.AS_CHECK_BOX);
-		}
-
-		@Override
-		public void run() {
-			check(0);
-			refreshAction(0);
-
-		}
-	}
-
-	private class DegreeOneAction extends Action {
-		DegreeOneAction() {
-			super(JFaceResources.getString("1: Landmark Resources"), //$NON-NLS-1$
-					IAction.AS_CHECK_BOX);
-		}
-
-		@Override
-		public void run() {
-			check(1);
-			refreshAction(1);
-		}
-	}
-
-	private class DegreeTwoAction extends Action {
-		DegreeTwoAction() {
-			super(JFaceResources.getString("2: Interesting Resources"), //$NON-NLS-1$
-					IAction.AS_CHECK_BOX);
-		}
-
-		@Override
-		public void run() {
-			check(2);
-			refreshAction(2);
-		}
-	}
-
-	private class DegreeThreeAction extends Action {
-		DegreeThreeAction() {
-			super(JFaceResources.getString("3: Interesting Projects"), //$NON-NLS-1$
-					IAction.AS_CHECK_BOX);
-		}
-
-		@Override
-		public void run() {
-			check(3);
-			refreshAction(3);
-		}
-	}
-
-	private class DegreeFourAction extends Action {
-		DegreeFourAction() {
-			super(JFaceResources.getString("4: Project Dependencies"), //$NON-NLS-1$
-					IAction.AS_CHECK_BOX);
-		}
-
-		@Override
-		public void run() {
-			check(4);
-			refreshAction(4);
-		}
-	}
-
-	private class DegreeFiveAction extends Action {
-		DegreeFiveAction() {
-			super(JFaceResources.getString("5: Entire Workspace (slow)"), //$NON-NLS-1$
-					IAction.AS_CHECK_BOX);
-		}
-
-		@Override
-		public void run() {
-			check(5);
-			refreshAction(5);
-		}
-	}
-
-	private void refreshAction(int degOfSep) {
-		try {
-			for (AbstractRelationProvider provider : ContextCorePlugin.getDefault().getRelationProviders()) {
-				List<AbstractRelationProvider> providerList = new ArrayList<AbstractRelationProvider>();
-				providerList.add(provider);
-
-				if (provider.getCurrentDegreeOfSeparation() != degOfSep) {
-					updateDegreesOfSeparation(providerList, degOfSep);
-					degree = provider.getCurrentDegreeOfSeparation();
-				}
-			}
-
-		} catch (Throwable t) {
-			StatusHandler.log(new Status(IStatus.WARNING, SandboxUiPlugin.ID_PLUGIN,
-					"Could not refresh related elements", t));
-		}
-	}
-
-	private int getDegree() {
-		for (AbstractRelationProvider provider : ContextCorePlugin.getDefault().getRelationProviders()) {
-			degree = provider.getCurrentDegreeOfSeparation();
-			break;
-		}
-		return degree;
-	}
-
-	private void check(int degree) {
-		zero.setChecked(false);
-		one.setChecked(false);
-		two.setChecked(false);
-		three.setChecked(false);
-		four.setChecked(false);
-		five.setChecked(false);
-		switch (degree) {
-		case 0:
-			zero.setChecked(true);
-			break;
-		case 1:
-			one.setChecked(true);
-			break;
-		case 2:
-			two.setChecked(true);
-			break;
-		case 3:
-			three.setChecked(true);
-			break;
-		case 4:
-			four.setChecked(true);
-			break;
-		default:
-			five.setChecked(true);
-		}
-	}
-
-	private class ShowQualifiedNamesAction extends Action {
-
-		public static final String LABEL = "Qualify Member Names";
-
-		public static final String ID = "org.eclipse.mylyn.ui.views.elements.qualify";
-
-		private final RelatedElementsPopupDialog dialog;
-
-		public ShowQualifiedNamesAction(RelatedElementsPopupDialog dialog) {
-			super(LABEL, IAction.AS_CHECK_BOX);
-			this.dialog = dialog;
-			setId(ID);
-			setText(LABEL);
-			setToolTipText(LABEL);
-			setImageDescriptor(ContextUiImages.QUALIFY_NAMES);
-			update(ContextUiPlugin.getDefault().getPreferenceStore().getBoolean(ID));
-		}
-
-		public void update(boolean on) {
-			dialog.setQualifiedNameMode(on);
-			setChecked(on);
-			ContextUiPlugin.getDefault().getPreferenceStore().setValue(ID, on);
-		}
-
-		@Override
-		public void run() {
-			update(!ContextUiPlugin.getDefault().getPreferenceStore().getBoolean(ID));
-		}
-	}
-
-	/**
-	 * Set to false for testing
-	 */
-	public void setSyncExecForTesting(boolean asyncRefreshMode) {
-		this.syncExecForTesting = asyncRefreshMode;
-	}
-
-	public void dispose() {
-		ContextCore.getContextManager().removeListener(REFRESH_UPDATE_LISTENER);
-		super.close();
-	}
-
-	@Override
-	protected Point getInitialSize() {
-		return new Point(400, 500);
-	}
-
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/TaskActivityView.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/TaskActivityView.java
deleted file mode 100644
index 084728e..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/TaskActivityView.java
+++ /dev/null
@@ -1,535 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.views;
-
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.ComboBoxCellEditor;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.ICellEditorListener;
-import org.eclipse.jface.viewers.ICellModifier;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.ViewerDropAdapter;
-import org.eclipse.mylyn.internal.provisional.commons.ui.CommonThemes;
-import org.eclipse.mylyn.internal.sandbox.ui.planner.ActivityReportAction;
-import org.eclipse.mylyn.internal.sandbox.ui.planner.TaskActivityLabelProvider;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.core.DateRange;
-import org.eclipse.mylyn.internal.tasks.core.ITaskListChangeListener;
-import org.eclipse.mylyn.internal.tasks.core.ScheduledTaskContainer;
-import org.eclipse.mylyn.internal.tasks.core.TaskContainerDelta;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.internal.tasks.ui.actions.OpenTaskListElementAction;
-import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
-import org.eclipse.mylyn.internal.tasks.ui.views.TaskListView;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.mylyn.tasks.core.ITaskActivationListener;
-import org.eclipse.mylyn.tasks.core.ITaskContainer;
-import org.eclipse.mylyn.tasks.core.TaskActivationAdapter;
-import org.eclipse.mylyn.tasks.ui.TaskElementLabelProvider;
-import org.eclipse.mylyn.tasks.ui.TasksUi;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.dnd.TransferData;
-import org.eclipse.swt.events.ControlEvent;
-import org.eclipse.swt.events.ControlListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IViewSite;
-import org.eclipse.ui.IWorkbenchActionConstants;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.ViewPart;
-import org.eclipse.ui.themes.IThemeManager;
-
-/**
- * @author Rob Elves
- */
-public class TaskActivityView extends ViewPart {
-
-	private static final String MEMENTO_KEY_WIDTH = "colwidth";
-
-	public static final String ID = "org.eclipse.mylyn.tasklist.activity";
-
-	public static final String columnWidthIdentifier = "org.eclipse.mylyn.tasklist.ui.views.taskactivity.columnwidth";
-
-	public static final String tableSortIdentifier = "org.eclipse.mylyn.tasklist.ui.views.taskactivity.sortIndex";
-
-	private static TaskActivityView INSTANCE;
-
-	private IMemento taskActivityMemento;
-
-	private OpenTaskListElementAction openTaskEditor;
-
-	private final String[] columnNames = new String[] { " ", " !", "Description", "Elapsed", "Estimated", "Scheduled",
-	/*"Last Active"*/};
-
-	private final String[] ESTIMATE_TIMES = new String[] { "0 Hours", "1 Hours", "2 Hours", "3 Hours", "4 Hours",
-			"5 Hours", "6 Hours", "7 Hours", "8 Hours", "9 Hours", "10 Hours" };
-
-	private final int[] columnWidths = new int[] { 60, 12, 160, 60, 70, 100 /*, 100*/};
-
-	private TreeColumn[] columns;
-
-	private TaskActivityLabelProvider taskHistoryTreeLabelProvider;
-
-	private TreeViewer treeViewer;
-
-	private TaskActivityViewContentProvider taskActivityTableContentProvider;
-
-//	private TaskScheduleContentProvider taskActivityTableContentProvider;
-
-	private IThemeManager themeManager;
-
-	private final IPropertyChangeListener THEME_CHANGE_LISTENER = new IPropertyChangeListener() {
-		public void propertyChange(PropertyChangeEvent event) {
-			if (event.getProperty().equals(IThemeManager.CHANGE_CURRENT_THEME)
-					|| event.getProperty().equals(CommonThemes.COLOR_CATEGORY)) {
-				taskHistoryTreeLabelProvider.setCategoryBackgroundColor(themeManager.getCurrentTheme()
-						.getColorRegistry()
-						.get(CommonThemes.COLOR_CATEGORY));
-				refresh();
-			}
-		}
-	};
-
-	/**
-	 * TODO: need lazier refresh policy.
-	 */
-	private final ITaskActivationListener TASK_ACTIVATION_LISTENER = new TaskActivationAdapter() {
-
-		@Override
-		public void taskActivated(ITask task) {
-			refresh();
-		}
-	};
-
-	private final ITaskListChangeListener TASKLIST_CHANGE_LISTENER = new ITaskListChangeListener() {
-
-		public void containersChanged(Set<TaskContainerDelta> containers) {
-			refresh();
-		}
-
-	};
-
-	private TaskActivityViewSorter sorter;
-
-	public static TaskActivityView openInActivePerspective() {
-		try {
-			return (TaskActivityView) PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView(ID);
-		} catch (Exception e) {
-			return null;
-		}
-	}
-
-	public TaskActivityView() {
-		INSTANCE = this;
-		TasksUi.getTaskActivityManager().addActivationListener(TASK_ACTIVATION_LISTENER);
-		TasksUiInternal.getTaskList().addChangeListener(TASKLIST_CHANGE_LISTENER);
-	}
-
-	@Override
-	public void dispose() {
-		super.dispose();
-		TasksUi.getTaskActivityManager().removeActivationListener(TASK_ACTIVATION_LISTENER);
-		TasksUiInternal.getTaskList().removeChangeListener(TASKLIST_CHANGE_LISTENER);
-	}
-
-	@Override
-	public void createPartControl(Composite parent) {
-		themeManager = getSite().getWorkbenchWindow().getWorkbench().getThemeManager();
-		themeManager.addPropertyChangeListener(THEME_CHANGE_LISTENER);
-
-		int treeStyle = SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION;
-		treeViewer = new TreeViewer(parent, treeStyle);
-
-		getViewer().getTree().setHeaderVisible(true);
-		getViewer().getTree().setLinesVisible(true);
-		getViewer().setColumnProperties(columnNames);
-		getViewer().setUseHashlookup(true);
-
-		columns = new TreeColumn[columnNames.length];
-		for (int i = 0; i < columnNames.length; i++) {
-			columns[i] = new TreeColumn(getViewer().getTree(), SWT.LEFT);
-			columns[i].setText(columnNames[i]);
-			columns[i].setWidth(columnWidths[i]);
-
-			final int index = i;
-			columns[i].addSelectionListener(new SelectionAdapter() {
-
-				@Override
-				public void widgetSelected(SelectionEvent e) {
-					int column = index - 1;
-					if (column == sorter.getSortColumn()) {
-						sorter.reverseDirection();
-					} else {
-						sorter.setSortColumn(column);
-					}
-					getViewer().refresh();
-					// if(taskActivityMemento != null) {
-					// sorter.saveState(taskActivityMemento);
-					// }
-				}
-			});
-
-			columns[i].addControlListener(new ControlListener() {
-				public void controlResized(ControlEvent e) {
-					for (int j = 0; j < columnWidths.length; j++) {
-						if (columns[j].equals(e.getSource())) {
-							columnWidths[j] = columns[j].getWidth();
-						}
-					}
-				}
-
-				public void controlMoved(ControlEvent e) {
-					// don't care if the control is moved
-				}
-			});
-		}
-
-		IThemeManager themeManager = getSite().getWorkbenchWindow().getWorkbench().getThemeManager();
-		Color categoryBackground = themeManager.getCurrentTheme().getColorRegistry().get(CommonThemes.COLOR_CATEGORY);
-
-		sorter = new TaskActivityViewSorter();
-		getViewer().setSorter(sorter);
-		taskActivityTableContentProvider = new TaskActivityViewContentProvider(TasksUiPlugin.getTaskActivityManager());
-		taskHistoryTreeLabelProvider = new TaskActivityLabelProvider(new TaskElementLabelProvider(false),
-				PlatformUI.getWorkbench().getDecoratorManager().getLabelDecorator(), categoryBackground,
-				taskActivityTableContentProvider);
-
-		getViewer().setContentProvider(taskActivityTableContentProvider);
-		getViewer().setLabelProvider(taskHistoryTreeLabelProvider);
-		getViewer().setInput(getViewSite());
-		restoreState();
-		createCellEditorListener();
-		makeActions();
-		initDrop();
-		hookOpenAction();
-		hookContextMenu();
-		contributeToActionBars();
-		getSite().setSelectionProvider(getViewer());
-	}
-
-	private void contributeToActionBars() {
-		IActionBars bars = getViewSite().getActionBars();
-		fillLocalPullDown(bars.getMenuManager());
-		fillLocalToolBar(bars.getToolBarManager());
-	}
-
-	private void fillLocalPullDown(IMenuManager manager) {
-		manager.add(new ActivityReportAction());
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-	private void fillLocalToolBar(IToolBarManager manager) {
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-	private void initDrop() {
-		Transfer[] types = new Transfer[] { TextTransfer.getInstance() };
-
-		treeViewer.addDropSupport(DND.DROP_MOVE, types, new ViewerDropAdapter(treeViewer) {
-			{
-				setFeedbackEnabled(false);
-			}
-
-			@Override
-			public boolean performDrop(Object data) {
-
-				IStructuredSelection selection = ((IStructuredSelection) TaskListView.getFromActivePerspective()
-						.getViewer()
-						.getSelection());
-
-				Object target = getCurrentTarget();
-				ScheduledTaskContainer container;
-				DateRange reminderCalendar;
-				if (target instanceof ScheduledTaskContainer) {
-					container = (ScheduledTaskContainer) target;
-					reminderCalendar = container.getDateRange();
-				} else if (target instanceof ITask) {
-					reminderCalendar = ((AbstractTask) target).getScheduledForDate();
-				} else {
-					return false;
-				}
-
-				for (Iterator<?> iter = selection.iterator(); iter.hasNext();) {
-					Object selectedObject = iter.next();
-					AbstractTask task = null;
-					if (selectedObject instanceof ITask) {
-						task = (AbstractTask) selectedObject;
-					}
-					if (task != null) {
-						TasksUiPlugin.getTaskActivityManager().setScheduledFor(task, reminderCalendar);
-					}
-				}
-				return true;
-			}
-
-			@Override
-			public boolean validateDrop(Object targetObject, int operation, TransferData transferType) {
-				Object selectedObject = ((IStructuredSelection) TaskListView.getFromActivePerspective()
-						.getViewer()
-						.getSelection()).getFirstElement();
-
-				if (selectedObject instanceof ITaskContainer) {
-					return false;
-				}
-
-				Object target = getCurrentTarget();
-				ScheduledTaskContainer dateRangeContainer = null;
-				if (target instanceof ScheduledTaskContainer) {
-					dateRangeContainer = (ScheduledTaskContainer) target;
-				} else if (target instanceof ITask) {
-					AbstractTask task = ((AbstractTask) target);
-					dateRangeContainer = new ScheduledTaskContainer(TasksUiPlugin.getTaskActivityManager(),
-							task.getScheduledForDate());
-				}
-
-				if (dateRangeContainer != null && (dateRangeContainer.isPresent() || dateRangeContainer.isFuture())) {
-					return true;
-				}
-				return false;
-			}
-		});
-	}
-
-	private void makeActions() {
-		openTaskEditor = new OpenTaskListElementAction(this.getViewer());
-		// openUrlInExternal = new OpenTaskInExternalBrowserAction();
-	}
-
-	private void hookOpenAction() {
-		getViewer().addDoubleClickListener(new IDoubleClickListener() {
-			public void doubleClick(DoubleClickEvent event) {
-				openTaskEditor.run();
-			}
-		});
-	}
-
-	private void hookContextMenu() {
-		MenuManager menuMgr = new MenuManager("#PopupMenu");
-		menuMgr.setRemoveAllWhenShown(true);
-		menuMgr.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager manager) {
-				TaskActivityView.this.fillContextMenu(manager);
-			}
-		});
-		Menu menu = menuMgr.createContextMenu(getViewer().getControl());
-		getViewer().getControl().setMenu(menu);
-		getSite().registerContextMenu(menuMgr, getViewer());
-	}
-
-	private void fillContextMenu(IMenuManager manager) {
-		manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
-	}
-
-	public static TaskActivityView getDefault() {
-		return INSTANCE;
-	}
-
-	private TreeViewer getViewer() {
-		return treeViewer;
-	}
-
-	private void refresh() {
-		if (PlatformUI.getWorkbench() != null && !PlatformUI.getWorkbench().getDisplay().isDisposed()) {
-			PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					if (getViewer().getControl() != null && !getViewer().getControl().isDisposed()) {
-						TaskActivityView.this.treeViewer.refresh();
-					}
-				}
-			});
-		}
-	}
-
-	public ITask getSelectedTask() {
-		ISelection selection = getViewer().getSelection();
-		if (selection.isEmpty()) {
-			return null;
-		}
-		if (selection instanceof StructuredSelection) {
-			StructuredSelection structuredSelection = (StructuredSelection) selection;
-			Object element = structuredSelection.getFirstElement();
-			if (element instanceof ITask) {
-				return (ITask) structuredSelection.getFirstElement();
-			}
-		}
-		return null;
-	}
-
-	@Override
-	public void setFocus() {
-		// ignore
-	}
-
-	private void createCellEditorListener() {
-		CellEditor[] editors = new CellEditor[columnNames.length];
-		final ComboBoxCellEditor estimateEditor = new ComboBoxCellEditor(treeViewer.getTree(), ESTIMATE_TIMES,
-				SWT.READ_ONLY);
-//		final ReminderCellEditor reminderEditor = new ReminderCellEditor(treeViewer.getTree());
-		editors[0] = null; // not used
-		editors[1] = null;// not used
-		editors[2] = null;// not used
-		editors[3] = null;// not used
-		editors[4] = estimateEditor;
-		editors[5] = null;//reminderEditor;
-//		reminderEditor.addListener(new ICellEditorListener() {
-//			public void applyEditorValue() {
-//				Object selection = ((IStructuredSelection) treeViewer.getSelection()).getFirstElement();
-//				if (selection instanceof ITask) {
-//					Date newReminder = reminderEditor.getReminderDate();
-//					if (newReminder != null) {
-//						TasksUiPlugin.getTaskActivityManager().setScheduledFor(
-//								dateRangeActivityDelegate.getCorrespondingTask(), newReminder);
-//					}
-//				}
-//			}
-//
-//			public void cancelEditor() {
-//			}
-//
-//			public void editorValueChanged(boolean oldValidState, boolean newValidState) {
-//			}
-//
-//		});
-		estimateEditor.addListener(new ICellEditorListener() {
-			public void applyEditorValue() {
-				Object selection = ((IStructuredSelection) treeViewer.getSelection()).getFirstElement();
-				if (selection instanceof AbstractTask) {
-					AbstractTask task = (AbstractTask) selection;
-					int estimate = (Integer) estimateEditor.getValue();
-					if (estimate == -1) {
-						estimate = 0;
-					}
-					task.setEstimatedTimeHours(estimate);
-					refresh();
-				}
-			}
-
-			public void cancelEditor() {
-			}
-
-			public void editorValueChanged(boolean oldValidState, boolean newValidState) {
-			}
-
-		});
-		treeViewer.setCellEditors(editors);
-		getViewer().setCellModifier(new TaskActivityCellModifier(treeViewer));
-	}
-
-	private class TaskActivityCellModifier implements ICellModifier {
-
-		private final TreeViewer treeViewer;
-
-		public TaskActivityCellModifier(TreeViewer tableViewer) {
-			this.treeViewer = tableViewer;
-		}
-
-		public boolean canModify(Object element, String property) {
-			if (element instanceof ITask) {
-				int columnIndex = Arrays.asList(columnNames).indexOf(property);
-				if (columnIndex == 4 /*|| columnIndex == 5*/) {
-					return true;
-				}
-			}
-			return false;
-		}
-
-		public Object getValue(Object element, String property) {
-			if (element instanceof ITask) {
-				AbstractTask task = (AbstractTask) element;
-				int columnIndex = Arrays.asList(columnNames).indexOf(property);
-				/*if (columnIndex == 5) {
-					if (task.getScheduledForDate() != null) {
-						return DateFormat.getDateInstance(DateFormat.MEDIUM).format(task.getScheduledForDate());
-					} else {
-						return null;
-					}
-				} else*/if (columnIndex == 4) {
-					return new Integer(Arrays.asList(ESTIMATE_TIMES).indexOf(task.getEstimatedTimeHours()));
-				}
-			}
-			return null;
-		}
-
-		public void modify(Object element, String property, Object value) {
-			int columnIndex = Arrays.asList(columnNames).indexOf(property);
-			if (element instanceof AbstractTask) {
-				AbstractTask task = (AbstractTask) element;
-				if (columnIndex == 4) {
-					if (value instanceof Integer) {
-						task.setEstimatedTimeHours(((Integer) value).intValue() * 10);
-						treeViewer.refresh();
-					}
-				}
-			}
-		}
-	}
-
-	@Override
-	public void init(IViewSite site, IMemento memento) throws PartInitException {
-		super.init(site, memento);
-		this.taskActivityMemento = memento;
-	}
-
-	@Override
-	public void saveState(IMemento memento) {
-		IMemento colMemento = memento.createChild(columnWidthIdentifier);
-		for (int i = 0; i < columnWidths.length; i++) {
-			IMemento m = colMemento.createChild("col" + i);
-			m.putInteger(MEMENTO_KEY_WIDTH, columnWidths[i]);
-		}
-
-		sorter.saveState(memento);
-	}
-
-	private void restoreState() {
-
-		if (taskActivityMemento != null) {
-			IMemento taskActivityWidth = taskActivityMemento.getChild(columnWidthIdentifier);
-			if (taskActivityWidth != null) {
-				for (int i = 0; i < columnWidths.length; i++) {
-					IMemento m = taskActivityWidth.getChild("col" + i);
-					if (m != null) {
-						int width = m.getInteger(MEMENTO_KEY_WIDTH);
-						columnWidths[i] = width;
-						columns[i].setWidth(width);
-					}
-				}
-			}
-
-			sorter.restoreState(taskActivityMemento);
-
-		}
-		getViewer().refresh();
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/TaskActivityViewContentProvider.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/TaskActivityViewContentProvider.java
deleted file mode 100644
index 4d0deb7..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/TaskActivityViewContentProvider.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.views;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTaskContainer;
-import org.eclipse.mylyn.internal.tasks.core.DateRange;
-import org.eclipse.mylyn.internal.tasks.core.ScheduledTaskContainer;
-import org.eclipse.mylyn.internal.tasks.core.TaskActivityManager;
-import org.eclipse.mylyn.internal.tasks.core.TaskActivityUtil;
-import org.eclipse.mylyn.internal.tasks.core.WeekDateRange;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-
-/**
- * @author Rob Elves
- * @author Mik Kersten
- */
-public class TaskActivityViewContentProvider implements IStructuredContentProvider, ITreeContentProvider {
-
-	protected final TaskActivityManager taskActivityManager;
-
-	public TaskActivityViewContentProvider(TaskActivityManager taskActivityManager) {
-		this.taskActivityManager = taskActivityManager;
-	}
-
-	public Object[] getElements(Object parent) {
-		Set<AbstractTaskContainer> containers = new HashSet<AbstractTaskContainer>();
-		WeekDateRange week = TaskActivityUtil.getCurrentWeek();
-		//containers.add(new ScheduledTaskContainer(TasksUiPlugin.getTaskActivityManager(), week.previous()));
-		for (DateRange day : week.getDaysOfWeek()) {
-			containers.add(new ScheduledTaskContainer(TasksUiPlugin.getTaskActivityManager(), day));
-		}
-//		containers.add(new ScheduledTaskContainer(TasksUiPlugin.getTaskActivityManager(), week));
-//		ScheduledTaskContainer nextWeekContainer = new ScheduledTaskContainer(taskActivityManager, week.next());
-//		containers.add(nextWeekContainer);
-
-		return containers.toArray();
-	}
-
-	public Object getParent(Object child) {
-		for (Object o : getElements(null)) {
-			ScheduledTaskContainer container = ((ScheduledTaskContainer) o);
-			for (Object o2 : getChildren(container)) {
-				if (o2 instanceof AbstractTask) {
-					if (((AbstractTask) o2).equals(child)) {
-						return container;
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	public Object[] getChildren(Object parent) {
-		if (parent instanceof ScheduledTaskContainer) {
-			DateRange range = ((ScheduledTaskContainer) parent).getDateRange();
-			Set<AbstractTask> activeTasks = TasksUiPlugin.getTaskActivityManager().getActiveTasks(range.getStartDate(),
-					range.getEndDate());
-			return activeTasks.toArray();
-		} else {
-			return new Object[0];
-		}
-	}
-
-	public boolean hasChildren(Object parent) {
-		return getChildren(parent).length > 0;
-	}
-
-	public void dispose() {
-	}
-
-	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-	}
-}
diff --git a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/TaskActivityViewSorter.java b/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/TaskActivityViewSorter.java
deleted file mode 100644
index 598f7dd..0000000
--- a/org.eclipse.mylyn.sandbox.ui/src/org/eclipse/mylyn/internal/sandbox/ui/views/TaskActivityViewSorter.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.sandbox.ui.views;
-
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.core.ScheduledTaskContainer;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.mylyn.tasks.core.ITaskContainer;
-import org.eclipse.mylyn.tasks.core.ITask.PriorityLevel;
-import org.eclipse.ui.IMemento;
-
-/**
- * @author Rob Elves
- */
-public class TaskActivityViewSorter extends ViewerSorter {
-
-	private static final String activitySortColumn = "org.eclipse.mylyn.tasklist.ui.views.taskactivitysorter.sortcolumn";
-
-	private static final String activityViewSorterSettings = "org.eclipse.mylyn.tasklist.ui.views.taskactivitysorter.sortsettings";
-
-	private int[] directions;
-
-	private final static int ASCENDING = 1;
-
-	private final static int DESCENDING = -1;
-
-	private final static int PRIORITY = 0;
-
-	private final static int DESCRIPTION = 1;
-
-	private final static int ELAPSED = 2;
-
-	private final static int ESTIMATED = 3;
-
-	private final static int REMINDER = 4;
-
-	private final static int LAST_ACTIVE = 5;
-
-	private int sortColumn = LAST_ACTIVE;
-
-	final static int[] DEFAULT_DIRECTIONS = { ASCENDING, ASCENDING, ASCENDING, DESCENDING, DESCENDING, DESCENDING,
-			DESCENDING };
-
-	public TaskActivityViewSorter() {
-		resetState();
-	}
-
-	public void reverseDirection() {
-		directions[sortColumn] *= -1;
-	}
-
-	public void setSortDirection(int direction) {
-		if (direction == ASCENDING || direction == DESCENDING) {
-			directions[sortColumn] = direction;
-		}
-	}
-
-	public int getDirection() {
-		return directions[sortColumn];
-	}
-
-	public int getSortColumn() {
-		return sortColumn;
-	}
-
-	public void setSortColumn(int col) {
-		if (col < 0 || col >= directions.length) {
-			sortColumn = LAST_ACTIVE;
-		} else {
-			sortColumn = col;
-		}
-	}
-
-	public void resetState() {
-		directions = new int[DEFAULT_DIRECTIONS.length];
-		System.arraycopy(DEFAULT_DIRECTIONS, 0, directions, 0, directions.length);
-	}
-
-	@SuppressWarnings("unchecked")
-	private int compare(AbstractTask task1, AbstractTask task2) {
-		if (sortColumn >= directions.length) {
-			return 0;
-		}
-
-		switch (sortColumn) {
-		case PRIORITY: {
-			PriorityLevel a = PriorityLevel.fromString(task1.getPriority());
-			PriorityLevel b = PriorityLevel.fromString(task2.getPriority());
-			int result = a.compareTo(b);
-			return result * directions[sortColumn];
-		}
-		case DESCRIPTION: {
-			String description1 = task1.getSummary();
-			String description2 = task2.getSummary();
-			int result = getComparator().compare(description1, description2);
-			return result * directions[sortColumn];
-		}
-		case ELAPSED: {
-			long elapsed1 = TasksUiPlugin.getTaskActivityManager().getElapsedTime(task1);
-			long elapsed2 = TasksUiPlugin.getTaskActivityManager().getElapsedTime(task2);
-			int result = new Long(elapsed1).compareTo(new Long(elapsed2));
-			return result * directions[sortColumn];
-		}
-		case ESTIMATED: {
-			int estimate1 = task1.getEstimatedTimeHours();
-			int estimate2 = task2.getEstimatedTimeHours();
-			int result = estimate1 - estimate2;
-			return result * directions[sortColumn];
-		}
-		case REMINDER: {
-			int result = 0;
-			if (task1.getScheduledForDate() != null && task2.getScheduledForDate() != null) {
-				long reminder1 = task1.getScheduledForDate().getEndDate().getTimeInMillis();
-				long reminder2 = task2.getScheduledForDate().getEndDate().getTimeInMillis();
-				result = new Long(reminder1).compareTo(new Long(reminder2));
-			} else if (task1.getScheduledForDate() != null) {
-				result = 1;
-			} else if (task2.getScheduledForDate() != null) {
-				result = -1;
-			}
-			return result * directions[sortColumn];
-		}
-		case LAST_ACTIVE: {
-//			long active1 = task1.getStart();
-//			long active2 = task2.getStart();
-//			int result = new Long(active1).compareTo(new Long(active2));
-//			return result * directions[sortColumn];
-			return directions[sortColumn];
-		}
-		}
-		return 0;
-	}
-
-	@Override
-	public int compare(Viewer viewer, Object o1, Object o2) {
-		if (o1 instanceof ScheduledTaskContainer) {
-			if (o2 instanceof ScheduledTaskContainer) {
-				ScheduledTaskContainer dateRangeTaskContainer1 = (ScheduledTaskContainer) o1;
-				ScheduledTaskContainer dateRangeTaskContainer2 = (ScheduledTaskContainer) o2;
-				return -1 * dateRangeTaskContainer2.getStart().compareTo(dateRangeTaskContainer1.getStart());
-			} else {
-				return -1;
-			}
-		} else if (o1 instanceof ITask) {
-			if (o2 instanceof ITask) {
-				AbstractTask task1 = (AbstractTask) o1;
-				AbstractTask task2 = (AbstractTask) o2;
-				return compare(task1, task2);
-			} else if (o2 instanceof ITaskContainer) {
-				return -1;
-			}
-		}
-		return 0;
-	}
-
-	public void saveState(IMemento memento) {
-		if (memento == null) {
-			return;
-		}
-		IMemento sortingMemento = memento.createChild(activityViewSorterSettings);
-		if (sortingMemento != null) {
-
-			for (int i = 0; i < directions.length; i++) {
-				sortingMemento.putInteger("direction" + i, directions[i]);
-			}
-			sortingMemento.putInteger(activitySortColumn, sortColumn);
-		}
-	}
-
-	public void restoreState(IMemento memento) {
-		if (memento == null) {
-			return;
-		}
-
-		IMemento sortingMemento = memento.getChild(activityViewSorterSettings);
-		if (sortingMemento != null) {
-			try {
-				for (int i = 0; i < directions.length; i++) {
-					directions[i] = sortingMemento.getInteger("direction" + i);
-				}
-				sortColumn = sortingMemento.getInteger(activitySortColumn);
-			} catch (NumberFormatException e) {
-				resetState();
-			}
-		}
-	}
-
-}
diff --git a/org.eclipse.mylyn.tests.report/.classpath b/org.eclipse.mylyn.tests.report/.classpath
deleted file mode 100644
index 994239d..0000000
--- a/org.eclipse.mylyn.tests.report/.classpath
+++ /dev/null
@@ -1,10 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/org.eclipse.mylyn.trac.core"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/org.eclipse.mylyn.tasks.core"/>
-	<classpathentry kind="lib" path="lib/org.eclipse.equinox.common_3.4.0.v20070910.jar"/>
-	<classpathentry combineaccessrules="false" kind="src" path="/org.eclipse.mylyn.commons.net"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.mylyn.tests.report/.project b/org.eclipse.mylyn.tests.report/.project
deleted file mode 100644
index 431fb0f..0000000
--- a/org.eclipse.mylyn.tests.report/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.mylyn.tests.report</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.mylyn.tests.report/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.tests.report/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 8b08f1b..0000000
--- a/org.eclipse.mylyn.tests.report/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,340 +0,0 @@
-#Thu Apr 24 21:03:23 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-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.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
-org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
-org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL,NORMAL
-org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX,API
-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_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_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_selector_in_method_invocation=80
-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.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=1
-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=false
-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=false
-org.eclipse.jdt.core.formatter.comment.format_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=false
-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=120
-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=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-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=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_member=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_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not 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=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=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_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_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_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_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_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.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=120
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
-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_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.tests.report/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.tests.report/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 5e70d08..0000000
--- a/org.eclipse.mylyn.tests.report/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,63 +0,0 @@
-#Sat Mar 01 03:38:47 PST 2008
-cleanup_settings_version=2
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-formatter_profile=_Mylyn based on Eclipse
-formatter_settings_version=11
-internal.default.compliance=default
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=true
-org.eclipse.jdt.ui.javadoc=false
-org.eclipse.jdt.ui.keywordthis=false
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2004, 2007 Mylyn project committers and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
-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_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=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=true
-sp_cleanup.correct_indentation=true
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.make_local_variable_final=false
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-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=true
-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=true
-sp_cleanup.remove_unused_imports=false
-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=true
-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=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.tests.report/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.tests.report/.settings/org.eclipse.mylyn.tasks.ui.prefs
deleted file mode 100644
index 650aa91..0000000
--- a/org.eclipse.mylyn.tests.report/.settings/org.eclipse.mylyn.tasks.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Sat Dec 15 19:32:21 GMT-08:00 2007
-eclipse.preferences.version=1
-project.repository.kind=bugzilla
-project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.tests.report/.settings/org.eclipse.wst.validation.prefs b/org.eclipse.mylyn.tests.report/.settings/org.eclipse.wst.validation.prefs
deleted file mode 100644
index 0efb33f..0000000
--- a/org.eclipse.mylyn.tests.report/.settings/org.eclipse.wst.validation.prefs
+++ /dev/null
@@ -1,6 +0,0 @@
-#Sat Dec 15 19:32:22 GMT-08:00 2007
-DELEGATES_PREFERENCE=delegateValidatorListorg.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator\=org.eclipse.wst.xsd.core.internal.validation.eclipse.Validator;org.eclipse.wst.wsdl.validation.internal.eclipse.WSDLDelegatingValidator\=org.eclipse.wst.wsdl.validation.internal.eclipse.Validator;
-USER_BUILD_PREFERENCE=enabledBuildValidatorListorg.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator;org.eclipse.wst.dtd.core.internal.validation.eclipse.Validator;org.eclipse.wst.wsi.ui.internal.WSIMessageValidator;org.eclipse.wst.html.internal.validation.HTMLValidator;org.eclipse.wst.xml.core.internal.validation.eclipse.Validator;org.eclipse.wst.wsdl.validation.internal.eclipse.WSDLDelegatingValidator;
-USER_MANUAL_PREFERENCE=enabledManualValidatorListorg.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator;org.eclipse.wst.dtd.core.internal.validation.eclipse.Validator;org.eclipse.wst.wsi.ui.internal.WSIMessageValidator;org.eclipse.wst.html.internal.validation.HTMLValidator;org.eclipse.wst.xml.core.internal.validation.eclipse.Validator;org.eclipse.wst.wsdl.validation.internal.eclipse.WSDLDelegatingValidator;
-USER_PREFERENCE=overrideGlobalPreferencesfalse
-eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.tests.report/lib/org.eclipse.equinox.common_3.4.0.v20070910.jar b/org.eclipse.mylyn.tests.report/lib/org.eclipse.equinox.common_3.4.0.v20070910.jar
deleted file mode 100644
index b1b8d1a..0000000
--- a/org.eclipse.mylyn.tests.report/lib/org.eclipse.equinox.common_3.4.0.v20070910.jar
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.tests.report/repository.properties b/org.eclipse.mylyn.tests.report/repository.properties
deleted file mode 100644
index 182f4aa..0000000
--- a/org.eclipse.mylyn.tests.report/repository.properties
+++ /dev/null
@@ -1,3 +0,0 @@
-url=http\://localhost/tractest
-username=
-password=
\ No newline at end of file
diff --git a/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/Build.java b/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/Build.java
deleted file mode 100644
index 88fb13a..0000000
--- a/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/Build.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.tests.report;
-
-/**
- * @author Steffen Pingel
- */
-public class Build {
-
-	private final String id;
-
-	public Build(String id) {
-		this.id = id;
-	}
-
-	public String getId() {
-		return id;
-	}
-
-}
diff --git a/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/JUnitReportParser.java b/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/JUnitReportParser.java
deleted file mode 100644
index 28b6e7b..0000000
--- a/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/JUnitReportParser.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.tests.report;
-
-import javax.xml.namespace.QName;
-import javax.xml.stream.XMLEventReader;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.events.Attribute;
-import javax.xml.stream.events.StartElement;
-import javax.xml.stream.events.XMLEvent;
-
-import org.eclipse.mylyn.internal.tests.report.TestCaseResult.TestCaseResultType;
-
-/**
- * @author Steffen Pingel
- */
-public class JUnitReportParser {
-
-	private static final String TAG_TEST_CASE = "testcase";
-
-	private static final String TAG_TEST_CASE_FAILURE = "failure";
-
-	private static final String TAG_TEST_CASE_ERROR = "error";
-
-	private static final String ATTRIBUTE_CLASS_NAME = "classname";
-
-	private static final String ATTRIBUTE_TEST_NAME = "name";
-
-	private static final String ATTRIBUTE_MESSAGE = "message";
-
-	private static final String ATTRIBUTE_TYPE = "type";
-
-	private final TestCaseVisitor reportVisitor;
-
-	public JUnitReportParser(TestCaseVisitor reportVisitor) {
-		this.reportVisitor = reportVisitor;
-	}
-
-	private String getAttributeValue(StartElement element, String name) throws XMLStreamException {
-		Attribute attribute = element.getAttributeByName(new QName(name));
-		if (attribute == null) {
-			throw new XMLStreamException("Missing mandatory attribute: " + name, element.getLocation());
-		}
-		return attribute.getValue();
-	}
-
-	private String getOptionalAttributeValue(StartElement element, String name) {
-		Attribute attribute = element.getAttributeByName(new QName(name));
-		if (attribute == null) {
-			return null;
-		}
-		return attribute.getValue();
-	}
-
-	public void parse(XMLEventReader reader) throws XMLStreamException {
-		while (reader.hasNext()) {
-			XMLEvent event = reader.nextEvent();
-			if (event.isStartElement()) {
-				StartElement element = event.asStartElement();
-				if (TAG_TEST_CASE.equals(element.getName().getLocalPart())) {
-					TestCase testCase = parseTestCase(reader, element);
-					if (testCase != null) {
-						reportVisitor.visit(testCase);
-					}
-				}
-			}
-		}
-	}
-
-	private TestCase parseTestCase(XMLEventReader reader, StartElement testCaseElement) throws XMLStreamException {
-		String className = getAttributeValue(testCaseElement, ATTRIBUTE_CLASS_NAME);
-		String testName = getAttributeValue(testCaseElement, ATTRIBUTE_TEST_NAME);
-		TestCaseResult result = null;
-		while (reader.hasNext()) {
-			XMLEvent event = reader.nextEvent();
-			if (event.isStartElement()) {
-				StartElement element = event.asStartElement();
-				if (TAG_TEST_CASE_FAILURE.equals(element.getName().getLocalPart())) {
-					result = parseTestCaseResult(reader, element, TestCaseResultType.FAILURE);
-				} else if (TAG_TEST_CASE_ERROR.equals(element.getName().getLocalPart())) {
-					result = parseTestCaseResult(reader, element, TestCaseResultType.FAILURE);
-				}
-			} else if (event.isEndElement()) {
-				break;
-			}
-		}
-
-		return new TestCase(className, testName, result);
-	}
-
-	private TestCaseResult parseTestCaseResult(XMLEventReader reader, StartElement resultElement,
-			TestCaseResultType resultType) throws XMLStreamException {
-		String type = getAttributeValue(resultElement, ATTRIBUTE_TYPE);
-		String message = getOptionalAttributeValue(resultElement, ATTRIBUTE_MESSAGE);
-		return new TestCaseResult(resultType, type, message, reader.getElementText());
-	}
-}
diff --git a/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/Main.java b/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/Main.java
deleted file mode 100644
index d741e12..0000000
--- a/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/Main.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.tests.report;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.util.Properties;
-
-import javax.xml.stream.XMLEventReader;
-import javax.xml.stream.XMLInputFactory;
-
-import org.eclipse.mylyn.commons.net.AuthenticationCredentials;
-import org.eclipse.mylyn.commons.net.AuthenticationType;
-import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
-import org.eclipse.mylyn.internal.trac.core.ITracClient.Version;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-
-/**
- * @author Steffen Pingel
- */
-public class Main {
-
-	public static void main(String[] args) {
-		Build build = null;
-		String filename = null;
-		String propertiesFilename = null;
-
-		for (int i = 0; i < args.length; i++) {
-			if ("-build".equals(args[i])) {
-				build = new Build(readArg(args, ++i));
-			} else if ("-in".equals(args[i])) {
-				filename = readArg(args, ++i);
-			}
-			if ("-config".equals(args[i])) {
-				propertiesFilename = readArg(args, ++i);
-			}
-		}
-
-		if (build == null || filename == null || propertiesFilename == null) {
-			printUsage();
-			System.exit(1);
-		}
-
-		try {
-			TaskRepository repository = readConfig(new File(propertiesFilename));
-			process(repository, new File(filename), build);
-		} catch (Exception e) {
-			e.printStackTrace();
-		}
-	}
-
-	private static void printUsage() {
-		System.err.println("Main -in [junit report file] -config [config file] -build [id]");
-
-	}
-
-	private static void process(TaskRepository repository, File file, Build build) throws Exception {
-		XMLInputFactory inputFactory = XMLInputFactory.newInstance();
-		InputStream in = new FileInputStream(file);
-		try {
-			XMLEventReader reader = inputFactory.createXMLEventReader(in);
-			TaskReporter reporter = new TaskReporter(build, repository);
-			JUnitReportParser parser = new JUnitReportParser(reporter);
-			parser.parse(reader);
-			System.out.println(reporter.getStatistics());
-		} finally {
-			in.close();
-		}
-	}
-
-	private static String readArg(String[] args, int i) {
-		if (i > args.length) {
-			printUsage();
-			System.exit(1);
-		}
-		return args[i];
-	}
-
-	private static TaskRepository readConfig(File file) throws Exception {
-		Properties properties = new Properties();
-		InputStream in = new FileInputStream(file);
-		try {
-			properties.load(in);
-			String url = properties.getProperty("url", null);
-
-			if (url == null) {
-				throw new Exception("propertiy 'url' not defined in config file");
-			}
-
-			String userName = properties.getProperty("username", "");
-			String password = properties.getProperty("password", "");
-			AuthenticationCredentials credentials = new AuthenticationCredentials(userName, password);
-
-			TaskRepository repository = new TaskRepository(TracCorePlugin.REPOSITORY_KIND, url);
-			repository.setCredentials(AuthenticationType.REPOSITORY, credentials, false);
-			repository.setVersion(Version.XML_RPC.name());
-			return repository;
-		} finally {
-			in.close();
-		}
-	}
-
-}
diff --git a/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/TaskReporter.java b/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/TaskReporter.java
deleted file mode 100644
index daa74f1..0000000
--- a/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/TaskReporter.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.tests.report;
-
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractAttributeFactory;
-import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractTaskDataHandler;
-import org.eclipse.mylyn.internal.tasks.core.deprecated.ITaskFactory;
-import org.eclipse.mylyn.internal.tasks.core.deprecated.QueryHitCollector;
-import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryOperation;
-import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskAttribute;
-import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData;
-import org.eclipse.mylyn.internal.tasks.core.deprecated.TaskComment;
-import org.eclipse.mylyn.internal.tests.report.TestCaseResult.TestCaseResultType;
-import org.eclipse.mylyn.internal.trac.core.ITracClient;
-import org.eclipse.mylyn.internal.trac.core.TracRemoteException;
-import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector;
-import org.eclipse.mylyn.internal.trac.core.TracRepositoryQuery;
-import org.eclipse.mylyn.internal.trac.core.TracTask;
-import org.eclipse.mylyn.internal.trac.core.model.TracSearch;
-import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-
-/**
- * @author Steffen Pingel
- */
-class TaskReporter implements TestCaseVisitor {
-
-	private static final RepositoryOperation OPERATION_REOPEN;
-
-	private static final RepositoryOperation OPERATION_RESOLVE;
-
-	private static final int MAX_ERROR_TIMEOUT = 3;
-
-	static {
-		OPERATION_REOPEN = new RepositoryOperation("reopen", "");
-
-		OPERATION_RESOLVE = new RepositoryOperation("resolve", "");
-		OPERATION_RESOLVE.setOptionSelection("fixed");
-	}
-
-	private final TracRepositoryConnector connector;
-
-	private final AbstractTaskDataHandler taskDataHandler;
-
-	private final TaskRepository repository;
-
-	private final Build build;
-
-	private final TaskReporterStatistics statistics;
-
-	private int timeoutErrorCount;
-
-	public TaskReporter(Build build, TaskRepository repository) {
-		this.build = build;
-		this.repository = repository;
-		this.connector = new TracRepositoryConnector();
-		this.taskDataHandler = connector.getLegacyTaskDataHandler();
-		this.statistics = new TaskReporterStatistics();
-	}
-
-	private RepositoryTaskData createTaskData(TestCase testCase) throws CoreException {
-		AbstractAttributeFactory attributeFactory = taskDataHandler.getAttributeFactory(repository.getRepositoryUrl(),
-				repository.getConnectorKind(), AbstractTask.DEFAULT_TASK_KIND);
-
-		RepositoryTaskData taskData = new RepositoryTaskData(attributeFactory, repository.getConnectorKind(),
-				repository.getRepositoryUrl(), "0");
-		taskData.setNew(true);
-		taskDataHandler.initializeTaskData(repository, taskData, new NullProgressMonitor());
-		taskData.setSummary(getTaskSummary(testCase));
-		taskData.setDescription(getTaskDescription(testCase));
-		return taskData;
-	}
-
-	private String getQueryUrl(TestCase testCase) {
-		TracSearch search = new TracSearch();
-		search.addFilter("summary", getTaskSummary(testCase));
-		search.addFilter("description", getTaskDescription(testCase));
-
-		StringBuilder sb = new StringBuilder();
-		sb.append(repository.getRepositoryUrl());
-		sb.append(ITracClient.QUERY_URL);
-		sb.append(search.toUrl());
-		return sb.toString();
-	}
-
-	public TaskReporterStatistics getStatistics() {
-		return statistics;
-	}
-
-	private String getTaskComment(TestCaseResult result) {
-		StringBuilder sb = new StringBuilder();
-		if (result.getResultType() == TestCaseResultType.FAILURE) {
-			sb.append("Failure since build ");
-		} else {
-			sb.append("Error since build ");
-		}
-		sb.append(build.getId());
-		sb.append(": ");
-		if (result.getMessage() != null) {
-			sb.append(result.getMessage());
-		}
-		sb.append("\n\n");
-		sb.append(result.getStackTrace());
-		return sb.toString();
-	}
-
-	private String getTaskDescription(TestCase testCase) {
-		return "Test results for " + testCase.getClassName() + "." + testCase.getTestName() + "()";
-	}
-
-	private String getTaskSummary(TestCase testCase) {
-		return testCase.getShortClassName() + ": " + testCase.getTestName();
-	}
-
-	private void handleError(IStatus status) {
-		System.err.println(status);
-		if (status.getException() != null) {
-			status.getException().printStackTrace();
-		}
-		System.exit(1);
-	}
-
-	private void handleResults(TestCase testCase, Set<AbstractTask> tasks) throws CoreException {
-		String id;
-		RepositoryTaskData taskData = null;
-		if (tasks.isEmpty()) {
-			if (testCase.getResult() != null) {
-				message(" creating task");
-				taskData = createTaskData(testCase);
-				id = taskDataHandler.postTaskData(repository, taskData, new NullProgressMonitor());
-			} else {
-				statistics.tasksUntouched++;
-				// test case succeeded and task does not exist
-				message(" nothing to do");
-				return;
-			}
-		} else {
-			ITask task = tasks.iterator().next();
-			id = task.getTaskId();
-		}
-
-		message(" downloading task");
-		taskData = taskDataHandler.getTaskData(repository, id, new NullProgressMonitor());
-
-		String status = taskData.getAttribute(RepositoryTaskAttribute.STATUS).getValue();
-		if (testCase.getResult() != null) {
-			if (TracTask.Status.CLOSED == TracTask.Status.fromStatus(status)) {
-				taskData.setSelectedOperation(OPERATION_REOPEN);
-			}
-			if (matchesLastComment(taskData, testCase.getResult())) {
-				statistics.tasksStackTraceUpToDate++;
-				message(" stack trace is up to date");
-			} else {
-				statistics.tasksReopened++;
-				message(" adding new stack trace");
-				taskData.setNewComment(getTaskComment(testCase.getResult()));
-			}
-		} else {
-			if (TracTask.Status.CLOSED == TracTask.Status.fromStatus(status)) {
-				statistics.tasksUntouched++;
-				// test case succeeded and task is closed
-				message(" nothing to do, task is alread closed");
-				return;
-			} else {
-				statistics.tasksResolved++;
-				message(" resolving task");
-				taskData.setNewComment("Fixed in build " + build.getId());
-				taskData.setSelectedOperation(OPERATION_RESOLVE);
-			}
-		}
-
-		message(" submitting task");
-		taskDataHandler.postTaskData(repository, taskData, new NullProgressMonitor());
-	}
-
-	private boolean matchesLastComment(RepositoryTaskData taskData, TestCaseResult result) {
-		List<TaskComment> comments = taskData.getComments();
-		if (comments != null && !comments.isEmpty()) {
-			TaskComment lastComment = comments.get(comments.size() - 1);
-			if (lastComment.getText().endsWith(result.getStackTrace())) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	private void message(String string) {
-		System.out.println(string);
-	}
-
-	public void visit(TestCase testCase) {
-		// ITracClient client =
-		// connector.getClientManager().getRepository(repository);
-		// if (!client.hasAttributes()) {
-		// message("Updating repository configuration: " + repository.getUrl());
-		// try {
-		// client.updateAttributes(new NullProgressMonitor(), false);
-		// } catch (TracException e) {
-		// handleError(TracCorePlugin.toStatus(e, repository));
-		// }
-		// }
-		//
-		message("Processing: " + testCase.getClassName() + "#" + testCase.getTestName());
-		String queryUrl = getQueryUrl(testCase);
-		IRepositoryQuery query = new TracRepositoryQuery(repository.getRepositoryUrl(), queryUrl, "");
-		QueryHitCollector resultCollector = new QueryHitCollector(new ITaskFactory() {
-			public AbstractTask createTask(RepositoryTaskData taskData, IProgressMonitor monitor) throws CoreException {
-				throw new UnsupportedOperationException();
-			}
-		});
-		IStatus status = connector.performQuery(repository, query, resultCollector, null, new NullProgressMonitor());
-		if (status.isOK()) {
-			try {
-				handleResults(testCase, resultCollector.getTasks());
-			} catch (CoreException e) {
-				if (e.getStatus().getException() instanceof TracRemoteException) {
-					String message = e.getStatus().getException().getMessage();
-					if (message != null && message.contains("timeout")) {
-						timeoutErrorCount++;
-						if (timeoutErrorCount <= MAX_ERROR_TIMEOUT) {
-							// ignore a few timeouts
-							statistics.ignoredErrors++;
-							message(" timeout (" + timeoutErrorCount + "/" + MAX_ERROR_TIMEOUT + ")");
-							return;
-						}
-					}
-				}
-				handleError(e.getStatus());
-			}
-		} else {
-			handleError(status);
-		}
-	}
-
-}
diff --git a/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/TaskReporterStatistics.java b/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/TaskReporterStatistics.java
deleted file mode 100644
index 740732b..0000000
--- a/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/TaskReporterStatistics.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.tests.report;
-
-/**
- * @author Steffen Pingel
- */
-public class TaskReporterStatistics {
-
-	public int tasksReopened;
-
-	public int tasksResolved;
-
-	public int tasksUntouched;
-
-	public int tasksStackTraceUpToDate;
-
-	public int ignoredErrors;
-
-	@Override
-	public String toString() {
-		StringBuilder sb = new StringBuilder();
-		sb.append("Tasks untouched : ").append(tasksUntouched).append("\n");
-		sb.append("Tasks resolved  : ").append(tasksResolved).append("\n");
-		sb.append("Tasks reopened  : ").append(tasksReopened).append("\n");
-		sb.append("Tasks up-to-date: ").append(tasksStackTraceUpToDate).append("\n");
-		if (ignoredErrors > 0) {
-			sb.append("Ignored errors  : ").append(ignoredErrors).append("\n");
-		}
-		sb.append("Total           : ")
-				.append(tasksUntouched + tasksResolved + tasksReopened + tasksStackTraceUpToDate);
-		return sb.toString();
-	}
-
-}
diff --git a/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/TestCase.java b/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/TestCase.java
deleted file mode 100644
index 5bb9839..0000000
--- a/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/TestCase.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.tests.report;
-
-/**
- * @author Steffen Pingel
- */
-public class TestCase {
-
-	private final String className;
-
-	private final String testName;
-
-	private final TestCaseResult result;
-
-	public TestCase(String className, String testName, TestCaseResult result) {
-		this.className = className;
-		this.testName = testName;
-		this.result = result;
-	}
-
-	public String getClassName() {
-		return className;
-	}
-
-	public String getPackageName() {
-		int i = className.lastIndexOf(".");
-		return i != -1 ? className.substring(0, i) : "";
-	}
-
-	public TestCaseResult getResult() {
-		return result;
-	}
-
-	public String getShortClassName() {
-		int i = className.lastIndexOf(".");
-		return i != -1 ? className.substring(i + 1) : className;
-	}
-
-	public String getTestName() {
-		return testName;
-	}
-
-	@Override
-	public String toString() {
-		return getClass().getName() + " [className=" + className + ",testName=" + testName + ",result=" + result + "]";
-	}
-
-}
diff --git a/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/TestCaseResult.java b/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/TestCaseResult.java
deleted file mode 100644
index de9a7be..0000000
--- a/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/TestCaseResult.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.tests.report;
-
-/**
- * @author Steffen Pingel
- */
-public class TestCaseResult {
-
-	public enum TestCaseResultType {
-		ERROR, FAILURE
-	};
-
-	private final TestCaseResultType resultType;
-
-	private final String type;
-
-	private final String message;
-
-	private final String stackTrace;
-
-	public TestCaseResult(TestCaseResultType resultType, String type, String message, String stackTrace) {
-		this.resultType = resultType;
-		this.type = type;
-		this.message = message;
-		this.stackTrace = stackTrace;
-	}
-
-	public String getMessage() {
-		return message;
-	}
-
-	public TestCaseResultType getResultType() {
-		return resultType;
-	}
-
-	public String getStackTrace() {
-		return stackTrace;
-	}
-
-	public String getType() {
-		return type;
-	}
-
-	@Override
-	public String toString() {
-		return resultType.name();
-	}
-}
diff --git a/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/TestCaseVisitor.java b/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/TestCaseVisitor.java
deleted file mode 100644
index 577fb48..0000000
--- a/org.eclipse.mylyn.tests.report/src/org/eclipse/mylyn/internal/tests/report/TestCaseVisitor.java
+++ /dev/null
@@ -1,17 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.tests.report;
-
-/**
- * @author Steffen Pingel
- */
-public interface TestCaseVisitor {
-
-	public void visit(TestCase testCase);
-
-}
diff --git a/org.eclipse.mylyn.trac.wiki/.classpath b/org.eclipse.mylyn.trac.wiki/.classpath
deleted file mode 100644
index fd21c45..0000000
--- a/org.eclipse.mylyn.trac.wiki/.classpath
+++ /dev/null
@@ -1,15 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
-		<accessrules>
-			<accessrule kind="accessible" pattern="org/eclipse/mylyn/internal/trac/**"/>
-		</accessrules>
-	</classpathentry>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
-		<accessrules>
-			<accessrule kind="nonaccessible" pattern="com/sun/**"/>
-		</accessrules>
-	</classpathentry>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.mylyn.trac.wiki/.cvsignore b/org.eclipse.mylyn.trac.wiki/.cvsignore
deleted file mode 100644
index 4a98758..0000000
--- a/org.eclipse.mylyn.trac.wiki/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-bin
-.fbwarnings
diff --git a/org.eclipse.mylyn.trac.wiki/.project b/org.eclipse.mylyn.trac.wiki/.project
deleted file mode 100644
index e130d00..0000000
--- a/org.eclipse.mylyn.trac.wiki/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.mylyn.trac.wiki</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.mylyn.trac.wiki/.settings/.api_filters b/org.eclipse.mylyn.trac.wiki/.settings/.api_filters
deleted file mode 100644
index 38933e6..0000000
--- a/org.eclipse.mylyn.trac.wiki/.settings/.api_filters
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<component id="org.eclipse.mylyn.trac.wiki" version="2">
-    <resource path="META-INF/MANIFEST.MF">
-        <filter id="925892614">
-            <message_arguments>
-                <message_argument value="3.0.0.qualifier"/>
-                <message_argument value="2.3.2.v20080402-2100"/>
-            </message_arguments>
-        </filter>
-    </resource>
-</component>
diff --git a/org.eclipse.mylyn.trac.wiki/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.trac.wiki/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 66356cf..0000000
--- a/org.eclipse.mylyn.trac.wiki/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,340 +0,0 @@
-#Tue May 20 11:03:13 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-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.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
-org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
-org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL,NORMAL
-org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX,API
-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_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_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_selector_in_method_invocation=80
-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.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=1
-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=false
-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=false
-org.eclipse.jdt.core.formatter.comment.format_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=false
-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=120
-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=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-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=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_member=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_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not 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=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=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_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_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_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_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_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.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=120
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
-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_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.trac.wiki/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.trac.wiki/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 5e70d08..0000000
--- a/org.eclipse.mylyn.trac.wiki/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,63 +0,0 @@
-#Sat Mar 01 03:38:47 PST 2008
-cleanup_settings_version=2
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-formatter_profile=_Mylyn based on Eclipse
-formatter_settings_version=11
-internal.default.compliance=default
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=true
-org.eclipse.jdt.ui.javadoc=false
-org.eclipse.jdt.ui.keywordthis=false
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2004, 2007 Mylyn project committers and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
-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_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=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=true
-sp_cleanup.correct_indentation=true
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.make_local_variable_final=false
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-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=true
-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=true
-sp_cleanup.remove_unused_imports=false
-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=true
-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=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.trac.wiki/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.trac.wiki/.settings/org.eclipse.ltk.core.refactoring.prefs
deleted file mode 100644
index 7ab03bd..0000000
--- a/org.eclipse.mylyn.trac.wiki/.settings/org.eclipse.ltk.core.refactoring.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Jun 02 15:30:09 PDT 2006
-eclipse.preferences.version=1
-org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.trac.wiki/.settings/org.eclipse.mylyn.tasklist.prefs b/org.eclipse.mylyn.trac.wiki/.settings/org.eclipse.mylyn.tasklist.prefs
deleted file mode 100644
index 0a2cc0b..0000000
--- a/org.eclipse.mylyn.trac.wiki/.settings/org.eclipse.mylyn.tasklist.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Jun 18 17:14:59 PDT 2007
-eclipse.preferences.version=1
-project.repository.kind=bugzilla
-project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.trac.wiki/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.trac.wiki/.settings/org.eclipse.mylyn.tasks.ui.prefs
deleted file mode 100644
index d8c6d26..0000000
--- a/org.eclipse.mylyn.trac.wiki/.settings/org.eclipse.mylyn.tasks.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Jun 25 03:02:37 GMT 2007
-eclipse.preferences.version=1
-project.repository.kind=bugzilla
-project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.trac.wiki/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.trac.wiki/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index e8f2d56..0000000
--- a/org.eclipse.mylyn.trac.wiki/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,18 +0,0 @@
-#Tue Apr 15 11:07:59 PDT 2008
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=2
-compilers.p.missing-bundle-classpath-entries=1
-compilers.p.missing-packages=1
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=2
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=0
-compilers.p.unknown-element=0
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=0
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.trac.wiki/META-INF/MANIFEST.MF b/org.eclipse.mylyn.trac.wiki/META-INF/MANIFEST.MF
deleted file mode 100644
index 969a1c2..0000000
--- a/org.eclipse.mylyn.trac.wiki/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,25 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Mylyn Trac Connector Wiki Support
-Bundle-SymbolicName: org.eclipse.mylyn.trac.wiki;singleton:=true
-Bundle-Version: 3.0.0.qualifier
-Bundle-ActivationPolicy: lazy
-Bundle-Vendor: Eclipse.org
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.jface.text,
- org.eclipse.team.ui,
- org.eclipse.ui,
- org.eclipse.ui.forms,
- org.eclipse.ui.editors,
- org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.tasks.ui;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.tasks.core;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.trac.core;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.trac.ui;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.commons.net;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.commons.ui;bundle-version="[3.0.0,4.0.0)"
-Bundle-Activator: org.eclipse.mylyn.internal.trac.wiki.TracWikiPlugin
-Export-Package: org.eclipse.mylyn.internal.trac.wiki;x-internal:=true,
- org.eclipse.mylyn.internal.trac.wiki.actions;x-internal:=true,
- org.eclipse.mylyn.internal.trac.wiki.editor;x-internal:=true
diff --git a/org.eclipse.mylyn.trac.wiki/about.html b/org.eclipse.mylyn.trac.wiki/about.html
deleted file mode 100644
index 0dd939c..0000000
--- a/org.eclipse.mylyn.trac.wiki/about.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 7, 2007</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.trac.wiki/build.properties b/org.eclipse.mylyn.trac.wiki/build.properties
deleted file mode 100644
index e74cb9d..0000000
--- a/org.eclipse.mylyn.trac.wiki/build.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 Mylyn project committers and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-###############################################################################
-bin.includes = plugin.xml,\
-               META-INF/,\
-               about.html,\
-               .,\
-               icons/
-src.includes = about.html
-jre.compilation.profile = J2SE-1.5
-source.. = src/
diff --git a/org.eclipse.mylyn.trac.wiki/icons/eview16/trac-icon.gif b/org.eclipse.mylyn.trac.wiki/icons/eview16/trac-icon.gif
deleted file mode 100644
index dd0832e..0000000
--- a/org.eclipse.mylyn.trac.wiki/icons/eview16/trac-icon.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.trac.wiki/plugin.xml b/org.eclipse.mylyn.trac.wiki/plugin.xml
deleted file mode 100644
index 3b107c2..0000000
--- a/org.eclipse.mylyn.trac.wiki/plugin.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-      
-   <extension
-         point="org.eclipse.ui.popupMenus">
-      <viewerContribution
-            id="org.eclipse.mylyn.trac.ui.viewerContribution"
-            targetID="org.eclipse.mylyn.tasks.ui.views.repositories">
-         <action
-               class="org.eclipse.mylyn.internal.trac.wiki.actions.OpenWikiPageAction"
-               id="org.eclipse.mylyn.trac.ui.open.wikipage"
-               label="Open Wiki Page..."
-               menubarPath="additions"
-               tooltip="Open Wiki Page">
-         </action>
-      </viewerContribution>
-   </extension>
-   <extension
-         point="org.eclipse.ui.editors">
-      <editor
-            class="org.eclipse.mylyn.internal.trac.wiki.editor.TracWikiPageEditor"
-            icon="icons/eview16/trac-icon.gif"
-            id="org.eclipse.mylyn.trac.ui.editor.wikipage"
-            name="Wiki Page Editor">
-      </editor>
-   </extension>
-   
-</plugin>
diff --git a/org.eclipse.mylyn.trac.wiki/src/org/eclipse/mylyn/internal/trac/wiki/TracWikiPageHistoryPage.java b/org.eclipse.mylyn.trac.wiki/src/org/eclipse/mylyn/internal/trac/wiki/TracWikiPageHistoryPage.java
deleted file mode 100644
index f92db4c..0000000
--- a/org.eclipse.mylyn.trac.wiki/src/org/eclipse/mylyn/internal/trac/wiki/TracWikiPageHistoryPage.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.trac.wiki;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TableViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.mylyn.internal.trac.core.AbstractWikiHandler;
-import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
-import org.eclipse.mylyn.internal.trac.core.model.TracWikiPage;
-import org.eclipse.mylyn.internal.trac.core.model.TracWikiPageInfo;
-import org.eclipse.mylyn.internal.trac.wiki.editor.TracWikiPageEditorInput;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.team.ui.history.HistoryPage;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * @author Xiaoyang Guan
- */
-public class TracWikiPageHistoryPage extends HistoryPage {
-
-	private TableViewer viewer;
-
-	class DownloadPageHistoryJob extends Job {
-
-		private final TaskRepository repository;
-
-		private final TracWikiPage page;
-
-		public DownloadPageHistoryJob(TaskRepository repository, TracWikiPage page) {
-			super("Download Page History");
-			this.repository = repository;
-			this.page = page;
-		}
-
-		@Override
-		protected IStatus run(IProgressMonitor monitor) {
-			AbstractWikiHandler wikiHandler = TracCorePlugin.getDefault().getConnector().getWikiHandler();
-			try {
-				monitor.beginTask("Retrieving wiki page history", IProgressMonitor.UNKNOWN);
-				final TracWikiPageInfo[] pageVersions = wikiHandler.getPageHistory(repository, page.getPageInfo()
-						.getPageName(), monitor);
-				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-
-					public void run() {
-						viewer.setInput(pageVersions);
-					}
-
-				});
-			} catch (CoreException e) {
-				PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-
-					public void run() {
-						viewer.setInput(null);
-					}
-
-				});
-			} finally {
-				monitor.done();
-			}
-			return Status.OK_STATUS;
-		}
-
-	}
-
-	@Override
-	public boolean inputSet() {
-		if (getInput() instanceof TracWikiPageEditorInput) {
-			refresh();
-			return true;
-		}
-		return false;
-	}
-
-	class PageHistoryContentProvider implements IStructuredContentProvider {
-
-		public Object[] getElements(Object inputElement) {
-			return (TracWikiPageInfo[]) inputElement;
-		}
-
-		public void dispose() {
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-
-	}
-
-	@Override
-	public void createControl(Composite parent) {
-		viewer = new TableViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.FULL_SELECTION);
-		viewer.setContentProvider(new PageHistoryContentProvider());
-
-		TableViewerColumn column = new TableViewerColumn(viewer, SWT.NONE);
-		column.getColumn().setWidth(80);
-		column.getColumn().setText("Version");
-		column.getColumn().setMoveable(true);
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			@Override
-			public String getText(Object element) {
-				return ((TracWikiPageInfo) element).getVersion() + "";
-			}
-		});
-
-		column = new TableViewerColumn(viewer, SWT.NONE);
-		column.getColumn().setWidth(250);
-		column.getColumn().setText("Date");
-		column.getColumn().setMoveable(true);
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			@Override
-			public String getText(Object element) {
-				return ((TracWikiPageInfo) element).getLastModified().toString();
-			}
-
-		});
-
-		column = new TableViewerColumn(viewer, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("Author");
-		column.getColumn().setMoveable(true);
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			@Override
-			public String getText(Object element) {
-				return ((TracWikiPageInfo) element).getAuthor();
-			}
-
-		});
-
-		column = new TableViewerColumn(viewer, SWT.NONE);
-		column.getColumn().setWidth(200);
-		column.getColumn().setText("Comment");
-		column.getColumn().setMoveable(true);
-		column.setLabelProvider(new ColumnLabelProvider() {
-
-			@Override
-			public String getText(Object element) {
-				return ((TracWikiPageInfo) element).getComment();
-			}
-
-		});
-
-		viewer.getTable().setLinesVisible(true);
-		viewer.getTable().setHeaderVisible(true);
-		viewer.setComparator(new ViewerComparator() {
-
-			@Override
-			public int compare(Viewer viewer, Object e1, Object e2) {
-				if (e1 instanceof TracWikiPageInfo && e2 instanceof TracWikiPageInfo) {
-					// sort from the latest version to the earliest version
-					return ((TracWikiPageInfo) e2).getVersion() - ((TracWikiPageInfo) e1).getVersion();
-				}
-				return super.compare(viewer, e1, e2);
-			}
-
-		});
-	}
-
-	@Override
-	public Control getControl() {
-		return viewer.getControl();
-	}
-
-	@Override
-	public void setFocus() {
-		getControl().setFocus();
-	}
-
-	public String getDescription() {
-		return "Change History for " + getName();
-	}
-
-	public String getName() {
-		TracWikiPageEditorInput input = (TracWikiPageEditorInput) getInput();
-		return input.getPage().getPageInfo().getPageName() + " [" + input.getRepository().getRepositoryLabel() + "]";
-	}
-
-	public boolean isValidInput(Object object) {
-		if (object instanceof TracWikiPageEditorInput) {
-			TracWikiPageEditorInput input = (TracWikiPageEditorInput) object;
-			return input.getRepository() != null && input.getPage() != null;
-		}
-		return false;
-	}
-
-	public void refresh() {
-		TracWikiPageEditorInput input = (TracWikiPageEditorInput) getInput();
-		(new DownloadPageHistoryJob(input.getRepository(), input.getPage())).schedule();
-	}
-
-	@SuppressWarnings("unchecked")
-	public Object getAdapter(Class adapter) {
-		return null;
-	}
-
-}
diff --git a/org.eclipse.mylyn.trac.wiki/src/org/eclipse/mylyn/internal/trac/wiki/TracWikiPageHistoryPageSource.java b/org.eclipse.mylyn.trac.wiki/src/org/eclipse/mylyn/internal/trac/wiki/TracWikiPageHistoryPageSource.java
deleted file mode 100644
index bbd6ffa..0000000
--- a/org.eclipse.mylyn.trac.wiki/src/org/eclipse/mylyn/internal/trac/wiki/TracWikiPageHistoryPageSource.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.trac.wiki;
-
-import org.eclipse.mylyn.internal.trac.wiki.editor.TracWikiPageEditorInput;
-import org.eclipse.team.ui.history.HistoryPageSource;
-import org.eclipse.ui.part.Page;
-
-/**
- * @author Xiaoyang Guan
- */
-public class TracWikiPageHistoryPageSource extends HistoryPageSource {
-
-	public boolean canShowHistoryFor(Object object) {
-		if (object instanceof TracWikiPageEditorInput) {
-			return true;
-		}
-		return false;
-	}
-
-	public Page createPage(Object object) {
-		return new TracWikiPageHistoryPage();
-	}
-
-}
diff --git a/org.eclipse.mylyn.trac.wiki/src/org/eclipse/mylyn/internal/trac/wiki/TracWikiPlugin.java b/org.eclipse.mylyn.trac.wiki/src/org/eclipse/mylyn/internal/trac/wiki/TracWikiPlugin.java
deleted file mode 100644
index f6e2f40..0000000
--- a/org.eclipse.mylyn.trac.wiki/src/org/eclipse/mylyn/internal/trac/wiki/TracWikiPlugin.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.trac.wiki;
-
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * @author Steffen Pingel
- */
-public class TracWikiPlugin extends AbstractUIPlugin {
-
-	public static final String PLUGIN_ID = "org.eclipse.mylyn.trac.wiki";
-
-	private static TracWikiPlugin plugin;
-
-	public TracWikiPlugin() {
-	}
-
-	@Override
-	public void start(BundleContext context) throws Exception {
-		plugin = this;
-		super.start(context);
-	}
-
-	@Override
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	public static TracWikiPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/org.eclipse.mylyn.trac.wiki/src/org/eclipse/mylyn/internal/trac/wiki/actions/OpenWikiPageAction.java b/org.eclipse.mylyn.trac.wiki/src/org/eclipse/mylyn/internal/trac/wiki/actions/OpenWikiPageAction.java
deleted file mode 100644
index 7f1b1e9..0000000
--- a/org.eclipse.mylyn.trac.wiki/src/org/eclipse/mylyn/internal/trac/wiki/actions/OpenWikiPageAction.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.trac.wiki.actions;
-
-import java.util.Comparator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.window.Window;
-import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
-import org.eclipse.mylyn.internal.trac.core.AbstractWikiHandler;
-import org.eclipse.mylyn.internal.trac.core.TracRepositoryConnector;
-import org.eclipse.mylyn.internal.trac.core.model.TracWikiPage;
-import org.eclipse.mylyn.internal.trac.wiki.TracWikiPlugin;
-import org.eclipse.mylyn.internal.trac.wiki.editor.TracWikiPageEditor;
-import org.eclipse.mylyn.internal.trac.wiki.editor.TracWikiPageEditorInput;
-import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-import org.eclipse.mylyn.tasks.ui.TasksUi;
-import org.eclipse.mylyn.tasks.ui.TasksUiUtil;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IMemento;
-import org.eclipse.ui.IViewActionDelegate;
-import org.eclipse.ui.IViewPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.dialogs.FilteredItemsSelectionDialog;
-
-/**
- * @author Xiaoyang Guan
- */
-public class OpenWikiPageAction extends Action implements IViewActionDelegate {
-
-	private TaskRepository repository;
-
-	private AbstractWikiHandler wikiHandler;
-
-	private class OpenWikiPageSelectionDialog extends FilteredItemsSelectionDialog {
-
-		private static final String OPEN_WIKI_PAGE_DIALOG_DIALOG_SETTINGS = "org.eclipse.mylyn.trac.ui.open.wikipage";
-
-		private String[] pageNames;
-
-		private DownloadAllPageNamesJob downloadAllPageNamesJob;
-
-		private class DownloadAllPageNamesJob extends Job {
-
-			public DownloadAllPageNamesJob() {
-				super("Downloading All Wiki Page Names");
-			}
-
-			@Override
-			protected IStatus run(IProgressMonitor monitor) {
-				try {
-					pageNames = wikiHandler.downloadAllPageNames(repository, monitor);
-					// refresh the items list with the fetched page names
-					PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-						public void run() {
-							OpenWikiPageSelectionDialog.this.applyFilter();
-						}
-					});
-				} catch (CoreException e) {
-					PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-						public void run() {
-							OpenWikiPageSelectionDialog.this.close();
-						}
-					});
-					TasksUiInternal.displayStatus("Unable to download Wiki page names", e.getStatus());
-				}
-				return Status.OK_STATUS;
-			}
-		}
-
-		public OpenWikiPageSelectionDialog(Shell shell, boolean multi) {
-			super(shell, multi);
-			setTitle("Open Wiki Page");
-			setSelectionHistory(new PageSelectionHistory());
-			setInitialPattern("**");
-			setPageNames();
-		}
-
-		private void setPageNames() {
-			downloadAllPageNamesJob = new DownloadAllPageNamesJob();
-			downloadAllPageNamesJob.setUser(true);
-			downloadAllPageNamesJob.schedule();
-		}
-
-		private void stopDownloading() {
-			if (downloadAllPageNamesJob != null) {
-				downloadAllPageNamesJob.cancel();
-			}
-		}
-
-		private class PageSelectionHistory extends SelectionHistory {
-
-			@Override
-			protected Object restoreItemFromMemento(IMemento memento) {
-				return null;
-			}
-
-			@Override
-			protected void storeItemToMemento(Object item, IMemento memento) {
-			}
-
-		}
-
-		@Override
-		protected Control createExtendedContentArea(Composite parent) {
-			return null;
-		}
-
-		@Override
-		protected ItemsFilter createFilter() {
-			// return null if the download job hasn't finished so the real filter
-			// can be applied only after the pageNames has been populated
-			if (pageNames == null) {
-				return null;
-			}
-			return new ItemsFilter() {
-
-				@Override
-				public boolean isConsistentItem(Object item) {
-					return true;
-				}
-
-				@Override
-				public boolean matchItem(Object item) {
-					if (item != null) {
-						return matches(item.toString());
-					}
-					return false;
-				}
-
-			};
-		}
-
-		@Override
-		protected void fillContentProvider(AbstractContentProvider contentProvider, ItemsFilter itemsFilter,
-				IProgressMonitor progressMonitor) throws CoreException {
-			if (pageNames != null) {
-				progressMonitor.beginTask("Searching", pageNames.length);
-				for (String pageName : pageNames) {
-					contentProvider.add(pageName, itemsFilter);
-					progressMonitor.worked(1);
-				}
-			}
-			progressMonitor.done();
-		}
-
-		@Override
-		protected IDialogSettings getDialogSettings() {
-			IDialogSettings settings = TracWikiPlugin.getDefault().getDialogSettings().getSection(
-					OPEN_WIKI_PAGE_DIALOG_DIALOG_SETTINGS);
-			if (settings == null) {
-				settings = TracWikiPlugin.getDefault().getDialogSettings().addNewSection(
-						OPEN_WIKI_PAGE_DIALOG_DIALOG_SETTINGS);
-			}
-			return settings;
-		}
-
-		@Override
-		public String getElementName(Object item) {
-			return item.toString();
-		}
-
-		@Override
-		protected Comparator<Object> getItemsComparator() {
-			return new Comparator<Object>() {
-
-				public int compare(Object o1, Object o2) {
-					return o1.toString().compareTo(o2.toString());
-				}
-
-			};
-		}
-
-		@Override
-		protected IStatus validateItem(Object item) {
-			// ignore
-			return Status.OK_STATUS;
-		}
-
-		@Override
-		protected void cancelPressed() {
-			stopDownloading();
-			super.cancelPressed();
-		}
-
-		@Override
-		protected void handleShellCloseEvent() {
-			stopDownloading();
-			super.handleShellCloseEvent();
-		}
-	}
-
-	public void init(IViewPart view) {
-	}
-
-	public void run(IAction action) {
-		OpenWikiPageSelectionDialog openDialog = new OpenWikiPageSelectionDialog(PlatformUI.getWorkbench()
-				.getActiveWorkbenchWindow()
-				.getShell(), true);
-
-		if (openDialog.open() == Window.OK) {
-			Object[] selections = openDialog.getResult();
-			if (selections != null) {
-				for (Object selection : selections) {
-					OpenWikiPageJob job = new OpenWikiPageJob((String) selection);
-					job.schedule();
-				}
-			}
-		}
-	}
-
-	public void selectionChanged(IAction action, ISelection selection) {
-		repository = getSelectedRepository(selection);
-		if (repository != null) {
-			AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
-					repository.getConnectorKind());
-			// Note: the following type checking on the connector won't be needed once the Wiki
-			//       functionality is generalized into AbstractRepositoryConnector
-			if (connector instanceof TracRepositoryConnector) {
-				TracRepositoryConnector tracConnector = (TracRepositoryConnector) connector;
-				wikiHandler = tracConnector.getWikiHandler();
-				action.setEnabled(tracConnector.hasWiki(repository));
-			} else {
-				action.setEnabled(false);
-			}
-		} else {
-			action.setEnabled(false);
-		}
-	}
-
-	private TaskRepository getSelectedRepository(ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			Object selectedObject = ((IStructuredSelection) selection).getFirstElement();
-			if (selectedObject instanceof TaskRepository) {
-				return (TaskRepository) selectedObject;
-			}
-		}
-		return null;
-	}
-
-	private class OpenWikiPageJob extends Job {
-		private final String pageName;
-
-		public OpenWikiPageJob(String pageName) {
-			super("Opening Wiki Page");
-			this.pageName = pageName;
-		}
-
-		@Override
-		protected IStatus run(IProgressMonitor monitor) {
-			try {
-				final TracWikiPage page = wikiHandler.getWikiPage(repository, pageName, monitor);
-				if (page != null) {
-					PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-
-						public void run() {
-							openWikiPageEditor(repository, page, wikiHandler.getWikiUrl(repository) + pageName);
-						}
-					});
-				} else {
-					TasksUiInternal.displayStatus("Unable to open wiki page", new Status(IStatus.ERROR,
-							TracWikiPlugin.PLUGIN_ID, "Unable to retrieve wiki page " + pageName));
-				}
-			} catch (final CoreException e) {
-				TasksUiInternal.displayStatus("Unable to open wiki page", e.getStatus());
-			} finally {
-				monitor.done();
-			}
-			return Status.OK_STATUS;
-		}
-
-	}
-
-	private static void openWikiPageEditor(TaskRepository repository, TracWikiPage wikiPage, String pageUrl) {
-		IEditorInput editorInput = new TracWikiPageEditorInput(repository, wikiPage, pageUrl);
-		IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-		TasksUiUtil.openEditor(editorInput, TracWikiPageEditor.ID_EDITOR, window.getActivePage());
-	}
-
-}
diff --git a/org.eclipse.mylyn.trac.wiki/src/org/eclipse/mylyn/internal/trac/wiki/editor/TracWikiPageEditor.java b/org.eclipse.mylyn.trac.wiki/src/org/eclipse/mylyn/internal/trac/wiki/editor/TracWikiPageEditor.java
deleted file mode 100644
index e6704ee..0000000
--- a/org.eclipse.mylyn.trac.wiki/src/org/eclipse/mylyn/internal/trac/wiki/editor/TracWikiPageEditor.java
+++ /dev/null
@@ -1,556 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.trac.wiki.editor;
-
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.IJobChangeEvent;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.core.runtime.jobs.JobChangeAdapter;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.text.Document;
-import org.eclipse.jface.text.TextViewer;
-import org.eclipse.jface.text.source.AnnotationModel;
-import org.eclipse.jface.text.source.IAnnotationAccess;
-import org.eclipse.jface.text.source.SourceViewer;
-import org.eclipse.jface.window.Window;
-import org.eclipse.mylyn.commons.core.StatusHandler;
-import org.eclipse.mylyn.commons.net.AuthenticationType;
-import org.eclipse.mylyn.internal.provisional.commons.ui.CommonImages;
-import org.eclipse.mylyn.internal.tasks.ui.editors.RepositoryTextViewerConfiguration;
-import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
-import org.eclipse.mylyn.internal.trac.core.TracCorePlugin;
-import org.eclipse.mylyn.internal.trac.core.model.TracWikiPage;
-import org.eclipse.mylyn.internal.trac.ui.editor.TracRenderingEngine;
-import org.eclipse.mylyn.internal.trac.wiki.TracWikiPlugin;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-import org.eclipse.mylyn.tasks.ui.TasksUiImages;
-import org.eclipse.mylyn.tasks.ui.editors.AbstractRenderingEngine;
-import org.eclipse.mylyn.tasks.ui.editors.BrowserFormPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.browser.Browser;
-import org.eclipse.swt.browser.LocationAdapter;
-import org.eclipse.swt.browser.LocationEvent;
-import org.eclipse.swt.custom.StyledText;
-import org.eclipse.swt.events.DisposeEvent;
-import org.eclipse.swt.events.DisposeListener;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.editors.text.EditorsUI;
-import org.eclipse.ui.editors.text.TextSourceViewerConfiguration;
-import org.eclipse.ui.forms.IManagedForm;
-import org.eclipse.ui.forms.editor.FormEditor;
-import org.eclipse.ui.forms.editor.FormPage;
-import org.eclipse.ui.forms.events.ExpansionEvent;
-import org.eclipse.ui.forms.events.IExpansionListener;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.ScrolledForm;
-import org.eclipse.ui.forms.widgets.Section;
-import org.eclipse.ui.texteditor.AnnotationPreference;
-import org.eclipse.ui.texteditor.DefaultMarkerAnnotationAccess;
-import org.eclipse.ui.texteditor.MarkerAnnotationPreferences;
-import org.eclipse.ui.texteditor.SourceViewerDecorationSupport;
-
-/**
- * @author Xiaoyang Guan
- */
-public class TracWikiPageEditor extends FormEditor {
-
-	public static final String ID_EDITOR = "org.eclipse.mylyn.trac.ui.editor.wikipage";
-
-	private TaskRepository repository;
-
-	private TracWikiPage page;
-
-	private final WikiSourceEditor wikiSourceEditor;
-
-	private final BrowserFormPage browserPage;
-
-	private class WikiSourceEditor extends FormPage {
-
-		private static final String ID = "org.eclipse.mylyn.trac.ui.editor.wikisource";
-
-		private static final String TITLE = "Wiki Page Source";
-
-		private static final String LABEL_PREVIEW = "Page Preview";
-
-		private static final String LABEL_SOURCE = "Page Source";
-
-		private static final String LABEL_BUTTON_PREVIEW = "Preview";
-
-		private static final String LABEL_BUTTON_SUBMIT = "Submit";
-
-		private static final int PREVIEW_BROWSER_HEIGHT = 10 * 14;
-
-		private static final int DEFAULT_WIDTH = 79 * 7; // 500;
-
-		private ScrolledForm form;
-
-		private FormToolkit toolkit;
-
-		private Composite editorComposite;
-
-		private Section previewSection;
-
-		private Browser previewBrowser;
-
-		private TextViewer sourceEditor;
-
-		private Button previewButton;
-
-		private Button submitButton;
-
-		protected boolean isDirty;
-
-		public WikiSourceEditor(FormEditor editor) {
-			super(editor, ID, TITLE);
-
-		}
-
-		@Override
-		protected void createFormContent(IManagedForm managedForm) {
-			super.createFormContent(managedForm);
-			form = managedForm.getForm();
-			toolkit = managedForm.getToolkit();
-
-			editorComposite = form.getBody();
-			GridLayout editorLayout = new GridLayout();
-			editorComposite.setLayout(editorLayout);
-			editorComposite.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-			createPreviewSection(editorComposite);
-			createSourceSection(editorComposite);
-		}
-
-		private void createPreviewSection(Composite parent) {
-			previewSection = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR | ExpandableComposite.TWISTIE);
-			previewSection.setText(LABEL_PREVIEW);
-			previewSection.setExpanded(false);
-			previewSection.setLayout(new GridLayout());
-			previewSection.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-			previewSection.addExpansionListener(new IExpansionListener() {
-				public void expansionStateChanging(ExpansionEvent e) {
-					form.reflow(true);
-				}
-
-				public void expansionStateChanged(ExpansionEvent e) {
-					form.reflow(true);
-				}
-			});
-
-			Composite container = toolkit.createComposite(previewSection);
-			previewSection.setClient(container);
-			container.setLayout(new GridLayout());
-			container.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-			previewBrowser = addBrowser(container, SWT.NONE);
-			previewBrowser.setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
-			GridData previewBrowserData = new GridData(GridData.FILL_BOTH);
-			previewBrowserData.heightHint = PREVIEW_BROWSER_HEIGHT;
-			previewBrowser.setLayoutData(previewBrowserData);
-
-			toolkit.paintBordersFor(container);
-		}
-
-		private void createSourceSection(Composite parent) {
-			Section section = toolkit.createSection(parent, ExpandableComposite.TITLE_BAR);
-			section.setText(LABEL_SOURCE);
-			section.setExpanded(true);
-			section.setLayout(new GridLayout());
-			section.setLayoutData(new GridData(GridData.FILL_BOTH));
-			section.addExpansionListener(new IExpansionListener() {
-				public void expansionStateChanging(ExpansionEvent e) {
-					form.reflow(true);
-				}
-
-				public void expansionStateChanged(ExpansionEvent e) {
-					form.reflow(true);
-				}
-			});
-
-			Composite container = toolkit.createComposite(section);
-			section.setClient(container);
-			container.setLayout(new GridLayout());
-			container.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-			sourceEditor = new SourceViewer(container, null, SWT.FLAT | SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
-			sourceEditor.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
-			sourceEditor.getControl().setData(FormToolkit.KEY_DRAW_BORDER, FormToolkit.TEXT_BORDER);
-			sourceEditor.setEditable(true);
-
-			sourceEditor.getTextWidget().addModifyListener(new ModifyListener() {
-
-				public void modifyText(ModifyEvent e) {
-					if (!isDirty()) {
-						markDirty(true);
-						setSubmitEnabled(true);
-					}
-				}
-			});
-
-			StyledText styledText = sourceEditor.getTextWidget();
-			GridDataFactory.fillDefaults().hint(DEFAULT_WIDTH, SWT.DEFAULT).grab(true, true).applyTo(styledText);
-
-			IAnnotationAccess annotationAccess = new DefaultMarkerAnnotationAccess();
-
-			final SourceViewerDecorationSupport support = new SourceViewerDecorationSupport(
-					(SourceViewer) sourceEditor, null, annotationAccess, EditorsUI.getSharedTextColors());
-
-			@SuppressWarnings("unchecked")
-			Iterator e = new MarkerAnnotationPreferences().getAnnotationPreferences().iterator();
-			while (e.hasNext()) {
-				support.setAnnotationPreference((AnnotationPreference) e.next());
-			}
-
-			support.install(EditorsUI.getPreferenceStore());
-
-			styledText.addDisposeListener(new DisposeListener() {
-				public void widgetDisposed(DisposeEvent e) {
-					support.uninstall();
-				}
-			});
-
-			TextSourceViewerConfiguration viewerConfig = new RepositoryTextViewerConfiguration(repository, true);
-			((SourceViewer) sourceEditor).configure(viewerConfig);
-			Document document = new Document(page.getContent());
-			((SourceViewer) sourceEditor).setDocument(document, new AnnotationModel());
-
-			createActionsLayout(container);
-			toolkit.paintBordersFor(container);
-		}
-
-		private void createActionsLayout(Composite parent) {
-			Composite buttonComposite = toolkit.createComposite(parent);
-			GridLayout buttonLayout = new GridLayout();
-			buttonLayout.numColumns = 2;
-			buttonComposite.setLayout(buttonLayout);
-			buttonComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-			addActionButtons(buttonComposite);
-
-		}
-
-		private void addActionButtons(Composite buttonComposite) {
-			previewButton = toolkit.createButton(buttonComposite, LABEL_BUTTON_PREVIEW, SWT.NONE);
-			GridData previewButtonData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
-			previewButtonData.widthHint = 100;
-			previewButton.setLayoutData(previewButtonData);
-			previewButton.addListener(SWT.Selection, new Listener() {
-				public void handleEvent(Event e) {
-					previewSection.setExpanded(true);
-					setText(previewBrowser, "loading preview...");
-					previewWiki(previewBrowser, sourceEditor.getTextWidget().getText());
-				}
-			});
-
-			submitButton = toolkit.createButton(buttonComposite, LABEL_BUTTON_SUBMIT, SWT.NONE);
-			GridData submitButtonData = new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
-			submitButtonData.widthHint = 100;
-			submitButton.setImage(CommonImages.getImage(TasksUiImages.REPOSITORY_SUBMIT));
-			submitButton.setLayoutData(submitButtonData);
-			submitButton.addListener(SWT.Selection, new Listener() {
-				public void handleEvent(Event e) {
-					InputDialog commentDialog = new InputDialog(null, "Page Comment",
-							"Enter a Comment for the page (or cancel the submit):", null, null);
-					// cancel the comment dialog will cancel the submit
-					if (commentDialog.open() == Window.OK) {
-						page.getPageInfo().setComment(commentDialog.getValue());
-						boolean isAnonymouse = repository.getCredentials(AuthenticationType.REPOSITORY) == null;
-						page.getPageInfo().setAuthor(isAnonymouse ? "anonymous" : repository.getUserName());
-						page.setContent(sourceEditor.getTextWidget().getText());
-
-						submitToRepository();
-					}
-				}
-			});
-
-			setSubmitEnabled(false);
-		}
-
-		/**
-		 * Copied from AbstractRepositoryTaskEditor
-		 * 
-		 * @param enabled
-		 */
-		private void setSubmitEnabled(boolean enabled) {
-			if (submitButton != null && !submitButton.isDisposed()) {
-				submitButton.setEnabled(enabled);
-				if (enabled) {
-					submitButton.setToolTipText("Submit to " + repository.getRepositoryUrl());
-				}
-			}
-		}
-
-		public void submitToRepository() {
-			class SubmitPageJob extends Job {
-				private IStatus jobStatus;
-
-				public SubmitPageJob() {
-					super("upload wiki page");
-				}
-
-				public IStatus getStatus() {
-					return jobStatus;
-				}
-
-				@Override
-				protected IStatus run(IProgressMonitor monitor) {
-					try {
-						monitor.beginTask("Uploading wiki page", IProgressMonitor.UNKNOWN);
-						TracCorePlugin.getDefault().getConnector().getWikiHandler().postWikiPage(repository, page,
-								monitor);
-						jobStatus = Status.OK_STATUS;
-					} catch (CoreException e) {
-						TasksUiInternal.displayStatus("Submit failed", e.getStatus());
-						jobStatus = e.getStatus();
-					} finally {
-						monitor.done();
-					}
-					return Status.OK_STATUS;
-				}
-
-			}
-
-			final SubmitPageJob submitJob = new SubmitPageJob();
-			submitJob.addJobChangeListener(new JobChangeAdapter() {
-
-				@Override
-				public void done(IJobChangeEvent event) {
-
-					// refresh editor only if uploading the wiki page succeeded
-					if (submitJob.getStatus().isOK()) {
-						updateWikiPage();
-						PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								if (browserPage.getBrowser() != null) {
-									browserPage.getBrowser().refresh();
-								}
-								setActivePage(BrowserFormPage.ID_EDITOR);
-								markDirty(false);
-								setSubmitEnabled(false);
-							}
-						});
-					}
-				}
-			});
-			submitJob.schedule();
-		}
-
-		@Override
-		public boolean isDirty() {
-			return isDirty;
-		}
-
-		protected void markDirty(boolean dirty) {
-			isDirty = dirty;
-			getManagedForm().dirtyStateChanged();
-		}
-
-		/*====== Copied/modified from AbstractRepositoryTaskEditor ======*/
-
-		private boolean ignoreLocationEvents = false;
-
-		private Browser addBrowser(Composite parent, int style) {
-			Browser browser = new Browser(parent, style);
-			// intercept links to open tasks in rich editor and urls in separate browser
-			browser.addLocationListener(new LocationAdapter() {
-				@Override
-				public void changing(LocationEvent event) {
-					// ignore events that are caused by manually setting the contents of the browser
-					if (ignoreLocationEvents) {
-						return;
-					}
-
-					if (event.location != null) {
-						event.doit = false;
-						// TODO: add open link support when this editor is moved into ..mylyn.tasks.ui.editors
-						//IHyperlink link = new TaskUrlHyperlink(
-						//		new Region(0, 0)/* a fake region just to make constructor happy */, event.location);
-						//link.open();
-					}
-				}
-
-			});
-
-			return browser;
-		}
-
-		private void setText(Browser browser, String html) {
-			try {
-				ignoreLocationEvents = true;
-				browser.setText((html != null) ? html : "");
-			} finally {
-				ignoreLocationEvents = false;
-			}
-
-		}
-
-		private void previewWiki(final Browser browser, String sourceText) {
-			final class PreviewWikiJob extends Job {
-				private final String sourceText;
-
-				private String htmlText;
-
-				private IStatus jobStatus;
-
-				public PreviewWikiJob(String sourceText) {
-					super("Formatting Wiki Text");
-
-					if (sourceText == null) {
-						throw new IllegalArgumentException("source text must not be null");
-					}
-
-					this.sourceText = sourceText;
-				}
-
-				@Override
-				protected IStatus run(IProgressMonitor monitor) {
-					AbstractRenderingEngine htmlRenderingEngine = new TracRenderingEngine();
-
-					jobStatus = Status.OK_STATUS;
-					try {
-						htmlText = htmlRenderingEngine.renderAsHtml(repository, sourceText, monitor);
-					} catch (CoreException e) {
-						jobStatus = e.getStatus();
-					}
-					return Status.OK_STATUS;
-				}
-
-				public String getHtmlText() {
-					return htmlText;
-				}
-
-				public IStatus getStatus() {
-					return jobStatus;
-				}
-
-			}
-
-			final PreviewWikiJob job = new PreviewWikiJob(sourceText);
-
-			job.addJobChangeListener(new JobChangeAdapter() {
-
-				@Override
-				public void done(final IJobChangeEvent event) {
-					if (!form.isDisposed()) {
-						if (job.getStatus().isOK()) {
-							getPartControl().getDisplay().asyncExec(new Runnable() {
-								public void run() {
-									WikiSourceEditor.this.setText(browser, job.getHtmlText());
-									//parentEditor.setMessage(null, IMessageProvider.NONE);
-								}
-							});
-						} else {
-							getPartControl().getDisplay().asyncExec(new Runnable() {
-								public void run() {
-									//parentEditor.setMessage(job.getStatus().getMessage(), IMessageProvider.ERROR);
-								}
-							});
-						}
-					}
-					super.done(event);
-				}
-			});
-
-			job.setUser(true);
-			job.schedule();
-		}
-
-	}
-
-	public TracWikiPageEditor() {
-		super();
-		wikiSourceEditor = new WikiSourceEditor(this);
-		browserPage = new BrowserFormPage(this, "Browser") {
-			@Override
-			protected String getUrl() {
-				return ((TracWikiPageEditorInput) getEditorInput()).getPageUrl();
-			}
-		};
-	}
-
-	protected void initializeEditor() {
-		TracWikiPageEditorInput editorInput = (TracWikiPageEditorInput) getEditorInput();
-		page = editorInput.getPage();
-		repository = editorInput.getRepository();
-	}
-
-	@Override
-	protected void addPages() {
-		initializeEditor();
-		try {
-			addPage(wikiSourceEditor);
-			addPage(browserPage);
-			setPartName(getEditorInput().getName());
-			setActivePage(BrowserFormPage.ID_EDITOR);
-		} catch (PartInitException e) {
-			StatusHandler.fail(new Status(IStatus.ERROR, TracWikiPlugin.PLUGIN_ID,
-					"Cannot create Trac Wiki page editor pages"));
-		}
-	}
-
-	@Override
-	public void doSave(IProgressMonitor monitor) {
-		MessageDialog.openInformation(getSite().getShell(), "Changes cannot be saved",
-				"Offline editting on wiki pages not supported yet.");
-		monitor.setCanceled(true);
-	}
-
-	@Override
-	public void doSaveAs() {
-	}
-
-	@Override
-	public boolean isSaveAsAllowed() {
-		return false;
-	}
-
-	protected void updateWikiPage() {
-		Job updatePageJob = new Job("Update wiki page") {
-
-			@Override
-			protected IStatus run(IProgressMonitor monitor) {
-				try {
-					monitor.beginTask("Downloading wiki page", IProgressMonitor.UNKNOWN);
-					TracWikiPage newPage = TracCorePlugin.getDefault().getConnector().getWikiHandler().getWikiPage(
-							repository, page.getPageInfo().getPageName(), monitor);
-					if (newPage != null) {
-						((TracWikiPageEditorInput) getEditorInput()).setPage(newPage);
-					} else {
-						TasksUiInternal.displayStatus("Download failed", new Status(IStatus.ERROR,
-								TracCorePlugin.PLUGIN_ID, "Unable to retrieve wiki page "
-										+ page.getPageInfo().getPageName()));
-					}
-				} catch (CoreException e) {
-					TasksUiInternal.displayStatus("Download failed", e.getStatus());
-				} finally {
-					monitor.done();
-				}
-				return Status.OK_STATUS;
-			}
-
-		};
-		updatePageJob.schedule();
-	}
-
-}
diff --git a/org.eclipse.mylyn.trac.wiki/src/org/eclipse/mylyn/internal/trac/wiki/editor/TracWikiPageEditorInput.java b/org.eclipse.mylyn.trac.wiki/src/org/eclipse/mylyn/internal/trac/wiki/editor/TracWikiPageEditorInput.java
deleted file mode 100644
index 0cef793..0000000
--- a/org.eclipse.mylyn.trac.wiki/src/org/eclipse/mylyn/internal/trac/wiki/editor/TracWikiPageEditorInput.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.trac.wiki.editor;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.mylyn.internal.trac.core.model.TracWikiPage;
-import org.eclipse.mylyn.internal.trac.wiki.TracWikiPageHistoryPageSource;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-import org.eclipse.team.ui.history.IHistoryPageSource;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IPersistableElement;
-
-/**
- * @author Xiaoyang Guan
- */
-public class TracWikiPageEditorInput implements IEditorInput {
-
-	private TaskRepository repository;
-
-	private TracWikiPage page;
-
-	private String pageUrl;
-
-	public TracWikiPageEditorInput(TaskRepository repository, TracWikiPage page, String pageUrl) {
-		this.repository = repository;
-		this.page = page;
-		this.pageUrl = pageUrl;
-	}
-
-	public TaskRepository getRepository() {
-		return repository;
-	}
-
-	public void setRepository(TaskRepository repository) {
-		this.repository = repository;
-	}
-
-	public TracWikiPage getPage() {
-		return page;
-	}
-
-	public void setPage(TracWikiPage page) {
-		this.page = page;
-	}
-
-	public String getPageUrl() {
-		return pageUrl;
-	}
-
-	public void setPageUrl(String pageUrl) {
-		this.pageUrl = pageUrl;
-	}
-
-	public boolean exists() {
-		// ignore
-		return false;
-	}
-
-	public ImageDescriptor getImageDescriptor() {
-		// ignore
-		return null;
-	}
-
-	public String getName() {
-		return page.getPageInfo().getPageName();
-	}
-
-	public IPersistableElement getPersistable() {
-		// ignore
-		return null;
-	}
-
-	public String getToolTipText() {
-		return getName() + "  [" + repository.getRepositoryLabel() + "]";
-	}
-
-	private static TracWikiPageHistoryPageSource historyPageSource = new TracWikiPageHistoryPageSource();
-
-	@SuppressWarnings("unchecked")
-	public Object getAdapter(Class adapter) {
-		if (adapter == IEditorInput.class) {
-			return this;
-		}
-
-		if (adapter == IHistoryPageSource.class) {
-			return historyPageSource;
-		}
-
-		return null;
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		if (obj == null) {
-			return false;
-		} else if (this == obj) {
-			return true;
-		} else if (getClass() != obj.getClass()) {
-			return false;
-		} else {
-			TracWikiPageEditorInput other = (TracWikiPageEditorInput) obj;
-			return repository.equals(other.repository) && page.equals(other.page);
-		}
-	}
-
-}
diff --git a/org.eclipse.mylyn.web.tasks/.classpath b/org.eclipse.mylyn.web.tasks/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/org.eclipse.mylyn.web.tasks/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/org.eclipse.mylyn.web.tasks/.cvsignore b/org.eclipse.mylyn.web.tasks/.cvsignore
deleted file mode 100644
index ba077a4..0000000
--- a/org.eclipse.mylyn.web.tasks/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-bin
diff --git a/org.eclipse.mylyn.web.tasks/.project b/org.eclipse.mylyn.web.tasks/.project
deleted file mode 100644
index cf78565..0000000
--- a/org.eclipse.mylyn.web.tasks/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.mylyn.web.tasks</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 8b08f1b..0000000
--- a/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,340 +0,0 @@
-#Thu Apr 24 21:03:23 PDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.codeComplete.argumentPrefixes=
-org.eclipse.jdt.core.codeComplete.argumentSuffixes=
-org.eclipse.jdt.core.codeComplete.fieldPrefixes=
-org.eclipse.jdt.core.codeComplete.fieldSuffixes=
-org.eclipse.jdt.core.codeComplete.localPrefixes=
-org.eclipse.jdt.core.codeComplete.localSuffixes=
-org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
-org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-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.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=error
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
-org.eclipse.jdt.core.compiler.taskCaseSensitive=enabled
-org.eclipse.jdt.core.compiler.taskPriorities=NORMAL,HIGH,NORMAL,NORMAL
-org.eclipse.jdt.core.compiler.taskTags=TODO,FIXME,XXX,API
-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_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_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_selector_in_method_invocation=80
-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.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=1
-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=false
-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=false
-org.eclipse.jdt.core.formatter.comment.format_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=false
-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=120
-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=2
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-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=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_member=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_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not 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=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=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_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_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_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_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_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.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=120
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=true
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=true
-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_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
diff --git a/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.jdt.ui.prefs b/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 5e70d08..0000000
--- a/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,63 +0,0 @@
-#Sat Mar 01 03:38:47 PST 2008
-cleanup_settings_version=2
-eclipse.preferences.version=1
-editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
-formatter_profile=_Mylyn based on Eclipse
-formatter_settings_version=11
-internal.default.compliance=default
-org.eclipse.jdt.ui.exception.name=e
-org.eclipse.jdt.ui.gettersetter.use.is=true
-org.eclipse.jdt.ui.javadoc=false
-org.eclipse.jdt.ui.keywordthis=false
-org.eclipse.jdt.ui.overrideannotation=true
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?><templates><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter method" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created Java files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="false" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for fields" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="false" context\="overridecomment_context" deleted\="false" description\="Comment for overriding methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.overridecomment" name\="overridecomment"/><template autoinsert\="false" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.newtype" name\="newtype">/*******************************************************************************\n * Copyright (c) 2004, 2007 Mylyn project committers and others.\n * All rights reserved. This program and the accompanying materials\n * are made available under the terms of the Eclipse Public License v1.0\n * which accompanies this distribution, and is available at\n * http\://www.eclipse.org/legal/epl-v10.html\n *******************************************************************************/\n\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="false" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="false" context\="methodbody_context" deleted\="false" description\="Code in created method stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.methodbody" name\="methodbody">// ignore\n${body_statement}</template><template autoinsert\="false" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ignore</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate methods" enabled\="true" id\="org.eclipse.jdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="gettercomment_context" deleted\="false" description\="Comment for getter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.gettercomment" name\="gettercomment">/**\n * @return the ${bare_field_name}\n */</template><template autoinsert\="true" context\="settercomment_context" deleted\="false" description\="Comment for setter function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.settercomment" name\="settercomment">/**\n * @param ${param} the ${bare_field_name} to set\n */</template><template autoinsert\="true" context\="constructorcomment_context" deleted\="false" description\="Comment for created constructors" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorcomment" name\="constructorcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="filecomment_context" deleted\="false" description\="Comment for created JavaScript files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.filecomment" name\="filecomment">/**\n * \n */</template><template autoinsert\="true" context\="typecomment_context" deleted\="false" description\="Comment for created types" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.typecomment" name\="typecomment">/**\n * @author ${user}\n *\n * ${tags}\n */</template><template autoinsert\="true" context\="fieldcomment_context" deleted\="false" description\="Comment for vars" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.fieldcomment" name\="fieldcomment">/**\n * \n */</template><template autoinsert\="true" context\="methodcomment_context" deleted\="false" description\="Comment for non-overriding function" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodcomment" name\="methodcomment">/**\n * ${tags}\n */</template><template autoinsert\="true" context\="overridecomment_context" deleted\="false" description\="Comment for overriding functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.overridecomment" name\="overridecomment">/* (non-Jsdoc)\n * ${see_to_overridden}\n */</template><template autoinsert\="true" context\="delegatecomment_context" deleted\="false" description\="Comment for delegate functions" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.delegatecomment" name\="delegatecomment">/**\n * ${tags}\n * ${see_to_target}\n */</template><template autoinsert\="true" context\="newtype_context" deleted\="false" description\="Newly created files" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.newtype" name\="newtype">${filecomment}\n${package_declaration}\n\n${typecomment}\n${type_declaration}</template><template autoinsert\="true" context\="classbody_context" deleted\="false" description\="Code in new class type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.classbody" name\="classbody">\n</template><template autoinsert\="true" context\="interfacebody_context" deleted\="false" description\="Code in new interface type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.interfacebody" name\="interfacebody">\n</template><template autoinsert\="true" context\="enumbody_context" deleted\="false" description\="Code in new enum type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.enumbody" name\="enumbody">\n</template><template autoinsert\="true" context\="annotationbody_context" deleted\="false" description\="Code in new annotation type bodies" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.annotationbody" name\="annotationbody">\n</template><template autoinsert\="true" context\="catchblock_context" deleted\="false" description\="Code in new catch blocks" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.catchblock" name\="catchblock">// ${todo} Auto-generated catch block\n${exception_var}.printStackTrace();</template><template autoinsert\="true" context\="methodbody_context" deleted\="false" description\="Code in created function stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.methodbody" name\="methodbody">// ${todo} Auto-generated function stub\n${body_statement}</template><template autoinsert\="true" context\="constructorbody_context" deleted\="false" description\="Code in created constructor stubs" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.constructorbody" name\="constructorbody">${body_statement}\n// ${todo} Auto-generated constructor stub</template><template autoinsert\="true" context\="getterbody_context" deleted\="false" description\="Code in created getters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.getterbody" name\="getterbody">return ${field};</template><template autoinsert\="true" context\="setterbody_context" deleted\="false" description\="Code in created setters" enabled\="true" id\="org.eclipse.wst.jsdt.ui.text.codetemplates.setterbody" name\="setterbody">${field} \= ${param};</template></templates>
-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_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=false
-sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=true
-sp_cleanup.correct_indentation=true
-sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
-sp_cleanup.make_local_variable_final=false
-sp_cleanup.make_parameters_final=false
-sp_cleanup.make_private_fields_final=true
-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=true
-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=true
-sp_cleanup.remove_unused_imports=false
-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=true
-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=false
-sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-sp_cleanup.use_this_for_non_static_method_access=false
-sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.ltk.core.refactoring.prefs b/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.ltk.core.refactoring.prefs
deleted file mode 100644
index 7ab03bd..0000000
--- a/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.ltk.core.refactoring.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Fri Jun 02 15:30:09 PDT 2006
-eclipse.preferences.version=1
-org.eclipse.ltk.core.refactoring.enable.project.refactoring.history=true
diff --git a/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.mylyn.tasklist.prefs b/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.mylyn.tasklist.prefs
deleted file mode 100644
index 0a2cc0b..0000000
--- a/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.mylyn.tasklist.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Jun 18 17:14:59 PDT 2007
-eclipse.preferences.version=1
-project.repository.kind=bugzilla
-project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.mylyn.tasks.ui.prefs b/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.mylyn.tasks.ui.prefs
deleted file mode 100644
index d8c6d26..0000000
--- a/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.mylyn.tasks.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Mon Jun 25 03:02:37 GMT 2007
-eclipse.preferences.version=1
-project.repository.kind=bugzilla
-project.repository.url=https\://bugs.eclipse.org/bugs
diff --git a/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.pde.prefs b/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.pde.prefs
deleted file mode 100644
index e8f2d56..0000000
--- a/org.eclipse.mylyn.web.tasks/.settings/org.eclipse.pde.prefs
+++ /dev/null
@@ -1,18 +0,0 @@
-#Tue Apr 15 11:07:59 PDT 2008
-compilers.incompatible-environment=1
-compilers.p.build=1
-compilers.p.deprecated=1
-compilers.p.discouraged-class=2
-compilers.p.missing-bundle-classpath-entries=1
-compilers.p.missing-packages=1
-compilers.p.no-required-att=0
-compilers.p.not-externalized-att=2
-compilers.p.unknown-attribute=0
-compilers.p.unknown-class=0
-compilers.p.unknown-element=0
-compilers.p.unknown-identifier=1
-compilers.p.unknown-resource=0
-compilers.p.unresolved-ex-points=0
-compilers.p.unresolved-import=0
-compilers.use-project=true
-eclipse.preferences.version=1
diff --git a/org.eclipse.mylyn.web.tasks/META-INF/MANIFEST.MF b/org.eclipse.mylyn.web.tasks/META-INF/MANIFEST.MF
deleted file mode 100644
index a5bdac6..0000000
--- a/org.eclipse.mylyn.web.tasks/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,20 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Mylyn Web Templates Connector
-Bundle-SymbolicName: org.eclipse.mylyn.web.tasks;singleton:=true
-Bundle-Version: 3.0.0.qualifier
-Bundle-Activator: org.eclipse.mylyn.internal.web.tasks.TasksWebPlugin
-Bundle-Vendor: Eclipse.org
-Require-Bundle: com.sun.syndication;bundle-version="0.9.0",
- org.jdom;bundle-version="1.0.0",
- org.eclipse.core.runtime,
- org.eclipse.ui,
- org.eclipse.ui.forms,
- org.eclipse.mylyn.commons.core;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.commons.net;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.commons.ui;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.tasks.core;bundle-version="[3.0.0,4.0.0)",
- org.eclipse.mylyn.tasks.ui;bundle-version="[3.0.0,4.0.0)"
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.mylyn.internal.web.tasks;x-internal:=true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/org.eclipse.mylyn.web.tasks/about.html b/org.eclipse.mylyn.web.tasks/about.html
deleted file mode 100644
index 0dd939c..0000000
--- a/org.eclipse.mylyn.web.tasks/about.html
+++ /dev/null
@@ -1,27 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 7, 2007</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise 
-indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available 
-at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is 
-being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was 
-provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content
-and such source code may be obtained at <a href="/">http://www.eclipse.org</a>.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/org.eclipse.mylyn.web.tasks/build.properties b/org.eclipse.mylyn.web.tasks/build.properties
deleted file mode 100644
index 1976ca3..0000000
--- a/org.eclipse.mylyn.web.tasks/build.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 Mylyn project committers and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               icons/,\
-               about.html
-src.includes = about.html
diff --git a/org.eclipse.mylyn.web.tasks/icons/eview16/folder.gif b/org.eclipse.mylyn.web.tasks/icons/eview16/folder.gif
deleted file mode 100644
index 51e703b..0000000
--- a/org.eclipse.mylyn.web.tasks/icons/eview16/folder.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.web.tasks/icons/eview16/icons-task-jira.gif b/org.eclipse.mylyn.web.tasks/icons/eview16/icons-task-jira.gif
deleted file mode 100644
index f1fa823..0000000
--- a/org.eclipse.mylyn.web.tasks/icons/eview16/icons-task-jira.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.web.tasks/icons/eview16/monitor.gif b/org.eclipse.mylyn.web.tasks/icons/eview16/monitor.gif
deleted file mode 100644
index 3ea4ad7..0000000
--- a/org.eclipse.mylyn.web.tasks/icons/eview16/monitor.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.web.tasks/icons/eview16/task-list.gif b/org.eclipse.mylyn.web.tasks/icons/eview16/task-list.gif
deleted file mode 100644
index 6ab2668..0000000
--- a/org.eclipse.mylyn.web.tasks/icons/eview16/task-list.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.web.tasks/icons/obj16/overlay-web.gif b/org.eclipse.mylyn.web.tasks/icons/obj16/overlay-web.gif
deleted file mode 100644
index b168c1c..0000000
--- a/org.eclipse.mylyn.web.tasks/icons/obj16/overlay-web.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.web.tasks/icons/obj16/repository-web.gif b/org.eclipse.mylyn.web.tasks/icons/obj16/repository-web.gif
deleted file mode 100644
index 229c391..0000000
--- a/org.eclipse.mylyn.web.tasks/icons/obj16/repository-web.gif
+++ /dev/null
Binary files differ
diff --git a/org.eclipse.mylyn.web.tasks/plugin.xml b/org.eclipse.mylyn.web.tasks/plugin.xml
deleted file mode 100644
index 625f452..0000000
--- a/org.eclipse.mylyn.web.tasks/plugin.xml
+++ /dev/null
@@ -1,231 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-    <extension
-         id="org.eclipse.mylyn.web.repository"
-         name="Generic web-based access (Advanced)"
-         point="org.eclipse.mylyn.tasks.ui.repositories">
-      <connectorCore
-            class="org.eclipse.mylyn.internal.web.tasks.WebRepositoryConnector"
-            id="org.eclipse.mylyn.web.tasklist.repositories"
-            name="Web Templates Core"/>
-      <connectorUi
-            brandingIcon="icons/obj16/repository-web.gif"
-            class="org.eclipse.mylyn.internal.web.tasks.WebConnectorUi"
-            name="Web Templates UI"
-            overlayIcon="icons/obj16/overlay-web.gif"/>
-      <taskListFactory
-            class="org.eclipse.mylyn.internal.web.tasks.WebTaskListFactory"
-            id="org.eclipse.mylyn.web.tasklist.taskListFactory"/>
-   </extension>
-
-   <extension
-         point="org.eclipse.mylyn.tasks.ui.editors">
-      <editorFactory class="org.eclipse.mylyn.internal.web.tasks.WebTaskEditorFactory"/>
-   </extension>
-
-   <extension
-         point="org.eclipse.mylyn.tasks.core.templates">
-      <repository
-           repositoryKind="web"
-           label="Subclipse (IssueZilla)"
-           urlRepository="http://subclipse.tigris.org/issues"
-           urlTask="${serverUrl}/show_bug.cgi?id="
-           urlNewTask="${serverUrl}/enter_bug.cgi?component=subclipse"
-           urlTaskQuery="${serverUrl}/buglist.cgi?issue_status=NEW&amp;issue_status=STARTED&amp;issue_status=REOPENED&amp;order=Issue+Number">
-         <attribute name="queryPattern"
-                    value="&lt;a href=&quot;show_bug.cgi\?id\=(.+?)&quot;&gt;.+?&lt;span class=&quot;summary&quot;&gt;(.+?)&lt;/span&gt;"/>
-     </repository>
-     <repository
-           repositoryKind="web"
-           label="GlasFish (IssueZilla)"
-           urlRepository="https://glassfish.dev.java.net/issues"
-           urlNewTask="${serverUrl}/enter_bug.cgi?issue_type=DEFECT"
-           urlTask="${serverUrl}/show_bug.cgi?id="
-           urlTaskQuery="${serverUrl}/buglist.cgi?component=glassfish&amp;issue_status=NEW&amp;issue_status=STARTED&amp;issue_status=REOPENED&amp;order=Issue+Number">
-        <attribute name="queryPattern"
-                   value="&lt;a href=&quot;show_bug.cgi\?id\=(.+?)&quot;&gt;.+?&lt;span class=&quot;summary&quot;&gt;(.+?)&lt;/span&gt;"/>
-     </repository>
-     <!--
-     <repository
-           repositoryKind="web"
-           label="Spring Framework (Jira)"
-           urlRepository="http://opensource.atlassian.com/projects/spring"
-           urlNewTask="${serverUrl}/secure/CreateIssue!default.jspa?pid=${projectId}"
-           urlTask="${serverUrl}/browse/SPR"
-           urlTaskQuery="${serverUrl}/secure/IssueNavigator.jspa?reset=true&amp;mode=hide&amp;pid=${projectId}&amp;resolution=-1&amp;sorter/field=updated&amp;sorter/order=DESC">
-        <attribute name="queryPattern"
-                   value="&lt;td class=&quot;nav summary&quot;&gt;\s+?&lt;a href=&quot;/projects/spring/browse/(.+?)&quot;.+?&gt;(.+?)&lt;/a&gt;"/>
-        <attribute name="param_projectId" value="10000"/>
-     </repository>
-     <repository
-           repositoryKind="web"
-           label="SpringIDE (Trac)"
-           urlRepository="http://springide.org/project"
-           urlTask="${serverUrl}/ticket/"
-           urlNewTask="${serverUrl}/newticket"
-           urlTaskQuery="${serverUrl}/query?status=new&amp;status=assigned&amp;status=reopened&amp;order=id">
-        <attribute name="queryPattern"
-                   value="&lt;td class=&quot;summary&quot;&gt;&lt;a href=&quot;/project/ticket/(.+?)&quot; title=&quot;View ticket&quot;&gt;(.+?)&lt;/a&gt;&lt;/td&gt;"/>
-     </repository>
-     <repository
-            repositoryKind="web"
-            label="edgewall.org (Trac)"
-            urlRepository="http://trac.edgewall.org"
-            urlTask="${serverUrl}/ticket/"
-            urlNewTask="${serverUrl}/newticket"
-            urlTaskQuery="${serverUrl}/query?status=new&amp;status=assigned&amp;status=reopened&amp;order=id">
-        <attribute name="queryPattern"
-                   value="&lt;td class=&quot;summary&quot;&gt;&lt;a href=&quot;/ticket/(.+?)&quot; title=&quot;View ticket&quot;&gt;(.+?)&lt;/a&gt;&lt;/td&gt;"/>
-     </repository>
-     -->
-     <repository
-            repositoryKind="web"
-            label="ASM (GForge)"
-            urlRepository="http://forge.objectweb.org"
-            urlTask="${serverUrl}/tracker/?group_id=${group_id}&amp;func=detail&amp;atid=${atid}&amp;aid="
-            urlNewTask="${serverUrl}/tracker/?group_id=${group_id}&amp;func=add"
-            urlTaskQuery="${serverUrl}/tracker/?group_id=${group_id}&amp;atid=${atid}&amp;_status=100&amp;set=custom">
-        <attribute name="param_group_id" value="23"/>
-        <attribute name="param_atid" value="100023"/>
-        <attribute name="queryPattern"
-                   value="&lt;tr.*?&gt;&lt;td.+?&gt;.+?&lt;/td&gt;&lt;td&gt;&lt;a.+?href=&quot;/tracker/index.php\?func=detail&amp;aid=({Id}.+?)&amp;group_id=${group_id}&amp;atid=${atid}&quot;&gt;({Description}.+?)&lt;/a&gt;&lt;/td&gt;&lt;td&gt;({Open}.+?)&lt;/td&gt;&lt;td&gt;({Owner}.+?)&lt;/td&gt;&lt;td&gt;({Reporter}.+?)&lt;/td&gt;&lt;td&gt;({Status}.+?)&lt;/td&gt;&lt;td&gt;({Resolution}.+?)&lt;/td&gt;&lt;td&gt;({Priority}.+?)&lt;/td&gt;&lt;/tr&gt;"/>
-        <attribute name="loginRequestUrl"
-                   value="${serverUrl}/account/login.php?return_to=&amp;form_loginname=${userId}&amp;form_pw=${password}&amp;login=Login&amp;stay_in_ssl=1"/>
-     </repository>
-     <repository
-            repositoryKind="web"
-            label="SourceForge (Azureus)"
-            urlRepository="http://sourceforge.net/"
-            urlTask="${serverUrl}/tracker/?group_id=${group_id}&amp;func=detail&amp;atid=${atid}&amp;aid="
-            urlNewTask="${serverUrl}/tracker/?group_id=${group_id}&amp;func=add"
-            urlTaskQuery="${serverUrl}/tracker/?group_id=${group_id}&amp;atid=${atid}">
-        <attribute name="param_group_id" value="84122"/>
-        <attribute name="param_atid" value="575154"/>
-        <attribute name="queryPattern"
-                   value="&lt;a href=&quot;/tracker/index.php\?func=detail&amp;amp;aid=(.+?)&amp;amp;group_id=${group_id}&amp;amp;atid=${atid}&quot;&gt;(.+?)&lt;/a&gt;"/>
-        <attribute name="loginRequestMethod" value="POST"/>
-        <attribute name="loginRequestUrl"
-                   value="${serverUrl}/account/login.php?form_loginname=${userId}&amp;form_pw=${password}&amp;login=Login"/>
-     </repository>
-     <repository
-            repositoryKind="web"
-            label="phpbb.com (phpBB)"
-            urlRepository="http://www.phpbb.com/phpBB"
-            urlTask="${serverUrl}/viewtopic.php?t="
-            urlNewTask="${serverUrl}/posting.php?mode=newtopic&amp;f=1"
-            urlTaskQuery="${serverUrl}/viewforum.php?f=1">
-        <attribute name="queryPattern"
-                   value="&lt;li class=&quot;row .+?&lt;dt style=&quot;&quot;.+?title=&quot;.+?&quot;&gt;&lt;a href=&quot;.+?viewtopic.php\?.+?t=(\d+?)(?:&amp;.+?)?&quot; class=&quot;topictitle&quot;&gt;(.+?)&lt;/a&gt;.+?&lt;/dt&gt;.+?&lt;/li&gt;"/>
-     </repository>
-     <repository
-            repositoryKind="web"
-            label="Spring IDE Forum (vBulletin)"
-            urlRepository="http://forum.springframework.org"
-            urlTask="${serverUrl}/showthread.php?t="
-            urlNewTask="${serverUrl}"
-            urlTaskQuery="${serverUrl}/forumdisplay.php?f=${forumId}">
-        <attribute name="param_forumId" value="32"/>
-        <attribute name="queryPattern"
-                   value="&lt;a href=&quot;showthread.php\?.+?t=(\d+?)&quot; id=&quot;thread_title_\1&quot;&gt;(.+?)&lt;/a&gt;"/>
-     </repository>
-     <repository
-            repositoryKind="web"
-            label="Eclipse Outliner (Google Code)"
-            urlRepository="http://code.google.com/p/eclipse-outliner/issues"
-            urlTask="${serverUrl}/detail?id="
-            urlNewTask="${serverUrl}/entry"
-            urlTaskQuery="${serverUrl}/list">
-        <attribute name="queryPattern"
-                   value="&lt;td.+?class=&quot;vt col_1&quot;.+?&lt;a.+?&gt;({Type}.+?)&lt;/a&gt;.*?&lt;/td&gt;.*?&lt;td.+?class=&quot;vt col_2&quot;.+?&lt;a.+?&gt;({Status}.+?)&lt;/a&gt;.*?&lt;/td&gt;.*?&lt;td.+?class=&quot;vt col_5&quot;.+?&lt;a.+?&gt;({Owner}.+?)&lt;/a&gt;.*?&lt;/td&gt;.*?&lt;td.+?class=&quot;vt col_6&quot;.+?&lt;a.+?href=&quot;detail\?id=({Id}[0-9]+).*?&quot;&gt;({Description}.+?)&lt;/a&gt;.+?&lt;/td&gt;"/>
-     </repository>
-     <repository
-           anonymous="false"
-           label="Eclipse Plugin for Mantis (Mantis)"
-           repositoryKind="web"
-           urlNewTask="${serverUrl}/bug_report_page.php"
-           urlRepository="http://www.futureware.biz/mantis"
-           urlTask="${serverUrl}/view.php?id="
-           urlTaskQuery="${serverUrl}/view_all_bug_page.php">
-        <attribute name="loginRequestMethod" value="POST"/>
-        <attribute name="loginRequestUrl"
-              value="${serverUrl}/login.php?username=${userId}&amp;password=${password}"/>
-        <attribute name="queryPattern"
-                   value="&lt;tr .+?&lt;a href=&quot;view.php\?id=(.+?)&quot;&gt;.+?&lt;td class=&quot;left&quot;&gt;(.+?)&lt;/td&gt;&lt;/tr&gt;"/>
-     </repository>
-     <!--
-     <repository
-           anonymous="true"
-           label="ChangeLogic (anonymous)"
-           repositoryKind="web"
-           urlNewTask="${serverUrl}/index.php?event=Add_task"
-           urlRepository="http://changelogic.araneaframework.org"
-           urlTask="${serverUrl}/index.php?event=Show_public_task&amp;task_id="
-           urlTaskQuery="${serverUrl}/index.php?event=Show_public_task_list">
-        <attribute name="queryPattern"
-              value="&lt;a href=&quot;index.php\?event\=Show_public_task&amp;amp;task_id\=.+?&amp;amp;project_id\=0&quot;&gt;(.+?)&lt;/a&gt;.+?&lt;/td&gt;.+?&lt;td&gt;.+?&lt;/td&gt;.+?&lt;td&gt;.+?&lt;/td&gt;.+?&lt;td&gt;.+?&lt;/td&gt;.+?&lt;td&gt;(.+?)&lt;/td&gt;"/>
-     </repository>
-     -->
-     <repository
-           anonymous="false"
-           label="Aranea Framework (ChangeLogic)"
-           repositoryKind="web"
-           urlRepository="http://changelogic.araneaframework.org"
-           urlTask="${serverUrl}/index.php?event=Show_task&amp;task_id="
-           urlNewTask="${serverUrl}/index.php?event=Add_task&amp;project_id=${project_id}"
-           urlTaskQuery="${serverUrl}/index.php?event=Show_public_task_list&amp;project_id=${project_id}&amp;page=-1&amp;cookietest=2">
-        <attribute
-              name="loginFormUrl"
-              value="${serverUrl}/index.php?cookietest=1">
-        </attribute>
-        <attribute name="loginTokenPattern"
-              value="&lt;form name=&quot;Login_form&quot; method=&quot;.+?&quot; action=&quot;index.php\?event\=Login&amp;amp;.*?project_id\=0&amp;amp;link_uid\=(\p{Alnum}+?)\&quot;.*?&gt;"/>
-        <attribute name="loginRequestMethod" value="POST"/>
-        <attribute name="loginRequestUrl"
-              value="${serverUrl}/index.php?event=Login&amp;link_uid=${loginToken}&amp;username=${userId}&amp;password=${password}"/>
-        <attribute name="queryPattern"
-              value="&lt;a href=&quot;index.php\?event\=Show_.+?task.+?task_id=(.+?)&amp;.+?&lt;/td&gt;.+?&lt;td&gt;.+?&lt;/td&gt;.+?&lt;td&gt;.+?&lt;/td&gt;.+?&lt;td&gt;.+?&lt;/td&gt;.+?&lt;td&gt;.+?&lt;/td&gt;.+?&lt;td&gt;(.+?)&lt;/td&gt;"/>
-        <attribute name="param_project_id" value="1"/>
-     </repository>
-
-     <repository
-	      anonymous="false"
-	      label="OTRS"
-	      repositoryKind="web"
-	      urlRepository="http://demo.otrs.org"
-	      urlNewTask="${serverUrl}/otrs/index.pl?Action=AgentTicketPhone"
-	      urlTask="${serverUrl}/otrs/index.pl?Action=AgentTicketZoom&amp;TicketID="
-	      urlTaskQuery="${serverUrl}/otrs/index.pl?Action=AgentTicketMailbox">
-	    <attribute name="queryPattern"
-	                value="&lt;a href=\&quot;/otrs/index.pl\?Action=AgentTicketZoom&amp;TicketID=(.+?)&quot;.+?&lt;b&gt;Subject:&lt;/b&gt;.+?&lt;div title=&quot;.+?&quot;&gt;(.+?)&lt;/div&gt;&lt;/td&gt;"/>
-	    <attribute name="loginRequestUrl"
-	            value="${serverUrl}/otrs/index.pl?Action=Login&amp;User=${userId}&amp;Password=${password}"/>
-     </repository>
-
-     <repository
-		      anonymous="false"
-		      label="JavaForge (CodeLogic)"
-		      repositoryKind="web"
-		      urlRepository="http://www.javaforge.com/proj/tracker"
-		      urlTask="${serverUrl}/itemDetails.do?navigation=true&amp;task_id="
-		      urlNewTask="${serverUrl}/submitNew.do?tracker_id=${tracker_id}"
-		      urlTaskQuery="${serverUrl}/browseAllTrackers.do?proj_id=${proj_id}&amp;tracker_type_id=${tracker_type_id}&amp;onlyOpen=false&amp;pagesize=0">
-	     <attribute name="queryPattern"
-                  value="&lt;a href=&quot;/proj/tracker/itemDetails.do\?.+?task_id=(\d+?)&quot;&gt;(.+?)&lt;/a&gt;"/>
-       <attribute name="param_tracker_id" value="41"/>
-       <attribute name="param_tracker_type_id" value="2"/>
-       <attribute name="param_proj_id" value="11"/>
-    </repository>
-
-     <repository
-          anonymous="true"
-          label="Eclipse Plugin Central (RSS)"
-          repositoryKind="web"
-          urlRepository="http://www.eclipseplugincentral.com/"
-          urlTaskQuery="http://www.eclipseplugincentral.com/pluginfeed.rss">
-    </repository>
-
-   </extension>
-
-</plugin>
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/NamedPattern.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/NamedPattern.java
deleted file mode 100644
index b67d767..0000000
--- a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/NamedPattern.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.web.tasks;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * @author Eugene Kuleshov
- */
-public class NamedPattern {
-	private final List<String> groups = new ArrayList<String>();
-
-	private final Pattern pattern;
-
-	public NamedPattern(String namedRegex, int flags) {
-		pattern = Pattern.compile(prepare(namedRegex), flags);
-	}
-
-	public Pattern getPattern() {
-		return pattern;
-	}
-
-	public Matcher matcher(CharSequence input) {
-		return pattern.matcher(input);
-	}
-
-	public List<String> getGroups() {
-		return groups;
-	}
-
-	public String groupName(int i) {
-		return groups.get(i);
-	}
-
-	public String group(String name, Matcher m) {
-		int n = groups.indexOf(name);
-		return n == -1 ? null : m.group(n + 1);
-	}
-
-	private String prepare(String namedRegex) {
-		StringBuilder regex = new StringBuilder();
-		Matcher m = Pattern.compile("\\((\\{(\\S+?)})").matcher(namedRegex);
-		int pos = 0;
-		while (m.find()) {
-			groups.add(m.group(2));
-			regex.append(namedRegex.substring(pos, m.start(1)));
-			pos = m.end();
-		}
-		return regex.append(namedRegex.substring(pos)).toString();
-	}
-
-}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/ParameterEditorDialog.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/ParameterEditorDialog.java
deleted file mode 100644
index c5e4f05..0000000
--- a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/ParameterEditorDialog.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.web.tasks;
-
-import org.eclipse.jface.dialogs.Dialog;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Property editor dialog
- * 
- * @author Eugene Kuleshov
- */
-public class ParameterEditorDialog extends Dialog {
-	private final String title;
-
-	private String name;
-
-	private String value;
-
-	private Text valueText;
-
-	private Text nameText;
-
-	private Text status;
-
-	public ParameterEditorDialog(Shell parent) {
-		super(parent);
-		this.title = "New Property";
-	}
-
-	public ParameterEditorDialog(Shell parent, String name, String value) {
-		super(parent);
-		this.title = "Edit Property";
-		this.name = name;
-		this.value = value;
-	}
-
-	@Override
-	protected Control createDialogArea(Composite parent) {
-		Composite composite = (Composite) super.createDialogArea(parent);
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 2;
-		composite.setLayout(gridLayout);
-
-		Label nameLabel = new Label(composite, SWT.NONE);
-		nameLabel.setText("&Name:");
-
-		nameText = new Text(composite, SWT.BORDER);
-		GridData gridData = new GridData(SWT.FILL, SWT.CENTER, true, false);
-		gridData.widthHint = 300;
-		nameText.setLayoutData(gridData);
-
-		Label valueLabel = new Label(composite, SWT.NONE);
-		valueLabel.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
-		valueLabel.setText("&Value:");
-
-		valueText = new Text(composite, SWT.BORDER);
-		GridData gridData_1 = new GridData(SWT.FILL, SWT.CENTER, true, false);
-		gridData_1.widthHint = 300;
-		valueText.setLayoutData(gridData_1);
-
-		if (name != null) {
-			nameText.setText(name.trim());
-			valueText.setFocus();
-		}
-		if (value != null) {
-			valueText.setText(value);
-			valueText.setSelection(0, value.length());
-		}
-
-		ModifyListener updateListener = new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				updateButtons();
-			}
-		};
-		nameText.addModifyListener(updateListener);
-		valueText.addModifyListener(updateListener);
-		new Label(composite, SWT.NONE);
-
-		status = new Text(composite, SWT.READ_ONLY);
-		status.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-
-		return composite;
-	}
-
-	@Override
-	protected void configureShell(Shell shell) {
-		super.configureShell(shell);
-		if (title != null) {
-			shell.setText(title);
-		}
-	}
-
-	@Override
-	public void create() {
-		super.create();
-		updateButtons();
-	}
-
-	private void updateButtons() {
-		name = nameText.getText().trim();
-		value = valueText.getText();
-
-		getButton(IDialogConstants.OK_ID).setEnabled(isValid());
-	}
-
-	private boolean isValid() {
-		if (name.length() == 0 || !Character.isLetter(name.charAt(0))) {
-			status.setText("Name should be a Java identifier");
-			return false;
-		}
-		for (int i = 1; i < name.length(); i++) {
-			char c = name.charAt(i);
-			if (Character.isLetterOrDigit(c) || c == '_' || c == '-') {
-				continue;
-			}
-			status.setText("Name should be a Java identifier");
-			return false;
-		}
-		status.setText("");
-		return true;
-	}
-
-	public String getName() {
-		return name;
-	}
-
-	public String getValue() {
-		return value;
-	}
-
-}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/ParametersEditor.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/ParametersEditor.java
deleted file mode 100644
index b320e53..0000000
--- a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/ParametersEditor.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.web.tasks;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.eclipse.jface.window.Window;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-
-/**
- * Parameters editor table
- * 
- * @author Eugene Kuleshov
- */
-public class ParametersEditor extends Composite {
-
-	private final Table paramsTable;
-
-	public ParametersEditor(Composite parent, int style) {
-		super(parent, style);
-
-		GridLayout gridLayout = new GridLayout(2, false);
-		gridLayout.marginWidth = 0;
-		gridLayout.marginHeight = 0;
-		setLayout(gridLayout);
-
-		paramsTable = new Table(this, SWT.FULL_SELECTION | SWT.BORDER | SWT.MULTI);
-		GridData gridData1 = new GridData(SWT.FILL, SWT.FILL, true, true, 1, 3);
-		gridData1.minimumHeight = 70;
-		paramsTable.setLayoutData(gridData1);
-		paramsTable.setLinesVisible(true);
-		paramsTable.setHeaderVisible(true);
-
-		TableColumn colVariable = new TableColumn(paramsTable, SWT.NONE);
-		colVariable.setWidth(170);
-		colVariable.setText("Parameter");
-
-		TableColumn colValue = new TableColumn(paramsTable, SWT.NONE);
-		colValue.setWidth(280);
-		colValue.setText("Value");
-
-		Button bAdd = new Button(this, SWT.NONE);
-		bAdd.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
-		bAdd.setText("&Add...");
-		bAdd.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				ParameterEditorDialog dlg = new ParameterEditorDialog(Display.getCurrent().getActiveShell());
-				if (dlg.open() == Window.OK) {
-					TableItem item = new TableItem(paramsTable, SWT.NONE);
-					item.setText(new String[] { dlg.getName(), dlg.getValue() });
-				}
-			}
-		});
-
-		final Button bRemove = new Button(this, SWT.NONE);
-		bRemove.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
-		bRemove.setText("&Remove");
-		bRemove.setEnabled(false);
-		bRemove.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				int[] indices = paramsTable.getSelectionIndices();
-				paramsTable.remove(indices);
-			}
-		});
-
-		final Button bEdit = new Button(this, SWT.NONE);
-		bEdit.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, true));
-		bEdit.setText("&Edit...");
-		bEdit.setEnabled(false);
-		bEdit.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				TableItem item = paramsTable.getSelection()[0];
-				ParameterEditorDialog dlg = new ParameterEditorDialog(Display.getCurrent().getActiveShell(),
-						item.getText(0), item.getText(1));
-				if (dlg.open() == Window.OK) {
-					item.setText(0, dlg.getName());
-					item.setText(1, dlg.getValue());
-				}
-			}
-		});
-
-		paramsTable.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				bRemove.setEnabled(paramsTable.getSelectionCount() > 0);
-				bEdit.setEnabled(paramsTable.getSelectionCount() == 1);
-			}
-		});
-	}
-
-	public void removeAll() {
-		paramsTable.removeAll();
-	}
-
-	public void add(String name, String value) {
-		TableItem item = new TableItem(paramsTable, SWT.NONE);
-		item.setText(new String[] { name, value });
-	}
-
-	public Map<String, String> getParameters() {
-		Map<String, String> parameters = new LinkedHashMap<String, String>();
-		for (TableItem item : paramsTable.getItems()) {
-			parameters.put(WebRepositoryConnector.PARAM_PREFIX + item.getText(0), item.getText(1));
-		}
-		return parameters;
-	}
-
-	public void addParams(Map<String, String> props, LinkedHashMap<String, String> variables) {
-		Map<String, String> params = new LinkedHashMap<String, String>();
-		for (Map.Entry<String, String> e : props.entrySet()) {
-			String key = e.getKey();
-			String value = e.getValue();
-			if (key.startsWith(WebRepositoryConnector.PARAM_PREFIX)) {
-				params.put(key.substring(WebRepositoryConnector.PARAM_PREFIX.length()), value);
-			}
-			for (String var : WebRepositoryConnector.getTemplateVariables(value)) {
-				variables.put(var, "");
-			}
-		}
-
-		variables.remove(WebRepositoryConnector.PARAM_SERVER_URL);
-		variables.remove(WebRepositoryConnector.PARAM_USER_ID);
-		variables.remove(WebRepositoryConnector.PARAM_PASSWORD);
-
-		for (String var : variables.keySet()) {
-			if (!params.containsKey(var)) {
-				params.put(var, "");
-			}
-		}
-
-		for (Map.Entry<String, String> e : params.entrySet()) {
-			add(e.getKey(), e.getValue());
-		}
-	}
-
-}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/TasksWebPlugin.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/TasksWebPlugin.java
deleted file mode 100644
index 00e8fbd..0000000
--- a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/TasksWebPlugin.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-package org.eclipse.mylyn.internal.web.tasks;
-
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class TasksWebPlugin extends AbstractUIPlugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.mylyn.tasks.web";
-
-	// The shared instance
-	private static TasksWebPlugin plugin;
-
-	/**
-	 * The constructor
-	 */
-	public TasksWebPlugin() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	@Override
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	@Override
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 * 
-	 * @return the shared instance
-	 */
-	public static TasksWebPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/Util.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/Util.java
deleted file mode 100644
index 60ce23f..0000000
--- a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/Util.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.web.tasks;
-
-/**
- * Utility methods
- * 
- * @author Eugene Kuleshov
- */
-public class Util {
-
-	public static boolean isPresent(String value) {
-		return value != null && value.length() > 0;
-	}
-
-	public static String nvl(String value) {
-		return value == null ? "" : value;
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebConnectorUi.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebConnectorUi.java
deleted file mode 100644
index 9d07982..0000000
--- a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebConnectorUi.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.web.tasks;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.mylyn.tasks.core.ITaskMapping;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-import org.eclipse.mylyn.tasks.ui.AbstractRepositoryConnectorUi;
-import org.eclipse.mylyn.tasks.ui.wizards.ITaskRepositoryPage;
-import org.eclipse.mylyn.tasks.ui.wizards.NewWebTaskWizard;
-
-/**
- * TODO: refactor into extension points?
- * 
- * @author Mik Kersten
- * @author Eugene Kuleshov
- */
-public class WebConnectorUi extends AbstractRepositoryConnectorUi {
-
-	@Override
-	public ITaskRepositoryPage getSettingsPage(TaskRepository taskRepository) {
-		return new WebRepositorySettingsPage(taskRepository);
-	}
-
-	@Override
-	public IWizard getNewTaskWizard(TaskRepository taskRepository, ITaskMapping taskSelection) {
-		return new NewWebTaskWizard(taskRepository, WebRepositoryConnector.evaluateParams(
-				taskRepository.getProperty(WebRepositoryConnector.PROPERTY_TASK_CREATION_URL), taskRepository),
-				taskSelection);
-	}
-
-	@Override
-	public IWizard getQueryWizard(TaskRepository repository, IRepositoryQuery query) {
-		if (query instanceof WebQuery) {
-			return new WebQueryEditWizard(repository, query);
-		} else {
-			return new WebQueryWizard(repository);
-		}
-	}
-
-	/**
-	 * Task kind overlay, recommended to override with connector-specific overlay.
-	 */
-	@Override
-	public ImageDescriptor getTaskKindOverlay(ITask task) {
-		if (task instanceof WebTask) {
-			return WebImages.OVERLAY_TASK_WEB;
-		}
-		return null;
-	}
-
-	@Override
-	public String getConnectorKind() {
-		return WebRepositoryConnector.REPOSITORY_TYPE;
-	}
-
-	@Override
-	public boolean hasSearchPage() {
-		return false;
-	}
-}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebContentProposalProvider.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebContentProposalProvider.java
deleted file mode 100644
index a55e830..0000000
--- a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebContentProposalProvider.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.web.tasks;
-
-import java.util.ArrayList;
-
-import org.eclipse.jface.bindings.keys.KeyStroke;
-import org.eclipse.jface.bindings.keys.ParseException;
-import org.eclipse.jface.fieldassist.ContentProposalAdapter;
-import org.eclipse.jface.fieldassist.ControlDecoration;
-import org.eclipse.jface.fieldassist.FieldDecoration;
-import org.eclipse.jface.fieldassist.FieldDecorationRegistry;
-import org.eclipse.jface.fieldassist.IContentProposal;
-import org.eclipse.jface.fieldassist.IContentProposalListener;
-import org.eclipse.jface.fieldassist.IContentProposalListener2;
-import org.eclipse.jface.fieldassist.IContentProposalProvider;
-import org.eclipse.jface.fieldassist.IControlContentAdapter;
-import org.eclipse.jface.fieldassist.TextContentAdapter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * @author Eugene Kuleshov
- */
-public class WebContentProposalProvider implements IContentProposalProvider {
-
-	private final ParametersEditor parametersEditor;
-
-	private final boolean includeTemplates;
-
-	public WebContentProposalProvider(ParametersEditor parametersEditor, boolean includeTemplates) {
-		this.parametersEditor = parametersEditor;
-		this.includeTemplates = includeTemplates;
-	}
-
-	public IContentProposal[] getProposals(String contents, int position) {
-		ArrayList<IContentProposal> proposals = new ArrayList<IContentProposal>();
-		if (includeTemplates) {
-			addProposal(proposals, "({Id}.+?)");
-			addProposal(proposals, "({Description}.+?)");
-			addProposal(proposals, "({Owner}.+?)");
-			addProposal(proposals, "({Type}.+?)");
-			addProposal(proposals, "({Status}.+?)");
-			// proposals.add("({Due}.+?)");
-			// proposals.add("({Updated}.+?)");
-			// proposals.add("({Created}.+?)");
-			addProposal(proposals, "(.+?)");
-			addProposal(proposals, ".+?");
-		}
-		addProposal(proposals, "${" + WebRepositoryConnector.PARAM_SERVER_URL + "}");
-		addProposal(proposals, "${" + WebRepositoryConnector.PARAM_USER_ID + "}");
-		addProposal(proposals, "${" + WebRepositoryConnector.PARAM_PASSWORD + "}");
-		addProposal(proposals, "${" + WebRepositoryConnector.PARAM_LOGIN_TOKEN + "}");
-		for (String param : parametersEditor.getParameters().keySet()) {
-			addProposal(proposals, "${" + param.substring(WebRepositoryConnector.PARAM_PREFIX.length()) + "}");
-		}
-		addProposal(proposals, "${}");
-		return proposals.toArray(new IContentProposal[proposals.size()]);
-	}
-
-	private boolean addProposal(ArrayList<IContentProposal> proposals, final String content) {
-		return proposals.add(new IContentProposal() {
-
-			public String getContent() {
-				return content;
-			}
-
-			public int getCursorPosition() {
-				return content.length();
-			}
-
-			public String getDescription() {
-				return null;
-			}
-
-			public String getLabel() {
-				return null;
-			}
-
-		});
-	}
-
-	@SuppressWarnings("deprecation")
-	public static ControlDecoration createDecoration(final Text text, //
-			ParametersEditor parametersEditor, boolean includeTemplates) {
-		FieldDecorationRegistry registry = FieldDecorationRegistry.getDefault();
-		FieldDecoration fieldDecoration = registry.getFieldDecoration(FieldDecorationRegistry.DEC_CONTENT_PROPOSAL);
-
-		ControlDecoration decoration = new ControlDecoration(text, SWT.LEFT | SWT.TOP);
-		decoration.setImage(fieldDecoration.getImage());
-		decoration.setDescriptionText(fieldDecoration.getDescription());
-		decoration.setShowOnlyOnFocus(true);
-
-		KeyStroke keystroke = null;
-		try {
-			keystroke = KeyStroke.getInstance("Ctrl" + KeyStroke.KEY_DELIMITER + "Space");
-		} catch (ParseException e) {
-		}
-
-		ContentProposalAdapter adapter = new ContentProposalAdapter(text, new TextContentAdapter(), //
-				new WebContentProposalProvider(parametersEditor, includeTemplates), keystroke, null);
-		adapter.setPopupSize(new Point(200, 150));
-		adapter.setPropagateKeys(true);
-		adapter.setFilterStyle(ContentProposalAdapter.FILTER_CUMULATIVE);
-
-		// workaround for bug 196565
-		WebContentProposalListener listener = new WebContentProposalListener(adapter);
-		adapter.addContentProposalListener((IContentProposalListener) listener);
-		adapter.addContentProposalListener((IContentProposalListener2) listener);
-		adapter.setProposalAcceptanceStyle(ContentProposalAdapter.PROPOSAL_IGNORE);
-
-		return decoration;
-	}
-
-	static class WebContentProposalListener implements IContentProposalListener, IContentProposalListener2 {
-
-		private final ContentProposalAdapter adapter;
-
-		private int startCaretPosition;
-
-		private int endCaretPosition;
-
-		public WebContentProposalListener(ContentProposalAdapter adapter) {
-			this.adapter = adapter;
-		}
-
-		public void proposalAccepted(IContentProposal proposal) {
-			IControlContentAdapter contentAdapter = adapter.getControlContentAdapter();
-			Control control = adapter.getControl();
-			StringBuilder sb = new StringBuilder(contentAdapter.getControlContents(control));
-			sb.insert(contentAdapter.getCursorPosition(control), //
-					proposal.getContent().substring(endCaretPosition - startCaretPosition));
-			contentAdapter.setControlContents(control, sb.toString(), //
-					startCaretPosition + proposal.getCursorPosition());
-		}
-
-		public void proposalPopupOpened(ContentProposalAdapter adapter) {
-			startCaretPosition = adapter.getControlContentAdapter().getCursorPosition(adapter.getControl());
-		}
-
-		public void proposalPopupClosed(ContentProposalAdapter adapter) {
-			endCaretPosition = adapter.getControlContentAdapter().getCursorPosition(adapter.getControl());
-		}
-
-	}
-
-}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebImages.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebImages.java
deleted file mode 100644
index 81a076d..0000000
--- a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebImages.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-/*
- * Created on Apr 20, 2004
- */
-package org.eclipse.mylyn.internal.web.tasks;
-
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.resource.ImageRegistry;
-import org.eclipse.swt.graphics.Image;
-
-/**
- * @author Mik Kersten
- */
-public class WebImages {
-
-	private static ImageRegistry imageRegistry;
-
-	private static final String T_OBJ = "obj16";
-
-	private static final URL baseURL = TasksWebPlugin.getDefault().getBundle().getEntry("/icons/");
-
-	public static final ImageDescriptor OVERLAY_TASK_WEB = create(T_OBJ, "overlay-web.gif");
-
-	public static ImageDescriptor create(String prefix, String name) {
-		try {
-			return ImageDescriptor.createFromURL(makeIconFileURL(prefix, name));
-		} catch (MalformedURLException e) {
-			return ImageDescriptor.getMissingImageDescriptor();
-		}
-	}
-
-	private static URL makeIconFileURL(String prefix, String name) throws MalformedURLException {
-		if (baseURL == null) {
-			throw new MalformedURLException();
-		}
-
-		StringBuilder buffer = new StringBuilder(prefix);
-		buffer.append('/');
-		buffer.append(name);
-		return new URL(baseURL, buffer.toString());
-	}
-
-	private static ImageRegistry getImageRegistry() {
-		if (imageRegistry == null) {
-			imageRegistry = new ImageRegistry();
-		}
-
-		return imageRegistry;
-	}
-
-	/**
-	 * Lazily initializes image map.
-	 */
-	public static Image getImage(ImageDescriptor imageDescriptor) {
-		ImageRegistry imageRegistry = getImageRegistry();
-
-		Image image = imageRegistry.get("" + imageDescriptor.hashCode());
-		if (image == null) {
-			image = imageDescriptor.createImage();
-			imageRegistry.put("" + imageDescriptor.hashCode(), image);
-		}
-		return image;
-	}
-
-}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebQuery.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebQuery.java
deleted file mode 100644
index 280e7bb..0000000
--- a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebQuery.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.web.tasks;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
-
-/**
- * Represents pattern-based query on repository web page
- * 
- * @author Eugene Kuleshov
- */
-public class WebQuery extends RepositoryQuery {
-
-	private final String taskPrefix;
-
-	private final String queryUrlTemplate;
-
-	private final String queryPattern;
-
-	private final Map<String, String> params;
-
-	public WebQuery(String description, String queryUrl, String queryUrlTemplate, String queryPattern,
-			String taskPrefix, String repositoryUrl, Map<String, String> params) {
-		super(description);
-
-		this.queryUrlTemplate = queryUrlTemplate;
-		this.queryPattern = queryPattern;
-		this.taskPrefix = taskPrefix;
-		this.params = params;
-
-		setUrl(queryUrl);
-		setRepositoryUrl(repositoryUrl);
-	}
-
-	@Override
-	public String getConnectorKind() {
-		return WebRepositoryConnector.REPOSITORY_TYPE;
-	}
-
-	public String getTaskPrefix() {
-		return this.taskPrefix;
-	}
-
-	public String getQueryUrlTemplate() {
-		return this.queryUrlTemplate;
-	}
-
-	public String getQueryPattern() {
-		return this.queryPattern;
-	}
-
-	public Map<String, String> getQueryParameters() {
-		return new LinkedHashMap<String, String>(this.params);
-	}
-
-	public boolean isRss() {
-		return queryPattern == null || queryPattern.trim().length() == 0;
-	}
-
-}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebQueryEditWizard.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebQueryEditWizard.java
deleted file mode 100644
index 10b3eea..0000000
--- a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebQueryEditWizard.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.web.tasks;
-
-import org.eclipse.mylyn.internal.tasks.ui.deprecated.AbstractRepositoryQueryWizard;
-import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-
-/**
- * @author Eugene Kuleshov
- */
-public class WebQueryEditWizard extends AbstractRepositoryQueryWizard {
-
-	public WebQueryEditWizard(TaskRepository repository, IRepositoryQuery query) {
-		super(repository, query);
-		setForcePreviousAndNextButtons(true);
-	}
-
-	@Override
-	public void addPages() {
-		page = new WebQueryWizardPage(repository, (WebQuery) query);
-		page.setWizard(this);
-		addPage(page);
-	}
-
-//	@Override
-//	public boolean performFinish() {
-//
-//		AbstractRepositoryQuery q = queryPage.getQuery();
-//		if (q != null) {
-//			TasksUiPlugin.getTaskList().deleteQuery(query);
-//			TasksUiPlugin.getTaskList().addQuery(q);
-//			
-//			AbstractRepositoryConnector connector = TasksUiPlugin.getRepositoryManager().getRepositoryConnector(repository.getKind());
-//			if (connector != null) {
-//				TasksUiPlugin.getSynchronizationManager().synchronize(connector, q, null);
-//			}
-//		} 
-//
-//		return true;
-//	}
-
-	@Override
-	public boolean canFinish() {
-		if (page.getNextPage() == null) {
-			return page.isPageComplete();
-		}
-		return page.getNextPage().isPageComplete();
-	}
-}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebQueryWizard.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebQueryWizard.java
deleted file mode 100644
index 7bdbd63..0000000
--- a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebQueryWizard.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.web.tasks;
-
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
-import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
-import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-import org.eclipse.mylyn.tasks.ui.TasksUi;
-
-/**
- * Wizard used to create query for web based connector
- * 
- * @author Eugene Kuleshov
- */
-public class WebQueryWizard extends Wizard {
-
-	private static final String TITLE = "New Web Query";
-
-	private final TaskRepository repository;
-
-	private WebQueryWizardPage queryPage;
-
-	public WebQueryWizard(TaskRepository repository) {
-		this.repository = repository;
-		setNeedsProgressMonitor(true);
-		setWindowTitle(TITLE);
-	}
-
-	@Override
-	public void addPages() {
-		queryPage = new WebQueryWizardPage(repository);
-		queryPage.setWizard(this);
-		addPage(queryPage);
-	}
-
-	@Override
-	public boolean performFinish() {
-
-		RepositoryQuery query = queryPage.getQuery();
-		if (query != null) {
-			TasksUiInternal.getTaskList().addQuery(query);
-			AbstractRepositoryConnector connector = TasksUi.getRepositoryManager().getRepositoryConnector(
-					repository.getConnectorKind());
-			if (connector != null) {
-				TasksUiInternal.synchronizeQuery(connector, query, null, true);
-			}
-//			filter.refreshHits();
-		}
-
-		return true;
-	}
-
-	@Override
-	public boolean canFinish() {
-		if (queryPage.getNextPage() == null) {
-			return queryPage.isPageComplete();
-		}
-		return queryPage.getNextPage().isPageComplete();
-	}
-
-}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebQueryWizardPage.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebQueryWizardPage.java
deleted file mode 100644
index ef80025..0000000
--- a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebQueryWizardPage.java
+++ /dev/null
@@ -1,540 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.web.tasks;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.dialogs.IMessageProvider;
-import org.eclipse.jface.fieldassist.ControlDecoration;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
-import org.eclipse.mylyn.internal.tasks.core.deprecated.ITaskFactory;
-import org.eclipse.mylyn.internal.tasks.core.deprecated.QueryHitCollector;
-import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-import org.eclipse.mylyn.tasks.ui.TasksUi;
-import org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositoryQueryPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.browser.IWebBrowser;
-import org.eclipse.ui.browser.IWorkbenchBrowserSupport;
-import org.eclipse.ui.forms.events.ExpansionAdapter;
-import org.eclipse.ui.forms.events.ExpansionEvent;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * Wizard page for configuring and preview web query
- * 
- * @author Eugene Kuleshov
- */
-public class WebQueryWizardPage extends AbstractRepositoryQueryPage {
-	private Text queryUrlText;
-
-	private Text queryPatternText;
-
-	private TableViewer previewTable;
-
-	private String webPage;
-
-	private final WebQuery query;
-
-	private UpdatePreviewJob updatePreviewJob;
-
-	private final FormToolkit toolkit = new FormToolkit(Display.getCurrent());
-
-	private ParametersEditor parametersEditor;
-
-	private Map<String, String> oldProperties;
-
-	private final ArrayList<ControlDecoration> decorations = new ArrayList<ControlDecoration>();
-
-	private Text title;
-
-	public WebQueryWizardPage(TaskRepository repository) {
-		this(repository, null);
-	}
-
-	public WebQueryWizardPage(TaskRepository repository, WebQuery query) {
-		super("New web query", repository);
-		this.query = query;
-		setTitle("Create web query");
-		setDescription("Specify query parameters for " + repository.getRepositoryUrl());
-	}
-
-	@Override
-	public void dispose() {
-		for (ControlDecoration decoration : decorations) {
-			decoration.dispose();
-		}
-		super.dispose();
-	}
-
-	private static String getDefaultQueryTitle(TaskRepository repository) {
-		String label = repository.getRepositoryLabel();
-		String title = label;
-		Set<RepositoryQuery> queries = TasksUiPlugin.getTaskList().getRepositoryQueries(repository.getRepositoryUrl());
-		for (int n = 1; true; n++) {
-			for (RepositoryQuery query : queries) {
-				if (query.getSummary().equals(title)) {
-					title = label + " " + n;
-				}
-			}
-			return title;
-		}
-	}
-
-	private void createTitleGroup(Composite parent) {
-		Composite group = new Composite(parent, SWT.NONE);
-
-		GridLayout layout = new GridLayout(2, false);
-		group.setLayout(layout);
-
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 1;
-		group.setLayoutData(gd);
-
-		Label label = new Label(group, SWT.NONE);
-		label.setText("Query Title:");
-
-		title = new Text(group, SWT.BORDER);
-		title.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
-		title.setText(query == null ? getDefaultQueryTitle(getTaskRepository()) : query.getSummary());
-		title.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				setPageComplete(isPageComplete());
-			}
-		});
-		title.setFocus();
-	}
-
-	@Override
-	public String getQueryTitle() {
-		return (title != null) ? title.getText() : null;
-	}
-
-	public void createControl(Composite parent) {
-		final Composite composite = new Composite(parent, SWT.NONE);
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.marginHeight = 0;
-		gridLayout.marginWidth = 0;
-		gridLayout.verticalSpacing = 0;
-		gridLayout.numColumns = 1;
-		composite.setLayout(gridLayout);
-
-		if (!inSearchContainer()) {
-			createTitleGroup(composite);
-		}
-
-		parametersEditor = new ParametersEditor(composite, SWT.NONE);
-		GridData gridData1 = new GridData(SWT.FILL, SWT.FILL, true, true);
-		gridData1.minimumHeight = 90;
-		parametersEditor.setLayoutData(gridData1);
-
-		ExpandableComposite expComposite = toolkit.createExpandableComposite(composite, ExpandableComposite.COMPACT
-				| ExpandableComposite.TWISTIE);
-		expComposite.setFont(parent.getFont());
-		GridData gridData_1 = new GridData(SWT.FILL, SWT.FILL, true, false);
-		gridData_1.heightHint = 150;
-		gridData_1.minimumHeight = 150;
-		expComposite.setLayoutData(gridData_1);
-		expComposite.setBackground(parent.getBackground());
-		expComposite.setText("Advanced &Configuration");
-		expComposite.addExpansionListener(new ExpansionAdapter() {
-			@Override
-			public void expansionStateChanged(ExpansionEvent e) {
-				getControl().getShell().pack();
-			}
-		});
-		toolkit.paintBordersFor(expComposite);
-
-		Composite composite1 = toolkit.createComposite(expComposite, SWT.BORDER);
-		composite1.setLayout(new GridLayout(3, false));
-		expComposite.setClient(composite1);
-
-		toolkit.createLabel(composite1, "&Query URL:", SWT.NONE);
-
-		queryUrlText = new Text(composite1, SWT.BORDER);
-		final GridData gridData_2 = new GridData(SWT.FILL, SWT.CENTER, true, false);
-		gridData_2.widthHint = 200;
-		queryUrlText.setLayoutData(gridData_2);
-		queryUrlText.addModifyListener(new ModifyListener() {
-			public void modifyText(final ModifyEvent e) {
-				webPage = null;
-			}
-		});
-		decorations.add(WebContentProposalProvider.createDecoration(queryUrlText, parametersEditor, false));
-
-		Button button = new Button(composite1, SWT.NONE);
-		button.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false));
-		button.setText("&Open");
-		button.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				openBrowser();
-			}
-		});
-
-		Label queryPatternLabel = toolkit.createLabel(composite1, "Query &Pattern:", SWT.NONE);
-		queryPatternLabel.setLayoutData(new GridData(SWT.LEFT, SWT.TOP, false, false));
-
-		queryPatternText = new Text(composite1, SWT.V_SCROLL | SWT.MULTI | SWT.BORDER | SWT.WRAP);
-		GridData gridData = new GridData(SWT.FILL, SWT.TOP, true, false);
-		gridData.widthHint = 200;
-		gridData.heightHint = 60;
-		queryPatternText.setLayoutData(gridData);
-		decorations.add(WebContentProposalProvider.createDecoration(queryPatternText, parametersEditor, true));
-
-		Button preview = new Button(composite1, SWT.NONE);
-		preview.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false));
-		preview.setText("Previe&w");
-		preview.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(final SelectionEvent e) {
-				webPage = null;
-				updatePreview();
-			}
-		});
-
-		previewTable = new TableViewer(composite1, SWT.BORDER);
-		// previewTable = new Table(composite1, SWT.BORDER);
-		GridData gridData2 = new GridData(SWT.FILL, SWT.FILL, false, true, 3, 1);
-		gridData2.heightHint = 60;
-
-		Table table = previewTable.getTable();
-		table.setLayoutData(gridData2);
-		table.setLinesVisible(true);
-		table.setHeaderVisible(true);
-
-		TableColumn colId = new TableColumn(table, SWT.NONE);
-		colId.setWidth(100);
-		colId.setText("Id");
-
-		TableColumn colDescription = new TableColumn(table, SWT.NONE);
-		colDescription.setWidth(200);
-		colDescription.setText("Description");
-
-		TableColumn colStatus = new TableColumn(table, SWT.NONE);
-		colStatus.setText("Status");
-		colStatus.setWidth(80);
-
-		TableColumn colType = new TableColumn(table, SWT.NONE);
-		colType.setText("Type");
-		colType.setWidth(80);
-
-		TableColumn colOwner = new TableColumn(table, SWT.NONE);
-		colOwner.setText("Owner");
-		colOwner.setWidth(120);
-
-		previewTable.setColumnProperties(new String[] { "Id", "Description", "Status", "Type", "Owner" });
-		previewTable.setContentProvider(new IStructuredContentProvider() {
-
-			public void dispose() {
-			}
-
-			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			}
-
-			public Object[] getElements(Object inputElement) {
-				if (inputElement instanceof Collection) {
-					@SuppressWarnings("unchecked")
-					Collection<AbstractTask> tasks = (Collection<AbstractTask>) inputElement;
-					return tasks.toArray();
-				}
-				return new Object[0];
-			}
-		});
-
-		previewTable.setLabelProvider(new ITableLabelProvider() {
-
-			public String getColumnText(Object element, int columnIndex) {
-				ITask task = (ITask) element;
-				switch (columnIndex) {
-				case 0:
-					return task.getTaskId();
-				case 1:
-					return task.getSummary();
-				case 2:
-					return task.isCompleted() ? "complete" : "incomplete";
-				case 3:
-					return task.getTaskKind();
-				case 4:
-					return task.getOwner();
-				}
-				return null;
-			}
-
-			public Image getColumnImage(Object element, int columnIndex) {
-				return null;
-			}
-
-			public void addListener(ILabelProviderListener listener) {
-			}
-
-			public void dispose() {
-			}
-
-			public boolean isLabelProperty(Object element, String property) {
-				return false;
-			}
-
-			public void removeListener(ILabelProviderListener listener) {
-			}
-		});
-
-		setControl(composite);
-
-		LinkedHashMap<String, String> vars = new LinkedHashMap<String, String>();
-		Map<String, String> params = new LinkedHashMap<String, String>();
-		if (getTaskRepository() != null) {
-			queryUrlText.setText(addVars(vars, getTaskRepository().getProperty(
-					WebRepositoryConnector.PROPERTY_QUERY_URL)));
-			queryPatternText.setText(addVars(vars, getTaskRepository().getProperty(
-					WebRepositoryConnector.PROPERTY_QUERY_REGEXP)));
-
-			oldProperties = getTaskRepository().getProperties();
-			params.putAll(oldProperties);
-		}
-		if (query != null) {
-			setTitle(query.getSummary());
-			queryUrlText.setText(addVars(vars, query.getQueryUrlTemplate()));
-			queryPatternText.setText(addVars(vars, query.getQueryPattern()));
-			params.putAll(query.getQueryParameters());
-		}
-		parametersEditor.addParams(params, vars);
-	}
-
-	private static String addVars(LinkedHashMap<String, String> vars, String property) {
-		if (property == null) {
-			return "";
-		}
-		for (String var : WebRepositoryConnector.getTemplateVariables(property)) {
-			vars.put(var, "");
-		}
-		return property;
-	}
-
-	@Override
-	public RepositoryQuery getQuery() {
-		String description = getQueryTitle();
-		String queryUrlTemplate = queryUrlText.getText();
-		String queryPattern = queryPatternText.getText();
-		Map<String, String> params = parametersEditor.getParameters();
-
-		String queryUrl = WebRepositoryConnector.evaluateParams(queryUrlTemplate, params, getTaskRepository());
-
-		return new WebQuery(description, queryUrl, queryUrlTemplate, queryPattern, getTaskRepository().getProperty(
-				WebRepositoryConnector.PROPERTY_TASK_URL), getTaskRepository().getRepositoryUrl(), params);
-	}
-
-	synchronized void updatePreview() {
-		if (updatePreviewJob == null) {
-			updatePreviewJob = new UpdatePreviewJob("Updating preview");
-			updatePreviewJob.setPriority(Job.DECORATE);
-		}
-		updatePreviewJob.setParams(queryUrlText.getText(), queryPatternText.getText(), parametersEditor.getParameters());
-		if (!updatePreviewJob.isActive()) {
-			updatePreviewJob.schedule();
-		}
-	}
-
-	protected void openBrowser() {
-		final String url = queryUrlText.getText();
-		final Map<String, String> params = parametersEditor.getParameters();
-
-		new Job("Opening Browser") {
-			@Override
-			protected IStatus run(IProgressMonitor monitor) {
-				String evaluatedUrl = WebRepositoryConnector.evaluateParams(url, params, getTaskRepository());
-
-				try {
-					String webPage = WebRepositoryConnector.fetchResource(evaluatedUrl, params, getTaskRepository());
-					File webPageFile = File.createTempFile("mylyn-web-connector", ".html");
-					webPageFile.deleteOnExit();
-
-					FileWriter w = new FileWriter(webPageFile);
-					w.write(webPage);
-					w.flush();
-					w.close();
-
-					IWorkbenchBrowserSupport browserSupport = PlatformUI.getWorkbench().getBrowserSupport();
-					IWebBrowser browser = browserSupport.getExternalBrowser();
-					browser.openURL(webPageFile.toURL());
-
-				} catch (final Exception e) {
-					Display.getCurrent().asyncExec(new Runnable() {
-						public void run() {
-							setMessage(e.toString());
-						}
-					});
-				}
-
-				return Status.OK_STATUS;
-			}
-		}.schedule();
-	}
-
-	@Override
-	public boolean isPageComplete() {
-		return super.isPageComplete();
-	}
-
-	void updatePreviewTable(List<AbstractTask> tasks, MultiStatus queryStatus) {
-		previewTable.setInput(tasks);
-
-		if (queryStatus.isOK()) {
-			setMessage(null, IMessageProvider.WARNING);
-		} else {
-			StringBuffer sb = new StringBuffer();
-			for (IStatus status : queryStatus.getChildren()) {
-				sb.append(status.getMessage()).append("\n");
-			}
-			setMessage(sb.toString(), IMessageProvider.WARNING);
-		}
-	}
-
-	private final class UpdatePreviewJob extends Job {
-		private volatile String url;
-
-		private volatile String regexp;
-
-		private volatile Map<String, String> params;
-
-		private volatile boolean active = false;
-
-		private UpdatePreviewJob(String name) {
-			super(name);
-		}
-
-		public boolean isActive() {
-			return active;
-		}
-
-		public void setParams(String url, String regexp, Map<String, String> params) {
-			this.url = url;
-			this.regexp = regexp;
-			this.params = params;
-		}
-
-		@Override
-		protected IStatus run(IProgressMonitor monitor) {
-			String currentRegexp = regexp;
-			String queryPattern = WebRepositoryConnector.evaluateParams(currentRegexp, params, getTaskRepository());
-			String evaluatedUrl = WebRepositoryConnector.evaluateParams(url, params, getTaskRepository());
-			String taskPrefix = WebRepositoryConnector.evaluateParams(getTaskRepository().getProperty(
-					WebRepositoryConnector.PROPERTY_TASK_URL), params, getTaskRepository());
-			active = true;
-			do {
-				final MultiStatus queryStatus = new MultiStatus(TasksUiPlugin.ID_PLUGIN, IStatus.OK, "Query result",
-						null);
-				final List<RepositoryTaskData> queryHits = new ArrayList<RepositoryTaskData>();
-				try {
-					if (webPage == null) {
-						webPage = WebRepositoryConnector.fetchResource(evaluatedUrl, params, getTaskRepository());
-					}
-
-					ITaskFactory taskFactory = new ITaskFactory() {
-						public AbstractTask createTask(RepositoryTaskData taskData, IProgressMonitor monitor)
-								throws CoreException {
-							return null;
-						}
-					};
-					QueryHitCollector collector = new QueryHitCollector(taskFactory) {
-						@Override
-						public void accept(RepositoryTaskData hit) {
-							queryHits.add(hit);
-						}
-					};
-
-					IStatus status;
-					if (queryPattern != null && queryPattern.trim().length() > 0) {
-						status = WebRepositoryConnector.performQuery(webPage, queryPattern, taskPrefix, monitor,
-								collector, getTaskRepository());
-					} else {
-						status = WebRepositoryConnector.performRssQuery(evaluatedUrl, monitor, collector,
-								getTaskRepository());
-					}
-
-					if (!status.isOK()) {
-						queryStatus.add(status);
-					} else if (queryHits.size() == 0) {
-						queryStatus.add(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, 0,
-								"No matching results. Check query regexp", null));
-					}
-
-				} catch (IOException ex) {
-					queryStatus.add(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, IStatus.ERROR, //
-							"Unable to fetch resource: " + ex.getMessage(), null));
-				} catch (Exception ex) {
-					queryStatus.add(new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, IStatus.ERROR, //
-							"Parsing error: " + ex.getMessage(), null));
-				}
-
-				Display.getDefault().asyncExec(new Runnable() {
-					public void run() {
-						WebRepositoryConnector connector = (WebRepositoryConnector) TasksUi.getRepositoryManager()
-								.getRepositoryConnector(getTaskRepository().getConnectorKind());
-						List<AbstractTask> tasks = new ArrayList<AbstractTask>();
-						for (RepositoryTaskData hit : queryHits) {
-							AbstractTask task = connector.createTask(getTaskRepository().getRepositoryUrl(),
-									hit.getTaskId(), "");
-							connector.updateTaskFromTaskData(getTaskRepository(), task, hit);
-							tasks.add(task);
-						}
-						updatePreviewTable(tasks, queryStatus);
-					}
-				});
-			} while (!currentRegexp.equals(currentRegexp) && !monitor.isCanceled());
-			active = false;
-			return Status.OK_STATUS;
-		}
-	}
-
-	@Override
-	public void applyTo(IRepositoryQuery query) {
-		throw new UnsupportedOperationException();
-	}
-
-}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebRepositoryConnector.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebRepositoryConnector.java
deleted file mode 100644
index 163b2c3..0000000
--- a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebRepositoryConnector.java
+++ /dev/null
@@ -1,697 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.web.tasks;
-
-import static org.eclipse.mylyn.internal.web.tasks.Util.isPresent;
-
-import java.io.IOException;
-import java.net.URL;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.commons.codec.EncoderException;
-import org.apache.commons.codec.net.URLCodec;
-import org.apache.commons.httpclient.Header;
-import org.apache.commons.httpclient.HttpClient;
-import org.apache.commons.httpclient.HttpException;
-import org.apache.commons.httpclient.HttpMethod;
-import org.apache.commons.httpclient.methods.GetMethod;
-import org.apache.commons.httpclient.methods.PostMethod;
-import org.apache.commons.lang.StringEscapeUtils;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.mylyn.commons.net.WebClientUtil;
-import org.eclipse.mylyn.commons.net.WebLocation;
-import org.eclipse.mylyn.commons.net.WebUtil;
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.core.IdentityAttributeFactory;
-import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractAttachmentHandler;
-import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractLegacyRepositoryConnector;
-import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractTaskDataHandler;
-import org.eclipse.mylyn.internal.tasks.core.deprecated.DefaultTaskSchema;
-import org.eclipse.mylyn.internal.tasks.core.deprecated.LegacyTaskDataCollector;
-import org.eclipse.mylyn.internal.tasks.core.deprecated.RepositoryTaskData;
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.internal.tasks.ui.util.TasksUiInternal;
-import org.eclipse.mylyn.tasks.core.IRepositoryManager;
-import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
-import org.eclipse.mylyn.tasks.core.sync.ISynchronizationSession;
-import org.eclipse.mylyn.tasks.ui.TasksUi;
-
-import com.sun.syndication.feed.module.DCModule;
-import com.sun.syndication.feed.synd.SyndEntry;
-import com.sun.syndication.feed.synd.SyndFeed;
-import com.sun.syndication.io.SyndFeedInput;
-import com.sun.syndication.io.XmlReader;
-
-/**
- * Generic connector for web based issue tracking systems
- * 
- * @author Eugene Kuleshov
- */
-public class WebRepositoryConnector extends AbstractLegacyRepositoryConnector {
-
-	public static final String REPOSITORY_TYPE = "web";
-
-	public static final String PROPERTY_TASK_CREATION_URL = "taskCreationUrl";
-
-	public static final String PROPERTY_TASK_URL = "taskUrl";
-
-	public static final String PROPERTY_QUERY_URL = "queryUrl";
-
-	public static final String PROPERTY_QUERY_METHOD = "queryMethod";
-
-	public static final String PROPERTY_QUERY_REGEXP = "queryPattern";
-
-	public static final String PROPERTY_LOGIN_FORM_URL = "loginFormUrl";
-
-	public static final String PROPERTY_LOGIN_TOKEN_REGEXP = "loginTokenPattern";
-
-	public static final String PROPERTY_LOGIN_REQUEST_METHOD = "loginRequestMethod";
-
-	public static final String PROPERTY_LOGIN_REQUEST_URL = "loginRequestUrl";
-
-	public static final String PARAM_PREFIX = "param_";
-
-	public static final String PARAM_SERVER_URL = "serverUrl";
-
-	public static final String PARAM_USER_ID = "userId";
-
-	public static final String PARAM_PASSWORD = "password";
-
-	public static final String PARAM_LOGIN_TOKEN = "loginToken";
-
-	public static final String REQUEST_POST = "POST";
-
-	public static final String REQUEST_GET = "GET";
-
-	private static final String COMPLETED_STATUSES = "completed|fixed|resolved|invalid|verified|deleted|closed|done";
-
-	private static final String KEY_TASK_PREFIX = "taskPrefix";
-
-	@Override
-	public String getConnectorKind() {
-		return REPOSITORY_TYPE;
-	}
-
-	@Override
-	public String getLabel() {
-		return "Web Template (Advanced)";
-	}
-
-	@Override
-	public String[] getPepositoryPropertyNames() {
-		return new String[] { PROPERTY_TASK_URL, PROPERTY_TASK_CREATION_URL };
-	}
-
-	@Override
-	public boolean canCreateNewTask(TaskRepository repository) {
-		return repository.hasProperty(PROPERTY_TASK_CREATION_URL);
-	}
-
-	@Override
-	public boolean canCreateTaskFromKey(TaskRepository repository) {
-		return repository.hasProperty(PROPERTY_TASK_URL);
-	}
-
-//	@Override
-//	public AbstractTask createTaskFromExistingId(TaskRepository repository, final String id, IProgressMonitor monitor)
-//			throws CoreException {
-//		if (REPOSITORY_TYPE.equals(repository.getConnectorKind())) {
-//			String taskPrefix = evaluateParams(repository.getProperty(PROPERTY_TASK_URL), repository);
-//
-//			final WebTask task = new WebTask(id, id, taskPrefix, repository.getRepositoryUrl(), REPOSITORY_TYPE);
-//
-//			RetrieveTitleFromUrlJob job = new RetrieveTitleFromUrlJob(taskPrefix + id) {
-//				@Override
-//				protected void setTitle(String pageTitle) {
-//					task.setSummary(pageTitle);
-//					TasksUiPlugin.getTaskList().notifyTaskChanged(task, false);
-//				}
-//			};
-//			job.schedule();
-//
-//			return task;
-//		}
-//
-//		return null;
-//	}
-
-	@Override
-	public RepositoryTaskData getLegacyTaskData(TaskRepository repository, String taskId, IProgressMonitor monitor)
-			throws CoreException {
-		if (REPOSITORY_TYPE.equals(repository.getConnectorKind())) {
-			String taskPrefix = evaluateParams(repository.getProperty(PROPERTY_TASK_URL), repository);
-
-			RepositoryTaskData taskData = createTaskData(repository.getRepositoryUrl(), taskId);
-			final DefaultTaskSchema schema = new DefaultTaskSchema(taskData);
-			schema.setSummary(taskId);
-			schema.setTaskUrl(taskPrefix + taskId);
-			schema.setValue(KEY_TASK_PREFIX, taskPrefix);
-
-			String pageTitle;
-			try {
-				pageTitle = WebUtil.getTitleFromUrl(new WebLocation(taskPrefix + taskId), monitor);
-				schema.setSummary(pageTitle);
-			} catch (IOException e) {
-				// log to error log?
-			}
-			return taskData;
-		}
-
-		return null;
-	}
-
-	@Override
-	public String getRepositoryUrlFromTaskUrl(String url) {
-		if (url == null) {
-			return null;
-		}
-
-		// lookup repository using task prefix url
-		IRepositoryManager repositoryManager = TasksUi.getRepositoryManager();
-		for (TaskRepository repository : repositoryManager.getRepositories(getConnectorKind())) {
-			String taskUrl = evaluateParams(repository.getProperty(PROPERTY_TASK_URL), repository);
-			if (taskUrl != null && !taskUrl.equals("") && url.startsWith(taskUrl)) {
-				return repository.getRepositoryUrl();
-			}
-		}
-
-		for (IRepositoryQuery query : TasksUiInternal.getTaskList().getQueries()) {
-			if (query instanceof WebQuery) {
-				WebQuery webQuery = (WebQuery) query;
-				TaskRepository repository = repositoryManager.getRepository(webQuery.getConnectorKind(),
-						webQuery.getRepositoryUrl());
-				if (repository != null) {
-					String queryUrl = evaluateParams(webQuery.getTaskPrefix(), //
-							webQuery.getQueryParameters(), repository);
-					if (queryUrl != null && !queryUrl.equals("") && url.startsWith(queryUrl)) {
-						return webQuery.getRepositoryUrl();
-					}
-				}
-			}
-		}
-		return null;
-	}
-
-	@Override
-	public String getTaskIdFromTaskUrl(String url) {
-		if (url == null) {
-			return null;
-		}
-
-		IRepositoryManager repositoryManager = TasksUi.getRepositoryManager();
-		for (TaskRepository repository : repositoryManager.getRepositories(getConnectorKind())) {
-			String start = evaluateParams(repository.getProperty(PROPERTY_TASK_URL), repository);
-			if (start != null && url.startsWith(start)) {
-				return url.substring(start.length());
-			}
-		}
-		return null;
-	}
-
-	@Override
-	public String getTaskUrl(String repositoryUrl, String taskId) {
-		IRepositoryManager repositoryManager = TasksUi.getRepositoryManager();
-		TaskRepository repository = repositoryManager.getRepository(getConnectorKind(), repositoryUrl);
-		if (repository != null) {
-			String prefix = evaluateParams(repository.getProperty(PROPERTY_TASK_URL), repository);
-			return prefix + taskId;
-		}
-		return null;
-	}
-
-	@Override
-	public IStatus performQuery(TaskRepository repository, IRepositoryQuery query, TaskDataCollector resultCollector,
-			ISynchronizationSession event, IProgressMonitor monitor) {
-		if (query instanceof WebQuery) {
-			WebQuery webQuery = (WebQuery) query;
-			Map<String, String> queryParameters = webQuery.getQueryParameters();
-			String queryUrl = evaluateParams(query.getUrl(), queryParameters, repository);
-
-			try {
-				if (webQuery.isRss()) {
-					return performRssQuery(queryUrl, monitor, resultCollector, repository);
-				} else {
-					String taskPrefix = evaluateParams(webQuery.getTaskPrefix(), queryParameters, repository);
-					String queryPattern = evaluateParams(webQuery.getQueryPattern(), queryParameters, repository);
-					return performQuery(fetchResource(queryUrl, queryParameters, repository), queryPattern, taskPrefix,
-							monitor, resultCollector, repository);
-				}
-
-			} catch (IOException ex) {
-				String msg = ex.getMessage() == null ? ex.toString() : ex.getMessage();
-				return new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, IStatus.ERROR, //
-						"Could not fetch resource: " + queryUrl + "\n" + msg, ex);
-			}
-		}
-		return Status.OK_STATUS;
-	}
-
-	@Override
-	public void preSynchronization(ISynchronizationSession session, IProgressMonitor monitor) throws CoreException {
-		for (ITask task : session.getTasks()) {
-			((AbstractTask) task).setStale(false);
-		}
-	}
-
-	@Override
-	public AbstractAttachmentHandler getAttachmentHandler() {
-		// not supported
-		return null;
-	}
-
-	@Override
-	public AbstractTaskDataHandler getLegacyTaskDataHandler() {
-		// not supported
-		return null;
-	}
-
-	@Override
-	public void updateRepositoryConfiguration(TaskRepository repository, IProgressMonitor monitor) throws CoreException {
-		// ignore
-	}
-
-//	@Override
-//	public void updateTaskFromRepository(TaskRepository repository, AbstractTask repositoryTask,
-//			IProgressMonitor monitor) throws CoreException {
-//	}
-
-	@Override
-	public AbstractTask createTask(String repositoryUrl, String id, String summary) {
-		return new WebTask(id, summary, "", repositoryUrl, WebRepositoryConnector.REPOSITORY_TYPE);
-	}
-
-	@Override
-	public boolean updateTaskFromTaskData(TaskRepository repository, ITask task, RepositoryTaskData taskData) {
-		DefaultTaskSchema schema = new DefaultTaskSchema(taskData);
-		((WebTask) task).setTaskPrefix(schema.getValue(KEY_TASK_PREFIX));
-		// XXX WebTask overrides getTaskKind()
-		schema.setTaskKind(task.getTaskKind());
-		return schema.applyTo(task);
-	}
-
-	// utility methods
-
-	public static IStatus performQuery(String resource, String regexp, String taskPrefix, IProgressMonitor monitor,
-			TaskDataCollector resultCollector, TaskRepository repository) {
-		NamedPattern p = new NamedPattern(regexp, Pattern.CASE_INSENSITIVE | Pattern.MULTILINE | Pattern.DOTALL
-				| Pattern.UNICODE_CASE | Pattern.CANON_EQ);
-
-		Matcher matcher = p.matcher(resource);
-
-		if (!matcher.find()) {
-			return Status.OK_STATUS;
-		} else {
-			boolean isCorrect = true;
-			do {
-				if (p.getGroups().isEmpty()) {
-					// "classic" mode, no named patterns
-					if (matcher.groupCount() < 2) {
-						isCorrect = false;
-					}
-					if (matcher.groupCount() >= 1) {
-						String id = matcher.group(1);
-						String description = matcher.groupCount() > 1 ? cleanup(matcher.group(2), repository) : null;
-						description = unescapeHtml(description);
-//						resultCollector.accept(new WebTask(id, description, taskPrefix, repository.getUrl(),
-//								REPOSITORY_TYPE));
-
-						RepositoryTaskData data = createTaskData(repository.getRepositoryUrl(), id);
-						DefaultTaskSchema schema = new DefaultTaskSchema(data);
-						schema.setTaskUrl(taskPrefix + id);
-						schema.setSummary(description);
-						schema.setValue(KEY_TASK_PREFIX, taskPrefix);
-						((LegacyTaskDataCollector) resultCollector).accept(data);
-					}
-				} else {
-					String id = p.group("Id", matcher);
-					String description = p.group("Description", matcher);
-					if (id == null || description == null) {
-						isCorrect = false;
-					}
-					if (id != null) {
-						description = unescapeHtml(description);
-//						WebTask w = new WebTask(id, description, taskPrefix, repository.getUrl(), REPOSITORY_TYPE);
-
-						String owner = cleanup(p.group("Owner", matcher), repository);
-						owner = unescapeHtml(owner);
-//						w.setOwner(owner);
-						String type = cleanup(p.group("Type", matcher), repository);
-						type = unescapeHtml(type);
-//						w.setTaskKind(type);
-
-						RepositoryTaskData data = createTaskData(repository.getRepositoryUrl(), id);
-						DefaultTaskSchema schema = new DefaultTaskSchema(data);
-						schema.setTaskUrl(taskPrefix + id);
-						schema.setSummary(description);
-						schema.setValue(KEY_TASK_PREFIX, taskPrefix);
-						schema.setOwner(owner);
-						schema.setTaskKind(type);
-
-						String status = p.group("Status", matcher);
-						if (status != null) {
-//							w.setCompleted(COMPLETED_STATUSES.contains(status.toLowerCase()));
-							if (COMPLETED_STATUSES.contains(status.toLowerCase())) {
-								// TODO: set actual completion date here
-								schema.setCompletionDate(new Date());
-							}
-						}
-
-						((LegacyTaskDataCollector) resultCollector).accept(data);
-					}
-				}
-
-			} while (matcher.find() && !monitor.isCanceled());
-
-			if (isCorrect) {
-				return Status.OK_STATUS;
-			} else {
-				return new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, IStatus.ERROR,
-						"Require two matching groups (taskId and summary). Check query regexp", null);
-			}
-		}
-	}
-
-	private static RepositoryTaskData createTaskData(String repositoryUrl, String id) {
-		RepositoryTaskData data = new RepositoryTaskData(IdentityAttributeFactory.getInstance(),
-				WebRepositoryConnector.REPOSITORY_TYPE, repositoryUrl, id);
-		data.setPartial(true);
-		return data;
-	}
-
-	private static String unescapeHtml(String text) {
-		if (text == null) {
-			return null;
-		}
-
-		return StringEscapeUtils.unescapeHtml(text);
-	}
-
-	private static String cleanup(String text, TaskRepository repository) {
-		if (text == null) {
-			return null;
-		}
-
-		// Has to disable this for now. See bug 166737 and bug 166936
-		// try {
-		// text = URLDecoder.decode(text, repository.getCharacterEncoding());
-		// } catch (UnsupportedEncodingException ex) {
-		// // ignore
-		// }
-
-		text = text.replaceAll("<!--.+?-->", "");
-
-		String[] tokens = text.split(" |\\t|\\n|\\r");
-		StringBuilder sb = new StringBuilder();
-		String sep = "";
-		for (String token : tokens) {
-			if (token.length() > 0) {
-				sb.append(sep).append(token);
-				sep = " ";
-			}
-		}
-
-		return sb.toString();
-	}
-
-	public static IStatus performRssQuery(String queryUrl, IProgressMonitor monitor, TaskDataCollector resultCollector,
-			TaskRepository repository) {
-		SyndFeedInput input = new SyndFeedInput();
-		try {
-			SyndFeed feed = input.build(new XmlReader(new URL(queryUrl)));
-
-			SimpleDateFormat df = new SimpleDateFormat("yy-MM-dd HH:mm");
-
-			@SuppressWarnings("unchecked")
-			Iterator it;
-			for (it = feed.getEntries().iterator(); it.hasNext();) {
-				SyndEntry entry = (SyndEntry) it.next();
-
-				String author = entry.getAuthor();
-				if (author == null) {
-					DCModule module = (DCModule) entry.getModule("http://purl.org/dc/elements/1.1/");
-					author = module.getCreator();
-				}
-
-				Date date = entry.getUpdatedDate();
-				if (date == null) {
-					date = entry.getPublishedDate();
-				}
-				if (date == null) {
-					DCModule module = (DCModule) entry.getModule("http://purl.org/dc/elements/1.1/");
-					date = module.getDate();
-				}
-
-				String entryUri = entry.getLink();
-				if (entryUri == null) {
-					entryUri = entry.getUri();
-				}
-
-				String entrTitle = entry.getTitle();
-
-//				WebTask webTask = new WebTask(entryUri.replaceAll("-", "%2D"), //
-//						(date == null ? "" : df.format(date) + " - ") + entrTitle, //
-//						"", repository.getUrl(), REPOSITORY_TYPE);
-//				webTask.setCreationDate(date);
-//				webTask.setOwner(author);
-				RepositoryTaskData data = createTaskData(repository.getRepositoryUrl(), entryUri.replaceAll("-", "%2D"));
-				DefaultTaskSchema schema = new DefaultTaskSchema(data);
-				schema.setSummary(((date == null ? "" : df.format(date) + " - ") + entrTitle));
-				schema.setCreationDate(date);
-				schema.setOwner(author);
-				((LegacyTaskDataCollector) resultCollector).accept(data);
-			}
-			return Status.OK_STATUS;
-		} catch (Exception ex) {
-			String msg = ex.getMessage() == null ? ex.toString() : ex.getMessage();
-			return new Status(IStatus.ERROR, TasksUiPlugin.ID_PLUGIN, IStatus.ERROR, //
-					"Could not fetch resource: " + queryUrl + "\n" + msg, ex);
-		}
-	}
-
-	public static String fetchResource(String url, Map<String, String> params, TaskRepository repository)
-			throws IOException {
-		HttpClient client = new HttpClient();
-		WebClientUtil.setupHttpClient(client, repository.getProxy(), url, //
-				repository.getUserName(), repository.getPassword());
-
-		loginRequestIfNeeded(client, params, repository);
-
-		GetMethod method = new GetMethod(url);
-		// method.setFollowRedirects(false);
-		return requestResource(url, client, method);
-	}
-
-	private static void loginRequestIfNeeded(HttpClient client, Map<String, String> params, TaskRepository repository)
-			throws HttpException, IOException {
-		if (!isPresent(repository.getUserName()) || !isPresent(repository.getPassword())
-				|| !isPresent(repository.getProperty(PROPERTY_LOGIN_REQUEST_URL))) {
-			return;
-		}
-
-		String loginFormUrl = evaluateParams(repository.getProperty(PROPERTY_LOGIN_FORM_URL), params, repository);
-		String loginToken = evaluateParams(repository.getProperty(PROPERTY_LOGIN_TOKEN_REGEXP), params, repository);
-		if (isPresent(loginFormUrl) || isPresent(loginToken)) {
-			GetMethod method = new GetMethod(loginFormUrl);
-			// method.setFollowRedirects(false);
-			String loginFormPage = requestResource(loginFormUrl, client, method);
-			if (loginFormPage != null) {
-				Pattern p = Pattern.compile(loginToken);
-				Matcher m = p.matcher(loginFormPage);
-				if (m.find()) {
-					params.put(PARAM_PREFIX + PARAM_LOGIN_TOKEN, m.group(1));
-				}
-			}
-		}
-
-		String loginRequestUrl = evaluateParams(repository.getProperty(PROPERTY_LOGIN_REQUEST_URL), params, repository);
-		requestResource(loginRequestUrl, client, getLoginMethod(params, repository));
-	}
-
-	public static HttpMethod getLoginMethod(Map<String, String> params, TaskRepository repository) {
-		String requestMethod = repository.getProperty(PROPERTY_LOGIN_REQUEST_METHOD);
-		String requestTemplate = repository.getProperty(PROPERTY_LOGIN_REQUEST_URL);
-		String requestUrl = evaluateParams(requestTemplate, params, repository);
-
-		if (REQUEST_GET.equals(requestMethod)) {
-			return new GetMethod(requestUrl);
-			// method.setFollowRedirects(false);
-		}
-
-		int n = requestUrl.indexOf('?');
-		if (n == -1) {
-			return new PostMethod(requestUrl);
-		}
-
-		PostMethod postMethod = new PostMethod(requestUrl.substring(0, n));
-		// TODO this does not take into account escaped values
-		n = requestTemplate.indexOf('?');
-		String[] requestParams = requestTemplate.substring(n + 1).split("&");
-		for (String requestParam : requestParams) {
-			String[] nv = requestParam.split("=");
-			if (nv.length == 1) {
-				postMethod.addParameter(nv[0], "");
-			} else {
-				String value = evaluateParams(nv[1], getParams(repository, params), false);
-				postMethod.addParameter(nv[0], value);
-			}
-		}
-		return postMethod;
-	}
-
-	private static String requestResource(String url, HttpClient client, HttpMethod method) throws IOException,
-			HttpException {
-		String refreshUrl = null;
-		try {
-			client.executeMethod(method);
-//          int statusCode = client.executeMethod(method);
-//			if (statusCode == 300 || statusCode == 301 || statusCode == 302 || statusCode == 303 || statusCode == 307) {
-//				Header location = method.getResponseHeader("Location");
-//				if (location != null) {
-//					refreshUrl = location.getValue();
-//					if (!refreshUrl.startsWith("/")) {
-//						refreshUrl = "/" + refreshUrl;
-//					}
-//				}
-//			}
-
-			refreshUrl = getRefreshUrl(url, method);
-			if (refreshUrl == null) {
-				return method.getResponseBodyAsString();
-			}
-		} finally {
-			method.releaseConnection();
-		}
-
-		method = new GetMethod(refreshUrl);
-		try {
-			client.executeMethod(method);
-			return method.getResponseBodyAsString();
-		} finally {
-			method.releaseConnection();
-		}
-	}
-
-	private static String getRefreshUrl(String url, HttpMethod method) {
-		Header refreshHeader = method.getResponseHeader("Refresh");
-		if (refreshHeader == null) {
-			return null;
-		}
-		String value = refreshHeader.getValue();
-		int n = value.indexOf(";url=");
-		if (n == -1) {
-			return null;
-		}
-		value = value.substring(n + 5);
-		int requestPath;
-		if (value.charAt(0) == '/') {
-			int colonSlashSlash = url.indexOf("://");
-			requestPath = url.indexOf('/', colonSlashSlash + 3);
-		} else {
-			requestPath = url.lastIndexOf('/');
-		}
-
-		String refreshUrl;
-		if (requestPath == -1) {
-			refreshUrl = url + "/" + value;
-		} else {
-			refreshUrl = url.substring(0, requestPath + 1) + value;
-		}
-		return refreshUrl;
-	}
-
-	public static String evaluateParams(String value, Map<String, String> params, TaskRepository repository) {
-		return evaluateParams(value, getParams(repository, params), true);
-	}
-
-	public static String evaluateParams(String value, TaskRepository repository) {
-		return evaluateParams(value, getParams(repository, null), true);
-	}
-
-	private static String evaluateParams(String value, Map<String, String> params, boolean encode) {
-		if (value == null || value.indexOf("${") == -1) {
-			return value;
-		}
-
-		int n = 0;
-		int n1 = value.indexOf("${");
-		StringBuilder evaluatedValue = new StringBuilder(value.length());
-		while (n1 > -1) {
-			evaluatedValue.append(value.substring(n, n1));
-			int n2 = value.indexOf("}", n1);
-			if (n2 > -1) {
-				String key = value.substring(n1 + 2, n2);
-				if (PARAM_SERVER_URL.equals(key) || PARAM_USER_ID.equals(key) || PARAM_PASSWORD.equals(key)) {
-					evaluatedValue.append(evaluateParams(params.get(key), params, false));
-				} else {
-					String val = evaluateParams(params.get(PARAM_PREFIX + key), params, false);
-					evaluatedValue.append(encode ? encode(val) : val);
-				}
-			}
-			n = n2 + 1;
-			n1 = value.indexOf("${", n2);
-		}
-		if (n > -1) {
-			evaluatedValue.append(value.substring(n));
-		}
-		return evaluatedValue.toString();
-	}
-
-	private static Map<String, String> getParams(TaskRepository repository, Map<String, String> params) {
-		Map<String, String> mergedParams = new LinkedHashMap<String, String>(repository.getProperties());
-		mergedParams.put(PARAM_SERVER_URL, repository.getRepositoryUrl());
-		mergedParams.put(PARAM_USER_ID, repository.getUserName());
-		mergedParams.put(PARAM_PASSWORD, repository.getPassword());
-		if (params != null) {
-			mergedParams.putAll(params);
-		}
-		return mergedParams;
-	}
-
-	private static String encode(String value) {
-		try {
-			return new URLCodec().encode(value);
-		} catch (EncoderException ex) {
-			return value;
-		}
-	}
-
-	public static List<String> getTemplateVariables(String value) {
-		if (value == null) {
-			return Collections.emptyList();
-		}
-
-		List<String> vars = new ArrayList<String>();
-		Matcher m = Pattern.compile("\\$\\{(.+?)\\}").matcher(value);
-		while (m.find()) {
-			vars.add(m.group(1));
-		}
-		return vars;
-	}
-
-	@Override
-	public boolean hasLocalCompletionState(TaskRepository taskRepository, ITask task) {
-		return true;
-	}
-
-}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebRepositorySettingsPage.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebRepositorySettingsPage.java
deleted file mode 100644
index 2e5c180..0000000
--- a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebRepositorySettingsPage.java
+++ /dev/null
@@ -1,376 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.web.tasks;
-
-import static org.eclipse.mylyn.internal.web.tasks.Util.isPresent;
-import static org.eclipse.mylyn.internal.web.tasks.Util.nvl;
-
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.eclipse.jface.fieldassist.ControlDecoration;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.mylyn.tasks.core.RepositoryTemplate;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-import org.eclipse.mylyn.tasks.ui.wizards.AbstractRepositorySettingsPage;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.forms.events.ExpansionAdapter;
-import org.eclipse.ui.forms.events.ExpansionEvent;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.forms.widgets.FormToolkit;
-
-/**
- * Settings page for generic web-based repository connector
- * 
- * @author Eugene Kuleshov
- */
-public class WebRepositorySettingsPage extends AbstractRepositorySettingsPage implements IPropertyChangeListener {
-
-	private static final String TITLE = "Web Repository Settings";
-
-	private static final String DESCRIPTION = "Select a server template example and modify to match the settings for "
-			+ "your project, \nusually found in the query URL.  For more connectors see http://eclipse.org/mylyn";
-
-	private ParametersEditor parametersEditor;
-
-	private Text taskUrlText;
-
-	private Text newTaskText;
-
-	private Text queryUrlText;
-
-	private ComboViewer queryRequestMethod;
-
-	private Text queryPatternText;
-
-	private Text loginFormUrlText;
-
-	private Text loginTokenPatternText;
-
-	private Text loginRequestUrlText;
-
-	private ComboViewer loginRequestMethod;
-
-	private final FormToolkit toolkit = new FormToolkit(Display.getCurrent());
-
-	private Map<String, String> oldProperties;
-
-	private final ArrayList<ControlDecoration> decorations = new ArrayList<ControlDecoration>();
-
-	public WebRepositorySettingsPage(TaskRepository taskRepository) {
-		super(TITLE, DESCRIPTION, taskRepository);
-		setNeedsAnonymousLogin(true);
-		setNeedsValidation(false);
-	}
-
-	@Override
-	public void dispose() {
-		for (ControlDecoration decoration : decorations) {
-			decoration.dispose();
-		}
-		super.dispose();
-	}
-
-	@Override
-	protected void repositoryTemplateSelected(RepositoryTemplate template) {
-		repositoryLabelEditor.setStringValue(template.label);
-		setUrl(nvl(template.repositoryUrl));
-
-		taskUrlText.setText(nvl(template.taskPrefixUrl));
-		newTaskText.setText(nvl(template.newTaskUrl));
-
-		queryUrlText.setText(nvl(template.taskQueryUrl));
-		selectMethod(queryRequestMethod, //
-				template.getAttribute(WebRepositoryConnector.PROPERTY_QUERY_METHOD));
-		queryPatternText.setText(nvl(template.getAttribute(WebRepositoryConnector.PROPERTY_QUERY_REGEXP)));
-
-		loginRequestUrlText.setText(nvl(template.getAttribute(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_URL)));
-		selectMethod(loginRequestMethod, //
-				template.getAttribute(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_METHOD));
-		loginFormUrlText.setText(nvl(template.getAttribute(WebRepositoryConnector.PROPERTY_LOGIN_FORM_URL)));
-		loginTokenPatternText.setText(nvl(template.getAttribute(WebRepositoryConnector.PROPERTY_LOGIN_TOKEN_REGEXP)));
-
-		parametersEditor.removeAll();
-
-		for (Map.Entry<String, String> entry : template.getAttributes().entrySet()) {
-			String key = entry.getKey();
-			if (key.startsWith(WebRepositoryConnector.PARAM_PREFIX)) {
-				parametersEditor.add(key.substring(WebRepositoryConnector.PARAM_PREFIX.length()), //
-						entry.getValue());
-			}
-		}
-
-		getContainer().updateButtons();
-	}
-
-	@Override
-	protected void createAdditionalControls(Composite parent) {
-		addRepositoryTemplatesToServerUrlCombo();
-
-		Composite composite = new Composite(parent, SWT.NONE);
-		createParameterEditor(composite);
-		createAdvancedComposite(composite);
-		GridDataFactory.fillDefaults().grab(true, false).hint(200, SWT.DEFAULT).span(2, SWT.DEFAULT).applyTo(composite);
-
-		if (repository != null) {
-			taskUrlText.setText(getTextProperty(WebRepositoryConnector.PROPERTY_TASK_URL));
-			newTaskText.setText(getTextProperty(WebRepositoryConnector.PROPERTY_TASK_CREATION_URL));
-
-			selectMethod(queryRequestMethod, getTextProperty(WebRepositoryConnector.PROPERTY_QUERY_METHOD));
-			queryUrlText.setText(getTextProperty(WebRepositoryConnector.PROPERTY_QUERY_URL));
-			queryPatternText.setText(getTextProperty(WebRepositoryConnector.PROPERTY_QUERY_REGEXP));
-
-			loginFormUrlText.setText(getTextProperty(WebRepositoryConnector.PROPERTY_LOGIN_FORM_URL));
-			loginTokenPatternText.setText(getTextProperty(WebRepositoryConnector.PROPERTY_LOGIN_TOKEN_REGEXP));
-
-			selectMethod(loginRequestMethod, getTextProperty(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_METHOD));
-			loginRequestUrlText.setText(getTextProperty(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_URL));
-
-			oldProperties = repository.getProperties();
-			parametersEditor.addParams(oldProperties, new LinkedHashMap<String, String>());
-		}
-	}
-
-	private void selectMethod(ComboViewer viewer, String method) {
-		if (!isPresent(method)) {
-			method = WebRepositoryConnector.REQUEST_GET;
-		}
-		viewer.setSelection(new StructuredSelection(new Object[] { method }), true);
-	}
-
-	private String getTextProperty(String name) {
-		return nvl(repository.getProperty(name));
-	}
-
-	@Override
-	protected boolean isValidUrl(String name) {
-		return true;
-	}
-
-	private void createParameterEditor(Composite composite) {
-		composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-		GridLayout gridLayout = new GridLayout();
-		gridLayout.marginBottom = 10;
-		gridLayout.verticalSpacing = 0;
-		gridLayout.horizontalSpacing = 0;
-		gridLayout.marginWidth = 0;
-		gridLayout.marginHeight = 0;
-		composite.setLayout(gridLayout);
-
-		parametersEditor = new ParametersEditor(composite, SWT.NONE);
-		GridData parametersEditorGridData = new GridData(SWT.FILL, SWT.FILL, true, true);
-		parametersEditorGridData.minimumHeight = 100;
-		parametersEditor.setLayoutData(parametersEditorGridData);
-	}
-
-	private void createAdvancedComposite(final Composite composite) {
-		ExpandableComposite expComposite = toolkit.createExpandableComposite(composite, ExpandableComposite.TITLE_BAR
-				| ExpandableComposite.COMPACT | ExpandableComposite.TWISTIE);
-		expComposite.clientVerticalSpacing = 0;
-		GridData gridData_2 = new GridData(SWT.FILL, SWT.TOP, true, false);
-		gridData_2.horizontalIndent = -5;
-		expComposite.setLayoutData(gridData_2);
-		expComposite.setFont(composite.getFont());
-		expComposite.setBackground(composite.getBackground());
-		expComposite.setText("Advanced &Configuration");
-		expComposite.addExpansionListener(new ExpansionAdapter() {
-			@Override
-			public void expansionStateChanged(ExpansionEvent e) {
-				getControl().getShell().pack();
-			}
-		});
-		toolkit.paintBordersFor(expComposite);
-
-		Composite composite2 = toolkit.createComposite(expComposite, SWT.BORDER);
-		GridLayout gridLayout2 = new GridLayout();
-		gridLayout2.numColumns = 3;
-		gridLayout2.verticalSpacing = 0;
-		composite2.setLayout(gridLayout2);
-		expComposite.setClient(composite2);
-
-		Label taskUrlLabel = toolkit.createLabel(composite2, "&Task URL:", SWT.NONE);
-		taskUrlLabel.setLayoutData(new GridData());
-
-		taskUrlText = new Text(composite2, SWT.BORDER);
-		taskUrlText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
-		decorations.add(WebContentProposalProvider.createDecoration(taskUrlText, parametersEditor, false));
-
-		Label newTaskLabel = toolkit.createLabel(composite2, "&New Task URL:", SWT.NONE);
-		newTaskLabel.setLayoutData(new GridData());
-
-		newTaskText = new Text(composite2, SWT.BORDER);
-		newTaskText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 2, 1));
-		decorations.add(WebContentProposalProvider.createDecoration(newTaskText, parametersEditor, false));
-
-		final Label separatorLabel2 = new Label(composite2, SWT.HORIZONTAL | SWT.SEPARATOR);
-		final GridData gridData_4 = new GridData(SWT.FILL, SWT.CENTER, false, false, 3, 1);
-		gridData_4.verticalIndent = 5;
-		gridData_4.heightHint = 5;
-		separatorLabel2.setLayoutData(gridData_4);
-		toolkit.adapt(separatorLabel2, true, true);
-
-		Label queryUrlLabel = toolkit.createLabel(composite2, "&Query Request URL:", SWT.NONE);
-		queryUrlLabel.setLayoutData(new GridData());
-
-		queryUrlText = new Text(composite2, SWT.BORDER);
-		queryUrlText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-		decorations.add(WebContentProposalProvider.createDecoration(queryUrlText, parametersEditor, false));
-
-		queryRequestMethod = new ComboViewer(composite2, SWT.BORDER | SWT.READ_ONLY);
-		queryRequestMethod.setContentProvider(new MethodTypeContentProvider());
-		queryRequestMethod.setInput("");
-		{
-			Combo combo = queryRequestMethod.getCombo();
-			toolkit.adapt(combo, true, true);
-			combo.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
-		}
-
-		Label queryPatternLabel = toolkit.createLabel(composite2, "Query &Pattern:", SWT.NONE);
-		queryPatternLabel.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, false, true));
-
-		queryPatternText = new Text(composite2, SWT.V_SCROLL | SWT.MULTI | SWT.BORDER | SWT.WRAP);
-		GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 2, 1);
-		gridData.widthHint = 200;
-		gridData.heightHint = 60;
-		queryPatternText.setLayoutData(gridData);
-		decorations.add(WebContentProposalProvider.createDecoration(queryPatternText, parametersEditor, true));
-
-		final Label separatorLabel1 = new Label(composite2, SWT.HORIZONTAL | SWT.SEPARATOR);
-		final GridData gridData_3 = new GridData(SWT.FILL, SWT.CENTER, false, false, 3, 1);
-		gridData_3.heightHint = 5;
-		gridData_3.verticalIndent = 5;
-		separatorLabel1.setLayoutData(gridData_3);
-		toolkit.adapt(separatorLabel1, true, true);
-
-		final Label loginrequestUrlLabel = new Label(composite2, SWT.NONE);
-		loginrequestUrlLabel.setLayoutData(new GridData());
-		toolkit.adapt(loginrequestUrlLabel, true, true);
-		loginrequestUrlLabel.setText("Login &Request URL:");
-
-		loginRequestUrlText = new Text(composite2, SWT.BORDER);
-		toolkit.adapt(loginRequestUrlText, true, true);
-		loginRequestUrlText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
-		decorations.add(WebContentProposalProvider.createDecoration(loginRequestUrlText, parametersEditor, false));
-
-		loginRequestMethod = new ComboViewer(composite2, SWT.BORDER | SWT.READ_ONLY);
-		loginRequestMethod.setContentProvider(new MethodTypeContentProvider());
-		loginRequestMethod.setInput("");
-		{
-			Combo combo = loginRequestMethod.getCombo();
-			toolkit.adapt(combo, true, true);
-			combo.setLayoutData(new GridData(SWT.RIGHT, SWT.CENTER, false, false));
-		}
-
-		Label loginPageLabel = toolkit.createLabel(composite2, "Login &Form URL:", SWT.NONE);
-		loginPageLabel.setLayoutData(new GridData());
-
-		loginFormUrlText = new Text(composite2, SWT.BORDER);
-		loginFormUrlText.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, false, false, 2, 1));
-		decorations.add(WebContentProposalProvider.createDecoration(loginFormUrlText, parametersEditor, false));
-
-		Label loginTokenLabel = toolkit.createLabel(composite2, "Login T&oken Pattern:", SWT.NONE);
-		loginTokenLabel.setLayoutData(new GridData(SWT.LEFT, SWT.FILL, false, true));
-
-		loginTokenPatternText = new Text(composite2, SWT.V_SCROLL | SWT.MULTI | SWT.BORDER | SWT.WRAP);
-		final GridData gridData_1 = new GridData(SWT.FILL, SWT.FILL, false, true, 2, 1);
-		gridData_1.widthHint = 200;
-		gridData_1.heightHint = 30;
-		loginTokenPatternText.setLayoutData(gridData_1);
-		decorations.add(WebContentProposalProvider.createDecoration(loginTokenPatternText, parametersEditor, true));
-	}
-
-	public void propertyChange(PropertyChangeEvent event) {
-		Object source = event.getSource();
-		if (source == taskUrlText || source == taskUrlText) {
-			getWizard().getContainer().updateButtons();
-		}
-	}
-
-	@Override
-	public void applyTo(TaskRepository repository) {
-		super.applyTo(repository);
-		repository.setProperty(WebRepositoryConnector.PROPERTY_TASK_URL, taskUrlText.getText());
-		repository.setProperty(WebRepositoryConnector.PROPERTY_TASK_CREATION_URL, newTaskText.getText());
-
-		repository.setProperty(WebRepositoryConnector.PROPERTY_QUERY_URL, queryUrlText.getText());
-		repository.setProperty(WebRepositoryConnector.PROPERTY_QUERY_REGEXP, queryPatternText.getText());
-		repository.setProperty(WebRepositoryConnector.PROPERTY_QUERY_METHOD, getSelection(queryRequestMethod));
-
-		String loginRequestUrl = loginRequestUrlText.getText();
-		repository.setProperty(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_URL, loginRequestUrl);
-		if (loginRequestUrl.length() > 0) {
-			repository.setProperty(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_METHOD,
-					getSelection(loginRequestMethod));
-		} else {
-			repository.removeProperty(WebRepositoryConnector.PROPERTY_LOGIN_REQUEST_METHOD);
-		}
-		repository.setProperty(WebRepositoryConnector.PROPERTY_LOGIN_FORM_URL, loginFormUrlText.getText());
-		repository.setProperty(WebRepositoryConnector.PROPERTY_LOGIN_TOKEN_REGEXP, loginTokenPatternText.getText());
-
-		if (oldProperties != null) {
-			for (Map.Entry<String, String> e : oldProperties.entrySet()) {
-				String key = e.getKey();
-				if (key.startsWith(WebRepositoryConnector.PARAM_PREFIX)) {
-					repository.removeProperty(key);
-				}
-			}
-		}
-
-		for (Map.Entry<String, String> e : parametersEditor.getParameters().entrySet()) {
-			repository.setProperty(e.getKey(), e.getValue());
-		}
-	}
-
-	private String getSelection(ComboViewer viewer) {
-		return (String) ((IStructuredSelection) viewer.getSelection()).getFirstElement();
-	}
-
-	private static class MethodTypeContentProvider implements IStructuredContentProvider {
-
-		private static final Object[] ELEMENTS = new Object[] { WebRepositoryConnector.REQUEST_GET,
-				WebRepositoryConnector.REQUEST_POST };
-
-		public Object[] getElements(Object inputElement) {
-			return ELEMENTS;
-		}
-
-		public void dispose() {
-		}
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-		}
-
-	}
-
-	@Override
-	protected Validator getValidator(TaskRepository repository) {
-		return null;
-	}
-
-	@Override
-	public String getConnectorKind() {
-		return WebRepositoryConnector.REPOSITORY_TYPE;
-	}
-
-}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebTask.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebTask.java
deleted file mode 100644
index 3e06217..0000000
--- a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebTask.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.web.tasks;
-
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-
-/**
- * Task used with generic web-based repositories
- * 
- * @author Eugene Kuleshov
- */
-public class WebTask extends AbstractTask {
-
-	private static final String UNKNOWN_OWNER = "<unknown>";
-
-	private String taskPrefix;
-
-	public WebTask(String id, String label, String taskPrefix, String repositoryUrl, String repsitoryType) {
-		super(repositoryUrl, id, label);
-		this.taskPrefix = taskPrefix;
-		setUrl(taskPrefix + id);
-	}
-
-	public String getTaskPrefix() {
-		return this.taskPrefix;
-	}
-
-	@Override
-	public String getConnectorKind() {
-		return WebRepositoryConnector.REPOSITORY_TYPE;
-	}
-
-	@Override
-	public String getTaskKey() {
-		return isRss() ? null : super.getTaskKey();
-	}
-
-	@Override
-	public String getTaskKind() {
-		return isRss() ? "RSS" : super.getTaskKind();
-	}
-
-	public boolean isRss() {
-		return taskPrefix == null || taskPrefix.length() == 0;
-	}
-
-	@Override
-	public String getOwner() {
-		String o = super.getOwner();
-		return o == null ? UNKNOWN_OWNER : o;
-	}
-
-	@Override
-	public boolean isLocal() {
-		return true;
-	}
-
-	public void setTaskPrefix(String taskPrefix) {
-		this.taskPrefix = taskPrefix;
-	}
-
-}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebTaskEditorFactory.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebTaskEditorFactory.java
deleted file mode 100644
index ee6a7ab..0000000
--- a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebTaskEditorFactory.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.web.tasks;
-
-import org.eclipse.mylyn.internal.tasks.ui.TasksUiPlugin;
-import org.eclipse.mylyn.internal.tasks.ui.deprecated.AbstractRepositoryTaskEditor;
-import org.eclipse.mylyn.internal.tasks.ui.deprecated.AbstractTaskEditorFactory;
-import org.eclipse.mylyn.internal.tasks.ui.deprecated.RepositoryTaskEditorInput;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-import org.eclipse.mylyn.tasks.ui.TasksUi;
-import org.eclipse.mylyn.tasks.ui.editors.BrowserFormPage;
-import org.eclipse.mylyn.tasks.ui.editors.TaskEditor;
-import org.eclipse.mylyn.tasks.ui.editors.TaskEditorInput;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.part.EditorPart;
-
-/**
- * @author Mik Kersten
- */
-public class WebTaskEditorFactory extends AbstractTaskEditorFactory {
-
-	private static final String TITLE = "Browser";
-
-	@Override
-	public IEditorPart createEditor(TaskEditor parentEditor, IEditorInput editorInput) {
-		AbstractRepositoryTaskEditor editor = null;
-		if (editorInput instanceof TaskEditorInput) {
-			TaskEditorInput taskInput = (TaskEditorInput) editorInput;
-			return createBrowser(parentEditor, taskInput.getTask());
-		}
-		return editor;
-	}
-
-	@Override
-	public IEditorInput createEditorInput(ITask task) {
-		if (task instanceof WebTask) {
-			final TaskRepository repository = TasksUi.getRepositoryManager().getRepository(
-					WebRepositoryConnector.REPOSITORY_TYPE, task.getRepositoryUrl());
-			return new RepositoryTaskEditorInput(repository, task.getUrl(), task.getTaskId());
-		} else {
-			return null;
-		}
-	}
-
-	private EditorPart createBrowser(TaskEditor parentEditor, final ITask task) {
-		return new BrowserFormPage(parentEditor, TITLE) {
-			@Override
-			public void init(IEditorSite site, IEditorInput input) {
-				super.init(site, input);
-				TasksUiPlugin.getTaskDataManager().setTaskRead(task, true);
-			}
-		};
-	}
-
-	@Override
-	public String getTitle() {
-		return TITLE;
-	}
-
-	@Override
-	public boolean canCreateEditorFor(ITask task) {
-		return task instanceof WebTask;
-	}
-
-	@Override
-	public boolean canCreateEditorFor(IEditorInput input) {
-		return input instanceof TaskEditorInput;
-	}
-
-	@Override
-	public boolean providesOutline() {
-		return false;
-	}
-
-}
diff --git a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebTaskListFactory.java b/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebTaskListFactory.java
deleted file mode 100644
index 85634e4..0000000
--- a/org.eclipse.mylyn.web.tasks/src/org/eclipse/mylyn/internal/web/tasks/WebTaskListFactory.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004, 2007 Mylyn project committers and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *******************************************************************************/
-
-package org.eclipse.mylyn.internal.web.tasks;
-
-import java.util.Collections;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.mylyn.internal.tasks.core.AbstractTask;
-import org.eclipse.mylyn.internal.tasks.core.RepositoryQuery;
-import org.eclipse.mylyn.internal.tasks.core.deprecated.AbstractTaskListFactory;
-import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
-import org.eclipse.mylyn.tasks.core.ITask;
-import org.eclipse.mylyn.tasks.core.TaskRepository;
-import org.eclipse.mylyn.tasks.ui.TasksUi;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-
-/**
- * Task externalizer for generic web based issue tracking systems
- * 
- * @author Eugene Kuleshov
- * @author Mik Kersten
- */
-public class WebTaskListFactory extends AbstractTaskListFactory {
-
-	private static final String KEY_WEB = "Web";
-
-	private static final String KEY_WEB_QUERY = KEY_WEB + AbstractTaskListFactory.KEY_QUERY;
-
-	private static final String KEY_WEB_ISSUE = "WebIssue";
-
-	private static final String KEY_URL_TEMPLATE = "UrlTemplate";
-
-	private static final String KEY_REGEXP = "Regexp";
-
-	private static final String KEY_PREFIX = "TaskPrefix";
-
-	private static final String KEY_KEY = "Key";
-
-	@Override
-	public String getTaskElementName() {
-		return KEY_WEB_ISSUE;
-	}
-
-	@Override
-	public Set<String> getQueryElementNames() {
-		return Collections.singleton(KEY_WEB_QUERY);
-	}
-
-	@Override
-	public boolean canCreate(IRepositoryQuery category) {
-		return category instanceof WebQuery;
-	}
-
-	@Override
-	public boolean canCreate(ITask task) {
-		return task instanceof WebTask;
-	}
-
-	@SuppressWarnings( { "deprecation", "restriction" })
-	@Override
-	public void setAdditionalAttributes(IRepositoryQuery query, Element node) {
-		if (query instanceof WebQuery) {
-			WebQuery webQuery = (WebQuery) query;
-			node.setAttribute(KEY_URL_TEMPLATE, webQuery.getQueryUrlTemplate());
-			node.setAttribute(KEY_REGEXP, webQuery.getQueryPattern());
-			node.setAttribute(KEY_PREFIX, webQuery.getTaskPrefix());
-
-			for (Map.Entry<String, String> e : webQuery.getQueryParameters().entrySet()) {
-				node.setAttribute(
-						org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(e.getKey()), //
-						org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertToXmlString(e.getValue()));
-			}
-		}
-	}
-
-	@Override
-	public void setAdditionalAttributes(ITask task, Element element) {
-		element.setAttribute(KEY_KEY, ((WebTask) task).getTaskId());
-		element.setAttribute(KEY_PREFIX, ((WebTask) task).getTaskPrefix());
-//		element.setAttribute(AbstractTaskListFactory.KEY_NAME, ((WebTask) task).getSummary());
-//		element.setAttribute(DelegatingTaskExternalizer.KEY_REPOSITORY_URL, ((WebTask) task).getRepositoryUrl());
-	}
-
-	@Override
-	public AbstractTask createTask(String repositoryUrl, String taskId, String label, Element element) {
-//		String id = null;
-//		if (element.hasAttribute(KEY_KEY)) {
-//			id = element.getAttribute(KEY_KEY);
-//		} else {
-//			throw new TaskExternalizationException("Id not stored for bug report");
-//		}
-
-//		String label = summary;
-		// NOTE: this comes from the super
-//		if (element.hasAttribute(AbstractTaskListFactory.KEY_NAME)) {
-//			label = element.getAttribute(AbstractTaskListFactory.KEY_NAME);
-//		} else {
-//			throw new TaskExternalizationException("Description not stored for bug report");
-//		}
-
-		String prefix = null;
-		if (element.hasAttribute(KEY_PREFIX)) {
-			prefix = element.getAttribute(KEY_PREFIX);
-		}
-
-		WebTask task = new WebTask(taskId, label, prefix, repositoryUrl, WebRepositoryConnector.REPOSITORY_TYPE);
-//		task.setRepositoryUrl(repositoryUrl);
-		return task;
-	}
-
-	@SuppressWarnings( { "deprecation", "restriction" })
-	@Override
-	public RepositoryQuery createQuery(String repositoryUrl, String queryString, String label, Element element) {
-		String queryUrlTemplate = element.getAttribute(KEY_URL_TEMPLATE);
-		String queryPattern = element.getAttribute(KEY_REGEXP);
-		String taskPrefix = element.getAttribute(KEY_PREFIX);
-
-		Map<String, String> params = new LinkedHashMap<String, String>();
-		NamedNodeMap attributes = element.getAttributes();
-		for (int i = 0; i < attributes.getLength(); i++) {
-			Attr attr = (Attr) attributes.item(i);
-			String name = attr.getName();
-			if (name.startsWith(WebRepositoryConnector.PARAM_PREFIX)) {
-				params.put(org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(name), //
-						org.eclipse.mylyn.internal.commons.core.XmlStringConverter.convertXmlToString(attr.getValue()));
-			}
-		}
-
-		if (queryUrlTemplate == null || queryUrlTemplate.length() == 0) {
-			queryUrlTemplate = queryString;
-			TaskRepository repository = TasksUi.getRepositoryManager().getRepository(
-					WebRepositoryConnector.REPOSITORY_TYPE, repositoryUrl);
-			queryString = WebRepositoryConnector.evaluateParams(queryUrlTemplate, params, repository);
-		}
-
-		return new WebQuery(label, queryString, queryUrlTemplate, queryPattern, taskPrefix, repositoryUrl, params);
-	}
-
-	@Override
-	public String getQueryElementName(IRepositoryQuery query) {
-		return query instanceof WebQuery ? KEY_WEB_QUERY : "";
-	}
-
-}
