This commit was manufactured by cvs2svn to create tag 'R1_5_4'.
diff --git a/docs/org.eclipse.wst.validation.infopop/.cvsignore b/docs/org.eclipse.wst.validation.infopop/.cvsignore
new file mode 100644
index 0000000..c14487c
--- /dev/null
+++ b/docs/org.eclipse.wst.validation.infopop/.cvsignore
@@ -0,0 +1 @@
+build.xml
diff --git a/docs/org.eclipse.wst.validation.infopop/.project b/docs/org.eclipse.wst.validation.infopop/.project
new file mode 100644
index 0000000..28f5b4f
--- /dev/null
+++ b/docs/org.eclipse.wst.validation.infopop/.project
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.wst.validation.infopop</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<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>
+	</natures>
+</projectDescription>
diff --git a/docs/org.eclipse.wst.validation.infopop/META-INF/MANIFEST.MF b/docs/org.eclipse.wst.validation.infopop/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..44e4e45
--- /dev/null
+++ b/docs/org.eclipse.wst.validation.infopop/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Plugin.name
+Bundle-SymbolicName: org.eclipse.wst.validation.infopop; singleton:=true
+Bundle-Version: 1.0.201.qualifier
+Bundle-Localization: plugin
+Bundle-Vendor: %Plugin.providerName
+Require-Bundle: org.eclipse.help;bundle-version="[3.2.0,3.3.0)"
diff --git a/docs/org.eclipse.wst.validation.infopop/ValidationPrefs_HelpContexts.xml b/docs/org.eclipse.wst.validation.infopop/ValidationPrefs_HelpContexts.xml
new file mode 100644
index 0000000..9a8ccfa
--- /dev/null
+++ b/docs/org.eclipse.wst.validation.infopop/ValidationPrefs_HelpContexts.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS type="org.eclipse.help.contexts"?>
+
+<contexts>
+	<!-- Eclipse Validation preferences -->
+<context id="jvgp0000">
+<description>The validation preferences page allows you to view or change the default validation settings for all workbench projects. A validator is a tool that checks that resources conform to a specification, DTD, or some other set of rules.
+
+Each validator can apply to certain types of files, certain project natures, and certain project facets. When a validator applies to a project facet or nature, the workbench uses that validator only on projects that have that facet or nature. Likewise, most validators apply only to certain types of files, so the workbench uses those validators only on those types of files.
+
+Select the <b>Allow projects to override these preference settings</b> check box if you want to allow individual projects to set their own validation preferences. To configure new validation settings for an individual project, select the project in the Navigator view, right-click and select <b>Properties</b>   &gt; <b>Validation</b> .
+
+Select the <b>Suspend all validators</b> check box to prevent validation at the global level. If you select this check box, you can still enable validation at the project level.
+
+Select the <b>Save all modified resources automatically prior to validating</b> check box if you want to save any resources you have modified before the validation begins.
+
+In the list of validators, select the check boxes next to each validator you want to use at the global level. Each validator has a check box to specify whether it is used on manual validation or on build validation. Choose an alternate implementation for a validator by clicking the button in the <b>Settings</b> column. Not all validators have alternate implementations.
+
+</description>
+<topic href="../org.eclipse.jst.j2ee.doc.user/topics/tjval.html" label="Validating code in enterprise applications"/>
+<topic href="../org.eclipse.jst.j2ee.doc.user/topics/tjvalglobalpref.html" label="Overriding global validation preferences"/>
+<topic href="../org.eclipse.jst.j2ee.doc.user/topics/rvalerr.html" label="Common validation errors and solutions"/>
+</context>
+
+</contexts>
\ No newline at end of file
diff --git a/docs/org.eclipse.wst.validation.infopop/ValidationProjPrefs_HelpContexts.xml b/docs/org.eclipse.wst.validation.infopop/ValidationProjPrefs_HelpContexts.xml
new file mode 100644
index 0000000..489af37
--- /dev/null
+++ b/docs/org.eclipse.wst.validation.infopop/ValidationProjPrefs_HelpContexts.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS type="org.eclipse.help.contexts"?>
+
+<contexts>
+	<!-- Validation settings for project -->
+
+<context id="jvpp0000">
+<description>The project validation page allows you to view or change the validation settings for a project. A validator is a tool that checks that resources conform to a specification, DTD, or some other set of rules.
+
+Each validator can apply to certain types of files, certain project natures, and certain project facets. When a validator applies to a project facet or nature, the workbench uses that validator only on projects that have that facet or nature. Likewise, most validators apply only to certain types of files, so the workbench uses those validators only on those types of files.
+
+Select the <b>Override validation preferences</b> check box if you want to override the default validation preferences set in the workbench Preferences page. If the <b>Override validation preferences</b> check box is not enabled, go to <b>Window</b>   &gt; <b>Preferences</b>   &gt; <b>Validation</b> and select the <b>Allow projects to override these preference settings</b> check box.
+
+Select the <b>Suspend all validators</b> check box to prevent validation for this project.
+
+In the list of validators, select the check boxes next to each validator you want to use for this project. Each validator has a check box to specify whether it is used on manual validation or on build validation. Choose an alternate implementation for a validator by clicking the button in the <b>Settings</b> column. Not all validators have alternate implementations.
+
+</description>
+<topic href="../org.eclipse.jst.j2ee.doc.user/topics/tjval.html" label="Validating code in enterprise applications"/>
+<topic href="../org.eclipse.jst.j2ee.doc.user/topics/tjvalglobalpref.html" label="Overriding global validation preferences"/>
+<topic href="../org.eclipse.jst.j2ee.doc.user/topics/rvalerr.html" label="Common validation errors and solutions"/>
+</context>
+
+</contexts>
\ No newline at end of file
diff --git a/docs/org.eclipse.wst.validation.infopop/about.html b/docs/org.eclipse.wst.validation.infopop/about.html
new file mode 100644
index 0000000..4ec5989
--- /dev/null
+++ b/docs/org.eclipse.wst.validation.infopop/about.html
@@ -0,0 +1,34 @@
+<!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">
+
+<H3>About This Content</H3>
+
+<P>May 2, 2006</P>
+
+<H3>License</H3>
+
+<P>The Eclipse Foundation makes available all content in this plug-in 
+("Content"). Unless otherwise indicated below, the Content is provided to you 
+under the terms and conditions of the Eclipse Public License Version 1.0 
+("EPL"). A copy of the EPL is available at
+<A href="http://www.eclipse.org/org/documents/epl-v10.php">http://www.eclipse.org/org/documents/epl-v10.php</A>. 
+For purposes of the EPL, "Program" 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 ("Redistributor") 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/">http://www.eclipse.org/</A>.</P>
+
+</BODY>
+</HTML>
diff --git a/docs/org.eclipse.wst.validation.infopop/build.properties b/docs/org.eclipse.wst.validation.infopop/build.properties
new file mode 100644
index 0000000..ac322ed
--- /dev/null
+++ b/docs/org.eclipse.wst.validation.infopop/build.properties
@@ -0,0 +1,7 @@
+bin.includes = META-INF/,\
+               plugin.xml,\
+               ValidationPrefs_HelpContexts.xml,\
+               ValidationProjPrefs_HelpContexts.xml,\
+               plugin.properties,\
+               about.html
+src.includes = build.properties
diff --git a/docs/org.eclipse.wst.validation.infopop/plugin.properties b/docs/org.eclipse.wst.validation.infopop/plugin.properties
new file mode 100644
index 0000000..b0c0709
--- /dev/null
+++ b/docs/org.eclipse.wst.validation.infopop/plugin.properties
@@ -0,0 +1,6 @@
+# NLS_MESSAGEFORMAT_VAR
+# ==============================================================================
+# Translation Instruction: section to be translated
+# ==============================================================================
+Plugin.name = WST validation infopop plug-in
+Plugin.providerName = Eclipse.org
\ No newline at end of file
diff --git a/docs/org.eclipse.wst.validation.infopop/plugin.xml b/docs/org.eclipse.wst.validation.infopop/plugin.xml
new file mode 100644
index 0000000..aaf27bf
--- /dev/null
+++ b/docs/org.eclipse.wst.validation.infopop/plugin.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+   <extension
+         point="org.eclipse.help.contexts">
+    <contexts file="ValidationProjPrefs_HelpContexts.xml" plugin="org.eclipse.wst.validation.ui" />
+	<contexts file="ValidationPrefs_HelpContexts.xml" plugin="org.eclipse.wst.validation.ui" />
+   </extension>
+
+</plugin>
diff --git a/plugins/org.eclipse.jem.util/.classpath b/plugins/org.eclipse.jem.util/.classpath
new file mode 100644
index 0000000..25434f7
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="jemutil"/>
+	<classpathentry kind="src" path="property_files"/>
+	<classpathentry kind="src" path="jemutil-nonworkbnech"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.jem.util/.cvsignore b/plugins/org.eclipse.jem.util/.cvsignore
new file mode 100644
index 0000000..ba077a4
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/.cvsignore
@@ -0,0 +1 @@
+bin
diff --git a/plugins/org.eclipse.jem.util/.options b/plugins/org.eclipse.jem.util/.options
new file mode 100644
index 0000000..0565417
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/.options
@@ -0,0 +1,3 @@
+org.eclipse.jem.util/debug/logtrace=false
+org.eclipse.jem.util/debug/logtracefile=false
+org.eclipse.jem.util/debug/loglevel=WARNING
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/.project b/plugins/org.eclipse.jem.util/.project
new file mode 100644
index 0000000..e0e4120
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jem.util</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/plugins/org.eclipse.jem.util/.settings/org.eclipse.core.resources.prefs b/plugins/org.eclipse.jem.util/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..8c58b56
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#Sun Apr 15 21:22:05 EDT 2007
+eclipse.preferences.version=1
+encoding/<project>=ISO-8859-1
diff --git a/plugins/org.eclipse.jem.util/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.jem.util/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..77b1d97
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,294 @@
+#Sun Apr 15 21:31:03 EDT 2007
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
+org.eclipse.jdt.core.compiler.compliance=1.4
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=warning
+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.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
+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.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=error
+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.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
+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.unnecessaryElse=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
+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=error
+org.eclipse.jdt.core.compiler.problem.unusedLocal=error
+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=error
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
+org.eclipse.jdt.core.compiler.source=1.3
+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=16
+org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.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=1
+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_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.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_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=150
+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=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
+org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
+org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_empty_lines=false
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
+org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
+org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
+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_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=do not 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_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=150
+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
diff --git a/plugins/org.eclipse.jem.util/.settings/org.eclipse.jdt.ui.prefs b/plugins/org.eclipse.jem.util/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..6c8e1bc
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,8 @@
+#Tue Feb 21 10:09:19 EST 2006
+eclipse.preferences.version=1
+formatter_profile=_jve
+formatter_settings_version=10
+org.eclipse.jdt.ui.ignorelowercasenames=true
+org.eclipse.jdt.ui.importorder=java;javax;org;org.eclipse.wtp;org.eclipse.jem;org.eclipse.ve.internal.cdm;org.eclipse.ve.internal.cde;org.eclipse.ve.internal.jcm;org.eclipse.ve.internal.java;org.eclipse.ve;com;
+org.eclipse.jdt.ui.ondemandthreshold=3
+org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/plugins/org.eclipse.jem.util/.settings/org.eclipse.pde.prefs b/plugins/org.eclipse.jem.util/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..fb46b28
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,12 @@
+#Fri May 13 10:10:04 EDT 2005
+compilers.p.deprecated=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=2
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=2
+compilers.p.unknown-element=1
+compilers.p.unknown-resource=2
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=2
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/plugins/org.eclipse.jem.util/META-INF/MANIFEST.MF b/plugins/org.eclipse.jem.util/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..429caa0
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/META-INF/MANIFEST.MF
@@ -0,0 +1,26 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.jem.util; singleton:=true
+Bundle-Version: 1.2.1.qualifier
+Bundle-Activator: org.eclipse.jem.util.plugin.JEMUtilPlugin
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Export-Package: org.eclipse.jem.internal.util.emf.workbench;x-friends:="org.eclipse.jem.beaninfo",
+ org.eclipse.jem.internal.util.emf.workbench.nature;x-internal:=true,
+ org.eclipse.jem.internal.util.emf.workbench.nls;x-internal:=true,
+ org.eclipse.jem.util,
+ org.eclipse.jem.util.emf.workbench,
+ org.eclipse.jem.util.emf.workbench.nature,
+ org.eclipse.jem.util.logger,
+ org.eclipse.jem.util.logger.proxy,
+ org.eclipse.jem.util.logger.proxyrender,
+ org.eclipse.jem.util.plugin
+Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
+ org.eclipse.emf.ecore;bundle-version="[2.2.0,3.0.0)",
+ org.eclipse.emf.ecore.xmi;bundle-version="[2.2.0,3.0.0)",
+ org.eclipse.perfmsr.core;bundle-version="1.0.0";resolution:=optional,
+ com.ibm.icu;bundle-version="[3.4.4.1,4.0.0)"
+Eclipse-LazyStart: true
+Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/plugins/org.eclipse.jem.util/PERFMSR_README.txt b/plugins/org.eclipse.jem.util/PERFMSR_README.txt
new file mode 100644
index 0000000..ea51258
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/PERFMSR_README.txt
@@ -0,0 +1,12 @@
+org.eclipse.perfmsr.core code can be found in the perfmsr.jar loaded as binary in this
+project. Since this is optional, we needed to be able to compile without the true
+plugin being available. So we created the stub jar containing just what we needed.
+
+If there is a need to change anything in the stub jar, you will need to checkout
+the folder org.eclipse.jem.util/org.eclipse.perfmsr.core.stub. This will then
+be a separate project. You can then make the changes there, and then following the
+README in that project to create and commit the changes. 
+
+The jar is in this project's classpath, but it is not exported and is not in
+the plugin.xml or build.properties. This means it will be available for compilation
+but it won't show up in the runtime workbench.
\ No newline at end of file
diff --git "a/plugins/org.eclipse.jem.util/READ_ME_BEFORE_CHANGING_MANIFEST\041\041\041" "b/plugins/org.eclipse.jem.util/READ_ME_BEFORE_CHANGING_MANIFEST\041\041\041"
new file mode 100644
index 0000000..718e94a
--- /dev/null
+++ "b/plugins/org.eclipse.jem.util/READ_ME_BEFORE_CHANGING_MANIFEST\041\041\041"
@@ -0,0 +1,8 @@
+Do not include a new dependency plugin to the MANIFEST for this plugind!!!
+
+The reason for this is that this plugin is also executed outside of Eclipse framework, such IBM Websphere Application Server (c) IBM. We cannot add
+new dependencies to the plugin because the current set is considered to be API. Adding a new set without consulting those users would break
+them.
+
+The external API is anything in the jemutil-nonworkbench folder. If it is only for a class in the other source folder(s) it may be OK since they would not be 
+using that code. But it would be best to consult with them first.
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/about.html b/plugins/org.eclipse.jem.util/about.html
new file mode 100644
index 0000000..afceed0
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/about.html
@@ -0,0 +1,25 @@
+<!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>May 2, 2006</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/">http://www.eclipse.org</a>.</p>
+
+</body></html>
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/build.properties b/plugins/org.eclipse.jem.util/build.properties
new file mode 100644
index 0000000..31b39df
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/build.properties
@@ -0,0 +1,24 @@
+###############################################################################
+# Copyright (c) 2003, 2005 IBM Corporation 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+bin.includes = plugin.xml,\
+               .options,\
+               about.html,\
+               plugin.properties,\
+               META-INF/,\
+               .
+src.includes = schema/,\
+               about.html
+output.. = bin/
+source.. = jemutil/,\
+           property_files/,\
+           jemutil-nonworkbnech/
+jars.compile.order = .
+jars.extra.classpath = org.eclipse.perfmsr.core.stub/perfmsr.jar
diff --git a/plugins/org.eclipse.jem.util/jemutil-nonworkbnech/org/eclipse/jem/util/logger/LogEntry.java b/plugins/org.eclipse.jem.util/jemutil-nonworkbnech/org/eclipse/jem/util/logger/LogEntry.java
new file mode 100644
index 0000000..d44372b
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil-nonworkbnech/org/eclipse/jem/util/logger/LogEntry.java
@@ -0,0 +1,329 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: LogEntry.java,v $
+ *  $Revision: 1.5 $  $Date: 2006/05/17 20:13:45 $ 
+ */
+package org.eclipse.jem.util.logger;
+
+import java.io.ByteArrayOutputStream;
+import java.io.PrintWriter;
+
+/**
+ * This class should be used when logging information which should be grouped together. Instead of creating a new instance of this class every time it
+ * is needed, for performance reasons, create an instance and reuse it.
+ * <p>
+ * Currently the only fields that are logged are the {@link #getText()} and {@link #getTargetException()}.
+ * 
+ * @since 1.0.0
+ */
+public class LogEntry {
+
+	private int _executionMap = 0;
+
+	private Throwable _caughtException = null;
+
+	private String _propertiesFileName = null;
+
+	private String localeOfOrigin = null;
+
+	private String sourceIdentifier;
+
+	private String elapsedTime;
+
+	private String text;
+
+	private String messageTypeIdentifier;
+
+	/**
+	 * The file name parameter must be a name which can be used by ResourceBundle to load the string from the .properties file. The parameter must not
+	 * be null or the empty string.
+	 * 
+	 * @param propertiesFileName
+	 * 
+	 * @since 1.0.0
+	 */
+	public LogEntry(String propertiesFileName) {
+		setPropertiesFileName(propertiesFileName);
+	}
+
+	/**
+	 * Default Constructor
+	 */
+	public LogEntry() {
+	}
+
+	/**
+	 * Get execution map
+	 * 
+	 * @return execution map
+	 * 
+	 * @since 1.0.0
+	 */
+	public int getExecutionMap() {
+		return _executionMap;
+	}
+
+	/**
+	 * Get the properties file name
+	 * 
+	 * @return properties file name or <code>null</code> if not set.
+	 * 
+	 * @since 1.0.0
+	 */
+	public String getPropertiesFileName() {
+		return _propertiesFileName;
+	}
+
+	/**
+	 * Get target exception
+	 * 
+	 * @return target exception or <code>null</code> if not set.
+	 * 
+	 * @since 1.0.0
+	 */
+	public Throwable getTargetException() {
+		return _caughtException;
+	}
+
+	/**
+	 * Get locale of origin
+	 * 
+	 * @return locale of origin or <code>null</code> if not set.
+	 * 
+	 * @since 1.0.0
+	 */
+	public String getLocaleOfOrigin() {
+		return localeOfOrigin;
+	}
+
+	/**
+	 * Get source identifier.
+	 * 
+	 * @return source identifier or <code>null</code> if not set.
+	 * 
+	 * @since 1.0.0
+	 */
+	public String getSourceidentifier() {
+		return sourceIdentifier;
+	}
+
+	/**
+	 * Get elapsed time
+	 * 
+	 * @return elapsed time
+	 * 
+	 * @since 1.0.0
+	 */
+	public String getElapsedTime() {
+		return elapsedTime;
+	}
+
+	/**
+	 * Get the message type identifier
+	 * 
+	 * @return message type identifier or <code>null</code> if not set.
+	 * 
+	 * @since 1.0.0
+	 */
+	public String getMessageTypeIdentifier() {
+		return messageTypeIdentifier;
+	}
+
+	/**
+	 * Set execution map
+	 * 
+	 * @param map
+	 * 
+	 * @since 1.0.0
+	 */
+	public void setExecutionMap(int map) {
+		_executionMap = map;
+	}
+
+	/**
+	 * Set properties file name
+	 * 
+	 * @param fName
+	 * 
+	 * @since 1.0.0
+	 */
+	public void setPropertiesFileName(String fName) {
+		_propertiesFileName = fName;
+	}
+
+	/**
+	 * Set target exception
+	 * 
+	 * @param exc
+	 * 
+	 * @since 1.0.0
+	 */
+	public void setTargetException(Throwable exc) {
+		_caughtException = exc;
+	}
+
+	/**
+	 * Append stacktrace of current stack (at the time of call to this method) to the text buffer.
+	 * 
+	 * 
+	 * @since 1.0.0
+	 */
+	public void appendStackTrace() {
+		// Grab the stack trace from the Thread ...
+		ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
+		PrintWriter printWriter = new PrintWriter(byteOutput);
+		// Can't call Thread.dumpStack() because it doesn't take a writer as input.
+		// Copy its mechanism instead.
+		new Exception("Stack trace").printStackTrace(printWriter); //$NON-NLS-1$
+		printWriter.flush();
+
+		// and update the text to the LogEntry's text.
+		StringBuffer buffer = new StringBuffer();
+		buffer.append(getText());
+		buffer.append("\n"); //$NON-NLS-1$
+		buffer.append(byteOutput.toString());
+		setText(buffer.toString());
+	}
+
+	/**
+	 * Get the text.
+	 * 
+	 * @return text or or <code>null</code> if not set.
+	 * 
+	 * @since 1.0.0
+	 */
+	public String getText() {
+		return text;
+	}
+
+	/**
+	 * Set the text
+	 * 
+	 * @param string
+	 * 
+	 * @since 1.0.0
+	 */
+	public void setText(String string) {
+		text = string;
+	}
+
+	/**
+	 * Set every entry to the default value except the properties file name.
+	 * 
+	 * 
+	 * @since 1.0.0
+	 */
+	public void reset() {
+		setExecutionMap(0);
+		setTargetException(null);
+		localeOfOrigin = null;
+		sourceIdentifier = null;
+		elapsedTime = null;
+		setText(null);
+	}
+
+	/**
+	 * Set locale of origin.
+	 * 
+	 * @param origin
+	 * 
+	 * @since 1.0.0
+	 */
+	public void setLocaleOfOrigin(String origin) {
+		localeOfOrigin = origin;
+	}
+
+	/**
+	 * Set source id.
+	 * 
+	 * @param id
+	 * 
+	 * @since 1.0.0
+	 */
+	public void setSourceID(String id) {
+		sourceIdentifier = id;
+	}
+
+	/**
+	 * Set elapsed time.
+	 * 
+	 * @param time
+	 * 
+	 * @since 1.0.0
+	 */
+	public void setElapsedTime(long time) {
+		elapsedTime = String.valueOf(time);
+	}
+
+	/**
+	 * Set source identifier.
+	 * 
+	 * @param string
+	 * 
+	 * @since 1.0.0
+	 */
+	public void setSourceIdentifier(String string) {
+		setSourceID(string);
+	}
+
+	/**
+	 * Set message type identifier.
+	 * 
+	 * @param string
+	 * 
+	 * @since 1.0.0
+	 * @deprecated Use {@link #setText(String)} instead and calling it with the result of {@link java.text.MessageFormat#format(java.lang.String, java.lang.Object[])}
+	 */
+	public void setMessageTypeIdentifier(String string) {
+		messageTypeIdentifier = string;
+	}
+
+	/**
+	 * Set message type id. Same as <code>setMessageTypeIdentifier.</code>
+	 * @param string
+	 * 
+	 * @since 1.0.0
+	 * @deprecated Use {@link #setText(String)} instead and calling it with the result of {@link java.text.MessageFormat#format(java.lang.String, java.lang.Object[])}
+	 */
+	public void setMessageTypeID(String string) {
+		setMessageTypeIdentifier(string);
+	}
+
+	/**
+	 * Set tokens. (Currently this is ignored).
+	 * 
+	 * @param strings
+	 * 
+	 * @since 1.0.0
+	 * @deprecated Use {@link #setText(String)} instead and calling it with the result of {@link java.text.MessageFormat#format(java.lang.String, java.lang.Object[])}
+	 */
+	public void setTokens(String[] strings) {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
+		PrintWriter printWriter = new PrintWriter(byteOutput);
+		if (text != null)
+			printWriter.println(text);
+		if (_caughtException != null) {
+			_caughtException.printStackTrace(printWriter);
+		}
+		printWriter.flush();
+		return byteOutput.toString();
+	}
+
+}
diff --git a/plugins/org.eclipse.jem.util/jemutil-nonworkbnech/org/eclipse/jem/util/logger/proxy/ILogRenderer.java b/plugins/org.eclipse.jem.util/jemutil-nonworkbnech/org/eclipse/jem/util/logger/proxy/ILogRenderer.java
new file mode 100644
index 0000000..3ba7c4d
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil-nonworkbnech/org/eclipse/jem/util/logger/proxy/ILogRenderer.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: ILogRenderer.java,v $
+ *  $Revision: 1.2 $  $Date: 2005/02/15 23:05:54 $ 
+ */
+package org.eclipse.jem.util.logger.proxy;
+
+/**
+ * Basic log renderer interface. It is replaced by the extension <code>ILogRenderer2.</code>
+ * 
+ * @since 1.0.0
+ */
+public interface ILogRenderer {
+
+	/**
+	 * Logged to console.
+	 */
+	final public static String CONSOLE_DESCRIPTION = "console"; //$NON-NLS-1$
+
+	/**
+	 * Logged to workbench.
+	 */
+	final public static String WORKBENCH_DESCRIPTION = "workbench log"; //$NON-NLS-1$
+
+	/**
+	 * Not logged.
+	 */
+	final public static String NOLOG_DESCRIPTION = ""; //$NON-NLS-1$
+
+	/**
+	 * Log levels. These are deprecated, use <code>java.util.logging.Level</code> codes instead.
+	 */
+	final public static int LOG_ERROR = 0;
+
+	final public static int LOG_TRACE = 1;
+
+	final public static int LOG_WARNING = 2;
+
+	final public static int LOG_INFO = 3;
+
+	final public static String DefaultPluginID = "org.eclipse.jem.util"; //$NON-NLS-1$
+
+	/**
+	 * Log the string at the specified type.
+	 * 
+	 * @param msg
+	 * @param type
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String log(String msg, int type);
+
+	/**
+	 * Start or stop the tracing.
+	 * 
+	 * @param Flag
+	 *            <code>true</code> to start the tracing.
+	 * 
+	 * @since 1.0.0
+	 */
+	public void setTraceMode(boolean Flag);
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/jemutil-nonworkbnech/org/eclipse/jem/util/logger/proxy/ILogRenderer2.java b/plugins/org.eclipse.jem.util/jemutil-nonworkbnech/org/eclipse/jem/util/logger/proxy/ILogRenderer2.java
new file mode 100644
index 0000000..69ee144
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil-nonworkbnech/org/eclipse/jem/util/logger/proxy/ILogRenderer2.java
@@ -0,0 +1,151 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: ILogRenderer2.java,v $
+ *  $Revision: 1.4 $  $Date: 2005/08/24 21:10:34 $ 
+ */
+package org.eclipse.jem.util.logger.proxy;
+
+import java.util.logging.Level;
+ 
+/**
+ * Log renderer that provides more function. Basically it can handle
+ * the logging of specific types in a different manner than the default
+ * conversion to string supplied by Logger.
+ * 
+ * It also uses the Level classes from java.util.logging as the logging levels.
+ * 
+ * @since 1.0.0
+ */
+public interface ILogRenderer2 extends ILogRenderer {
+	
+	/**
+	 * When Logger.setLevel(DEFAULT): restore to what the default level was.
+	 * When log(...,DEFAULT): Log at the default level for the type of object.
+	 */
+	static final Level DEFAULT = new Logger.LocalLevel("DEFAULT", Integer.MAX_VALUE-1); //$NON-NLS-1$
+	
+	/**
+	 * When log(...,TRACE) : Log only when in trace mode.
+	 * Don't use in Logger.setLevel(). Has no meaning in that case.
+	 */
+	static final Level TRACE = new Logger.LocalLevel("TRACE", Integer.MAX_VALUE-2);	 //$NON-NLS-1$
+
+	/**
+	 * Log the throwable at the given level (if DEFAULT, use default level for a throwable).
+	 * 
+	 * @param t
+	 * @param level
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	String log(Throwable t, Level level);
+	
+	/**
+	 * Log the object at the given level (if DEFAULT, use default level for an object).
+	 * 
+	 * @param o
+	 * @param level
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	String log(Object o, Level level);
+	
+	/**
+	 * Log the boolean at the given level (if DEFAULT, use default level for a boolean).
+	 * 
+	 * @param b
+	 * @param level
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	String log(boolean b, Level level);	
+
+	/**
+	 * Log the char at the given level (if DEFAULT, use default level for a char).
+	 * 
+	 * @param c
+	 * @param level
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	String log(char c, Level level);	
+	
+	/**
+	 * Log the byte at the given level (if DEFAULT, use default level for a byte).
+	 * 
+	 * @param b
+	 * @param level
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	String log(byte b, Level level);
+	
+	/**
+	 * Log the short at the given level (if DEFAULT, use default level for a short).
+	 * 
+	 * @param s
+	 * @param level
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	String log(short s, Level level);
+	
+	/**
+	 * Log the int at the given level (if DEFAULT, use default level for an int).
+	 * 
+	 * @param i
+	 * @param level
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	String log(int i, Level level);
+
+	/**
+	 * Log the long at the given level (if DEFAULT, use default level for a long).
+	 * 
+	 * @param l
+	 * @param level
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	String log(long l, Level level);
+
+	/**
+	 * Log the float at the given level (if DEFAULT, use default level for a float).
+	 * 
+	 * @param f
+	 * @param level
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	String log(float f, Level level);
+
+	/**
+	 * Log the double at the given level (if DEFAULT, use default level for a double).
+	 * 
+	 * @param d
+	 * @param level
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	String log(double d, Level level);
+}
diff --git a/plugins/org.eclipse.jem.util/jemutil-nonworkbnech/org/eclipse/jem/util/logger/proxy/JDKConsoleRenderer.java b/plugins/org.eclipse.jem.util/jemutil-nonworkbnech/org/eclipse/jem/util/logger/proxy/JDKConsoleRenderer.java
new file mode 100644
index 0000000..6f0f828
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil-nonworkbnech/org/eclipse/jem/util/logger/proxy/JDKConsoleRenderer.java
@@ -0,0 +1,247 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: JDKConsoleRenderer.java,v $
+ *  $Revision: 1.3 $  $Date: 2005/08/24 21:10:34 $ 
+ */
+package org.eclipse.jem.util.logger.proxy;
+
+import java.util.logging.Level;
+
+/**
+ * Default log renderer to use when not running under Eclipse. It logs to sysout and syserr.
+ * 
+ * @since 1.1.0
+ */
+
+public class JDKConsoleRenderer implements ILogRenderer2 {
+
+	private boolean fTraceMode = false; // will we actually punch trace messaged or not
+
+	private boolean fSettingTrace = false;
+
+	private Logger fMyLogger = null;
+
+	/**
+	 * Constructer taking a logger.
+	 * 
+	 * @param logger
+	 * 
+	 * @since 1.1.0
+	 */
+	public JDKConsoleRenderer(Logger logger) {
+		super();
+		fMyLogger = logger;
+		fTraceMode = fMyLogger.getTraceMode();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer#log(java.lang.String, int)
+	 */
+	public String log(String msg, int type) {
+
+		if (type == ILogRenderer.LOG_TRACE && !fTraceMode)
+			return null;
+
+		if (type == ILogRenderer.LOG_ERROR)
+			System.err.println(msg);
+		else
+			System.out.println(msg);
+		return ILogRenderer.CONSOLE_DESCRIPTION;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer#setTraceMode(boolean)
+	 */
+	public void setTraceMode(boolean flag) {
+
+		if (fSettingTrace)
+			return;
+		fSettingTrace = true;
+		fTraceMode = flag;
+		fMyLogger.setTraceMode(flag);
+		fSettingTrace = false;
+	}
+
+	/**
+	 * Log the string at the given level.
+	 * 
+	 * @param msg
+	 * @param level
+	 * @return <code>CONSOLE_DESCRIPTION</code>
+	 * 
+	 * @since 1.1.0
+	 */
+	protected String log(String msg, Level level) {
+		if (level == Level.SEVERE)
+			System.err.println(msg);
+		else
+			System.out.println(msg);
+		return ILogRenderer.CONSOLE_DESCRIPTION;
+	}
+
+	/**
+	 * Answer if logging at the given level
+	 * 
+	 * @param logLevel
+	 * @return <code>true</code> if logging at the given level.
+	 * 
+	 * @since 1.1.0
+	 */
+	protected boolean isLogging(Level logLevel) {
+		return fTraceMode || fMyLogger.isLoggingLevel(logLevel);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer2#log(boolean, java.util.logging.Level)
+	 */
+	public String log(boolean b, Level level) {
+		if (level == DEFAULT)
+			level = Level.FINEST;
+		if (isLogging(level))
+			return log(fMyLogger.getGenericMsg(String.valueOf(b), level), level);
+		else
+			return NOLOG_DESCRIPTION;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer2#log(byte, java.util.logging.Level)
+	 */
+	public String log(byte b, Level level) {
+		if (level == DEFAULT)
+			level = Level.FINEST;
+		if (isLogging(level))
+			return log(fMyLogger.getGenericMsg(String.valueOf(b), level), level);
+		else
+			return NOLOG_DESCRIPTION;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer2#log(char, java.util.logging.Level)
+	 */
+	public String log(char c, Level level) {
+		if (level == DEFAULT)
+			level = Level.FINEST;
+		if (isLogging(level))
+			return log(fMyLogger.getGenericMsg(String.valueOf(c), level), level);
+		else
+			return NOLOG_DESCRIPTION;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer2#log(double, java.util.logging.Level)
+	 */
+	public String log(double d, Level level) {
+		if (level == DEFAULT)
+			level = Level.FINEST;
+		if (isLogging(level))
+			return log(fMyLogger.getGenericMsg(String.valueOf(d), level), level);
+		else
+			return NOLOG_DESCRIPTION;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer2#log(float, java.util.logging.Level)
+	 */
+	public String log(float f, Level level) {
+		if (level == DEFAULT)
+			level = Level.FINEST;
+		if (isLogging(level))
+			return log(fMyLogger.getGenericMsg(String.valueOf(f), level), level);
+		else
+			return NOLOG_DESCRIPTION;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer2#log(int, java.util.logging.Level)
+	 */
+	public String log(int i, Level level) {
+		if (level == DEFAULT)
+			level = Level.FINEST;
+		if (isLogging(level))
+			return log(fMyLogger.getGenericMsg(String.valueOf(i), level), level);
+		else
+			return NOLOG_DESCRIPTION;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer2#log(long, java.util.logging.Level)
+	 */
+	public String log(long l, Level level) {
+		if (level == DEFAULT)
+			level = Level.FINEST;
+		if (isLogging(level))
+			return log(fMyLogger.getGenericMsg(String.valueOf(l), level), level);
+		else
+			return NOLOG_DESCRIPTION;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer2#log(java.lang.Object, java.util.logging.Level)
+	 */
+	public String log(Object o, Level level) {
+		if (level == DEFAULT)
+			level = Level.FINEST;
+		if (isLogging(level))
+			return log(fMyLogger.getGenericMsg(String.valueOf(o), level), level);
+		else
+			return NOLOG_DESCRIPTION;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer2#log(short, java.util.logging.Level)
+	 */
+	public String log(short s, Level level) {
+		if (level == DEFAULT)
+			level = Level.FINEST;
+		if (isLogging(level))
+			return log(fMyLogger.getGenericMsg(String.valueOf(s), level), level);
+		else
+			return NOLOG_DESCRIPTION;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer2#log(java.lang.Throwable, java.util.logging.Level)
+	 */
+	public String log(Throwable t, Level level) {
+		if (level == DEFAULT)
+			level = Level.SEVERE;
+		if (isLogging(level))
+			return log(fMyLogger.getGenericMsg(fMyLogger.exceptionToString(t), level), level);
+		else
+			return NOLOG_DESCRIPTION;
+	}
+
+}
diff --git a/plugins/org.eclipse.jem.util/jemutil-nonworkbnech/org/eclipse/jem/util/logger/proxy/Logger.java b/plugins/org.eclipse.jem.util/jemutil-nonworkbnech/org/eclipse/jem/util/logger/proxy/Logger.java
new file mode 100644
index 0000000..24e891a
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil-nonworkbnech/org/eclipse/jem/util/logger/proxy/Logger.java
@@ -0,0 +1,843 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: Logger.java,v $
+ *  $Revision: 1.8 $  $Date: 2006/05/17 20:13:45 $ 
+ */
+package org.eclipse.jem.util.logger.proxy;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.*;
+import java.util.logging.Level;
+
+/**
+ * This is a base, UI independent logger.   It will
+ * construct a consistent msg. body, and call an enfironment specific ILogRenderer.
+ * By default, this logger will use a console based ILogRenderer,
+ * and a J2EE Plugin identification.
+ * 
+ * <p>
+ * When running outside of Eclipse, the trace and logging level come from the system properties
+ * <ul>
+ * 		<li>"debug" (="true") - The default is <code>false</code>. 
+ * 		<li>"logLevel" (="level" where "level" is a level string, e.g. SEVERE, WARNING, etc. from the <code>java.util.logging.Level</code> class).
+ * 			The default is "WARNING".
+ * </ul>
+ * 
+ * 
+ * @since 1.0.0
+ */
+public class Logger {
+	
+	// This is used by ILogRenderer2 to define the default level.
+	static class LocalLevel extends Level {
+		/**
+		 * Comment for <code>serialVersionUID</code>
+		 * 
+		 * @since 1.1.0
+		 */
+		private static final long serialVersionUID = -6273357074767854883L;
+
+		public LocalLevel(String name, int level) {
+			super(name, level);
+		}
+	}	
+	
+	private boolean fTraceMode = false; // will we actually punch trace messaged or not              
+	private String fPluginID;
+	private ILogRenderer fRenderer = null;
+	private ILogRenderer2 renderer2 = null;
+	public String fLineSeperator;
+	private Level level;
+	private Level defaultLevel = Level.SEVERE;	// By default only severe or greater are logged.
+	private String logFileName;
+	private final static String DefaultLoggerPlugin = ILogRenderer.DefaultPluginID;
+	static private Hashtable Loggers = new Hashtable(); // Keep track of all the Loggers
+	final protected static String[] LogMark = { "*** ERROR *** ", //$NON-NLS-1$
+		"[Trace] ", //$NON-NLS-1$
+		"+++ Warning +++ ", //$NON-NLS-1$
+		"Info " }; //$NON-NLS-1$
+
+	final protected static String Filler = "    "; // Use this to indent msg. body //$NON-NLS-1$
+	
+	protected Logger() {
+		this(ILogRenderer.DefaultPluginID);
+	}
+	
+	protected Logger(String pluginID) {
+		fPluginID = pluginID;
+		setRenderer(new JDKConsoleRenderer(this));	// Set up default to this. Someone can change it later.
+	}
+
+	/**
+	 * Return the stacktrace as a print formatted string.
+	 * @param e
+	 * @return the stacktrace as a string.
+	 * 
+	 * @since 1.0.0
+	 */
+	public String exceptionToString(Throwable e) {
+		StringWriter stringWriter = new StringWriter();
+		e.printStackTrace(new PrintWriter(stringWriter));
+		return stringWriter.toString();
+	}
+	
+	/**
+	 * Get the system default logger. This is used for clients that don't know if they
+	 * are running in Eclipse or outside of it. This way they have a common logger format
+	 * which switch correctly.
+	 * @return default logger.
+	 * 
+	 * @since 1.0.0
+	 */
+	static public Logger getLogger() {
+		Logger defaultLogger = (Logger) Loggers.get(DefaultLoggerPlugin);
+		if (defaultLogger == null) {
+			defaultLogger = new Logger();
+			defaultLogger.init();
+			Loggers.put(DefaultLoggerPlugin, defaultLogger);
+		}
+		return defaultLogger;
+	}
+	
+	/**
+	 * Get the logger for a specific plugin.
+	 * @param pluginId
+	 * @return logger for a specific pluggin.
+	 * 
+	 * @since 1.0.0
+	 */
+	static public Logger getLogger(String pluginId) {
+		if (pluginId == null)
+			return Logger.getLogger();
+		Logger Logger = (Logger) Loggers.get(pluginId);
+		if (Logger == null) {
+			Logger = new Logger(pluginId);
+			Logger.init();
+			Loggers.put(pluginId, Logger);
+		}
+		return Logger;
+	}
+	
+	/**
+	 * Used by subclass to get a logger if it exists, but not create one.
+	 * @param pluginId
+	 * @return logger.
+	 * 
+	 * @since 1.0.0
+	 */
+	static protected Logger getLoggerIfExists(String pluginId) {
+		if (pluginId == null)
+			return Logger.getLogger();
+		else
+			return (Logger) Loggers.get(pluginId);
+	}
+
+	/**
+	 * Get the plugin id for this logger.
+	 * @return pluginid
+	 * 
+	 * @since 1.0.0
+	 */
+	public String getPluginID() {
+		return fPluginID;
+	}
+	
+	/**
+	 * Get the trace mode for this logger
+	 * @return <code>true</code> if tracing is going on.
+	 * 
+	 * @since 1.0.0
+	 */
+	public boolean getTraceMode() {
+		return fTraceMode;
+	}
+	
+	/*
+	 * Indent the Msg. Body to make it easier to read the log
+	 */
+	private void indentMsg(String msg, StringBuffer logMsg) {
+		// Line seperator is different on different platform, unix = \n, windows \r\n and mac \r
+		String sep = fLineSeperator;
+		if (msg.indexOf("\r\n") != -1) //$NON-NLS-1$
+			sep = "\r\n"; //$NON-NLS-1$
+		else if (msg.indexOf("\n") != -1) //$NON-NLS-1$
+			sep = "\n"; //$NON-NLS-1$
+		else if (msg.indexOf("\r") != -1) //$NON-NLS-1$
+			sep = "\r"; //$NON-NLS-1$
+		StringTokenizer tokenizer = new StringTokenizer(msg, sep);
+		boolean first = true;
+		while (tokenizer.hasMoreTokens()) {
+			if (first) {
+				first = false;
+				logMsg.append(Filler + tokenizer.nextToken());
+			} else
+				logMsg.append(fLineSeperator + Filler + tokenizer.nextToken());
+		}
+	}
+	/*
+	 * If Eclipse is started with the -XDebug or -debug turn traces on for this Logger
+	 * Creation date: (8/23/2001 7:37:04 PM)
+	 */
+	private void init() {
+		if (System.getProperty("debug") != null) //$NON-NLS-1$
+			fTraceMode = true;
+		level = defaultLevel = Level.parse(System.getProperty("logLevel", Level.WARNING.getName())); //$NON-NLS-1$
+		
+		try {
+			fLineSeperator = System.getProperty("line.separator"); // Diff on Win/Unix/Mac //$NON-NLS-1$
+		} catch (Throwable e) {
+			fLineSeperator = "\n"; //$NON-NLS-1$
+		}
+	}
+	/*
+	 * Generic log.
+	 * Creation date: (8/24/2001 1:55:34 PM)
+	 * @return java.lang.String
+	 * @param msg java.lang.String
+	 * @param type int
+	 */
+	private String logAny(String msg, int type) {
+		StringBuffer logMsg = new StringBuffer();
+		logMsg.append(fLineSeperator);
+		logMsg.append(LogMark[type]);
+		return punchLog(logRest(msg, logMsg), type);
+	}
+	
+	/**
+	 * This is to be used by renderers that want to put a msg out
+	 * in a generic format. This just returns the string that
+	 * should be logged. It puts things like headers on it.
+	 * 
+	 * @param msg
+	 * @param aLevel
+	 * @return The generic message for the string and level.
+	 * 
+	 * @since 1.0.0
+	 */
+	public String getGenericMsg(String msg, Level aLevel) {
+		StringBuffer genMsg = new StringBuffer(msg.length()+16);
+		genMsg.append(fLineSeperator);
+		genMsg.append(getLevelHeader(aLevel));
+		genMsg.append(": "); //$NON-NLS-1$
+		genMsg.append(new Date());
+		indentMsg(msg, genMsg);
+		return genMsg.toString();
+	}
+	
+	private static final Level[] LEVEL_SEARCH = new Level[] {
+		Level.SEVERE,
+		Level.WARNING,
+		Level.INFO,
+		ILogRenderer2.TRACE
+	};
+	
+	private static final String[] LEVEL_MARK = new String[] {
+		"*** ERROR ***", //$NON-NLS-1$
+		"+++ Warning +++", //$NON-NLS-1$
+		"Info", //$NON-NLS-1$
+		"[Trace]" //$NON-NLS-1$
+	};
+	
+	private String getLevelHeader(Level aLevel) {
+		for (int i=0; i<LEVEL_SEARCH.length; i++)
+			if (LEVEL_SEARCH[i] == aLevel)
+				return LEVEL_MARK[i];
+		return aLevel.getName();	// Not found, just use level string.
+	}
+	
+	// The write's are here for history. Will implement using log(obj, Level) for all of the types.
+
+
+	/**
+	 * deprecated use log(Level, Exception)
+	 * @param aLevel
+	 * @param ex
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 * 
+	 */
+	public String write(Level aLevel, Exception ex) {
+		return log(aLevel, ex);
+	}
+	
+	/**
+	 * deprecated use log(Throwable)
+	 * @param ex
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 * 
+	 */
+	public String write(Throwable ex) {
+		return log(ex);
+	}
+	
+	/**
+	 * deprecated use log(Object, Level)
+	 * @param aLevel
+	 * @param logEntry
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	public String write(Level aLevel, Object logEntry) {
+		return log(logEntry, aLevel);
+	}
+	
+	/**
+	 * deprecated use log(String, Level)
+	 * @param aLevel
+	 * @param string
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	public String write(Level aLevel, String string) {
+		return log(string, aLevel);
+	}
+	/**
+	 * deprecated use log(Throwable, Level)
+	 * @param aLevel
+	 * @param ex
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	public String write(Level aLevel, Throwable ex) {
+		return log(ex, aLevel);
+	}
+	/**
+	 * deprecated use log(Throwable, Level)
+	 * @param aLevel
+	 * @param ex
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	public String log(Level aLevel, Exception ex) {
+		return log(ex, aLevel);
+	}
+	/**
+	 * deprecated use log(Throwable, Level)
+	 * @param aLevel
+	 * @param ex
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	public String log(Level aLevel, Throwable ex) {
+		return log(ex, aLevel);
+	}
+	
+	/**
+	 * Get the logging level
+	 * @return logging level
+	 * 
+	 * @since 1.0.0
+	 */
+	public Level getLevel() {
+		return level;
+	}
+	
+	/**
+	 * Check if the requested level is being logged. (e.g. if current level is SEVERE, then FINE will not be logged).
+	 * @param requestlevel
+	 * @return <code>true</code> if the level will be logged.
+	 * 
+	 * @since 1.0.0
+	 */
+	public boolean isLoggingLevel(Level requestlevel) {
+		if (requestlevel == ILogRenderer2.TRACE && !getTraceMode())
+			return false;	// We aren't tracing but requested trace.
+		
+		return !(requestlevel.intValue() < getLevel().intValue() || getLevel() == Level.OFF);
+	}
+
+	/**
+	 * Log an error string.
+	 * @param msg
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String logError(String msg) {
+		return log(msg, Level.SEVERE);
+	}
+
+	/**
+	 * Log an error throwable
+	 * @param e
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String logError(Throwable e) {
+		return log(e, Level.SEVERE);
+	}
+
+	/**
+	 * Log an info message.
+	 * @param msg
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String logInfo(String msg) {
+		return log(msg, Level.INFO);
+	}
+	
+/**
+ * Log a throwable as a warning.
+ * @param e
+ * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+ * 
+ * @since 1.0.0
+ */
+	public String logInfo(Throwable e) {
+		return log(e, Level.INFO);
+	}
+
+	/**
+	 * Append the string to logMsg buffer passed in. Append the date and format the
+	 * string with nice indentation.
+	 * 
+	 * @param msg
+	 * @param logMsg
+	 * @return the string from the logMsg after logging the rest.
+	 * 
+	 * @since 1.0.0
+	 */
+	protected String logRest(String msg, StringBuffer logMsg) {
+		logMsg.append(new Date());
+		indentMsg(msg, logMsg);
+		return logMsg.toString();
+	}
+
+	/**
+	 * Log the msg as trace only.
+	 * @param msg
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String logTrace(String msg) {
+		if (fTraceMode)
+			return log(msg, ILogRenderer2.TRACE);
+		else
+			return ILogRenderer.NOLOG_DESCRIPTION;
+	}
+
+	/**
+	 * Log the throwable as trace only.
+	 * @param e
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String logTrace(Throwable e) {
+		return log(e, ILogRenderer2.TRACE);
+	}
+
+	/**
+	 * Log the message as warning.
+	 * @param msg
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String logWarning(String msg) {
+		return log(msg, Level.WARNING);
+	}
+	/**
+	 * Log the throwable as a warning.
+	 * @param e
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String logWarning(Throwable e) {
+		return log(e, Level.WARNING);
+	}
+	
+	/**
+	 * Ask the Renderer to punch the msg. in the log.. one
+	 * caller at the time
+	 * Creation date: (8/24/2001 9:19:17 AM)
+	 * @return java.lang.String
+	 * @param msg java.lang.String
+	 * @param type int
+	 */
+	protected synchronized String punchLog(String msg, int type) {
+		return fRenderer.log(msg, type);
+	}
+	
+	/**
+	 * Set the renderer to use.
+	 * @param renderer
+	 * 
+	 * @since 1.0.0
+	 */
+	public void setRenderer(ILogRenderer renderer) {
+		fRenderer = renderer;
+		renderer2 = (renderer instanceof ILogRenderer2) ? (ILogRenderer2) renderer : null;
+		renderer.setTraceMode(getTraceMode());
+	}
+	
+	/**
+	 * Set the trace mode.
+	 * @param flag <code>true</code> to turn on tracing.
+	 * 
+	 * @since 1.0.0
+	 */
+	public void setTraceMode(boolean flag) {
+		fTraceMode = flag;
+		if (fRenderer != null)
+			fRenderer.setTraceMode(flag);
+	}
+	
+	/**
+	 * Set the level cutoff for logging. Anything below this level will not log.
+	 * Do not set level to <code>ILogRenderer2.TRACE</code>. It doesn't make sense.
+	 * 
+	 * @param level (Use <code>ILogRenderer2.DEFAULT</code> to restore to default for this logger.
+	 * 
+	 * @since 1.0.0
+	 */
+	public void setLevel(Level level) {
+		this.level = level != ILogRenderer2.DEFAULT ? level : defaultLevel;
+	}
+	
+	/**
+	 * Set the default level for this logger. It won't touch the current level.
+	 * 
+	 * @param level
+	 * 
+	 * @since 1.0.0
+	 */
+	public void setDefaultLevel(Level level) {
+		this.defaultLevel = level;
+	}
+	
+	/**
+	 * Get the log file name.
+	 * @return Returns the logFileName.
+	 */
+	public String getLogFileName() {
+		return logFileName;
+	}
+
+	/**
+	 * Set the log file name.
+	 * @param logFileName The logFileName to set.
+	 */
+	public void setLogFileName(String logFileName) {
+		this.logFileName = logFileName;
+	}
+	
+	// Now all of the log() types that use a Level.
+
+	/**
+	 * Log the throwable at the default level for a throwable. 
+	 * @param e
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String log(Throwable e) {
+		return log(e, ILogRenderer2.DEFAULT);
+	}
+	
+	/**
+	 * Log the throwable at the given level.
+	 * @param e
+	 * @param logLevel
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String log(Throwable e, Level logLevel) {
+		if (renderer2 != null) {
+			return renderer2.log(e, logLevel);
+		} else {
+			// Do it the old way.
+			String stackTrace = exceptionToString(e);
+			return logAny(stackTrace, getOldType(logLevel != ILogRenderer2.DEFAULT ? level : Level.SEVERE));
+		}
+	}
+	
+	public String log(Object o) {
+		return log(o, ILogRenderer2.DEFAULT);
+	}
+	
+	/**
+	 * Log the object at the given level.
+	 * @param o
+	 * @param logLevel
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String log(Object o, Level logLevel) {
+		if (renderer2 != null) {
+			return renderer2.log(o, logLevel);
+		} else {
+			// Do it the old way.
+			return logAny(String.valueOf(o), getOldType(logLevel != ILogRenderer2.DEFAULT ? level : Level.FINEST));
+		}
+	}	
+	
+	// The following are added to match up with Hyades so that primitives can be logged too.
+	
+	/**
+	 * Log a boolean at the default level. 
+	 * @param b
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String log(boolean b) {
+		return log(b, ILogRenderer2.DEFAULT);
+	}
+	
+	/**
+	 * Log a boolean at the given level.
+	 * @param b
+	 * @param logLevel
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String log(boolean b, Level logLevel) {
+		if (renderer2 != null) {
+			return renderer2.log(b, logLevel);
+		} else {
+			// Do it the old way.
+			return logAny(String.valueOf(b), getOldType(logLevel != ILogRenderer2.DEFAULT ? level : Level.FINEST));
+		}
+	}	
+	
+	/**
+	 * Log the character at the default level.
+	 * @param c
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String log(char c) {
+		return log(c, ILogRenderer2.DEFAULT);
+	}
+	
+	/**
+	 * Log the character at the given level.
+	 * @param c
+	 * @param logLevel
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String log(char c, Level logLevel) {
+		if (renderer2 != null) {
+			return renderer2.log(c, logLevel);
+		} else {
+			// Do it the old way.
+			return logAny(String.valueOf(c), getOldType(logLevel != ILogRenderer2.DEFAULT ? level : Level.FINEST));
+		}
+	}
+	
+	/**
+	 * Log the byte at the default level.
+	 * @param b
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String log(byte b) {
+		return log(b, ILogRenderer2.DEFAULT);
+	}
+	
+	/**
+	 * Log the byte at the given level.
+	 * @param b
+	 * @param logLevel
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String log(byte b, Level logLevel) {
+		if (renderer2 != null) {
+			return renderer2.log(b, logLevel);
+		} else {
+			// Do it the old way.
+			return logAny(String.valueOf(b), getOldType(logLevel != ILogRenderer2.DEFAULT ? level : Level.FINEST));
+		}
+	}	
+	
+	/**
+	 * Log the short at the default level.
+	 * @param s
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String log(short s) {
+		return log(s, ILogRenderer2.DEFAULT);
+	}
+	
+	/**
+	 * Log the short at the given level.
+	 * @param s
+	 * @param logLevel
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String log(short s, Level logLevel) {
+		if (renderer2 != null) {
+			return renderer2.log(s, logLevel);
+		} else {
+			// Do it the old way.
+			return logAny(String.valueOf(s), getOldType(logLevel != ILogRenderer2.DEFAULT ? level : Level.FINEST));
+		}
+	}
+	
+	/**
+	 * Log the int at the default level.
+	 * @param i
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String log(int i) {
+		return log(i, ILogRenderer2.DEFAULT);
+	}
+	
+	/**
+	 * Log the int at the default level.
+	 * @param i
+	 * @param logLevel
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String log(int i, Level logLevel) {
+		if (renderer2 != null) {
+			return renderer2.log(i, logLevel);
+		} else {
+			// Do it the old way.
+			return logAny(String.valueOf(i), getOldType(logLevel != ILogRenderer2.DEFAULT ? level : Level.FINEST));
+		}
+	}
+	
+	/**
+	 * Log the long at the default level.
+	 * @param l
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String log(long l) {
+		return log(l, ILogRenderer2.DEFAULT);
+	}
+	
+	/**
+	 * Log the long at the given level.
+	 * @param l
+	 * @param logLevel
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String log(long l, Level logLevel) {
+		if (renderer2 != null) {
+			return renderer2.log(l, logLevel);
+		} else {
+			// Do it the old way.
+			return logAny(String.valueOf(l), getOldType(logLevel != ILogRenderer2.DEFAULT ? level : Level.FINEST));
+		}
+	}	
+	
+	/**
+	 * Log the float at the default level.
+	 * @param f
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String log(float f) {
+		return log(f, ILogRenderer2.DEFAULT);
+	}
+	
+	/**
+	 * Log the float at the given level.
+	 * @param f
+	 * @param logLevel
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String log(float f, Level logLevel) {
+		if (renderer2 != null) {
+			return renderer2.log(f, logLevel);
+		} else {
+			// Do it the old way.
+			return logAny(String.valueOf(f), getOldType(logLevel != ILogRenderer2.DEFAULT ? level : Level.FINEST));
+		}
+	}
+	
+	/**
+	 * Log the double at the default level
+	 * @param d
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String log(double d) {
+		return log(d, ILogRenderer2.DEFAULT);
+	}
+	
+	/**
+	 * Log the double at the given level
+	 * 
+	 * @param d
+	 * @param logLevel
+	 * @return how it was logged. See <code>CONSOLE_DESCRIPTION.</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	public String log(double d, Level logLevel) {
+		if (renderer2 != null) {
+			return renderer2.log(d, logLevel);
+		} else {
+			// Do it the old way.
+			return logAny(String.valueOf(d), getOldType(logLevel != ILogRenderer2.DEFAULT ? level : Level.FINEST));
+		}
+	}	
+	
+	/*
+	 * Turn new type into old type. The defaultLevel is the
+	 * level to use if the incoming level is marked as default.
+	 */
+	private int getOldType(Level aLevel) {
+		if (aLevel == Level.SEVERE)
+			return ILogRenderer.LOG_ERROR;
+		else if (aLevel == Level.WARNING)
+			return ILogRenderer.LOG_WARNING;
+		else if (aLevel == Level.INFO)
+			return ILogRenderer.LOG_INFO;
+		else if (aLevel == ILogRenderer2.TRACE)
+			return ILogRenderer.LOG_TRACE;
+		else
+			return ILogRenderer.LOG_INFO;		
+	}
+}
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/internal/util/emf/workbench/EMFWorkbenchContextFactory.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/internal/util/emf/workbench/EMFWorkbenchContextFactory.java
new file mode 100644
index 0000000..698a435
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/internal/util/emf/workbench/EMFWorkbenchContextFactory.java
@@ -0,0 +1,172 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $$RCSfile: EMFWorkbenchContextFactory.java,v $$
+ *  $$Revision: 1.4 $$  $$Date: 2005/06/16 20:14:27 $$ 
+ */
+package org.eclipse.jem.internal.util.emf.workbench;
+
+import java.util.*;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectNature;
+import org.eclipse.core.runtime.*;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+
+import org.eclipse.jem.internal.util.emf.workbench.nls.EMFWorkbenchResourceHandler;
+import org.eclipse.jem.util.RegistryReader;
+import org.eclipse.jem.util.emf.workbench.*;
+import org.eclipse.jem.util.emf.workbench.nature.EMFNature;
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jem.util.plugin.JEMUtilPlugin;
+
+
+
+public class EMFWorkbenchContextFactory  {
+	public static final EMFWorkbenchContextFactory INSTANCE;
+	
+	static {
+		INSTANCE = createFactoryInstance();
+	}
+	private final Class CONTRIBUTOR_CLASS = IEMFContextContributor.class;
+	protected Map emfContextCache = new WeakHashMap();
+
+	
+	private static EMFWorkbenchContextFactory createFactoryInstance() {
+		EMFWorkbenchContextFactory factory = createFactoryInstanceFromExtension();
+		if (factory == null)
+			factory = new EMFWorkbenchContextFactory();
+		return factory;
+	}
+	
+	private static EMFWorkbenchContextFactory createFactoryInstanceFromExtension() {
+		final EMFWorkbenchContextFactory[] factoryHolder = new EMFWorkbenchContextFactory[1];
+		RegistryReader reader = new RegistryReader(JEMUtilPlugin.ID, "internalWorkbenchContextFactory") { //$NON-NLS-1$
+			public boolean readElement(IConfigurationElement element) {
+				if (element.getName().equals("factoryClass")) //$NON-NLS-1$
+					try {
+						factoryHolder[0] = (EMFWorkbenchContextFactory)element.createExecutableExtension("name"); //$NON-NLS-1$
+						return true;
+					} catch (CoreException e) {
+						Logger.getLogger().logError(e);
+					}				
+				return false;
+			}
+		};
+		reader.readRegistry();
+		return factoryHolder[0];
+	}
+
+	/**
+	 * Constructor for EMFNatureFactory.
+	 */
+	protected EMFWorkbenchContextFactory() {
+		super();
+
+	}
+
+
+	protected void cacheEMFContext(IProject aProject, EMFWorkbenchContextBase emfContext) {
+		if (aProject != null && emfContext != null)
+			emfContextCache.put(aProject, emfContext);
+	}
+
+	protected EMFWorkbenchContextBase getCachedEMFContext(IProject aProject) {
+		if (aProject != null)
+			return (EMFWorkbenchContextBase) emfContextCache.get(aProject);
+		return null;
+	}
+
+	/**
+	 * <code>aProject</code> is either being closed or deleted so we need to cleanup our cache.
+	 */
+	public void removeCachedProject(IProject aProject) {
+		if (aProject != null) 
+			emfContextCache.remove(aProject); 
+		
+	}
+	/**
+	 * Return a new or existing EMFNature on <code>aProject</code>. Allow the <code>contributor</code>
+	 * to contribute to the new or existing nature prior to returning.
+	 */
+	public EMFWorkbenchContextBase createEMFContext(IProject aProject, IEMFContextContributor contributor) {
+		if (aProject == null)
+			throw new IllegalStateException("[EMFWorkbenchContextBase]" + EMFWorkbenchResourceHandler.getString("EMFWorkbenchContextFactory_UI_0")); //$NON-NLS-1$ //$NON-NLS-2$
+		if (!aProject.isAccessible())
+			throw new IllegalStateException("[EMFWorkbenchContextBase]" + EMFWorkbenchResourceHandler.getString("EMFWorkbenchContextFactory_UI_1", new Object[]{aProject.getName()})); //$NON-NLS-1$ //$NON-NLS-2$
+		EMFWorkbenchContextBase context = getCachedEMFContext(aProject);
+		boolean contributorFound = false;
+		if (context == null) {
+			context = primCreateEMFContext(aProject);
+			cacheEMFContext(aProject, context);
+			contributorFound = initializeEMFContextFromContributors(aProject, context, contributor);
+		}
+		if (contributor != null && context != null && !contributorFound)
+			contributor.primaryContributeToContext(context);
+		return context;
+	}
+	
+	protected boolean initializeEMFContextFromContributors(IProject aProject, EMFWorkbenchContextBase emfContext, IEMFContextContributor contributor) {
+		boolean contributorFound = false;
+		if (aProject == null || emfContext == null)
+			return contributorFound;
+		List runtimes = EMFNature.getRegisteredRuntimes(aProject);
+		for (int i = 0; i < runtimes.size(); i++) {
+			IProjectNature nature = (IProjectNature) runtimes.get(i);
+			if (nature != null && CONTRIBUTOR_CLASS.isInstance(nature)) {
+				if (nature == contributor)
+					contributorFound = true;
+				((IEMFContextContributor) nature).primaryContributeToContext(emfContext);
+			}
+		}
+		return contributorFound;
+	}
+
+	protected boolean isNatureEnabled(IProject aProject, String natureId) {
+		try {
+			return aProject.isNatureEnabled(natureId);
+		} catch (CoreException e) {
+			return false;
+		}
+	}
+
+	protected String[] getNatureIds(IProject aProject) {
+		try {
+			if (aProject.isAccessible())
+				return aProject.getDescription().getNatureIds();
+		} catch (CoreException e) {
+		}
+		return null;
+	}
+
+	protected IProjectNature getNature(IProject aProject, String natureId) {
+		try {
+			return aProject.getNature(natureId);
+		} catch (CoreException e) {
+			return null;
+		}
+	}
+
+	protected EMFWorkbenchContextBase primCreateEMFContext(IProject aProject) {
+		return new EMFWorkbenchContextBase(aProject);
+	}
+	/**
+	 * Return an existing EMFNature on <code>aProject</code>.
+	 */
+	public EMFWorkbenchContextBase getEMFContext(IProject aProject) {
+		return getCachedEMFContext(aProject);
+	}
+
+	public ResourceSetWorkbenchSynchronizer createSynchronizer(ResourceSet aResourceSet, IProject aProject) {
+		return new ResourceSetWorkbenchSynchronizer(aResourceSet, aProject);
+	}
+
+}
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/internal/util/emf/workbench/ProjectResourceSetImpl.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/internal/util/emf/workbench/ProjectResourceSetImpl.java
new file mode 100644
index 0000000..36c8f4d
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/internal/util/emf/workbench/ProjectResourceSetImpl.java
@@ -0,0 +1,274 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $$RCSfile: ProjectResourceSetImpl.java,v $$
+ *  $$Revision: 1.8 $$  $$Date: 2005/03/18 18:52:06 $$ 
+ */
+package org.eclipse.jem.internal.util.emf.workbench;
+
+import java.io.IOException;
+import java.util.*;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.impl.NotificationImpl;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.resource.impl.URIConverterImpl;
+import org.eclipse.emf.ecore.xmi.XMLResource;
+
+import org.eclipse.jem.util.emf.workbench.*;
+import org.eclipse.jem.util.emf.workbench.nature.EMFNature;
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jem.util.plugin.JEMUtilPlugin;
+
+public class ProjectResourceSetImpl extends ResourceSetImpl implements ProjectResourceSet {
+	private boolean isReleasing = false;
+	private IProject project;
+	protected List resourceHandlers = new ArrayList();
+	protected ResourceSetWorkbenchSynchronizer synchronizer;
+	protected ProjectResourceSetImpl() {
+		setURIResourceMap(new HashMap(10));	// Tell it to cache uri->resource access.
+		getLoadOptions().put(XMLResource.OPTION_USE_PARSER_POOL, EMFNature.SHARED_PARSER_POOL);
+	}
+	public ProjectResourceSetImpl(IProject aProject) {
+		this();
+		setProject(aProject);
+		initializeSharedCacheListener();
+	}
+	protected void initializeSharedCacheListener() {
+		JEMUtilPlugin.getSharedCache().beginListening(this);
+	}
+	protected boolean isReleasing() {
+		return isReleasing;
+	}
+	/**
+	 * @see org.eclipse.emf.ecore.resource.impl.ResourceSetImpl#delegatedGetResource(URI, boolean)
+	 */
+	protected Resource delegatedGetResource(URI uri, boolean loadOnDemand) {
+		Resource res = super.delegatedGetResource(uri, loadOnDemand);
+		if (res == null)
+			res = getResourceFromHandlers(uri);
+		return res;
+	}
+	public Resource createResource(URI uri) {
+		if (isReleasing) return null;
+		//Check the map first when creating the resource and do not
+		//normalize if a value is found.
+		boolean isMapped = !(((URIConverterImpl.URIMap)getURIConverter().getURIMap()).getURI(uri).equals(uri));
+		URI converted = uri;
+		if (!isMapped)
+			converted = getURIConverter().normalize(uri);
+		Resource result = createResourceFromHandlers(converted);
+		if (result == null)
+			result = super.createResource(converted);
+		
+		return result;
+	}
+	/**
+	 * @see org.eclipse.emf.ecore.resource.impl.ResourceSetImpl#demandLoad(Resource)
+	 */
+	protected void demandLoad(Resource resource) throws IOException {
+		if (!isReleasing)
+			super.demandLoad(resource);
+	}
+	
+	/**
+	 * See if any resource handlers from the WorkbenchContext
+	 * decide to create the Resource in another manner.
+	 */
+	protected Resource createResourceFromHandlers(URI uri) {
+		Resource resource = null;
+		ResourceHandler handler = null;
+		for (int i = 0; i < resourceHandlers.size(); i++) {
+			handler = (ResourceHandler) resourceHandlers.get(i);
+			resource = handler.createResource(this, uri);
+			if (resource != null)
+				return resource;
+		}
+		return null;
+	}
+	/**
+	 * See if any resource handlers from the WorkbenchContext
+	 * can return a Resource from a <code>uri</code>.
+	 */
+	protected Resource getResourceFromHandlers(URI uri) {
+		if (isReleasing) return null;
+		for (int i = 0; i < resourceHandlers.size(); i++) {
+			Resource resource = ((ResourceHandler) resourceHandlers.get(i)).getResource(this, uri);
+			if (resource != null)
+				return resource;
+		}
+		return null;
+	}
+	
+	public void release() {
+		// Send out notification of release.
+		if (eNotificationRequired()) {
+			eNotify(new NotificationImpl(SPECIAL_NOTIFICATION_TYPE, null, null, Notification.NO_INDEX, false) {
+				/* (non-Javadoc)
+				 * @see org.eclipse.emf.common.notify.impl.NotificationImpl#getFeatureID(java.lang.Class)
+				 */
+				public int getFeatureID(Class expectedClass) {
+					return PROJECTRESOURCESET_ABOUT_TO_RELEASE_ID;
+				}
+				
+				/* (non-Javadoc)
+				 * @see org.eclipse.emf.common.notify.impl.NotificationImpl#getNotifier()
+				 */
+				public Object getNotifier() {
+					return ProjectResourceSetImpl.this;
+				}
+			});
+		}
+		setIsReleasing(true);
+		if (synchronizer != null)
+			synchronizer.dispose();
+		synchronizer = null;
+		removeAndUnloadAllResources();
+		resourceHandlers = null;
+		eAdapters().clear();
+		setProject(null);
+		JEMUtilPlugin.getSharedCache().stopListening(this);
+	}
+	protected void removeAndUnloadAllResources() {
+		boolean caughtException = false;
+		if (getResources().isEmpty()) return;
+		List list = new ArrayList(getResources());
+		getResources().clear();
+		Resource res;
+		int size = list.size();
+		for (int i = 0; i < size; i++) {
+			res = (Resource) list.get(i);
+			try {
+				res.unload();
+			} catch (RuntimeException ex) {
+				Logger.getLogger().logError(ex);
+				caughtException = true;
+			}
+		}
+		if (caughtException)
+			throw new RuntimeException("Exception(s) unloading resources - check log files"); //$NON-NLS-1$
+	}
+	protected void setIsReleasing(boolean aBoolean) {
+		isReleasing = aBoolean;
+	}
+	/**
+	 * Gets the project.
+	 * @return Returns a IProject
+	 */
+	public IProject getProject() {
+		return project;
+	}
+	/**
+	 * Sets the project.
+	 * @param project The project to set
+	 */
+	protected void setProject(IProject project) {
+		this.project = project;
+	}
+	/*
+	 * Javadoc copied from interface.
+	 */
+	public EObject getEObject(URI uri, boolean loadOnDemand) {
+		if (isReleasing) return null;
+		Resource resource = getResource(uri.trimFragment(), loadOnDemand);
+		EObject result = null;
+		if (resource != null && resource.isLoaded())
+			result = resource.getEObject(uri.fragment());
+		if (result == null)
+			result = getEObjectFromHandlers(uri, loadOnDemand);
+		return result;
+	}
+	/**
+	 * See if any resource handlers from the WorkbenchContext
+	 * can return a EObject from a <code>uri</code> after
+	 * failing to find it using the normal mechanisms.
+	 */
+	protected EObject getEObjectFromHandlers(URI uri, boolean loadOnDemand) {
+		EObject obj = null;
+		ResourceHandler handler = null;
+		for (int i = 0; i < resourceHandlers.size(); i++) {
+			handler = (ResourceHandler) resourceHandlers.get(i);
+			obj = handler.getEObjectFailed(this, uri, loadOnDemand);
+			if (obj != null)
+				return obj;
+		}
+		return null;
+	}
+	
+	public boolean add(ResourceHandler resourceHandler) {
+		return resourceHandlers.add(resourceHandler);
+	}
+	public void addFirst(ResourceHandler resourceHandler) {
+		resourceHandlers.add(0, resourceHandler);
+	}
+	public boolean remove(ResourceHandler resourceHandler) {
+		return resourceHandlers.remove(resourceHandler);
+	}
+	/**
+	 * Returns the synchronizer.
+	 * @return ResourceSetWorkbenchSynchronizer
+	 */
+	public ResourceSetWorkbenchSynchronizer getSynchronizer() {
+		return synchronizer;
+	}
+	/**
+	 * Sets the synchronizer.
+	 * @param synchronizer The synchronizer to set
+	 */
+	public void setSynchronizer(ResourceSetWorkbenchSynchronizer synchronizer) {
+		this.synchronizer = synchronizer;
+	}
+	/**
+	 * @see org.eclipse.emf.ecore.resource.ResourceSet#setResourceFactoryRegistry(Resource.Factory.Registry)
+	 */
+	public void setResourceFactoryRegistry(Resource.Factory.Registry factoryReg) {
+		if (resourceFactoryRegistry != null && factoryReg != null) {
+			preserveEntries(factoryReg.getExtensionToFactoryMap(), resourceFactoryRegistry.getExtensionToFactoryMap());
+			preserveEntries(factoryReg.getProtocolToFactoryMap(), resourceFactoryRegistry.getProtocolToFactoryMap());
+		}
+		super.setResourceFactoryRegistry(factoryReg);
+	}
+	/*
+	 * Preserve the entries from map2 in map1 if no collision.
+	 */
+	protected void preserveEntries(Map map1, Map map2) {
+		if (map2.isEmpty())
+			return;
+		Iterator it = map2.entrySet().iterator();
+		Map.Entry entry;
+		while (it.hasNext()) {
+			entry = (Map.Entry) it.next();
+			if (!map1.containsKey(entry.getKey()))
+				map1.put(entry.getKey(), entry.getValue());
+		}
+	}
+	/*
+	 * Javadoc copied from interface.
+	 */
+	public Resource getResource(URI uri, boolean loadOnDemand) {
+		if (isReleasing) return null;
+		return super.getResource(uri, loadOnDemand);
+	}
+
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.util.emf.workbench.ProjectResourceSet#resetNormalizedURICache()
+	 */
+	public void resetNormalizedURICache() {
+		if (getURIResourceMap() != null)
+			getURIResourceMap().clear();
+	}
+
+}
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/internal/util/emf/workbench/WorkspaceResourceHandler.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/internal/util/emf/workbench/WorkspaceResourceHandler.java
new file mode 100644
index 0000000..9234123
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/internal/util/emf/workbench/WorkspaceResourceHandler.java
@@ -0,0 +1,147 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $$RCSfile: WorkspaceResourceHandler.java,v $$
+ *  $$Revision: 1.2 $$  $$Date: 2005/02/15 23:04:14 $$ 
+ */
+package org.eclipse.jem.internal.util.emf.workbench;
+
+import org.eclipse.core.resources.*;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.URIConverterImpl;
+
+import org.eclipse.jem.util.emf.workbench.ResourceHandler;
+import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
+import org.eclipse.jem.util.plugin.JEMUtilPlugin;
+
+/**
+ * The main purpose of this class is to redirect, if necessary, to another 
+ * ResourceSet.  This class should be used in conjunction with the WorkbenchURIConverter
+ * so that the URIs passed will use the platform protocol.  Anything else will be considered
+ * to be ambiguous and we will not be able to redirect.
+ */
+public class WorkspaceResourceHandler implements ResourceHandler {
+	/**
+	 * Constructor for WorkspaceResourceHandler.
+	 */
+	public WorkspaceResourceHandler() {
+		super();
+	}
+	/*
+	* @see IResourceHandler#getResource(ResourceSet, URI)
+	*/
+	public Resource getResource(ResourceSet originatingResourceSet, URI uri) {
+		if (WorkbenchResourceHelperBase.isPlatformResourceURI(uri))
+			return getResourceForPlatformProtocol(originatingResourceSet, uri);
+		URI mappedURI = ((URIConverterImpl.URIMap)originatingResourceSet.getURIConverter().getURIMap()).getURI(uri);
+		if (isGlobalPluginLoad(mappedURI))
+			return getResourceForPlatformPluginProtocol(originatingResourceSet, uri);
+		return null;
+	}
+	/**
+	 * Redirect to the correct project based on the project name in the <code>uri</code>.
+	 * The <code>uri</code> will be in the following format:   platform:/resource/[project name].
+	 */
+	protected Resource createResourceForPlatformProtocol(ResourceSet originatingResourceSet, URI uri) {
+		String projectName = uri.segment(1);
+		IProject project = getProject(projectName);
+		if (project != null && project.isAccessible()) {
+			ResourceSet set = WorkbenchResourceHelperBase.getResourceSet(project);
+			if (originatingResourceSet != set)
+				return createResource(uri, set);
+		}
+		return null;
+	}
+	/**
+		 * Redirect to the correct project based on the project name in the <code>uri</code>.
+		 * The <code>uri</code> will be in the following format:   platform:/resource/[project name].
+		 */
+	protected Resource createResourceForPlatformPluginProtocol(ResourceSet originatingResourceSet, URI uri) {
+			
+		ResourceSet set = JEMUtilPlugin.getPluginResourceSet();
+		return createResource(uri, set);
+		}
+	protected Resource createResource(URI uri, ResourceSet redirectedResourceSet) {
+		return redirectedResourceSet.createResource(uri);
+	}
+	/**
+	 * Redirect to the correct project based on the first segment in the file name.
+	 * This is for compatability purposes for people using the platform:/resource protocol.
+	 */
+	protected Resource getResourceForPlatformProtocol(ResourceSet originatingResourceSet, URI uri) {
+		String projectName = uri.segment(1);
+		IProject project = getProject(projectName);
+		if (project != null && project.isAccessible()) {
+			ResourceSet set = WorkbenchResourceHelperBase.getResourceSet(project);
+			if (originatingResourceSet != set)
+				return getResource(uri, set);
+		}
+		return null;
+	}
+	/**
+		 * Redirect to the correct project based on the first segment in the file name.
+		 * This is for compatability purposes for people using the platform:/resource protocol.
+		 */
+	protected Resource getResourceForPlatformPluginProtocol(ResourceSet originatingResourceSet, URI uri) {
+			
+		ResourceSet set = JEMUtilPlugin.getPluginResourceSet();
+		return getResource(uri, set);
+			
+	}
+	protected Resource getResource(URI uri, ResourceSet redirectedResourceSet) {
+		return redirectedResourceSet.getResource(uri, false);
+	}
+	
+	protected IWorkspace getWorkspace() {
+		return ResourcesPlugin.getWorkspace();
+	}
+	protected IProject getProject(String projectName) {
+		IWorkspace ws = getWorkspace();
+		if (ws == null)
+			return null;
+		return ws.getRoot().getProject(projectName);
+	}
+	protected IProject getProject(ResourceSet resourceSet) {
+		return WorkbenchResourceHelperBase.getProject(resourceSet);
+	}
+	/**
+	 * @see org.eclipse.jem.util.ResourceHandler#createResource(ResourceSet, URI)
+	 */
+	public Resource createResource(ResourceSet originatingResourceSet, URI uri) {
+		if (WorkbenchResourceHelperBase.isPlatformResourceURI(uri))
+			return createResourceForPlatformProtocol(originatingResourceSet, uri);
+		URI mappedURI = ((URIConverterImpl.URIMap)originatingResourceSet.getURIConverter().getURIMap()).getURI(uri);
+		if (isGlobalPluginLoad(mappedURI))
+			return createResourceForPlatformPluginProtocol(originatingResourceSet, uri);
+		return null;
+	}
+	/**
+	 * @see org.eclipse.jem.util.ResourceHandler#getEObjectFailed(ResourceSet, URI, boolean)
+	 * Subclasses may override.
+	 */
+	public EObject getEObjectFailed(ResourceSet originatingResourceSet, URI uri, boolean loadOnDemand) {
+		return null;
+	}
+	
+	protected boolean isGlobalPluginLoad(URI aURI) {
+		if (WorkbenchResourceHelperBase.isPlatformPluginResourceURI(aURI)) {
+			String[] globalPlugins = JEMUtilPlugin.getGlobalLoadingPluginNames();
+			for (int i=0;i<globalPlugins.length;i++) {
+				if (aURI.segment(1).startsWith(globalPlugins[i]))
+					return true;
+			}
+		}
+		return false;
+	}
+}
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/internal/util/emf/workbench/WorkspaceResourceNotifier.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/internal/util/emf/workbench/WorkspaceResourceNotifier.java
new file mode 100644
index 0000000..6c10afe
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/internal/util/emf/workbench/WorkspaceResourceNotifier.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $$RCSfile: WorkspaceResourceNotifier.java,v $$
+ *  $$Revision: 1.2 $$  $$Date: 2005/02/15 23:04:14 $$ 
+ */
+package org.eclipse.jem.internal.util.emf.workbench;
+
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.emf.common.notify.impl.NotifierImpl;
+
+import org.eclipse.jem.util.emf.workbench.ProjectResourceSet;
+
+/**
+ * This class is used to capture all ADD and REMOVE notifications from each ProjectResourceSet
+ * and forward it on to any interrested listeners.  This is to allow you to listen to one object
+ * to gain all ADD and REMOVE notifications for each ResourceSet within the system.
+ */
+public class WorkspaceResourceNotifier extends NotifierImpl {
+	protected Adapter projectAdapter = new WorkspaceResourceCacheAdapter();
+
+	class WorkspaceResourceCacheAdapter extends AdapterImpl {
+		/**
+		 * Forward ADD and REMOVE notification.
+		 */
+		public void notifyChanged(Notification msg) {
+			switch (msg.getEventType()) {
+				case Notification.ADD :
+				case Notification.ADD_MANY :
+				case Notification.REMOVE :
+				case Notification.REMOVE_MANY :
+					eNotify(msg);
+					break;
+			}
+		}
+	}
+
+	/**
+	 * Constructor for WorkspaceResourceCache.
+	 */
+	public WorkspaceResourceNotifier() {
+		super();
+	}
+
+	/**
+	 * Begin listening to a ProjectResourceSet.
+	 */
+	public void beginListening(ProjectResourceSet aResourceSet) {
+		if (aResourceSet != null) { 
+			if (aResourceSet.eAdapters() == null ||  
+			!aResourceSet.eAdapters().contains(projectAdapter))
+			aResourceSet.eAdapters().add(projectAdapter);
+		}
+	}
+	/**
+	 * Stop listening to a ProjectResourceSet.
+	 */
+	public void stopListening(ProjectResourceSet aResourceSet) {
+		if (aResourceSet != null)
+			aResourceSet.eAdapters().remove(projectAdapter);
+	}
+}
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/internal/util/emf/workbench/nature/EMFNatureRegistry.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/internal/util/emf/workbench/nature/EMFNatureRegistry.java
new file mode 100644
index 0000000..f85f7b0
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/internal/util/emf/workbench/nature/EMFNatureRegistry.java
@@ -0,0 +1,74 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $$RCSfile: EMFNatureRegistry.java,v $$
+ *  $$Revision: 1.2 $$  $$Date: 2005/02/15 23:04:14 $$ 
+ */
+package org.eclipse.jem.internal.util.emf.workbench.nature;
+
+import java.util.HashSet;
+import java.util.Set;
+
+
+import org.eclipse.core.runtime.*;
+
+import org.eclipse.jem.internal.util.emf.workbench.nls.EMFWorkbenchResourceHandler;
+import org.eclipse.jem.util.logger.proxy.Logger;
+
+public class EMFNatureRegistry {
+
+	private static final String NATURE_REGISTRATION_POINT = "org.eclipse.jem.util.nature_registration"; //$NON-NLS-1$
+	private static final String NATURE  = "nature"; //$NON-NLS-1$
+	private static final String STATIC_ID = "id"; //$NON-NLS-1$
+
+	/**
+	 * Constructor
+	 */
+	private EMFNatureRegistry() {
+		super();
+		readRegistry();
+	}
+	
+	private static EMFNatureRegistry singleton;
+	
+	public final Set REGISTERED_NATURE_IDS = new HashSet();
+	
+	public static EMFNatureRegistry singleton() {
+		if (singleton == null)
+			singleton = new EMFNatureRegistry();
+		return singleton;
+	}
+	
+	protected void readRegistry() {
+	// register Nature IDs for the J2EENatures
+		IExtensionRegistry r = Platform.getExtensionRegistry();
+		IConfigurationElement[] ce = r.getConfigurationElementsFor(NATURE_REGISTRATION_POINT);
+		String natureId;
+		for (int i=0; i<ce.length; i++) {
+			if (ce[i].getName().equals(NATURE)) {
+				natureId = ce[i].getAttribute(STATIC_ID);
+				if (natureId != null)
+					registerNatureID(natureId);
+			}
+		}
+	}
+
+	/**
+	 * @param natureId
+	 */
+	private void registerNatureID(String natureId) {
+		if (!REGISTERED_NATURE_IDS.contains(natureId))
+			REGISTERED_NATURE_IDS.add(natureId);
+		else
+			Logger.getLogger().logError(EMFWorkbenchResourceHandler.getString("EMFNatureRegistry_ERROR_0", new Object[] {natureId})); //$NON-NLS-1$
+	}
+
+}
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/internal/util/emf/workbench/nls/EMFWorkbenchResourceHandler.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/internal/util/emf/workbench/nls/EMFWorkbenchResourceHandler.java
new file mode 100644
index 0000000..31a8e45
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/internal/util/emf/workbench/nls/EMFWorkbenchResourceHandler.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $$RCSfile: EMFWorkbenchResourceHandler.java,v $$
+ *  $$Revision: 1.2 $$  $$Date: 2005/02/15 23:04:14 $$ 
+ */
+package org.eclipse.jem.internal.util.emf.workbench.nls;
+
+import java.text.MessageFormat;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class EMFWorkbenchResourceHandler {
+
+	private static ResourceBundle fgResourceBundle;
+
+	/**
+	 * Returns the resource bundle used by all classes in this Project
+	 */
+	public static ResourceBundle getResourceBundle() {
+		try {
+			return ResourceBundle.getBundle("emfworkbench");//$NON-NLS-1$
+		} catch (MissingResourceException e) {
+			// does nothing - this method will return null and
+			// getString(String, String) will return the key
+			// it was called with
+		}
+		return null;
+	}
+	public static String getString(String key) {
+		if (fgResourceBundle == null) {
+			fgResourceBundle= getResourceBundle();
+		}
+		
+		if (fgResourceBundle != null) {
+			try {
+				return fgResourceBundle.getString(key);
+			} catch (MissingResourceException e) {
+				return "!" + key + "!";//$NON-NLS-2$//$NON-NLS-1$
+			}
+		} else {
+			return "!" + key + "!";//$NON-NLS-2$//$NON-NLS-1$
+		}
+	}
+public static String getString(String key, Object[] args) {
+
+	try {return MessageFormat.format(getString(key), args);}
+	catch (IllegalArgumentException e) {return getString(key);}
+
+}
+public static String getString(String key, Object[] args, int x) {
+
+		return getString(key);
+	}
+}
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/CharacterUtil.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/CharacterUtil.java
new file mode 100644
index 0000000..afe7279
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/CharacterUtil.java
@@ -0,0 +1,279 @@
+/*******************************************************************************
+ * Copyright (c) 2006 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: CharacterUtil.java,v $
+ *  $Revision: 1.1 $  $Date: 2006/02/24 17:32:14 $ 
+ */
+package org.eclipse.jem.util;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import com.ibm.icu.text.UTF16;
+ 
+
+/**
+ * Static helper to handle characters in the new UTF multi-char format.
+ * It is needed because ICU4J currently doesn't handle some correctly yet that we
+ * need to have working. As ICU4J gets them working, the methods here will become
+ * deprecated.
+ * 
+ * @since 1.2.0
+ */
+public class CharacterUtil {
+
+	private CharacterUtil() {
+		
+	}
+	
+	
+	/**
+	 * TODO So until ICU4J does work correctly this util will be needed. It will
+	 * stay around because it is API, but at that time it will be marked deprecated. It should
+	 * also then reroute to ICU4J instead of doing the method reflections.
+	 */
+	private static Method METHOD_JAVA_IDENTIFIER_START, METHOD_JAVA_IDENTIFIER_PART;
+	
+	static {
+		// Try to get the Character.isJavaIdentifier(int) method. If there, then we are in 1.5 or above. Else use the char form.
+		try {
+			METHOD_JAVA_IDENTIFIER_START = Character.class.getMethod("isJavaIdentifierStart", new Class[] {Integer.TYPE});
+		} catch (SecurityException e) {
+			// Default to use (char) type instead.
+			METHOD_JAVA_IDENTIFIER_START = null;
+		} catch (NoSuchMethodException e) {
+			// Default to use (char) type instead.
+			METHOD_JAVA_IDENTIFIER_START = null;
+		}
+		try {
+			METHOD_JAVA_IDENTIFIER_PART = Character.class.getMethod("isJavaIdentifierPart", new Class[] {Integer.TYPE});
+		} catch (SecurityException e) {
+			// Default to use (char) type instead.
+			METHOD_JAVA_IDENTIFIER_PART = null;
+		} catch (NoSuchMethodException e) {
+			// Default to use (char) type instead.
+			METHOD_JAVA_IDENTIFIER_PART = null;
+		}		
+	}
+
+	/**
+	 * Is start of java identifier
+	 * @param intChar int character (UTF multi-char is valid)
+	 * @return <code>true</code> if start of java identifier.
+	 * 
+	 * @see Character#isJavaIdentifierStart(char)
+	 * @since 1.2.0
+	 */
+	public static boolean isJavaIdentifierStart(int intChar) {
+		if (METHOD_JAVA_IDENTIFIER_START != null) {
+			try {
+				return ((Boolean) METHOD_JAVA_IDENTIFIER_START.invoke(null, new Object[] {new Integer(intChar)})).booleanValue();
+			} catch (IllegalArgumentException e) {
+			} catch (IllegalAccessException e) {
+			} catch (InvocationTargetException e) {
+			}
+		}
+		return Character.isJavaIdentifierStart((char) intChar);
+	}
+	
+	/**
+	 * Is start of java identifier
+	 * @param intChar int character (UTF multi-char is valid)
+	 * @return <code>true</code> if start of java identifier.
+	 * 
+	 * @see Character#isJavaIdentifierStart(char)
+	 * @since 1.2.0
+	 */
+	public static boolean isJavaIdentifierPart(int intChar) {
+		if (METHOD_JAVA_IDENTIFIER_PART != null) {
+			try {
+				return ((Boolean) METHOD_JAVA_IDENTIFIER_PART.invoke(null, new Object[] {new Integer(intChar)})).booleanValue();
+			} catch (IllegalArgumentException e) {
+			} catch (IllegalAccessException e) {
+			} catch (InvocationTargetException e) {
+			}
+		}
+		return Character.isJavaIdentifierPart((char) intChar);
+	}
+	
+	public static abstract class AbstractCharIterator {
+
+		
+		protected final CharSequence charSeq;
+		private int pos = 0;
+		private int lastCharIndex = 0;
+
+		/**
+		 * Create with a string.
+		 * @param charSeq
+		 * 
+		 * @since 1.2.0
+		 */
+		public AbstractCharIterator(CharSequence charSeq) {
+			this.charSeq = charSeq;
+		}
+		
+		/**
+		 * Set the next char index.
+		 * @param index
+		 * 
+		 * @since 1.2.0
+		 */
+		public void setIndex(int index) {
+			pos = index;
+		}
+
+		/**
+		 * Has another char.
+		 * @return <code>true</code> if there is another char to return.
+		 * 
+		 * @since 1.2.0
+		 */
+		public boolean hasNext() {
+			return pos < charSeq.length();
+		}
+		
+		/**
+		 * Has another char before the current position. Doing previous
+		 * will return the char that was just returned.
+		 * @return
+		 * 
+		 * @since 1.2.0
+		 */
+		public boolean hasPrevious() {
+			return pos > 0;
+		}
+		
+		/**
+		 * Return next char from the one that was just returned.
+		 * @return next char.
+		 * 
+		 * @since 1.2.0
+		 */
+		public int next() {
+			if (!hasNext())
+				throw new IllegalStateException();
+			
+			int next = utfCharAt(pos);
+			lastCharIndex = pos;
+			pos += UTF16.getCharCount(next);
+			return next;
+		}
+		
+		/**
+		 * Return the UTF-32 char at the given position.
+		 * @param pos
+		 * @return
+		 * 
+		 * @since 1.2.0
+		 */
+		protected abstract int utfCharAt(int pos);
+		
+		/**
+		 * Return the previous character from the one that was just returned.
+		 * @return
+		 * 
+		 * @since 1.2.0
+		 */
+		public int previous() {
+			if (!hasPrevious())
+				throw new IllegalStateException();
+
+			int next;
+			if (UTF16.isTrailSurrogate(charSeq.charAt(--pos))) {
+				if (pos > 0)
+					next = utfCharAt(--pos);
+				else
+					next = charSeq.charAt(pos);
+			} else {
+				next = charSeq.charAt(pos);
+			}
+			lastCharIndex = pos;
+			return next;
+		}
+		
+		/**
+		 * Return the UTF16 character position of the char that was just returned from either
+		 * previous or next.
+		 * This is the (char) position not the
+		 * position of logical int chars returned. For example a standard string of
+		 * <code>"abc"</code> the position of the char 'b' is 1. But take the string
+		 * <code>"ab1b2c"</code> where "b1b2" is one UTF-32 char, then the position
+		 * of 'c' is 3. It would not be 2, which is what the logical char position
+		 * would be if taking UFT32 into account.
+		 * @return
+		 * 
+		 * @since 1.2.0
+		 */
+		public int getPosition() {
+			return lastCharIndex;
+		}
+	
+	}
+	
+	/**
+	 * Special char iterator that returns ints instead of chars for
+	 * walking strings that can contain UTF multi-chars. This is
+	 * a limited version of {@link java.text.CharacterIterator}.
+	 * 
+	 * @since 1.2.0
+	 */
+	public static class StringIterator extends AbstractCharIterator {
+		
+
+		/**
+		 * Create with a string.
+		 * @param str
+		 * 
+		 * @since 1.2.0
+		 */
+		public StringIterator(String str) {
+			super(str);
+		}
+		
+		/* (non-Javadoc)
+		 * @see org.eclipse.jem.util.CharacterUtil.AbstractCharIterator#utfCharAt(int)
+		 */
+		protected int utfCharAt(int pos) {
+			return UTF16.charAt((String) charSeq, pos);
+		}
+		
+	}
+	
+	/**
+	 * Special char iterator that returns ints instead of chars for
+	 * walking strings that can contain UTF multi-chars. This is
+	 * a limited version of {@link java.text.CharacterIterator}.
+	 * 
+	 * @since 1.2.0
+	 */
+	public static class StringBufferIterator extends AbstractCharIterator {
+		
+
+		/**
+		 * Create with a string.
+		 * @param strBuffer
+		 * 
+		 * @since 1.2.0
+		 */
+		public StringBufferIterator(StringBuffer strBuffer) {
+			super(strBuffer);
+		}
+		
+		/* (non-Javadoc)
+		 * @see org.eclipse.jem.util.CharacterUtil.AbstractCharIterator#utfCharAt(int)
+		 */
+		protected int utfCharAt(int pos) {
+			return UTF16.charAt((StringBuffer) charSeq, pos);
+		}
+		
+	}	
+}
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/NotPresentPerformanceMonitor.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/NotPresentPerformanceMonitor.java
new file mode 100644
index 0000000..54af2bd
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/NotPresentPerformanceMonitor.java
@@ -0,0 +1,55 @@
+package org.eclipse.jem.util;
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $$RCSfile: NotPresentPerformanceMonitor.java,v $$
+ *  $$Revision: 1.3 $$  $$Date: 2005/02/15 23:04:14 $$ 
+ */
+/**
+ * This is the instantiation to use if the performance monitor plugin is not installed. It basically does nothing.
+ * 
+ * <p>
+ * This class is not intended to be instantiated by clients.
+ * </p>
+ * 
+ * @since 1.0.0
+ */
+public class NotPresentPerformanceMonitor extends PerformanceMonitorUtil {
+
+	/*
+	 * Only instantiated from this package.
+	 */
+	NotPresentPerformanceMonitor() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.PerformanceMonitorUtil#setVar(java.lang.String)
+	 */
+	public void setVar(String var) {
+	}
+
+	/*
+	 *  (non-Javadoc)
+	 * @see org.eclipse.jem.util.PerformanceMonitorUtil#doSnapshot(int, int)
+	 */
+	protected void doSnapshot(int step, int types) {
+	}
+
+
+	/*
+	 *  (non-Javadoc)
+	 * @see org.eclipse.jem.util.PerformanceMonitorUtil#doSnapshot(int)
+	 */
+	protected void doSnapshot(int step) {
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/PerformanceMonitorUtil.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/PerformanceMonitorUtil.java
new file mode 100644
index 0000000..a76fdd0
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/PerformanceMonitorUtil.java
@@ -0,0 +1,280 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: PerformanceMonitorUtil.java,v $
+ *  $Revision: 1.7 $  $Date: 2005/08/24 21:10:34 $ 
+ */
+package org.eclipse.jem.util;
+import java.util.EventObject;
+
+import org.eclipse.perfmsr.core.IPerformanceMonitor;
+
+/**
+ * This is a simplified wrapper to the IPerformanceMonitor that hides it so that the actual plugin can be optional and not required.
+ * 
+ * <p>
+ * This class is not meant to be subclassed by clients.
+ * </p>
+ * 
+ * @since 1.0.0
+ */
+public abstract class PerformanceMonitorUtil {
+	/**
+	 * Event for PerformanceListener notification.
+	 * 
+	 * @since 1.1.0
+	 */
+	public static class PerformanceEvent extends EventObject {
+		
+		/**
+		 * Comment for <code>serialVersionUID</code>
+		 * 
+		 * @since 1.1.0
+		 */
+		private static final long serialVersionUID = -4680071462750180339L;
+
+		PerformanceEvent(Object source, int step) {
+			super(source);
+			snapshowWithTypes = false;
+			this.step = step;
+			this.types = 0;	// Not set.
+		}
+		
+		PerformanceEvent(Object source, int step, int types) {
+			super(source);
+			snapshowWithTypes = true;
+			this.step = step;
+			this.types = types;
+		}
+
+		
+		/**
+		 * Snapshot with types if <code>true</code>.
+		 * @since 1.1.0
+		 */
+		public final boolean snapshowWithTypes;
+
+		/**
+		 * Step of snapshot
+		 * @since 1.1.0
+		 */
+		public final int step;
+		
+		/**
+		 * types of snapshot.
+		 * @since 1.1.0
+		 */
+		public final int types;
+	}
+	
+	/**
+	 * Performance Listener interface
+	 * 
+	 * @since 1.1.0
+	 */
+	public interface PerformanceListener {
+		/**
+		 * Snapshot was called.
+		 * @param event
+		 * 
+		 * @since 1.1.0
+		 */
+		public void snapshot(PerformanceEvent event);
+	}
+	
+	private PerformanceListener[] listeners;
+
+	public interface Types {
+
+		/**
+		 * 1 - Write out the performance counters from the operating system. These include working set, peak working set, elapsed time, user time, and
+		 * kernel time.
+		 */
+		int OperatingSystemCounters = IPerformanceMonitor.Types.OperatingSystemCounters;
+
+		/**
+		 * 2 - Write out the global performance info. This includes things like the total committed memory for the entire system.
+		 * 
+		 * This function depends on the GetPerformanceInfo() function being available in the Windows psapi.dll. This is available in XP but is usually
+		 * not available in Win/2000. If it is not available then this function throws an UnsupportedOperationException.
+		 */
+		int GlobalSystemCounters = IPerformanceMonitor.Types.GlobalSystemCounters;
+
+		/**
+		 * 4 - Write out the size of the Java Heap.
+		 */
+		int JavaHeapSize = IPerformanceMonitor.Types.JavaHeapSize;
+
+		/**
+		 * 8 - Write out how much of the Java heap is being used. This calls the garbage collector so it may skew timing results.
+		 */
+		int JavaHeapUsed = IPerformanceMonitor.Types.JavaHeapUsed;
+
+		/**
+		 * 16 - The plugin startup and size information.
+		 */
+		int PluginInfo = IPerformanceMonitor.Types.PluginInfo;
+
+		/** 0xffff - Everything. */
+		int All = IPerformanceMonitor.Types.All;
+	}
+
+	private static PerformanceMonitorUtil sharedMonitor;
+
+	public static PerformanceMonitorUtil getMonitor() {
+		if (sharedMonitor == null) {
+			try {
+				Class.forName("org.eclipse.perfmsr.core.PerfMsrCorePlugin"); // This just tests if the performance plugin is available. Throws //$NON-NLS-1$
+																			 // exception otherwise.
+				Class presentClass = Class.forName("org.eclipse.jem.util.PresentPerformanceMonitor"); // Get the class we use wrapper it. //$NON-NLS-1$
+				sharedMonitor = (PerformanceMonitorUtil) presentClass.newInstance();
+				if (!sharedMonitor.isValid())
+					sharedMonitor = null;
+			} catch (RuntimeException e) {
+				// If any runtime exception, just use the not present one.
+			} catch (ClassNotFoundException e) {
+				// If class not found, then plugin not available, so just use the not present one.
+			} catch (InstantiationException e) {
+				// Problem instantiating, so just use the not present one.
+			} catch (IllegalAccessException e) {
+				// Some illegal access, so just use the not present one.
+			}
+			if (sharedMonitor == null) {
+				// Couldn't get the performance one for some reason. Use not present one instead.
+				sharedMonitor = new NotPresentPerformanceMonitor();
+			}
+		}
+		return sharedMonitor;
+	}
+	
+	protected boolean isValid() {
+		return true;
+	}
+
+	/**
+	 * Set the variations that are in effect.
+	 * 
+	 * @param var
+	 *            a comma delimited string of variation numbers
+	 */
+	public abstract void setVar(String var);
+
+	/**
+	 * Take a snapshot of some default performance measurements.
+	 * 
+	 * @param step
+	 *            this identifies the step that the snapshot is for
+	 */
+	public final void snapshot(int step) {
+		doSnapshot(step);
+		if (listeners != null)
+			notifySnapshot(new PerformanceEvent(this, step));
+	}
+	
+	private void notifySnapshot(PerformanceEvent event) {
+		PerformanceListener[] list = listeners;
+		for (int i = 0; i < list.length; i++) {
+			list[i].snapshot(event);
+		}
+	}
+	
+	/**
+	 * Do the actual snapshot
+	 * @param step
+	 * 
+	 * @see #snapshot(int)
+	 * @since 1.1.0
+	 */
+	protected abstract void doSnapshot(int step);
+
+	/**
+	 * Take a snapshot of the selected performance measurements.
+	 * 
+	 * @param step
+	 *            this identifies the step that the snapshot is for
+	 * 
+	 * @param types
+	 *            This controls which measurements are selected. It is an or'd together list of the IPerformanceMonitor.Types constants.
+	 * 
+	 * @see IPerformanceMonitor.Types
+	 */
+	public void snapshot(int step, int types) {
+		doSnapshot(step, types);
+		if (listeners != null)
+			notifySnapshot(new PerformanceEvent(this, step, types));		
+	}
+	
+	/**
+	 * Do the actual snapshot
+	 * @param step
+	 * 
+	 * @see #snapshot(int, int)
+	 * @since 1.1.0
+	 */
+	protected abstract void doSnapshot(int step, int types);	
+	
+	/**
+	 * Add listener to list.
+	 * @param listener
+	 * 
+	 * @since 1.1.0
+	 */
+	public void addPerformanceListener(PerformanceListener listener) {
+		if (findListener(listener) != -1)
+			return;
+		PerformanceListener[] newList = new PerformanceListener[listeners != null ? listeners.length+1 : 1];
+		if (listeners != null)
+			System.arraycopy(listeners, 0, newList, 0, listeners.length);
+		newList[newList.length-1] = listener;
+		listeners = newList;
+	}
+	
+	private int findListener(PerformanceListener listener) {
+		if (listeners != null) {
+			for (int i = 0; i < listeners.length; i++) {
+				if (listeners[i] == listener)
+					return i;
+			}
+		}
+		return -1;
+	}
+	
+	/**
+	 * Remove the listener from the list.
+	 * @param listener
+	 * 
+	 * @since 1.1.0
+	 */
+	public void removePerformanceListener(PerformanceListener listener) {
+		int index = findListener(listener);
+		if (index != -1) {
+			if (listeners.length == 1) {
+				listeners = null;
+				return;
+			}
+			PerformanceListener[] newList = new PerformanceListener[listeners.length-1];
+			System.arraycopy(listeners, 0, newList, 0, index);
+			System.arraycopy(listeners, index+1, newList, index, newList.length-index);
+			listeners = newList;
+		}
+	}
+	/**
+	 * Upload the results to the server. This causes the file to be
+	 * closed, and the monitor to be placed into the finished state.
+	 * 
+	 * This method can only be called if the uploadhost, uploadport and uploaduserid
+	 * have been configured before hand.
+	 * 
+	 * @param description an optional description (it can be null)
+	 * 
+	 */
+	public boolean upload(String description){return false;}
+}
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/PresentPerformanceMonitor.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/PresentPerformanceMonitor.java
new file mode 100644
index 0000000..3ee5b05
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/PresentPerformanceMonitor.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: PresentPerformanceMonitor.java,v $
+ *  $Revision: 1.5 $  $Date: 2005/08/24 21:10:34 $ 
+ */
+package org.eclipse.jem.util;
+import org.eclipse.perfmsr.core.IPerformanceMonitor;
+import org.eclipse.perfmsr.core.PerfMsrCorePlugin;
+
+/**
+ * This is the version used when the performance plugin is available.
+ * 
+ * <p>
+ * This class is not meant to be instantiated by clients.
+ * </p>
+ * 
+ * @since 1.0.0
+ */
+public class PresentPerformanceMonitor extends PerformanceMonitorUtil {
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.util.PerformanceMonitorUtil#upload(java.lang.String)
+	 */
+	public boolean upload(String description) {
+		return monitor.upload(description).success;
+	}
+	
+	private IPerformanceMonitor monitor;
+
+	/*
+	 * So that only instantiated by this package.
+	 */
+	PresentPerformanceMonitor() {
+		monitor = PerfMsrCorePlugin.getPerformanceMonitor(true);
+	}
+	
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jem.util.PerformanceMonitorUtil#isValid()
+	 */
+	protected boolean isValid() {
+		return monitor != null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.PerformanceMonitorUtil#setVar(java.lang.String)
+	 */
+	public void setVar(String var) {
+		monitor.setVar(var);
+	}
+
+	/*
+	 *  (non-Javadoc)
+	 * @see org.eclipse.jem.util.PerformanceMonitorUtil#doSnapshot(int)
+	 */
+	protected void doSnapshot(int step) {
+		monitor.snapshot(step);
+	}
+
+	/*
+	 *  (non-Javadoc)
+	 * @see org.eclipse.jem.util.PerformanceMonitorUtil#doSnapshot(int, int)
+	 */
+	protected void doSnapshot(int step, int types) {
+		monitor.snapshot(step, types);
+	}
+
+}
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/RegistryReader.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/RegistryReader.java
new file mode 100644
index 0000000..37e8277
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/RegistryReader.java
@@ -0,0 +1,156 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $$RCSfile: RegistryReader.java,v $$
+ *  $$Revision: 1.5 $$  $$Date: 2006/05/17 20:13:45 $$ 
+ */
+package org.eclipse.jem.util;
+import org.eclipse.core.runtime.*;
+import org.osgi.framework.Bundle;
+
+import org.eclipse.jem.util.logger.proxy.Logger;
+
+
+/**
+ * Class to read a registry. It is meant to be subclassed to provide specific function.
+ * 
+ * @since 1.0.0
+ */
+public abstract class RegistryReader {
+
+	String pluginId;
+
+	String extensionPointId;
+
+	private static Bundle systemBundle;
+
+	/**
+	 * Utility method to get the plugin id of a configuation element
+	 * 
+	 * @param configurationElement
+	 * @return plugin id of configuration element
+	 * @since 1.0.0
+	 */
+	public static String getPluginId(IConfigurationElement configurationElement) {
+		String pluginId = null;
+
+		if (configurationElement != null) {
+			IExtension extension = configurationElement.getDeclaringExtension();
+
+			if (extension != null)
+				pluginId = extension.getContributor().getName();
+		}
+
+		return pluginId;
+	}
+
+	/**
+	 * Constructor for RegistryReader taking a registry, plugin id, and extension point id.
+	 * 
+	 * @param registry
+	 * @param pluginID
+	 * @param extensionPoint
+	 * 
+	 * @deprecated Use RegistryReader(plugin, extensionPoint) instead. The registry passed in is ignored.
+	 * @since 1.0.0
+	 */
+	public RegistryReader(IPluginRegistry registry, String pluginID, String extensionPoint) {
+		this(pluginID, extensionPoint);
+	}
+
+	/**
+	 * Constructor for RegistryReader taking the plugin id and extension point id.
+	 * 
+	 * @param pluginID
+	 * @param extensionPoint
+	 * 
+	 * @since 1.0.0
+	 */
+	public RegistryReader(String pluginID, String extensionPoint) {
+		super();
+		this.pluginId = pluginID;
+		extensionPointId = extensionPoint;
+	}
+
+	private void internalReadElement(IConfigurationElement element) {
+		boolean recognized = this.readElement(element);
+		if (!recognized) {
+			logError(element, "Error processing extension: " + element); //$NON-NLS-1$
+		}
+	}
+
+	/*
+	 * Logs the error in the desktop log using the provided text and the information in the configuration element.
+	 */
+	protected void logError(IConfigurationElement element, String text) {
+		IExtension extension = element.getDeclaringExtension();
+		StringBuffer buf = new StringBuffer();
+		buf.append("Plugin " + extension.getContributor().getName() + ", extension " + extension.getExtensionPointUniqueIdentifier()); //$NON-NLS-1$ //$NON-NLS-2$
+		buf.append("\n" + text); //$NON-NLS-1$
+		Logger.getLogger().logError(buf.toString());
+	}
+
+	/*
+	 * Logs a very common registry error when a required attribute is missing.
+	 */
+	protected void logMissingAttribute(IConfigurationElement element, String attributeName) {
+		logError(element, "Required attribute '" + attributeName + "' not defined"); //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	/*
+	 * Implement this method to read element attributes. If this element has subelements, the reader will recursively cycle through them and call this
+	 * method so don't do it here.
+	 */
+	public abstract boolean readElement(IConfigurationElement element);
+
+	/**
+	 * Read the extension point and parse it.
+	 * 
+	 * @since 1.0.0
+	 */
+	public void readRegistry() {
+		IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(pluginId, extensionPointId);
+		if (point == null)
+			return;
+		IConfigurationElement[] elements = point.getConfigurationElements();
+		for (int i = 0; i < elements.length; i++) {
+			internalReadElement(elements[i]);
+		}
+	}
+
+	/**
+	 * Tests to see if it is valid at this point in time to create an executable extension. A valid reason not to would be that the workspace is
+	 * shutting donw.
+	 * 
+	 * @param element
+	 * @return <code>true</code> if it is valid point to create an executable extension.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static boolean canCreateExecutableExtension(IConfigurationElement element) {
+		if (Platform.isRunning() && getSystemBundle().getState() != Bundle.STOPPING)
+			return true;
+		return false;
+	}
+
+	/**
+	 * Get the system bundle
+	 * 
+	 * @return system bundle.
+	 * 
+	 * @since 1.0.0
+	 */
+	protected static Bundle getSystemBundle() {
+		if (systemBundle == null)
+			systemBundle = Platform.getBundle("org.eclipse.osgi"); //$NON-NLS-1$
+		return systemBundle;
+	}
+}
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/TimerTests.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/TimerTests.java
new file mode 100644
index 0000000..57f5b4e
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/TimerTests.java
@@ -0,0 +1,352 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: TimerTests.java,v $
+ *  $Revision: 1.8 $  $Date: 2006/05/17 20:13:45 $ 
+ */
+package org.eclipse.jem.util;
+
+import java.text.NumberFormat;
+import java.util.*;
+
+/**
+ * 
+ * @since 1.0.2
+ */
+public class TimerTests {
+
+	/**
+	 * Default TimerTests class to use when not using your own. It's a global.
+	 */
+	public static TimerTests basicTest = new TimerTests();
+
+	public static final String CURRENT_PARENT_ID = "current parent"; //$NON-NLS-1$
+	protected String currentParentId = null;
+
+
+	protected static class TimerStep {
+		static final int START = 0;
+		static final int STOP = 1;
+		static final int START_CUMULATIVE = 2;
+		static final int STOP_CUMULATIVE = 3;
+		static final int START_ACCUMULATING = 4;
+		static final int STOP_ACCUMULATING = 5;
+		protected String id;
+		protected int type;
+		protected long currentTime;
+		protected int threadId;
+}
+
+	protected boolean testOn = false;
+	protected List steps;
+
+	public synchronized boolean startStep(String id) {
+		if (!testOn)
+			return true;
+
+		TimerStep step = createTimerStep(id, TimerStep.START);
+		return step != null;
+	}
+
+	protected TimerStep createTimerStep(String id, int stepType) {
+		TimerStep newStep = new TimerStep();
+		newStep.threadId = Thread.currentThread().hashCode();
+		newStep.id = id;
+		newStep.type = stepType;
+		newStep.currentTime = System.currentTimeMillis();
+		steps.add(newStep);
+
+		return newStep;
+	}
+
+	public synchronized boolean stopStep(String id) {
+		if (!testOn)
+			return true;
+		TimerStep step = createTimerStep(id, TimerStep.STOP);
+		return step != null;
+	}
+
+	public synchronized boolean startAccumulating(String id) {
+		if (!testOn)
+			return true;
+
+		return createTimerStep(id, TimerStep.START_ACCUMULATING) != null;
+	}
+
+	public synchronized boolean stopAccumulating(String id) {
+		if (!testOn)
+			return true;
+
+		return createTimerStep(id, TimerStep.STOP_ACCUMULATING) != null;
+	}
+	public synchronized boolean startCumulativeStep(String id) {
+		if (!testOn)
+			return true;
+
+		return createTimerStep(id, TimerStep.START_CUMULATIVE) != null;
+	}
+
+	public synchronized boolean stopCumulativeStep(String id) {
+		if (!testOn)
+			return true;
+		return createTimerStep(id, TimerStep.STOP_CUMULATIVE) != null;
+	}
+
+	/**
+	 * Clear the tests so that you can restart and do some more tests.
+	 * 
+	 * 
+	 * @since 1.0.2
+	 */
+	public synchronized void clearTests() {
+		if (!testOn)
+			return;
+		steps.clear();
+		currentParentId = null;
+	}
+
+	/**
+	 * Turn this test on. If not turned on then all calls will quickly return with no errors. This allows the code to stay in place even when not
+	 * debugging.
+	 * <p>
+	 * When turned off, it will clear the test.
+	 * 
+	 * @param on
+	 * 
+	 * @since 1.0.2
+	 */
+	public synchronized void testState(boolean on) {
+		if (on == testOn)
+			return;
+		if (on) {
+			testOn = true;
+			if (steps == null)
+				steps = new ArrayList();
+		} else {
+			testOn = false;
+			steps = null;
+		}
+		currentParentId = null;
+	}
+	private static class CumulativeInformation {
+		public TimerStep currentCumulativeStep;
+		public long cumTime;
+		public int cumCount;
+		public int cumCountNonZero;
+		public long maxTime;
+		public long minTime = Integer.MAX_VALUE;
+		public long minTimeNonZero = Integer.MAX_VALUE;
+	}
+	public synchronized void printIt() {
+		if (!testOn)
+			return;
+		if (steps == null)
+			return;
+		Map stepInfoByThreadId = new HashMap();
+		Map indentsByThreadId = new HashMap();
+		Map cumSteps;
+		TimerStep prevStep = null;
+		TimerStep startStep;
+		NumberFormat percentFormatter = NumberFormat.getPercentInstance();
+		double totalTime = 0;
+		StringBuffer strb = new StringBuffer(150);
+		if (steps.size() > 2){
+			totalTime = ((TimerStep)steps.get(steps.size()-1)).currentTime - ((TimerStep)steps.get(0)).currentTime;
+		}
+		for (int i = 0; i < steps.size(); i++) {
+			TimerStep step = (TimerStep) steps.get(i);
+			Integer threadId = new Integer(step.threadId);
+			switch (step.type) {
+				case TimerStep.START:
+				case TimerStep.STOP:
+					Integer threadIndent = (Integer) indentsByThreadId.get(threadId);
+					int indent = 0;
+					if (step.type == TimerStep.START) {
+						if (threadIndent != null)
+							indent = threadIndent.intValue() + 1;
+						indentsByThreadId.put(threadId, new Integer(indent));
+					} else {
+						if (threadIndent != null)
+							indent = threadIndent.intValue();
+						if (indent > 0)
+							indentsByThreadId.put(threadId, new Integer(indent - 1));
+						else {
+							indentsByThreadId.remove(threadId);
+							indent = 0;
+						}
+					}
+					strb.setLength(0);
+					strb.append(step.currentTime);
+					strb.append("\t"); //$NON-NLS-1$
+					for (int j = 0; j < indent; j++) {
+						strb.append("     "); //$NON-NLS-1$
+					}
+					switch (step.type) {
+						case TimerStep.START:
+							strb.append("Start"); //$NON-NLS-1$
+							break;
+
+						case TimerStep.STOP:
+							strb.append("Stop "); //$NON-NLS-1$
+							break;
+						default:
+							break;
+					}
+					;
+					strb.append(" \""); //$NON-NLS-1$
+					strb.append(step.id);
+					strb.append("\"   id("); //$NON-NLS-1$
+					strb.append(step.threadId);
+					strb.append(")"); //$NON-NLS-1$
+					Map startSteps = (Map) stepInfoByThreadId.get(threadId);
+					if (startSteps == null)
+						stepInfoByThreadId.put(threadId, startSteps = new HashMap());
+					if (step.type == TimerStep.START) {
+						// Store the start step for later lookup when calulating the total time
+						startSteps.put(step.id, step);
+					} else {
+						// This is the stop time for a step. We need to find
+						// the corresponding start time and calculate the total time.
+						Object item = startSteps.remove(step.id);
+						if (item instanceof TimerStep) {
+							startStep = (TimerStep) item;
+							if (startStep != null) {
+								int addchars = 100 - strb.length();
+								for (int j = 0; j < addchars; j++) {
+									strb.append(" "); //$NON-NLS-1$
+								}
+								long delta = step.currentTime - startStep.currentTime;
+								strb.append("    Total = " + delta + " ms"); //$NON-NLS-1$ //$NON-NLS-2$
+								if (totalTime > 0)
+									strb.append("   " + percentFormatter.format(delta/totalTime)); //$NON-NLS-1$
+							}
+						} else
+							strb.append("    ---> Couldn't find Starting point for \"" + step.id + "\""); //$NON-NLS-1$ //$NON-NLS-2$
+					}
+					if (i > 0 && (step.currentTime - prevStep.currentTime) > 0)
+						System.out.println("-- " + (step.currentTime - prevStep.currentTime) + " ms --"); //$NON-NLS-1$ //$NON-NLS-2$
+					prevStep = step;
+					System.out.println(strb);
+					break;
+
+				case TimerStep.START_ACCUMULATING:
+					cumSteps = (Map) stepInfoByThreadId.get(threadId);
+					if (cumSteps == null)
+						stepInfoByThreadId.put(threadId, cumSteps = new HashMap());
+					cumSteps.put(step.id, new CumulativeInformation());
+					threadIndent = (Integer) indentsByThreadId.get(threadId);
+					indent = 0;
+					if (threadIndent != null)
+						indent = threadIndent.intValue();
+					strb.setLength(0);
+					strb.append(step.currentTime);
+					strb.append("\t"); //$NON-NLS-1$
+					for (int j = 0; j < indent; j++) {
+						strb.append("     "); //$NON-NLS-1$
+					}
+					strb.append("Start Accumulating"); //$NON-NLS-1$
+					strb.append(" \""); //$NON-NLS-1$
+					strb.append(step.id);
+					strb.append("\"   id("); //$NON-NLS-1$
+					strb.append(step.threadId);
+					strb.append(")"); //$NON-NLS-1$
+					if (i > 0 && (step.currentTime - prevStep.currentTime) > 0)
+						System.out.println("-- " + (step.currentTime - prevStep.currentTime) + " ms --"); //$NON-NLS-1$ //$NON-NLS-2$
+					prevStep = step;
+					System.out.println(strb);
+					break;
+
+				case TimerStep.START_CUMULATIVE:
+					cumSteps = (Map) stepInfoByThreadId.get(threadId);
+					if (cumSteps != null) {
+						Object info = cumSteps.get(step.id);
+						if (info instanceof CumulativeInformation)
+							((CumulativeInformation) info).currentCumulativeStep = step;
+					}
+					break;
+					
+				case TimerStep.STOP_CUMULATIVE:
+					cumSteps = (Map) stepInfoByThreadId.get(threadId);
+					if (cumSteps != null) {
+						Object info = cumSteps.get(step.id);
+						if (info instanceof CumulativeInformation) {
+							CumulativeInformation cumInfo = (CumulativeInformation) info;
+							if (cumInfo.currentCumulativeStep != null) {
+								cumInfo.cumCount++;
+								long delta = step.currentTime - cumInfo.currentCumulativeStep.currentTime;
+								cumInfo.cumTime += delta;
+								if (cumInfo.maxTime < delta)
+									cumInfo.maxTime = delta;
+								if (delta < cumInfo.minTime)
+									cumInfo.minTime = delta;
+								if (delta != 0) {
+									cumInfo.cumCountNonZero++;
+									if (delta < cumInfo.minTimeNonZero)
+										cumInfo.minTimeNonZero = delta;
+								}
+							}
+						}
+					}
+					break;
+					
+				case TimerStep.STOP_ACCUMULATING:
+					threadIndent = (Integer) indentsByThreadId.get(threadId);
+					indent = 0;
+					if (threadIndent != null)
+						indent = threadIndent.intValue();
+					strb.setLength(0);
+					strb.append(step.currentTime);
+					strb.append("\t"); //$NON-NLS-1$
+					for (int j = 0; j < indent; j++) {
+						strb.append("     "); //$NON-NLS-1$
+					}
+					strb.append("Stop  Accumulating"); //$NON-NLS-1$
+					strb.append(" \""); //$NON-NLS-1$
+					strb.append(step.id);
+					strb.append("\"   id("); //$NON-NLS-1$
+					strb.append(step.threadId);
+					strb.append(")"); //$NON-NLS-1$
+					cumSteps = (Map) stepInfoByThreadId.get(threadId);
+					if (cumSteps != null) {
+						Object info = cumSteps.get(step.id);
+						if (info instanceof CumulativeInformation) {
+							CumulativeInformation cumInfo = (CumulativeInformation) info;
+							if (cumInfo.currentCumulativeStep != null) {
+								strb.append("   cumulative time="); //$NON-NLS-1$
+								strb.append(cumInfo.cumTime);
+								strb.append("   cumulative count="); //$NON-NLS-1$
+								strb.append(cumInfo.cumCount);
+								strb.append("   max time="); //$NON-NLS-1$
+								strb.append(cumInfo.maxTime);
+								strb.append("   min time="); //$NON-NLS-1$
+								strb.append(cumInfo.minTime);
+								strb.append("   avg time="); //$NON-NLS-1$
+								strb.append(((double) cumInfo.cumTime)/cumInfo.cumCount);
+								strb.append("   NonZero times: cumulative ~0 count="); //$NON-NLS-1$
+								strb.append(cumInfo.cumCountNonZero);
+								if (cumInfo.cumCountNonZero != 0) {
+									strb.append("   min ~0 time="); //$NON-NLS-1$
+									strb.append(cumInfo.minTimeNonZero);
+									strb.append("   avg ~0 time="); //$NON-NLS-1$
+									strb.append(((double) cumInfo.cumTime) / cumInfo.cumCountNonZero);
+								}
+							}
+						}
+					}
+					if (i > 0 && (step.currentTime - prevStep.currentTime) > 0)
+						System.out.println("-- " + (step.currentTime - prevStep.currentTime) + " ms --"); //$NON-NLS-1$ //$NON-NLS-2$
+					prevStep = step;
+					System.out.println(strb);
+					break;
+			}
+		}
+	}
+}
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/UIContextDetermination.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/UIContextDetermination.java
new file mode 100644
index 0000000..040d39d
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/UIContextDetermination.java
@@ -0,0 +1,190 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $$RCSfile: UIContextDetermination.java,v $$
+ *  $$Revision: 1.4 $$  $$Date: 2006/08/09 15:38:22 $$ 
+ */
+package org.eclipse.jem.util;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.runtime.*;
+
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jem.util.plugin.JEMUtilPlugin;
+
+
+/**
+ * Static utility class for UIContext determination.
+ * 
+ * @since 1.0.0
+ */
+public class UIContextDetermination {
+
+	private static final int UNKNOWN = 100;
+
+	public static final String HEADLESS_CONTEXT_LITERAL = "Headless"; //$NON-NLS-1$
+
+	public static final String UI_CONTEXT_LITERAL = "UI"; //$NON-NLS-1$
+
+	public static final int HEADLESS_CONTEXT = 102;
+
+	public static final int UI_CONTEXT = 101;
+
+	private static Map cachedExtensions = null;
+
+	private static int currentContext = UNKNOWN;
+
+	private UIContextDetermination() {
+	}
+
+	/**
+	 * Returns an instance of a given class based on the UI or Headless context.
+	 * 
+	 * @param key
+	 * @return new class instance for the given key.
+	 * @throws IllegalArgumentException
+	 *             If the key is invalid (e.g. no extension is found for the key)
+	 */
+	public static Object createInstance(String key) {
+		Object result = null;
+		if (cachedExtensions == null)
+			initExtensions();
+		IConfigurationElement contextSensitiveClass = (IConfigurationElement) cachedExtensions.get(key);
+		try {
+			if (contextSensitiveClass != null)
+				result = contextSensitiveClass
+						.createExecutableExtension(UIContextDeterminationRegistryReader.UI_CONTEXT_SENSTIVE_CLASS_CLASSNAME_ATTR);
+		} catch (CoreException e) {
+			Logger.getLogger().logError("Problem loading extension not found for key \"" + key + "\"."); //$NON-NLS-1$ //$NON-NLS-2$
+			Logger.getLogger().logError(e);
+		}
+		if (result == null)
+			Logger.getLogger().logError("Extension not found for key \"" + key + "\"."); //$NON-NLS-1$ //$NON-NLS-2$
+		return result;
+	}
+
+	/**
+	 * Returns the current context -- determines the value if necessary.
+	 * 
+	 * @return current context
+	 * @see #HEADLESS_CONTEXT
+	 * @see #UI_CONTEXT
+	 */
+	public static int getCurrentContext() {
+		if (currentContext == UNKNOWN) {
+			currentContext = HEADLESS_CONTEXT;
+			new UITesterRegistryReader().readRegistry();
+		}
+		return currentContext;
+	}
+
+	/*
+	 * Invokes the UIContextDeterminationRegistryReader to cache all of the extensions, if necessary.
+	 *  
+	 */
+	private static void initExtensions() {
+		if (cachedExtensions == null) {
+			cachedExtensions = new HashMap();
+			new UIContextDeterminationRegistryReader().readRegistry();
+		}
+	}
+
+	/*
+	 * Converts the input to one of UI_CONTEXT or HEADLESS_CONTEXT. Defaults to HEADLESS on invalid input
+	 * 
+	 * @param literal @return
+	 */
+	private static int convertLiteral(String literal) {
+		return (UI_CONTEXT_LITERAL.equals(literal)) ? UI_CONTEXT : HEADLESS_CONTEXT;
+	}
+
+	/*
+	 * Reads the registration of UI Context-sensitive class extensions and initializes the cache of the UIContextDetermination object.
+	 * 
+	 * @author mdelder
+	 */
+	private static class UIContextDeterminationRegistryReader extends RegistryReader {
+
+		public static final String UI_CONTEXT_SENSTIVE_CLASS_ELEMENT = "uiContextSensitiveClass"; //$NON-NLS-1$
+
+		public static final String UI_CONTEXT_SENSTIVE_CLASS_KEY_ATTR = "key"; //$NON-NLS-1$
+
+		public static final String UI_CONTEXT_SENSTIVE_CLASS_CLASSNAME_ATTR = "className"; //$NON-NLS-1$
+
+		public static final String UI_CONTEXT_SENSTIVE_CLASS_CONTEXT_ATTR = "context"; //$NON-NLS-1$
+
+		public UIContextDeterminationRegistryReader() {
+			super(JEMUtilPlugin.PLUGIN_ID, JEMUtilPlugin.UI_CONTEXT_EXTENSION_POINT);
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see org.eclipse.jem.util.RegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
+		 */
+		public boolean readElement(IConfigurationElement element) {
+			boolean result = false;
+			if (element.getName().equals(UI_CONTEXT_SENSTIVE_CLASS_ELEMENT)) {
+
+				String key = element.getAttribute(UI_CONTEXT_SENSTIVE_CLASS_KEY_ATTR);
+				String context = element.getAttribute(UI_CONTEXT_SENSTIVE_CLASS_CONTEXT_ATTR);
+
+				if (!cachedExtensions.containsKey(key) || getCurrentContext() == convertLiteral(context))
+					cachedExtensions.put(key, element);
+				result = true;
+			}
+			return result;
+		}
+	}
+
+	/*
+	 * Reads the uiTester extension and instantiate the any of the UITester classes it finds.
+	 * 
+	 * The implementation has the side effect that if multiple UITesters are registered, any of them can trip the currentContext into the UI_CONTEXT
+	 * state.
+	 * 
+	 * @author mdelder
+	 */
+	private static class UITesterRegistryReader extends RegistryReader {
+
+		public static final String UI_TESTER_ELEMENT = "uiTester"; //$NON-NLS-1$
+
+		public static final String UI_TESTER_CLASSNAME_ATTR = "className"; //$NON-NLS-1$
+
+		public UITesterRegistryReader() {
+			super(JEMUtilPlugin.PLUGIN_ID, JEMUtilPlugin.UI_TESTER_EXTENSION_POINT);
+		}
+
+		/*
+		 * (non-Javadoc)
+		 * 
+		 * @see com.ibm.etools.emf.workbench.RegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
+		 */
+		public boolean readElement(IConfigurationElement element) {
+			boolean result = false;
+			if (element.getName().equals(UI_TESTER_ELEMENT)) {
+				result = true;
+				try {
+					// Don't bother running tester it if we already processed one extension that returned true.
+					if (currentContext != UI_CONTEXT && canCreateExecutableExtension(element)) {
+						UITester tester = (UITester) element.createExecutableExtension(UI_TESTER_CLASSNAME_ATTR);
+						if (tester.isCurrentContextUI())
+							currentContext = UI_CONTEXT;
+					}
+				} catch (Throwable t) {
+					Logger.getLogger().log("UIContextDetermination is proceeding in HEADLESS mode"); //$NON-NLS-1$
+				}
+			}
+			return result;
+		}
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/UITester.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/UITester.java
new file mode 100644
index 0000000..54517e8
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/UITester.java
@@ -0,0 +1,31 @@
+package org.eclipse.jem.util;
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $$RCSfile: UITester.java,v $$
+ *  $$Revision: 1.2 $$  $$Date: 2005/02/15 23:04:14 $$ 
+ */
+/**
+ * Interface for a UITester. The "classname" attribute on the "uiTester" extension point should implement this class.
+ * 
+ * @since 1.0.0
+ */
+public interface UITester {
+
+	/**
+	 * Answer if the current context is an UI context.
+	 * 
+	 * @return <code>true</code> if an UI context.
+	 * 
+	 * @since 1.0.0
+	 */
+	public boolean isCurrentContextUI();
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/EMFWorkbenchContextBase.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/EMFWorkbenchContextBase.java
new file mode 100644
index 0000000..bedff60
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/EMFWorkbenchContextBase.java
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $$RCSfile: EMFWorkbenchContextBase.java,v $$
+ *  $$Revision: 1.2 $$  $$Date: 2005/02/15 23:04:14 $$ 
+ */
+package org.eclipse.jem.util.emf.workbench;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+
+import org.eclipse.jem.internal.util.emf.workbench.*;
+import org.eclipse.jem.internal.util.emf.workbench.nls.EMFWorkbenchResourceHandler;
+import org.eclipse.jem.util.plugin.JEMUtilPlugin;
+
+
+/**
+ * ContextBase for EMFWorkbench.
+ * 
+ * <p>
+ * This is meant to be subclassed as needed for additional or override function. It will be instantiated by default.
+ * </p>
+ * 
+ * @since 1.0.0
+ */
+public class EMFWorkbenchContextBase {
+
+	protected IProject project;
+
+	protected ProjectResourceSet resourceSet;
+
+	/**
+	 * Construct with a project.
+	 * 
+	 * @param aProject
+	 * 
+	 * @since 1.0.0
+	 */
+	public EMFWorkbenchContextBase(IProject aProject) {
+		if (aProject == null)
+			throw new IllegalArgumentException(EMFWorkbenchResourceHandler.getString("EMFWorkbenchContextBase_ERROR_1")); //$NON-NLS-1$
+		project = aProject;
+	}
+
+	/**
+	 * Dispose of the context base.
+	 * 
+	 * 
+	 * @since 1.0.0
+	 */
+	public void dispose() {
+		if (resourceSet != null)
+			resourceSet.release();
+		resourceSet = null;
+		project = null;
+	}
+
+	/**
+	 * Get the project this context is associated with.
+	 * 
+	 * @return project
+	 * 
+	 * @since 1.0.0
+	 */
+	public IProject getProject() {
+		return project;
+	}
+
+	/**
+	 * Return the resource set (creating if needed) for context.
+	 * 
+	 * @return resource set
+	 * 
+	 * @since 1.0.0
+	 */
+	public ProjectResourceSet getResourceSet() {
+		if (resourceSet == null) {
+			resourceSet = createResourceSet();
+			initializeResourceSet(resourceSet);
+		}
+		return resourceSet;
+	}
+
+	/**
+	 * Used for optimization; answer whether a resourceSet has been created
+	 * 
+	 * @return <code>true</code> if a resource set has been created.
+	 * 
+	 * @since 1.0.0
+	 */
+	public boolean hasResourceSet() {
+		return resourceSet != null;
+	}
+
+	/**
+	 * Initialize the resource set.
+	 * 
+	 * @param aResourceSet
+	 * 
+	 * @since 1.0.0
+	 */
+	protected void initializeResourceSet(ProjectResourceSet aResourceSet) {
+		createResourceSetSynchronizer(aResourceSet);
+		aResourceSet.setURIConverter(createURIConverter(aResourceSet));
+		aResourceSet.add(new WorkspaceResourceHandler());
+		JEMUtilPlugin.getDefault().addExtendedResourceHandlers(aResourceSet);
+
+	}
+
+	/**
+	 * Create the resource set. By default it is a ProjectResourceSetImpl.
+	 * 
+	 * @return project's new resource set.
+	 * 
+	 * @since 1.0.0
+	 */
+	protected ProjectResourceSet createResourceSet() {
+		if (project == null)
+			throw new IllegalStateException(EMFWorkbenchResourceHandler.getString("EMFWorkbenchContextBase_ERROR_2")); //$NON-NLS-1$
+		return new ProjectResourceSetImpl(project);
+	}
+
+	/**
+	 * Create a URIConverter for the resource set.
+	 * 
+	 * @param aResourceSet
+	 * @return a uri converter.
+	 * 
+	 * @since 1.0.0
+	 */
+	protected WorkbenchURIConverter createURIConverter(ProjectResourceSet aResourceSet) {
+		return new WorkbenchURIConverterImpl(getProject(), aResourceSet.getSynchronizer());
+	}
+
+	/**
+	 * Create a resource set workbench synchronizer.
+	 * 
+	 * @param aResourceSet
+	 * @return a resource set workbench synchronizer.
+	 * 
+	 * @since 1.0.0
+	 */
+	protected ResourceSetWorkbenchSynchronizer createResourceSetSynchronizer(ProjectResourceSet aResourceSet) {
+		return EMFWorkbenchContextFactory.INSTANCE.createSynchronizer(aResourceSet, getProject());
+	}
+
+	/**
+	 * Delete the resource from the workspace.
+	 * 
+	 * @param aResource
+	 * @throws CoreException
+	 * 
+	 * @since 1.0.0
+	 */
+	public void deleteResource(Resource aResource) throws CoreException {
+		if (aResource != null)
+			deleteFile(aResource);
+	}
+
+	/**
+	 * Delete the file associated with the resource.
+	 * 
+	 * @param resource
+	 * 
+	 * @since 1.0.0
+	 */
+	public void deleteFile(Resource resource) {
+		throw new UnsupportedOperationException(EMFWorkbenchResourceHandler.getString("EMFWorkbenchContextBase_ERROR_0")); //$NON-NLS-1$
+	}
+
+	/**
+	 * Get resource (with the given URI) from the project resource set. Load it if not already loaded.
+	 * 
+	 * @param uri
+	 * @return resource for the uri, or <code>null</code> if not found.
+	 * 
+	 * @since 1.0.0
+	 */
+	public Resource getResource(URI uri) {
+		return this.resourceSet.getResource(uri, true);
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/IEMFContextContributor.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/IEMFContextContributor.java
new file mode 100644
index 0000000..465d7fa
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/IEMFContextContributor.java
@@ -0,0 +1,46 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $$RCSfile: IEMFContextContributor.java,v $$
+ *  $$Revision: 1.2 $$  $$Date: 2005/02/15 23:04:14 $$ 
+ */
+
+package org.eclipse.jem.util.emf.workbench;
+
+/**
+ * EMF Context Contributor interface. Implimenters are called to contribute to the context.
+ * 
+ * @see org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase#createEMFContext(IProject, IEMFContextContributor)
+ * @since 1.0.0
+ */
+public interface IEMFContextContributor {
+
+	/**
+	 * This is your opportunity to add a primary EMFNature. Typically you would add to the WorkbenchContext held by <code>aNature</code> in order to
+	 * change the container for the WorkbenchURIConverter or add adapter factories to the ResourceSet or anything else that is needed.
+	 * 
+	 * @param aNature
+	 * 
+	 * @since 1.0.0
+	 */
+	void primaryContributeToContext(EMFWorkbenchContextBase aNature);
+
+	/**
+	 * This is your opportunity to add a secondary EMFNature. Typically you would add to the WorkbenchContext held by <code>aNature</code> in order
+	 * to change the container for the WorkbenchURIConverter or add adapter factories to the ResourceSet or anything else that is needed.
+	 * 
+	 * @param aNature
+	 * 
+	 * @since 1.0.0
+	 */
+	void secondaryContributeToContext(EMFWorkbenchContextBase aNature);
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/ISynchronizerExtender.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/ISynchronizerExtender.java
new file mode 100644
index 0000000..f70dd1e
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/ISynchronizerExtender.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $$RCSfile: ISynchronizerExtender.java,v $$
+ *  $$Revision: 1.2 $$  $$Date: 2005/02/15 23:04:14 $$ 
+ */
+package org.eclipse.jem.util.emf.workbench;
+
+import org.eclipse.core.resources.IResourceDelta;
+
+/**
+ * Implimenters allows clients, eg {@link org.eclipse.jem.util.emf.workbench.EMFNatureContributor}, to extend the behavior of the
+ * ResourceSetWorkbenchSynchronizer.
+ * 
+ * @see org.eclipse.jem.util.emf.workbench.ResourceSetWorkbenchSynchronizer#addExtender(ISynchronizerExtender)
+ * @since 1.0.0
+ */
+public interface ISynchronizerExtender {
+
+	/**
+	 * Notification that project has changed.
+	 * 
+	 * @param delta
+	 * 
+	 * @since 1.0.0
+	 */
+	void projectChanged(IResourceDelta delta);
+
+	/**
+	 * Notification that project has been closed.
+	 * 
+	 * 
+	 * @since 1.0.0
+	 */
+	void projectClosed();
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/ProjectResourceSet.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/ProjectResourceSet.java
new file mode 100644
index 0000000..68c9735
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/ProjectResourceSet.java
@@ -0,0 +1,117 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $$RCSfile: ProjectResourceSet.java,v $$
+ *  $$Revision: 1.3 $$  $$Date: 2005/02/15 23:04:14 $$ 
+ */
+package org.eclipse.jem.util.emf.workbench;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+
+/**
+ * A ResourceSet for an entire project. It allows sharing of resources from multiple editors/viewers for a project.
+ * <p>
+ * An additional Notification type is sent out by ProjectResourceSet's of project resource set about to be released. A release is
+ * called when projects are about to be closed. They release all of the resources and unload them. This notification can be used 
+ * to know that this is about to happen and to do something before the resources become invalid. It will be sent out just before the
+ * resource set will be released. 
+ * 
+ * @see ProjectResourceSet#SPECIAL_NOTIFICATION_TYPE
+ * @see ProjectResourceSet#PROJECTRESOURCESET_ABOUT_TO_RELEASE_ID 
+ * @since 1.0.0
+ */
+
+public interface ProjectResourceSet extends ResourceSet {
+
+	IProject getProject();
+	
+	/**
+	 * Notification type in notifications from the ProjectResourceSet for
+	 * special notifications, and not the standard ones from ResourceSet.
+	 * 
+	 * @see org.eclipse.emf.common.notify.Notification#getEventType()
+	 * @since 1.1.0
+	 */
+	static int SPECIAL_NOTIFICATION_TYPE = Notification.EVENT_TYPE_COUNT+4;
+	
+	/**
+	 * Notification Feature ID for resource set about to be released.
+	 * Use {@link org.eclipse.emf.common.notify.Notification#getFeatureID(java.lang.Class)} to
+	 * get this id. The getFeature() on notification will return null.
+	 * 
+	 * @since 1.1.0
+	 */
+	static int PROJECTRESOURCESET_ABOUT_TO_RELEASE_ID = 1000;
+
+	/**
+	 * Call when the ResourceSet is no longer to be used.
+	 * 
+	 * 
+	 * @since 1.0.0
+	 */
+	void release();
+
+	/**
+	 * Add the <code>resourceHandler</code> to the end of the list of resourceHandlers.
+	 * 
+	 * @param resourceHandler
+	 *            IResourceHandler
+	 * @return boolean Return <code>true</code> if it was added.
+	 * @since 1.0.0
+	 */
+	boolean add(ResourceHandler resourceHandler);
+
+	/**
+	 * Add the <code>resourceHandler</code> to the front of the list of resourceHandlers.
+	 * 
+	 * @param resourceHandler
+	 *            IResourceHandler
+	 * @since 1.0.0
+	 */
+	void addFirst(ResourceHandler resourceHandler);
+
+	/**
+	 * Remove the <code>resourceHandler</code> from the list of resourceHandlers.
+	 * 
+	 * @param resourceHandler
+	 *            IResourceHandler
+	 * @return boolean Return true if it was removed.
+	 * @since 1.0.0
+	 */
+	boolean remove(ResourceHandler resourceHandler);
+
+	/**
+	 * Return the ResourceSet synchronizer that will synchronize the ResourceSet with changes from the Workbench.
+	 * 
+	 * @return ResourceSetWorkbenchSynchronizer
+	 * @since 1.0.0
+	 */
+	ResourceSetWorkbenchSynchronizer getSynchronizer();
+
+	/**
+	 * Set the ResourceSet synchronizer that will synchronize the ResourceSet with changes from the Workbench.
+	 * 
+	 * @param aSynchronizer
+	 * @return ResourceSetWorkbenchSynchronizer
+	 * @since 1.0.0
+	 */
+	void setSynchronizer(ResourceSetWorkbenchSynchronizer aSynchronizer);
+
+	/**
+	 * This should be called by clients whenever the structure of the project changes such that any cached URIs will be invalid. For example, if the
+	 * source folders within the URIConverter change.
+	 * 
+	 * @since 1.0.0
+	 */
+	void resetNormalizedURICache();
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/ProjectUtilities.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/ProjectUtilities.java
new file mode 100644
index 0000000..b339d88
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/ProjectUtilities.java
@@ -0,0 +1,754 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $$RCSfile: ProjectUtilities.java,v $$
+ *  $$Revision: 1.4 $$  $$Date: 2005/05/11 19:01:24 $$ 
+ */
+
+package org.eclipse.jem.util.emf.workbench;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.*;
+import java.util.logging.Level;
+
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.*;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.*;
+
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jem.util.plugin.JEMUtilPlugin;
+
+
+/**
+ * EMF Workbench Project Utilities.
+ * 
+ * @since 1.0.0
+ */
+
+public class ProjectUtilities {
+
+	/**
+	 * Project control file name in project.
+	 * 
+	 * @since 1.0.0
+	 */
+	public final static String DOT_PROJECT = ".project"; //$NON-NLS-1$
+
+	/**
+	 * Classpath control file name in project.
+	 * 
+	 * @since 1.0.0
+	 */
+	public final static String DOT_CLASSPATH = ".classpath"; //$NON-NLS-1$
+
+	public ProjectUtilities() {
+	}
+
+	/**
+	 * Add the nature id to the project ahead of all other nature ids.
+	 * 
+	 * @param proj
+	 * @param natureId
+	 * @throws CoreException
+	 * 
+	 * @since 1.0.0
+	 */
+	public static void addNatureToProject(IProject proj, String natureId) throws CoreException {
+		IProjectDescription description = proj.getDescription();
+		String[] prevNatures = description.getNatureIds();
+		String[] newNatures = new String[prevNatures.length + 1];
+		System.arraycopy(prevNatures, 0, newNatures, 1, prevNatures.length);
+		newNatures[0] = natureId;
+		description.setNatureIds(newNatures);
+		proj.setDescription(description, null);
+	}
+
+	/**
+	 * Add the nature id after all of the other nature ids for the project.
+	 * 
+	 * @param proj
+	 * @param natureId
+	 * @throws CoreException
+	 * 
+	 * @since 1.0.0
+	 */
+	public static void addNatureToProjectLast(IProject proj, String natureId) throws CoreException {
+		IProjectDescription description = proj.getDescription();
+		String[] prevNatures = description.getNatureIds();
+		String[] newNatures = new String[prevNatures.length + 1];
+		System.arraycopy(prevNatures, 0, newNatures, 0, prevNatures.length);
+		newNatures[prevNatures.length] = natureId;
+		description.setNatureIds(newNatures);
+		proj.setDescription(description, null);
+	}
+
+	/**
+	 * Remove the nature id from the project.
+	 * 
+	 * @param project
+	 * @param natureId
+	 * @throws CoreException
+	 * 
+	 * @since 1.0.0
+	 */
+	public static void removeNatureFromProject(IProject project, String natureId) throws CoreException {
+		IProjectDescription description = project.getDescription();
+		String[] prevNatures = description.getNatureIds();
+		int size = prevNatures.length;
+		int newsize = 0;
+		String[] newNatures = new String[size];
+		boolean matchfound = false;
+		for (int i = 0; i < size; i++) {
+			if (prevNatures[i].equals(natureId)) {
+				matchfound = true;
+				continue;
+			} else
+				newNatures[newsize++] = prevNatures[i];
+		}
+		if (!matchfound)
+			throw new CoreException(new Status(IStatus.ERROR, JEMUtilPlugin.ID, 0,
+					"The nature id " + natureId + " does not exist on the project " + project.getName(), null)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		else {
+			String[] temp = newNatures;
+			newNatures = new String[newsize];
+			System.arraycopy(temp, 0, newNatures, 0, newsize);
+			description.setNatureIds(newNatures);
+			project.setDescription(description, null);
+		}
+	}
+
+	/**
+	 * Add the list of projects to end of the "referenced projects" list from the project's description.
+	 * 
+	 * @param project
+	 * @param toBeAddedProjectsList
+	 * @throws CoreException
+	 * 
+	 * @since 1.0.0
+	 */
+	public static void addReferenceProjects(IProject project, List toBeAddedProjectsList) throws CoreException {
+
+		IProjectDescription description = project.getDescription();
+		IProject[] projects = description.getReferencedProjects();
+
+		ArrayList projectsList = new ArrayList();
+
+		for (int i = 0; i < projects.length; i++) {
+			projectsList.add(projects[i]);
+		}
+
+		for (int i = 0; i < toBeAddedProjectsList.size(); i++) {
+			projectsList.add(toBeAddedProjectsList.get(i));
+		}
+
+		IProject[] refProjects = new IProject[projectsList.size()];
+
+		for (int i = 0; i < refProjects.length; i++) {
+			refProjects[i] = (IProject) (projectsList.get(i));
+		}
+
+		description.setReferencedProjects(refProjects);
+		project.setDescription(description, null);
+	}
+
+	/**
+	 * Add the single project to the end of the "referenced projects" list from the project's description.
+	 * 
+	 * @param project
+	 * @param projectToBeAdded
+	 * @throws CoreException
+	 * 
+	 * @since 1.0.0
+	 */
+	public static void addReferenceProjects(IProject project, IProject projectToBeAdded) throws CoreException {
+		IProjectDescription description = project.getDescription();
+		IProject[] projects = description.getReferencedProjects();
+
+		ArrayList projectsList = new ArrayList();
+
+		for (int i = 0; i < projects.length; i++) {
+			projectsList.add(projects[i]);
+		}
+
+		projectsList.add(projectToBeAdded);
+
+		IProject[] refProjects = new IProject[projectsList.size()];
+
+		for (int i = 0; i < refProjects.length; i++) {
+			refProjects[i] = (IProject) (projectsList.get(i));
+		}
+
+		description.setReferencedProjects(refProjects);
+		project.setDescription(description, null);
+	}
+
+	/**
+	 * Force a an immediate build of the project.
+	 * 
+	 * @param project
+	 * @param progressMonitor
+	 * 
+	 * @since 1.0.0
+	 */
+	public static void forceAutoBuild(IProject project, IProgressMonitor progressMonitor) {
+		try {
+			project.build(IncrementalProjectBuilder.FULL_BUILD, progressMonitor);
+		} catch (CoreException ce) {
+			//Revisit: Need to use a Logger
+			//Logger.getLogger().logError(ce);
+		}
+	}
+
+	/**
+	 * Return if auto build is turned on.
+	 * 
+	 * @return <code>true</code> if auto build is turned on.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static boolean getCurrentAutoBuildSetting() {
+
+		IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		IWorkspaceDescription wd = workspace.getDescription();
+		return wd.isAutoBuilding();
+	}
+
+	/**
+	 * Get the project associated with the given object.
+	 * 
+	 * @param object
+	 *            may be an <code>IProject, IResource, IAdaptable (to an IProject), EObject (gets IProject if object is in a ProjectResourceSet</code>.
+	 * @param natureId
+	 *            if <code>null</code> then returns project. If not <code>null</code> then returns project only if project has this nature id.
+	 * @return project associated with the object or <code>null</code> if not found.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static IProject getProject(Object object, String natureId) {
+		IProject result = getProject(object);
+		if (natureId == null)
+			return result;
+		if (result != null && result.isAccessible() && natureId != null)
+			try {
+				if (result.hasNature(natureId))
+					return result;
+			} catch (CoreException e) {
+				Logger.getLogger().logError(e);
+			}
+		return null;
+	}
+
+	/**
+	 * Get the project associated with the given object.
+	 * 
+	 * @param object
+	 *            may be an <code>IProject, IResource, IAdaptable (to an IProject), EObject (gets IProject if object is in a ProjectResourceSet</code>.
+	 * @return project associated with the object or <code>null</code> if not found.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static IProject getProject(Object object) {
+		IProject result = null;
+
+		if (object instanceof IProject)
+			result = (IProject) object;
+		else if (object instanceof IResource)
+			result = ((IResource) object).getProject();
+		else if (object instanceof IAdaptable)
+			result = (IProject) ((IAdaptable) object).getAdapter(IProject.class);
+		else if (object instanceof EObject)
+			result = getProject((EObject) object);
+
+		return result;
+	}
+
+	/**
+	 * Get the project associated with the given EObject. (If in a ProjectResourceSet, then the project from that resource set).
+	 * 
+	 * @param aRefObject
+	 * @return project if associated or <code>null</code> if not found.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static IProject getProject(EObject aRefObject) {
+		if (aRefObject != null) {
+			Resource resource = aRefObject.eResource();
+			return getProject(resource);
+		}
+		return null;
+	}
+
+	/**
+	 * Get the project associated with the given Resource. (If in a ProjectResourceSet, then the project from that resource set).
+	 * 
+	 * @param resource
+	 * @return project if associated or <code>null</code> if not found.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static IProject getProject(Resource resource) {
+		ResourceSet set = resource == null ? null : resource.getResourceSet();
+		if (set instanceof ProjectResourceSet)
+			return ((ProjectResourceSet) set).getProject();
+		URIConverter converter = set == null ? null : set.getURIConverter();
+		if (converter != null && converter instanceof WorkbenchURIConverter && ((WorkbenchURIConverter) converter).getOutputContainer() != null)
+			return ((WorkbenchURIConverter) converter).getOutputContainer().getProject();
+		else
+			return null;
+	}
+
+	/**
+	 * Remove the list of projects from the list of "referenced projects" in the project's description.
+	 * 
+	 * @param project
+	 * @param toBeRemovedProjectList
+	 * @throws org.eclipse.core.runtime.CoreException
+	 * 
+	 * @since 1.0.0
+	 */
+	public static void removeReferenceProjects(IProject project, List toBeRemovedProjectList) throws org.eclipse.core.runtime.CoreException {
+		IProjectDescription description = project.getDescription();
+		IProject[] projects = description.getReferencedProjects();
+
+		ArrayList projectsList = new ArrayList();
+
+		for (int i = 0; i < projects.length; i++) {
+			projectsList.add(projects[i]);
+		}
+
+		for (int i = 0; i < toBeRemovedProjectList.size(); i++) {
+			projectsList.remove(toBeRemovedProjectList.get(i));
+		}
+
+		IProject[] refProjects = new IProject[projectsList.size()];
+
+		for (int i = 0; i < refProjects.length; i++) {
+			refProjects[i] = (IProject) (projectsList.get(i));
+		}
+
+		description.setReferencedProjects(refProjects);
+		project.setDescription(description, null);
+	}
+
+	/**
+	 * Remove the project from the list of "referenced projects" in the description for the given project.
+	 * 
+	 * @param project
+	 * @param toBeRemovedProject
+	 * @throws org.eclipse.core.runtime.CoreException
+	 * 
+	 * @since 1.0.0
+	 */
+	public static void removeReferenceProjects(IProject project, IProject toBeRemovedProject) throws org.eclipse.core.runtime.CoreException {
+		IProjectDescription description = project.getDescription();
+		IProject[] projects = description.getReferencedProjects();
+
+		ArrayList projectsList = new ArrayList();
+
+		for (int i = 0; i < projects.length; i++) {
+			projectsList.add((projects[i]));
+		}
+
+		projectsList.remove(toBeRemovedProject);
+
+		IProject[] refProjects = new IProject[projectsList.size()];
+
+		for (int i = 0; i < refProjects.length; i++) {
+			refProjects[i] = (IProject) (projectsList.get(i));
+		}
+
+		description.setReferencedProjects(refProjects);
+		project.setDescription(description, null);
+	}
+
+	/**
+	 * Turn auto-building off.
+	 * 
+	 * 
+	 * @since 1.0.0
+	 */
+	public static void turnAutoBuildOff() {
+		try {
+			IWorkspace workspace = ResourcesPlugin.getWorkspace();
+			IWorkspaceDescription wd = workspace.getDescription();
+			wd.setAutoBuilding(false);
+			workspace.setDescription(wd);
+		} catch (CoreException ce) {
+			//Logger.getLogger().logError(ce);
+		}
+	}
+
+	/**
+	 * Turn auto-building on.
+	 * 
+	 * 
+	 * @since 1.0.0
+	 */
+	public static void turnAutoBuildOn() {
+		try {
+			IWorkspace workspace = ResourcesPlugin.getWorkspace();
+			IWorkspaceDescription wd = workspace.getDescription();
+			wd.setAutoBuilding(true);
+			workspace.setDescription(wd);
+		} catch (CoreException ce) {
+			//Logger.getLogger().logError(ce);
+		}
+	}
+
+	/**
+	 * Set the auto-building state.
+	 * 
+	 * @param aBoolean
+	 *            <code>true</code> to turn auto-building on.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static void turnAutoBuildOn(boolean aBoolean) {
+		try {
+			IWorkspace workspace = ResourcesPlugin.getWorkspace();
+			IWorkspaceDescription wd = workspace.getDescription();
+			wd.setAutoBuilding(aBoolean);
+			workspace.setDescription(wd);
+		} catch (CoreException ce) {
+			//Logger.getLogger().logError(ce);
+
+		}
+	}
+
+	/**
+	 * Adds a builder to the build spec for the given project.
+	 * 
+	 * @param builderID
+	 *            The id of the builder.
+	 * @param project
+	 *            Project to add to.
+	 * @return whether the builder id was actually added (it may have already existed)
+	 * @throws CoreException
+	 * @since 1.0.0
+	 */
+	public static boolean addToBuildSpec(String builderID, IProject project) throws CoreException {
+		return addToBuildSpecBefore(builderID, null, project);
+	}
+
+	/**
+	 * Adds a builder to the build spec for the given project, immediately before the specified successor builder.
+	 * 
+	 * @param builderID
+	 *            The id of the builder.
+	 * @param successorID
+	 *            The id to put the builder before.
+	 * @return whether the builder id was actually added (it may have already existed)
+	 * @throws CoreException
+	 * @since 1.0.0
+	 */
+	public static boolean addToBuildSpecBefore(String builderID, String successorID, IProject project) throws CoreException {
+		IProjectDescription description = project.getDescription();
+		ICommand[] commands = description.getBuildSpec();
+		boolean found = false;
+		for (int i = 0; i < commands.length; ++i) {
+			if (commands[i].getBuilderName().equals(builderID)) {
+				found = true;
+				break;
+			}
+		}
+		if (!found) {
+			boolean successorFound = false;
+			ICommand command = description.newCommand();
+			command.setBuilderName(builderID);
+			ICommand[] newCommands = new ICommand[commands.length + 1];
+			for (int j = 0, index = 0; j < commands.length; j++, index++) {
+				if (successorID != null && commands[j].getBuilderName().equals(successorID)) {
+					successorFound = true;
+					newCommands[index++] = command;
+				}
+				newCommands[index] = commands[j];
+			}
+			if (!successorFound)
+				newCommands[newCommands.length - 1] = command;
+			description.setBuildSpec(newCommands);
+			project.setDescription(description, null);
+		}
+		return !found;
+	}
+
+	/**
+	 * Remove the builder from the build spec.
+	 * 
+	 * @param builderID
+	 *            The id of the builder.
+	 * @param project
+	 *            Project to remove from.
+	 * @return boolean if the builder id was found and removed
+	 * @throws CoreException
+	 * @since 1.0.0
+	 */
+	public static boolean removeFromBuildSpec(String builderID, IProject project) throws CoreException {
+		IProjectDescription description = project.getDescription();
+		ICommand[] commands = description.getBuildSpec();
+		boolean found = false;
+		for (int i = 0; i < commands.length; ++i) {
+			if (commands[i].getBuilderName().equals(builderID)) {
+				found = true;
+				break;
+			}
+		}
+		if (found) {
+			ICommand[] newCommands = new ICommand[commands.length - 1];
+			int newCount = 0;
+			for (int i = 0; i < commands.length; ++i) {
+				if (!(commands[i].getBuilderName().equals(builderID))) {
+					//Add the existng to the new array
+					newCommands[newCount] = commands[i];
+					newCount++;
+				}
+			}
+
+			description.setBuildSpec(newCommands);
+			project.setDescription(description, null);
+
+		}
+		return found;
+
+	}
+
+	/**
+	 * Ensure the container is not read-only.
+	 * <p>
+	 * For Linux, a Resource cannot be created in a ReadOnly folder. This is only necessary for new files.
+	 * 
+	 * @param resource
+	 *            workspace resource to make read/write
+	 * @since 1.0.0
+	 */
+	public static void ensureContainerNotReadOnly(IResource resource) {
+		if (resource != null && !resource.exists()) { //it must be new
+			IContainer container = resource.getParent();
+			ResourceAttributes attr = container.getResourceAttributes();
+			while (attr != null && !attr.isReadOnly()) {
+				container = container.getParent();
+				if (container == null)
+					break;
+				attr = container.getResourceAttributes();
+			}
+			if (container != null && attr != null)
+				attr.setReadOnly(false);
+		}
+	}
+
+	/**
+	 * Get projects from primary nature.
+	 * 
+	 * @param natureID
+	 * @return All projects that have the given nature id as the first nature id.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static IProject[] getProjectsForPrimaryNature(String natureID) {
+		IProject[] projectsWithNature = new IProject[] {};
+		List result = new ArrayList();
+		IProject[] projects = getAllProjects();
+		for (int i = 0; i < projects.length; i++) {
+			if (isProjectPrimaryNature(projects[i], natureID))
+				result.add(projects[i]);
+		}
+		return (IProject[]) result.toArray(projectsWithNature);
+	}
+
+	/**
+	 * Get all projects in the workspace
+	 * 
+	 * @return all workspace projects
+	 * 
+	 * @since 1.0.0
+	 */
+	public static IProject[] getAllProjects() {
+		return ResourcesPlugin.getWorkspace().getRoot().getProjects();
+	}
+
+	/**
+	 * Is this nature id the primary nature id for the project
+	 * 
+	 * @param project
+	 * @param natureID
+	 * @return <code>true</code> if first nature id for the project.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static boolean isProjectPrimaryNature(IProject project, String natureID) {
+		String[] natures = null;
+		try {
+			natures = project.getDescription().getNatureIds();
+		} catch (Exception e1) {
+		}
+		return (natures != null && natures.length > 0 && natures[0].equals(natureID));
+	}
+
+	protected static IPath createPath(IProject p, String defaultSourceName) {
+		IPath path = new Path(p.getName());
+		path = path.append(defaultSourceName);
+		path = path.makeAbsolute();
+		return path;
+	}
+
+	/**
+	 * Returns a list of existing files which will be modified if the classpath changes for the given proeject.
+	 * 
+	 * @param p
+	 *            project
+	 * @return list of affected files.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static List getFilesAffectedByClasspathChange(IProject p) {
+		List result = new ArrayList(2);
+		addFileIfExists(p, result, DOT_CLASSPATH);
+		addFileIfExists(p, result, DOT_PROJECT);
+		return result;
+	}
+
+	protected static void addFileIfExists(IProject p, List aList, String filename) {
+		IFile aFile = p.getFile(filename);
+		if (aFile != null && aFile.exists())
+			aList.add(aFile);
+	}
+
+	/**
+	 * Strip off a leading "/" from each project name in the array, if it has one.
+	 * 
+	 * @param projecNames
+	 * @return array of project names with all leading '/' removed.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static String[] getProjectNamesWithoutForwardSlash(String[] projecNames) {
+		String[] projNames = new String[projecNames.length];
+		List temp = java.util.Arrays.asList(projecNames);
+		for (int i = 0; i < temp.size(); i++) {
+			String name = (String) (temp.get(i));
+			if (name.startsWith("/")) { //$NON-NLS-1$
+				projNames[i] = name.substring(1, name.length());
+			} else {
+				projNames[i] = name;
+			}
+		}
+		return projNames;
+	}
+
+	protected static URL createFileURL(IPath path) {
+		try {
+			return path.toFile().toURL();
+		} catch (MalformedURLException e) {
+			Logger.getLogger().log(e, Level.WARNING);
+			return null;
+		}
+	}
+
+	/**
+	 * Find first newObject that is not in the oldObjects array (using "==").
+	 * 
+	 * @param oldObjects
+	 * @param newObjects
+	 * @return first newObject not found in oldObjects, or <code>null</code> if all found.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static Object getNewObject(Object[] oldObjects, Object[] newObjects) {
+		if (oldObjects != null && newObjects != null && oldObjects.length < newObjects.length) {
+			for (int i = 0; i < newObjects.length; i++) {
+				boolean found = false;
+				Object object = newObjects[i];
+				for (int j = 0; j < oldObjects.length; j++) {
+					if (oldObjects[j] == object) {
+						found = true;
+						break;
+					}
+				}
+				if (!found)
+					return object;
+			}
+		}
+		if (oldObjects == null && newObjects != null && newObjects.length == 1)
+			return newObjects[0];
+		return null;
+	}
+
+	/**
+	 * List of all files in the project.
+	 * <p>
+	 * Note: A more efficient way to do this is to use {@link IResource#accept(org.eclipse.core.resources.IResourceProxyVisitor, int)}
+	 * 
+	 * @param 1.0.0
+	 * @return list of files in the project
+	 * 
+	 * @see IResource#accept(org.eclipse.core.resources.IResourceProxyVisitor, int)
+	 * @since 1.0.0
+	 */
+	public static List getAllProjectFiles(IProject project) {
+		List result = new ArrayList();
+		if (project == null)
+			return result;
+		try {
+			result = collectFiles(project.members(), result);
+		} catch (CoreException e) {
+		}
+		return result;
+	}
+
+	private static List collectFiles(IResource[] members, List result) throws CoreException {
+		// recursively collect files for the given members
+		for (int i = 0; i < members.length; i++) {
+			IResource res = members[i];
+			if (res instanceof IFolder) {
+				collectFiles(((IFolder) res).members(), result);
+			} else if (res instanceof IFile) {
+				result.add(res);
+			}
+		}
+		return result;
+	}
+
+	/**
+	 * Get the project.
+	 * 
+	 * @param projectName
+	 * @return a IProject given the projectName
+	 * @since 1.0.0
+	 */
+	public static IProject getProject(String projectName) {
+		return ResourcesPlugin.getWorkspace().getRoot().getProject(projectName);
+	}
+
+	/**
+	 * Return whether the given builder name is attached to the project.
+	 * 
+	 * @param project
+	 * @param builderName
+	 * @return <code>true</code> if builder name is attached to the project.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static boolean hasBuilder(IProject project, String builderName) {
+		try {
+			ICommand[] builders = project.getDescription().getBuildSpec();
+			for (int i = 0; i < builders.length; i++) {
+				ICommand builder = builders[i];
+				if (builder != null) {
+					if (builder.getBuilderName().equals(builderName))
+						return true;
+				}
+			}
+		} catch (Exception e) {
+		}
+		return false;
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/ResourceHandler.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/ResourceHandler.java
new file mode 100644
index 0000000..0170780
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/ResourceHandler.java
@@ -0,0 +1,65 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $$RCSfile: ResourceHandler.java,v $$
+ *  $$Revision: 1.2 $$  $$Date: 2005/02/15 23:04:14 $$ 
+ */
+package org.eclipse.jem.util.emf.workbench;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+
+/**
+ * Implementers of this interface are provide extension capabilities on resource set. Such as looking or creating in other resource sets for a
+ * resource or an EObject.
+ * 
+ * @see org.eclipse.jem.util.emf.workbench.ProjectResourceSet#add(ResourceHandler)
+ * @since 1.0.0
+ */
+public interface ResourceHandler {
+
+	/**
+	 * Each ResourceHandler for a WorkbenchContext (which holds a ProjectResourceSet) will get an oportunity to get the Resource given the uriString
+	 * prior to the originatingResourceSet getting it in the normal manner.
+	 * 
+	 * If this handler loaded a Resource in its create(ResourceSet, uriString) then this method should be able to return it as well.
+	 * 
+	 * @param originatingResourceSet
+	 * @param uri
+	 * @return resource if found or <code>nulll/code> if this handler didn't find it.
+	 * 
+	 * @since 1.0.0
+	 */
+	Resource getResource(ResourceSet originatingResourceSet, URI uri);
+
+	/**
+	 * Get the EObject for the given URI, if it can. Load the resource if loadOnDemand is <code>true</code>.
+	 * 
+	 * @param originatingResourceSet
+	 * @param uri
+	 *            uri of EObject being requested
+	 * @param loadOnDemand
+	 *            <code>true</code> if resource should be loaded
+	 * @return eobject if found or <code>null</code> if not.
+	 */
+	EObject getEObjectFailed(ResourceSet originatingResourceSet, URI uri, boolean loadOnDemand);
+
+	/**
+	 * Create the resource pointed to be the URI if this handler will handle it.
+	 * 
+	 * @param originatingResourceSet
+	 * @param uri
+	 * @return resource if created, or <code>null</code> if handler doesn't handle this type.
+	 */
+	Resource createResource(ResourceSet originatingResourceSet, URI uri);
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/ResourceSetWorkbenchSynchronizer.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/ResourceSetWorkbenchSynchronizer.java
new file mode 100644
index 0000000..1cec597
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/ResourceSetWorkbenchSynchronizer.java
@@ -0,0 +1,192 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $$RCSfile: ResourceSetWorkbenchSynchronizer.java,v $$
+ *  $$Revision: 1.4 $$  $$Date: 2006/05/17 20:13:45 $$ 
+ */
+
+package org.eclipse.jem.util.emf.workbench;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.*;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+
+import org.eclipse.jem.internal.util.emf.workbench.EMFWorkbenchContextFactory;
+import org.eclipse.jem.util.plugin.JEMUtilPlugin;
+
+
+/**
+ * Synchronizer on the workbench. It listens for the project to see if it is closed or deleted. If it does it notifies this out.
+ * 
+ * @since 1.0.0
+ */
+public class ResourceSetWorkbenchSynchronizer implements IResourceChangeListener {
+
+	protected IProject project;
+
+	protected ResourceSet resourceSet;
+
+	/** Extenders that will be notified after a pre build resource change */
+	protected List extenders;
+
+	/** The delta for this project that will be broadcast to the extenders */
+	protected IResourceDelta currentProjectDelta;
+
+	private int currentEventType = -1;
+
+	/**
+	 * Constructor taking a resource set and project.
+	 * 
+	 * @param aResourceSet
+	 * @param aProject
+	 * 
+	 * @since 1.0.0
+	 */
+	public ResourceSetWorkbenchSynchronizer(ResourceSet aResourceSet, IProject aProject) {
+		resourceSet = aResourceSet;
+		project = aProject;
+		if (aResourceSet != null && aResourceSet instanceof ProjectResourceSet)
+			((ProjectResourceSet) aResourceSet).setSynchronizer(this);
+		initialize();
+	}
+
+	/**
+	 * Get the project for this synchronizer
+	 * 
+	 * @return project
+	 * 
+	 * @since 1.0.0
+	 */
+	public IProject getProject() {
+		return project;
+	}
+
+	/*
+	 * @see IResourceChangeListener#resourceChanged(IResourceChangeEvent)
+	 */
+	public void resourceChanged(IResourceChangeEvent event) {
+		currentEventType = event.getType();
+		currentProjectDelta = null;
+		if ((currentEventType == IResourceChangeEvent.PRE_CLOSE || currentEventType == IResourceChangeEvent.PRE_DELETE)
+				&& event.getResource().equals(getProject())) {
+			notifyExtendersOfClose();
+			release();
+		}
+	}
+
+
+	protected void notifyExtendersIfNecessary() {
+		if (currentEventType != IResourceChangeEvent.POST_CHANGE || extenders == null || currentProjectDelta == null)
+			return;
+		for (int i = 0; i < extenders.size(); i++) {
+			ISynchronizerExtender extender = (ISynchronizerExtender) extenders.get(i);
+			extender.projectChanged(currentProjectDelta);
+		}
+	}
+
+	protected void notifyExtendersOfClose() {
+		if (extenders != null && !extenders.isEmpty()) {
+			for (int i = 0; i < extenders.size(); i++) {
+				ISynchronizerExtender extender = (ISynchronizerExtender) extenders.get(i);
+				extender.projectClosed();
+			}
+		}
+	}
+
+	protected IWorkspace getWorkspace() {
+		if (getProject() == null)
+			return ResourcesPlugin.getWorkspace();
+		return getProject().getWorkspace();
+	}
+
+	protected void initialize() {
+		getWorkspace().addResourceChangeListener(this,
+				IResourceChangeEvent.PRE_CLOSE | IResourceChangeEvent.PRE_DELETE | IResourceChangeEvent.POST_CHANGE | IResourceChangeEvent.PRE_BUILD);
+	}
+
+	/**
+	 * Dispose of the synchronizer. Called when no longer needed.
+	 * 
+	 * 
+	 * @since 1.0.0
+	 */
+	public void dispose() {
+		getWorkspace().removeResourceChangeListener(this);
+	}
+
+	/**
+	 * The project is going away so we need to cleanup ourself and the ResourceSet.
+	 */
+	protected void release() {
+		if (JEMUtilPlugin.isActivated()) {
+			try {
+				if (resourceSet instanceof ProjectResourceSet)
+					((ProjectResourceSet) resourceSet).release();
+			} finally {
+				EMFWorkbenchContextFactory.INSTANCE.removeCachedProject(getProject());
+				dispose();
+			}
+		}
+	}
+
+	/**
+	 * Add an extender to be notified of events.
+	 * 
+	 * @param extender
+	 * 
+	 * @since 1.0.0
+	 */
+	public void addExtender(ISynchronizerExtender extender) {
+		if (extenders == null)
+			extenders = new ArrayList(3);
+		extenders.add(extender);
+	}
+
+	/**
+	 * Remove extender from notification of events.
+	 * 
+	 * @param extender
+	 * 
+	 * @since 1.0.0
+	 */
+	public void removeExtender(ISynchronizerExtender extender) {
+		if (extenders == null)
+			return;
+		extenders.remove(extender);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#toString()
+	 */
+	public String toString() {
+		return getClass().getName() + '(' + ((getProject() != null) ? getProject().getName() : "null") + ')'; //$NON-NLS-1$
+	}
+
+	/**
+	 * Tell Synchronizer that a file is about to be saved. This method should be called prior to writing to an IFile from an EMF resource.
+	 * <p>
+	 * Default does nothing, but subclasses can do something.
+	 * </p>
+	 * 
+	 * @param aFile
+	 *            file about to be saved.
+	 * 
+	 * @since 1.0.0
+	 */
+	public void preSave(IFile aFile) {
+		//Default is do nothing
+	}
+
+}
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/WorkbenchByteArrayOutputStream.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/WorkbenchByteArrayOutputStream.java
new file mode 100644
index 0000000..9d72f51
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/WorkbenchByteArrayOutputStream.java
@@ -0,0 +1,148 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $$RCSfile: WorkbenchByteArrayOutputStream.java,v $$
+ *  $$Revision: 1.2 $$  $$Date: 2005/02/15 23:04:14 $$ 
+ */
+package org.eclipse.jem.util.emf.workbench;
+
+import java.io.IOException;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.emf.ecore.resource.impl.URIConverterImpl;
+
+/**
+ * ByteArray OutputStream for the Workbench. It works with the synchronizer {@link org.eclipse.jem.util.emf.workbench.ResourceSetWorkbenchSynchronizer}to
+ * notify of a save. It also changes all of the line separators to the current system line separator, i.e. if there are some '\r' and we are on
+ * Windows(R) then they will be converted to '\n\r'), if the setting for the stream is to do eol conversion.
+ * 
+ * @since 1.0.0
+ */
+public class WorkbenchByteArrayOutputStream extends URIConverterImpl.PlatformResourceOutputStream {
+
+	private boolean fConvertEOL = false;
+
+	protected ResourceSetWorkbenchSynchronizer synchronizer;
+
+	/**
+	 * Construct with an IFile
+	 * 
+	 * @param aFile
+	 * 
+	 * @since 1.0.0
+	 */
+	public WorkbenchByteArrayOutputStream(IFile aFile) {
+		this(aFile, null);
+	}
+
+	/**
+	 * Construct with a IFile and a synchronizer. This way synchronizer will know when file is about to be saved.
+	 * 
+	 * @param aFile
+	 * @param aSynchronizer
+	 * 
+	 * @since 1.0.0
+	 */
+	public WorkbenchByteArrayOutputStream(IFile aFile, ResourceSetWorkbenchSynchronizer aSynchronizer) {
+		super(aFile, false, true, null);
+		synchronizer = aSynchronizer;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.io.OutputStream#close()
+	 */
+	public void close() throws IOException {
+		if (synchronizer != null)
+			synchronizer.preSave(file);
+		super.close();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.emf.ecore.resource.impl.URIConverterImpl.PlatformResourceOutputStream#flush()
+	 */
+	public void flush() throws IOException {
+		if (synchronizer != null)
+			synchronizer.preSave(file);
+		super.flush();
+	}
+
+	/*
+	 * Convert the end of line characters.
+	 */
+	private int convertEOL(byte[] data) {
+		// Algorithm:
+		// Remove all '\r' chars
+		// Replace all '\n' chars with line seperator chars
+
+		String EOL = System.getProperties().getProperty("line.separator"); //$NON-NLS-1$
+		byte[] EOLBytes = EOL.getBytes();
+
+		int out = 0;
+
+		for (int in = 0; in < data.length; in++) {
+			if (data[in] == '\r') {
+				// don't output (ie, throw the char away)
+			} else if (data[in] == '\n') {
+				// The code does not currently handle expanding the array
+				if ((in - out + 1) < EOLBytes.length)
+					throw new UnsupportedOperationException("WorkbenchByteArrayOutputStream: Expanding EOL chars not implemented"); //$NON-NLS-1$
+
+				for (int i = 0; i < EOLBytes.length; i++) {
+					data[out++] = EOLBytes[i];
+				}
+			} else {
+				// Just copy the data
+				data[out++] = data[in];
+			}
+		}
+
+		return out;
+	}
+
+	/**
+	 * Is EOL conversion turned on.
+	 * 
+	 * @return <code>true</code> if EOL conversion is turned on.
+	 * 
+	 * @since 1.0.0
+	 */
+	public boolean isConvertEOLChars() {
+		return fConvertEOL;
+	}
+
+	/**
+	 * Set the EOL conversion flag.
+	 * 
+	 * @param set
+	 *            <code>true</code> if EOL should be converted to current line separator.
+	 * 
+	 * @since 1.0.0
+	 */
+	public void setConvertEOLChars(boolean set) {
+		fConvertEOL = set;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.io.ByteArrayOutputStream#toByteArray()
+	 */
+	public synchronized byte[] toByteArray() {
+		byte[] contents = super.toByteArray();
+		if (isConvertEOLChars())
+			convertEOL(contents);
+		return contents;
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/WorkbenchResourceHelperBase.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/WorkbenchResourceHelperBase.java
new file mode 100644
index 0000000..27bb8f1
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/WorkbenchResourceHelperBase.java
@@ -0,0 +1,694 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $$RCSfile: WorkbenchResourceHelperBase.java,v $$
+ *  $$Revision: 1.5 $$  $$Date: 2006/08/09 15:40:22 $$ 
+ */
+package org.eclipse.jem.util.emf.workbench;
+
+import java.util.*;
+
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.*;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.common.util.WrappedException;
+import org.eclipse.emf.ecore.*;
+import org.eclipse.emf.ecore.resource.*;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+import org.eclipse.jem.internal.util.emf.workbench.EMFWorkbenchContextFactory;
+import org.eclipse.jem.internal.util.emf.workbench.WorkspaceResourceHandler;
+import org.eclipse.jem.util.plugin.JEMUtilPlugin;
+
+
+/**
+ * Workbench resource helper
+ * 
+ * @since 1.0.0
+ */
+public class WorkbenchResourceHelperBase {
+
+	/**
+	 * Everything is static, don't know why there is an instance here.
+	 */
+	public static final WorkbenchResourceHelperBase INSTANCE = new WorkbenchResourceHelperBase();
+
+	protected static WorkspaceResourceHandler workspaceURILoader = new WorkspaceResourceHandler();
+
+	protected static void resolveContainedProxies(EObject refObject) {
+		List contained = refObject.eContents();
+		EObject mofObject;
+		for (int i = 0; i < contained.size(); i++) {
+			mofObject = (EObject) contained.get(i);
+			resolveProxies(mofObject);
+		}
+	}
+
+	protected static void resolveNonContainedProxies(EObject refObject) {
+		List references = refObject.eClass().getEAllReferences();
+		EReference reference;
+		for (int i = 0; i < references.size(); i++) {
+			reference = (EReference) references.get(i);
+			if (!reference.isContainment()) {
+				if (reference.isMany()) {
+					List value = (List) refObject.eGet(reference);
+					for (int j = 0; j < value.size(); j++)
+						value.get(j);
+				} else {
+					refObject.eGet(reference);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Force all of the proxies with <code>resource</code> to be resolved.
+	 * 
+	 * @param resource
+	 * 
+	 * @since 1.0.0
+	 */
+	public static void resolveProxies(Resource resource) {
+		if (resource != null) {
+			List topLevels = resource.getContents();
+			EObject mofObject;
+			for (int i = 0; i < topLevels.size(); i++) {
+				mofObject = (EObject) topLevels.get(i);
+				resolveProxies(mofObject);
+			}
+		}
+	}
+
+	/**
+	 * Return a List of proxies that are contained by the <code>resource</code>.
+	 * 
+	 * @param resource
+	 * @return list of proxies.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static List gatherProxies(Resource resource) {
+		if (resource == null)
+			return Collections.EMPTY_LIST;
+		List list = new ArrayList();
+		List topLevels = resource.getContents();
+		int size = topLevels.size();
+		EObject mofObject;
+		for (int i = 0; i < size; i++) {
+			mofObject = (EObject) topLevels.get(i);
+			gatherProxies((InternalEObject) mofObject, list);
+		}
+		return list;
+	}
+
+	protected static void gatherProxies(InternalEObject refObject, List proxies) {
+		if (refObject == null)
+			return;
+		List contains = refObject.eClass().getEAllContainments();
+		if (contains != null) {
+			int size = contains.size();
+			EStructuralFeature sf = null;
+			for (int i = 0; i < size; i++) {
+				sf = (EStructuralFeature) contains.get(i);
+				gatherProxies(refObject, sf, proxies);
+			}
+		}
+	}
+
+	protected static void gatherProxies(InternalEObject refObject, EStructuralFeature sf, List proxies) {
+		Object value = null;
+		InternalEObject proxy = null;
+		if (sf.isMany() || refObject.eIsSet(sf)) {
+			value = refObject.eGet(sf, false);
+			if (value != null) {
+				if (sf.isMany()) {
+					Iterator j = ((InternalEList) value).basicIterator();
+					while (j.hasNext()) {
+						proxy = (InternalEObject) j.next();
+						if (proxy.eIsProxy())
+							proxies.add(proxy);
+					}
+				} else if (((InternalEObject) value).eIsProxy())
+					proxies.add(value);
+			}
+		}
+	}
+
+	protected static void resolveProxies(EObject refObject) {
+		if (refObject != null) {
+			resolveNonContainedProxies(refObject);
+			resolveContainedProxies(refObject);
+		}
+	}
+
+	/**
+	 * Return an existing context base on <code>aProject</code>.
+	 * 
+	 * @param aProject
+	 * @return the context base for the project or <code>null</code> if none.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static EMFWorkbenchContextBase getEMFContext(IProject aProject) {
+		return EMFWorkbenchContextFactory.INSTANCE.getEMFContext(aProject);
+	}
+
+	/**
+	 * Create a resource from the URI. The URI must contain the project name, either as the first segment, or if in platform resource url protocol.
+	 * {@link #getResourceSet(URI)}
+	 * 
+	 * @param uri
+	 * @return a new resource for the uri or <code>null</code> if not a project uri
+	 * 
+	 * @since 1.0.0
+	 */
+	public static Resource createResource(URI uri) {
+		ResourceSet set = getResourceSet(uri);
+		if (set != null)
+			return set.createResource(uri);
+		return null;
+	}
+
+	/**
+	 * Check for a cached Resource for the given URI, if none is found, create a new Resource for with the URI against the proper ResourceSet.
+	 * 
+	 * @param uri The URI MUST be either a "<b>platform:/resource/</b>project-name/...." type URI or it
+	 * must be of type "project-name/...". This method will only return resources that are workbench project resources.
+	 * Any other type of URI will cause <code>null</code> to be returned.
+	 * @return resource or <code>null</code> if not a project uri.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static Resource getExistingOrCreateResource(URI uri) {
+		return getExistingOrCreateResource(uri, getResourceSet(uri));
+	}
+	
+	/**
+	 * Get the IFile for the URI. The URI must be a workbench project style URI. 
+	 * @param uri The URI MUST be either a "<b>platform:/resource/</b>project-name/...." type URI or it
+	 * must be of type "project-name/...". This method will only return resources that are workbench project resources.
+	 * Any other type of URI will cause <code>null</code> to be returned.
+	 * @return the IFile if the URI is a project form, <code>null</code> if not a project form, OR the project doesn't exist. The IFile returned doesn't necessarily exist. Use {@link IFile#exists()} to test that.
+	 * 
+	 * @since 1.2.0
+	 */
+	public static IFile getIFile(URI uri) {
+		IProject project = getProject(uri);
+		if (project != null) {
+			IPath path;
+			if (isPlatformResourceURI(uri)) {
+				// Need to get the path and remove the first two segments (/resource/project name/).
+				path = new Path(URI.decode(uri.path())).removeFirstSegments(2);
+			} else {
+				// Need to get the path and remove the first segment (/project name/).
+				path = new Path(URI.decode(uri.path())).removeFirstSegments(1);
+			}
+			return project.getFile(path);
+		} else
+			return null;
+	}
+
+	/**
+	 * Check for a cached Resource for the given URI, if none is found, create a new Resource for with the URI against the given ResourceSet.
+	 * 
+	 * @param uri 
+	 * @param set
+	 * @return resource or <code>null</code> if set was <code>null</code>.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static Resource getExistingOrCreateResource(URI uri, ResourceSet set) {
+		if (set != null) {
+			Resource res = set.getResource(uri, false);
+			if (res == null)
+				res = set.createResource(uri);
+			return res;
+		} else
+			return null;
+	}
+
+	/**
+	 * Return a new or existing context base on <code>aProject</code>. Allow the <code>contributor</code> to contribute to the new or existing
+	 * nature prior to returning.
+	 * 
+	 * @param aProject
+	 * @param contributor
+	 * @return the context base for the project.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static EMFWorkbenchContextBase createEMFContext(IProject aProject, IEMFContextContributor contributor) {
+		return EMFWorkbenchContextFactory.INSTANCE.createEMFContext(aProject, contributor);
+	}
+
+	/**
+	 * Does the passed URI have the form platform:/resource/... ?
+	 * 
+	 * @param uri
+	 * @return <code>true</code> if it is a platform resource protocol.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static boolean isPlatformResourceURI(URI uri) {
+		return JEMUtilPlugin.PLATFORM_PROTOCOL.equals(uri.scheme()) && JEMUtilPlugin.PLATFORM_RESOURCE.equals(uri.segment(0));
+	}
+
+	/**
+	 * This api may be used to cache a Resource if it has a URI that is Workspace relative. Return true if it is cached.
+	 * 
+	 * @param aResource
+	 * @return <code>true</code> if it was successful to cache.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static boolean cacheResource(Resource aResource) {
+		if (aResource != null) {
+			ResourceSet set = getResourceSet(aResource.getURI());
+			if (set != null)
+				return set.getResources().add(aResource);
+		}
+		return false;
+	}
+
+	/**
+	 * This api is used if you create a new MOF resource and you want to add it to the correct ResourceSet. In order to do that, we need the IProject
+	 * that you want aResource to be cached within as well as the IPath which is the full path of the location of the new Resource.
+	 * 
+	 * @param aProject
+	 * @param aResource
+	 * @param fullPath
+	 * @return <code>true</code> if resource was cached.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static boolean cacheResource(IProject aProject, Resource aResource, IPath fullPath) {
+		if (aProject == null || aResource == null || !aProject.isAccessible())
+			return false;
+		ResourceSet set = getResourceSet(aProject);
+		if (set != null) {
+			URI converted = set.getURIConverter().normalize(aResource.getURI());
+			if (converted != aResource.getURI())
+				aResource.setURI(converted);
+			return set.getResources().add(aResource);
+		}
+		return false;
+	}
+
+	/**
+	 * Get the path of the project resource relative to the workspace or relative to the list of containers in this project.
+	 * 
+	 * @param aResource
+	 * @return path
+	 * 
+	 * @since 1.0.0
+	 */
+	public static String getActualProjectRelativeURI(IResource aResource) {
+		if (aResource == null || !aResource.isAccessible())
+			return null;
+		IProject project = aResource.getProject();
+		IPath path = getPathInProject(project, aResource.getFullPath());
+		return path.makeRelative().toString();
+	}
+
+	/**
+	 * Return an IPath that can be used to load a Resource using the <code>fullPath</code>. This will be a project relative path.
+	 * 
+	 * @param project
+	 * @param fullPath
+	 * @return path
+	 * 
+	 * @since 1.0.0
+	 */
+	public static IPath getPathInProject(IProject project, IPath fullPath) {
+		List containers = getProjectURIConverterContainers(project);
+		if (!containers.isEmpty())
+			return getPathFromContainers(containers, fullPath);
+		return fullPath;
+	}
+
+	protected static List getProjectURIConverterContainers(IProject project) {
+		EMFWorkbenchContextBase nature = createEMFContext(project, null);
+		if (nature != null) {
+			WorkbenchURIConverter conv = (WorkbenchURIConverter) nature.getResourceSet().getURIConverter();
+			if (conv != null)
+				return conv.getInputContainers();
+		}
+		return Collections.EMPTY_LIST;
+	}
+
+	/**
+	 * If this path is contained within one of the listed containers, then return the path relative to the container.
+	 * 
+	 * @param containers
+	 * @param fullPath
+	 * @return path relative to a container, or unchanged path if not in a container.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static IPath getPathFromContainers(List containers, IPath fullPath) {
+		IContainer container = null;
+		IPath result;
+		int size = containers.size();
+		int matching = -1;
+		IPath containerPath;
+		for (int i = 0; i < size; i++) {
+			container = (IContainer) containers.get(i);
+			containerPath = container.getFullPath();
+			matching = fullPath.matchingFirstSegments(containerPath);
+			if (matching > 0 && matching == containerPath.segmentCount()) {
+				result = fullPath.removeFirstSegments(matching);
+				result = result.makeRelative();
+				return result;
+			}
+		}
+		return fullPath;
+	}
+
+	/**
+	 * Return true if the <code>uri</code> has its container segments visible from the input containers for the <code>project</code>.
+	 * 
+	 * @param project
+	 * @param uri
+	 * @return <code>true</code> if the uri is visible from the input containers.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static boolean hasContainerStructure(IProject project, URI uri) {
+		if (project != null && uri != null) {
+			IPath path = new Path(uri.toString());
+			List containers = getProjectURIConverterContainers(project);
+			int segmentCount = path.segmentCount();
+			IPath containerPath = segmentCount > 1 ? path.removeLastSegments(1) : null;
+			IContainer container = null;
+			for (int i = 0; i < containers.size(); i++) {
+				container = (IContainer) containers.get(i);
+				if (!container.isAccessible())
+					continue;
+				if (segmentCount == 1) {
+					if (container == project)
+						return true;
+				} else if (containerPath != null) {
+					IFolder folder = container.getFolder(containerPath);
+					if (folder != null && folder.isAccessible())
+						return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Get the resource for the uri. The URI MUST be either a "<b>platform:/resource/</b>project-name/...." type URI or it
+	 * must be of type "project-name/...". This method will only return resources that are workbench project resources.
+	 * Any other type of URI will cause <code>null</code> to be returned. It will be loaded if not already loaded. If it is not to
+	 * be loaded if not loaded use {@link #getResource(URI, boolean)} instead.
+	 * 
+	 * @param uri must be either a "<b>platform:/resource/</b>project-name/..." form or it must be "project-name/...". Any other form will be invalid.
+	 * @return resource if uri is for a valid workbench project resource or <code>null</code> if project not found or not a valid project resource.
+	 * 
+	 * @throws WrappedException if valid project format URI but file not found or some other error on load.
+	 * @since 1.0.0
+	 */
+	public static Resource getResource(URI uri) {
+		return getResource(uri, true);
+	}
+
+	/**
+	 * Return the Resource for the passed IFile without forcing a load.
+	 * 
+	 * @param aFile
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	public static Resource getResource(IFile aFile) {
+		return getResource(aFile, false);
+	}
+
+	/**
+	 * Return the Resource for the passed IFile, forcing a load if <code>loadOnDemand</code> says so.
+	 * 
+	 * @param aFile
+	 * @param loadOnDemand
+	 *            <code>true</code> will force a load of resource if not loaded.
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	public static Resource getResource(IFile aFile, boolean loadOnDemand) {
+		if (aFile != null)
+			return getResource(URI.createPlatformResourceURI(aFile.getFullPath().toString()), loadOnDemand);
+		return null;
+	}
+
+	/**
+	 * Return the Resource for the passed IFile without a load if not loaded.
+	 * 
+	 * @param aFile
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	public static Resource load(IFile aFile) {
+		return getResource(aFile, true);
+	}
+
+	/**
+	 * Get the resource for the uri. The URI MUST be either a "<b>platform:/resource/</b>project-name/...." type URI or it
+	 * must be of type "project-name/...". This method will only return resources that are workbench project resources.
+	 * Any other type of URI will cause <code>null</code> to be returned.
+	 * 
+	 * @param uri must be either a "<b>platform:/resource/</b>project-name/..." form or it must be "project-name/...". Any other form will be invalid.
+	 * @param loadOnDemand <code>true</code> will cause resource to be loaded if not already loaded.
+	 * @return resource if uri is for a valid workbench project resource, or <code>null</code> if project not found, or not a valid project resource uri.
+	 * 
+	 * @throws WrappedException if valid project format URI but file not found or some other error on load if loadOnDemand is true.
+	 * @since 1.0.0
+	 */
+	public static Resource getResource(URI uri, boolean loadOnDemand) {
+		ResourceSet set = getResourceSet(uri);
+		if (set != null)
+			return set.getResource(uri, loadOnDemand);
+		return null;
+	}
+
+	/**
+	 * Return a ResourceSet for the passed URI. The URI should be in the format platform:/resource/{project name}/... or {project name}/... for this
+	 * api to work.
+	 * 
+	 * @param uri
+	 * @return the resource set or <code>null</code> if not of correct form or project doesn't have a resource set.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static ResourceSet getResourceSet(URI uri) {
+		IProject project = getProject(uri);
+		if (project != null && project.isAccessible())
+			return getResourceSet(project);
+		else
+			return null;
+	}
+	
+	/*
+	 * Get the project for the uri if the uri is a valid workbench project format uri. null otherwise.
+	 */
+	private static IProject getProject(URI uri) {
+		String projectName;
+		if (isPlatformResourceURI(uri))
+			projectName = uri.segment(1);
+		else if (uri.scheme() == null) {
+			projectName = new Path(uri.path()).segment(0); //assume project name is first in the URI
+		} else
+			return null;
+		IProject project = getWorkspace().getRoot().getProject(URI.decode(projectName));
+		if (project != null && project.isAccessible())
+			return project;
+		else
+			return null;
+	}
+
+	/**
+	 * Return the ResourceSet for the passed IProject.
+	 * 
+	 * @param project
+	 * @return resource set
+	 */
+	public static ResourceSet getResourceSet(IProject project) {
+		EMFWorkbenchContextBase nat = createEMFContext(project, null);
+		if (nat != null)
+			return nat.getResourceSet();
+		return null;
+	}
+
+	/**
+	 * Get the workspace. (just use {@link ResourcesPlugin#getWorkspace()}).
+	 * 
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	public static IWorkspace getWorkspace() {
+		return ResourcesPlugin.getWorkspace();
+	}
+
+	/**
+	 * Get the project associated with the resource set.
+	 * 
+	 * @param set
+	 * @return project or <code>null</code> if resource set not associated with a project.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static IProject getProject(ResourceSet set) {
+		if (set != null) {
+			if (set instanceof ProjectResourceSet) {
+				ProjectResourceSet pset = (ProjectResourceSet) set;
+				return pset.getProject();
+			}
+		}
+		return null;
+	}
+
+	protected static boolean isRegisteredURIMapping(String href) {
+		if (href != null) {
+			String file = href;
+			int index = href.indexOf('#');
+			if (index > -1)
+				file = href.substring(0, index);
+			return URIConverter.URI_MAP.get(file) != null;
+		}
+		return false;
+	}
+
+	/**
+	 * Remove all of the resources from the resource set and then unload them. Unload forces all of the objects to become proxies so next resolve will
+	 * reload the resource.
+	 * 
+	 * @param resources
+	 * @param aSet
+	 * 
+	 * @since 1.0.0
+	 */
+	public static void removeAndUnloadAll(List resources, ResourceSet aSet) {
+		if (aSet == null || resources == null || resources.isEmpty())
+			return;
+		aSet.getResources().removeAll(resources);
+		Resource res;
+		for (int i = 0; i < resources.size(); i++) {
+			res = (Resource) resources.get(i);
+			res.unload();
+		}
+	}
+
+	/**
+	 * Turn object into a proxy.
+	 * 
+	 * @param anObject
+	 * @return <code>true</code> if object was able to become a proxy.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static boolean becomeProxy(EObject anObject) {
+		if (anObject != null) {
+			Resource res = anObject.eResource();
+			if (res != null) {
+				URI uri = res.getURI();
+				((InternalEObject) anObject).eSetProxyURI(uri.appendFragment(res.getURIFragment(anObject)));
+				//anObject.eAdapters().clear();
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Return true if the WrappedException is actually a Resource Not Found.
+	 * 
+	 * @param wrappedEx
+	 * @return <code>true</code> is exception wrappers a resource not found.
+	 * @since 1.0.0
+	 */
+	public static boolean isResourceNotFound(WrappedException wrappedEx) {
+		Exception excep = wrappedEx.exception();
+		while (excep instanceof WrappedException) {
+			excep = ((WrappedException) excep).exception();
+		}
+		return primIsResourceNotFound(excep);
+	}
+
+	private static boolean primIsResourceNotFound(Throwable excep) {
+		if (excep instanceof CoreException) {
+			IStatus status = ((CoreException) excep).getStatus();
+			return status.getCode() == IResourceStatus.RESOURCE_NOT_FOUND && ResourcesPlugin.PI_RESOURCES.equals(status.getPlugin());
+		}
+		return false;
+	}
+
+	/**
+	 * Return true if the WrappedException is actually a Resource Not Found.
+	 * 
+	 * @param wrappedEx
+	 * @return <code>true</code> is exception wrappers a resource not found.
+	 * @since 1.0.0
+	 */
+	public static boolean isResourceNotFound(Resource.IOWrappedException wrappedEx) {
+		return primIsResourceNotFound(wrappedEx.getCause());
+	}
+
+	/**
+	 * Return a URI represenation of the platformURI without the leading "platform:/resource/" if present.
+	 * 
+	 * @param platformURI
+	 * @return uri
+	 * @since 1.0.0
+	 */
+	public static URI getNonPlatformURI(URI platformURI) {
+		if (isPlatformResourceURI(platformURI)) {
+			String uriString = primGetNonPlatformURIString(platformURI);
+			return URI.createURI(uriString);
+		}
+		return platformURI;
+	}
+
+	/**
+	 * Return a String represenation of the platformURI without the leading "platform:/resource/" if present.
+	 * 
+	 * @param platformURI
+	 * @return
+	 * @since 1.0.0
+	 */
+	public static String getNonPlatformURIString(URI platformURI) {
+		if (isPlatformResourceURI(platformURI)) { return primGetNonPlatformURIString(platformURI); }
+		return platformURI.toString();
+	}
+
+	/*
+	 * Remove "platform:/resource/" from the front of the platformURI and return the remaining String.
+	 */
+	private static String primGetNonPlatformURIString(URI platformURI) {
+		String uriString = platformURI.toString();
+		//"platform:/resource/" is 19 characters.
+		return uriString.substring(19, uriString.length());
+	}
+
+	/**
+	 * Does the passed URI have the form platform:/plugin/... ?
+	 * 
+	 * @param uri
+	 * @return <code>true</code> if uri is platform plugin protocol.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static boolean isPlatformPluginResourceURI(URI uri) {
+		return JEMUtilPlugin.PLATFORM_PROTOCOL.equals(uri.scheme()) && JEMUtilPlugin.PLATFORM_PLUGIN.equals(uri.segment(0));
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/WorkbenchURIConverter.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/WorkbenchURIConverter.java
new file mode 100644
index 0000000..e556851
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/WorkbenchURIConverter.java
@@ -0,0 +1,154 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $$RCSfile: WorkbenchURIConverter.java,v $$
+ *  $$Revision: 1.2 $$  $$Date: 2005/02/15 23:04:14 $$ 
+ */
+package org.eclipse.jem.util.emf.workbench;
+
+import java.util.List;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.emf.ecore.resource.URIConverter;
+
+/**
+ * Implementers of this interface are WorkbenchURI converters. Workbench URI converters handle references to files in the project's containers.
+ * This converter is only necessary to resolve old ambiguous workbench URIs.
+ * @since 1.0.0
+ */
+public interface WorkbenchURIConverter extends URIConverter {
+
+	/**
+	 * Add input container to to the converter.
+	 * 
+	 * @param aContainer
+	 * 
+	 * @since 1.0.0
+	 */
+	void addInputContainer(IContainer aContainer);
+
+	/**
+	 * Add list of containers to the converter.
+	 * 
+	 * @param containers
+	 *            list of <code>IContainer</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	void addInputContainers(List containers);
+
+	/**
+	 * Get the file relative to a container.
+	 * 
+	 * @param uri
+	 * @return file relative to a container or <code>null</code> if not.
+	 * 
+	 * @since 1.0.0
+	 */
+	IFile getFile(String uri);
+
+	/**
+	 * Get first input container
+	 * 
+	 * @return first input container or <code>null</code> if none set.
+	 * 
+	 * @since 1.0.0
+	 */
+	IContainer getInputContainer();
+
+	/**
+	 * Get all input containers.
+	 * 
+	 * @return all input containers.
+	 * 
+	 * @since 1.0.0
+	 */
+	List getInputContainers();
+
+	/**
+	 * Get the output container if set.
+	 * 
+	 * @return output container or <code>null</code> if not set.
+	 * 
+	 * @since 1.0.0
+	 */
+	IContainer getOutputContainer();
+
+	/**
+	 * Set the output container.
+	 * 
+	 * @param container
+	 * 
+	 * @since 1.0.0
+	 */
+	void setOutputContainer(IContainer container);
+
+	/**
+	 * Return an IFile for
+	 * 
+	 * @aPath. If we have a parent and we do not contain the first segment of the aPath, forward to the parent to retrieve the file.
+	 * @param aPath
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	IFile getOutputFile(IPath aPath);
+
+	/**
+	 * Get output file with mapping applied.
+	 * 
+	 * @param uri
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	IFile getOutputFileWithMappingApplied(String uri);
+
+	/**
+	 * Remove input container from list.
+	 * 
+	 * @param aContainer
+	 * @return <code>true</code> if removed.
+	 * 
+	 * @since 1.0.0
+	 */
+	boolean removeInputContainer(IContainer aContainer);
+
+	/**
+	 * Return true if we can retrieve the resource used to open an input stream on.
+	 * 
+	 * @param aFileName
+	 * @return <code>true</code> if filename is valid for file stream access.
+	 * @since 1.0.0
+	 *  
+	 */
+	boolean canGetUnderlyingResource(String aFileName);
+
+	/**
+	 * Is force save relative flag turned on.
+	 * 
+	 * @return <code>true</code> if force save relative is turned on.
+	 * 
+	 * @since 1.0.0
+	 */
+	boolean isForceSaveRelative();
+
+	/**
+	 * Set to true if you do not want any path manipulation when creating the output stream..
+	 * 
+	 * @param forceSaveRelative
+	 *            <code>true</code> to force saves as relative.
+	 */
+	void setForceSaveRelative(boolean forceSaveRelative);
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/WorkbenchURIConverterImpl.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/WorkbenchURIConverterImpl.java
new file mode 100644
index 0000000..6365551
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/WorkbenchURIConverterImpl.java
@@ -0,0 +1,514 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $$RCSfile: WorkbenchURIConverterImpl.java,v $$
+ *  $$Revision: 1.6 $$  $$Date: 2006/05/17 20:13:45 $$ 
+ */
+package org.eclipse.jem.util.emf.workbench;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.*;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.impl.URIConverterImpl;
+
+import org.eclipse.jem.util.plugin.JEMUtilPlugin;
+
+
+/**
+ * A default implementation of the WorkbenchURIConverter interface.
+ * 
+ * @since 1.0.0
+ */
+public class WorkbenchURIConverterImpl extends URIConverterImpl implements WorkbenchURIConverter {
+
+	private final static IWorkspaceRoot WORKSPACE_ROOT = URIConverterImpl.workspaceRoot;
+	private final static String WORKSPACE_ROOT_LOCATION = WORKSPACE_ROOT.getLocation().toString();
+
+	private static final String FILE_PROTOCOL = "file"; //$NON-NLS-1$
+
+	private static final IPath INVALID_PATH = new Path("!!!!~!!!!"); //$NON-NLS-1$
+
+	private static final IFile INVALID_FILE = WORKSPACE_ROOT.getFile(INVALID_PATH.append(INVALID_PATH));
+
+	//Used to avoid trying to fixup the URI when getting the
+	//OutputStream
+	protected boolean forceSaveRelative = false;
+
+	protected List inputContainers;
+
+	protected IContainer outputContainer;
+
+	protected ResourceSetWorkbenchSynchronizer resourceSetSynchronizer;
+	
+	/*
+	 * KLUDGE: We need to know the meta data area. This is so that any uri that starts with the metadata directory
+	 * is considered a file uri and NOT a workspace uri. The metadata is where plugin's store their working data.
+	 * It is not part of the workspace root.
+	 *  
+	 * There is no request for simply the metadata area. The log file is in the metadata directory. So we will
+	 * get the log file location and just remove the log file name. That should leave us with the metadata directory
+	 * only. If Eclipse ever decides to move it from here, this will no longer work. But it hasn't moved in three 
+	 * versions.
+	 * 
+	 * @since 1.1.0
+	 */
+	static protected final String METADATA_LOCATION = Platform.getLogFileLocation().removeLastSegments(1).toString();
+
+	/**
+	 * Default converter constructor, no containers.
+	 * 
+	 * 
+	 * @since 1.0.0
+	 */
+	public WorkbenchURIConverterImpl() {
+		super();
+	}
+
+	/**
+	 * Construct with an input container.
+	 * 
+	 * @param anInputContainer
+	 * 
+	 * @since 1.0.0
+	 */
+	public WorkbenchURIConverterImpl(IContainer anInputContainer) {
+		this(anInputContainer, (ResourceSetWorkbenchSynchronizer) null);
+	}
+
+	/**
+	 * Construct with an input container and a synchronzier.
+	 * 
+	 * @param aContainer
+	 * @param aSynchronizer
+	 * 
+	 * @since 1.0.0
+	 */
+	public WorkbenchURIConverterImpl(IContainer aContainer, ResourceSetWorkbenchSynchronizer aSynchronizer) {
+		this(aContainer, null, aSynchronizer);
+	}
+
+	/**
+	 * Construct with an input container and an output container.
+	 * 
+	 * @param anInputContainer
+	 * @param anOutputContainer
+	 * 
+	 * @since 1.0.0
+	 */
+	public WorkbenchURIConverterImpl(IContainer anInputContainer, IContainer anOutputContainer) {
+		this(anInputContainer, anOutputContainer, null);
+	}
+
+	/**
+	 * Construct with an input container, output container, and a synchronizer.
+	 * 
+	 * @param anInputContainer
+	 * @param anOutputContainer
+	 * @param aSynchronizer
+	 * 
+	 * @since 1.0.0
+	 */
+	public WorkbenchURIConverterImpl(IContainer anInputContainer, IContainer anOutputContainer, ResourceSetWorkbenchSynchronizer aSynchronizer) {
+		addInputContainer(anInputContainer);
+		setOutputContainer(anOutputContainer);
+		resourceSetSynchronizer = aSynchronizer;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.emf.workbench.WorkbenchURIConverter#addInputContainer(org.eclipse.core.resources.IContainer)
+	 */
+	public void addInputContainer(IContainer aContainer) {
+		if (aContainer != null && !getInputContainers().contains(aContainer))
+			getInputContainers().add(aContainer);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.emf.workbench.WorkbenchURIConverter#addInputContainers(java.util.List)
+	 */
+	public void addInputContainers(List containers) {
+		for (int i = 0; i < containers.size(); i++) {
+			addInputContainer((IContainer) containers.get(i));
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.emf.workbench.WorkbenchURIConverter#removeInputContainer(org.eclipse.core.resources.IContainer)
+	 */
+	public boolean removeInputContainer(IContainer aContainer) {
+		return getInputContainers().remove(aContainer);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.emf.workbench.WorkbenchURIConverter#getInputContainers()
+	 */
+	public List getInputContainers() {
+		if (inputContainers == null)
+			inputContainers = new ArrayList();
+		return inputContainers;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.emf.workbench.WorkbenchURIConverter#getInputContainer()
+	 */
+	public IContainer getInputContainer() {
+		if (!getInputContainers().isEmpty())
+			return (IContainer) getInputContainers().get(0);
+		else
+			return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.emf.workbench.WorkbenchURIConverter#getOutputContainer()
+	 */
+	public IContainer getOutputContainer() {
+		if (outputContainer == null)
+			outputContainer = getInputContainer();
+		return outputContainer;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.emf.workbench.WorkbenchURIConverter#setOutputContainer(org.eclipse.core.resources.IContainer)
+	 */
+	public void setOutputContainer(IContainer newOutputContainer) {
+		outputContainer = newOutputContainer;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.emf.workbench.WorkbenchURIConverter#getOutputFile(org.eclipse.core.runtime.IPath)
+	 */
+	public IFile getOutputFile(IPath aPath) {
+		IFile file = null;
+		if (getOutputContainer() != null) {
+			if (forceSaveRelative)
+				return primGetOutputFile(aPath);
+			file = getOutputFileForPathWithContainerSegments(aPath);
+			if (file != null)
+				return file;
+			else
+				return primGetOutputFile(aPath);
+		}
+		return file;
+	}
+
+	protected IFile primGetOutputFile(IPath aPath) {
+		return primGetFile(getOutputContainer(), aPath);
+	}
+
+	protected IFile getOutputFileForPathWithContainerSegments(IPath aPath) {
+		IContainer out = getOutputContainer();
+		return getFileForPathWithContainerSegments(aPath, out, false);
+	}
+
+	protected IFile getFileForPathWithContainerSegments(IPath aPath, IContainer container, boolean testExists) {
+		IPath containerPath = null;
+		IFile file = null;
+		if (testExists) {
+			containerPath = container.getProjectRelativePath();
+			if (!containerPath.isEmpty()) {
+				file = getFileForMatchingPath(aPath, containerPath, container);
+				if (file != null && file.exists())
+					return file;
+			}
+		}
+		containerPath = container.getFullPath();
+		file = getFileForMatchingPath(aPath, containerPath, container);
+		return file;
+	}
+
+	protected IFile getFileForMatchingPath(IPath containerPath, IPath sourcePath, IContainer container) {
+		int matches = 0;
+		matches = containerPath.matchingFirstSegments(sourcePath);
+		if (matches > 0 && matches == sourcePath.segmentCount()) {
+			IPath loadPath = containerPath.removeFirstSegments(matches);
+			return primGetFile(container, loadPath);
+		}
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.emf.workbench.WorkbenchURIConverter#getFile(java.lang.String)
+	 */
+	public IFile getFile(String uri) {
+		return getFile(new Path(uri));
+	}
+
+	/**
+	 * Get the file from the path.
+	 * 
+	 * @param path
+	 * @return
+	 * @see WorkbenchURIConverter#getFile(String)
+	 * @since 1.0.0
+	 */
+	public IFile getFile(IPath path) {
+		IFile file = null;
+		if (getInputContainer() != null) {
+			path = path.makeRelative();
+			java.util.Iterator it = getInputContainers().iterator();
+			while (it.hasNext()) {
+				IContainer con = (IContainer) it.next();
+				file = getInputFile(con, path);
+				if (file != null && file.exists())
+					return file;
+			}
+		}
+		if (file == null)
+			return INVALID_FILE;
+		return file;
+	}
+
+	/**
+	 * Get output file from string path.
+	 * 
+	 * @param uri
+	 * @return
+	 * 
+	 * @see WorkbenchURIConverter#getOutputFile(IPath)
+	 * @since 1.0.0
+	 */
+	public IFile getOutputFile(String uri) {
+		return getOutputFile(new Path(uri));
+	}
+
+	/**
+	 * Get the input file from the container and path.
+	 * 
+	 * @param con
+	 * @param path
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	public IFile getInputFile(IContainer con, IPath path) {
+		IFile file = null;
+		if (WORKSPACE_ROOT.equals(con) && path.segmentCount() < 2)
+			path = INVALID_PATH.append(path);
+		file = primGetFile(con, path);
+		if (file == null || !file.exists())
+			file = getFileForPathWithContainerSegments(path, con, true);
+		return file;
+	}
+
+	protected IFile primGetFile(IContainer container, IPath path) {
+		try {
+			return container.getFile(path);
+		} catch (IllegalArgumentException ex) {
+		}
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.emf.workbench.WorkbenchURIConverter#canGetUnderlyingResource(java.lang.String)
+	 */
+	public boolean canGetUnderlyingResource(String aFileName) {
+		IFile file = getFile(aFileName);
+		return file != null && file.exists();
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.emf.workbench.WorkbenchURIConverter#isForceSaveRelative()
+	 */
+	public boolean isForceSaveRelative() {
+		return forceSaveRelative;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.emf.workbench.WorkbenchURIConverter#setForceSaveRelative(boolean)
+	 */
+	public void setForceSaveRelative(boolean forceSaveRelative) {
+		this.forceSaveRelative = forceSaveRelative;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.emf.ecore.resource.URIConverter#normalize(org.eclipse.emf.common.util.URI)
+	 */public URI normalize(URI uri) {
+		URI result = uri;
+		String fragment = null;
+		if (uri.hasFragment()) {
+			fragment = uri.fragment();
+			result = uri.trimFragment();
+		}
+		result = getInternalURIMap().getURI(result);
+		if (WorkbenchResourceHelperBase.isPlatformResourceURI(result))
+			return appendFragment(result, fragment);
+		if (WorkbenchResourceHelperBase.isPlatformPluginResourceURI(result)) {
+			URI normalized = normalizePluginURI(result, fragment);
+			return (normalized != null) ? normalized : uri;
+		}
+		String protocol = result.scheme();
+		URI fileSearchURI = null;
+		if (protocol == null) {
+			fileSearchURI = normalizeEmptyProtocol(result, fragment);
+			if (fileSearchURI != null)
+				return fileSearchURI;
+		} else if (FILE_PROTOCOL.equals(protocol)) {
+			fileSearchURI = normalizeFileProtocol(result, fragment);
+			if (fileSearchURI != null)
+				return fileSearchURI;
+		} else if (JEMUtilPlugin.WORKSPACE_PROTOCOL.equals(protocol))
+			return normalizeWorkspaceProtocol(result, fragment);
+		return super.normalize(uri);
+	}
+
+	/*
+	 * Resolves a plugin format into the actual.
+	 */
+	protected URI normalizePluginURI(URI uri, String fragment) {
+		if (uri.segmentCount() < 2)
+			return uri; // Invalid, just let it go on.
+		// See if already normalized.
+		int u_scoreNdx = uri.segment(1).lastIndexOf('_');
+		if (u_scoreNdx != -1) {
+			// Not normalized. Remove the version to make it normalized.
+			String[] segments = uri.segments();
+			segments[1] = segments[1].substring(0, u_scoreNdx);
+			return URI.createHierarchicalURI(uri.scheme(), uri.authority(), uri.device(), segments, uri.query(), fragment);
+		} else
+			return uri;
+	}
+
+	protected URI normalizeWorkspaceProtocol(URI aWorkspaceURI, String fragment) {
+		URI result;
+		String uriString = aWorkspaceURI.toString();
+		uriString = uriString.substring(JEMUtilPlugin.WORKSPACE_PROTOCOL.length() + 1);
+		result = URI.createPlatformResourceURI(uriString);
+		if (fragment != null)
+			result = appendFragment(aWorkspaceURI, fragment);
+		return result;
+	}
+	
+	protected URI normalizeEmptyProtocol(URI aFileUri, String fragment) {
+		//Make the relative path absolute and return a platform URI.
+		IPath path = new Path(aFileUri.toString());
+		return normalizeToWorkspaceURI(path, fragment);
+	}
+	
+	private URI normalizeToWorkspaceURI(IPath path, String fragment) {
+		URI result = null;
+		IFile file = getFile(path);
+		if (file == null || !file.exists())
+			file = getOutputFile(path);
+		if (file != null) {
+			result = URI.createPlatformResourceURI(file.getFullPath().toString());
+			result = appendFragment(result, fragment);
+		}
+		return result;
+	}
+	
+	protected URI normalizeFileProtocol(URI aFileUri, String fragment) {
+		URI result = null;
+		//Make the relative path absolute and return a platform URI.
+		String devicePath = aFileUri.devicePath();
+		//Test for workspace location.
+		if (!devicePath.startsWith(METADATA_LOCATION) &&
+			devicePath.startsWith(WORKSPACE_ROOT_LOCATION) && devicePath.length() > WORKSPACE_ROOT_LOCATION.length()) {
+			//test for workspace location
+			result = normalizeToWorkspaceURI(new Path(devicePath.substring(WORKSPACE_ROOT_LOCATION.length())), fragment);
+		} else if (aFileUri.isRelative()) {
+			result = normalizeToWorkspaceURI(new Path(aFileUri.toString()), fragment);
+		} else {
+			result = aFileUri;
+		}
+		return result;
+	}
+	
+	protected URI appendFragment(URI result, String fragment) {
+		if (fragment != null)
+			return result.appendFragment(fragment);
+		else
+			return result;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.emf.workbench.WorkbenchURIConverter#getOutputFileWithMappingApplied(java.lang.String)
+	 */
+	public IFile getOutputFileWithMappingApplied(String uri) {
+		URI converted = getInternalURIMap().getURI(URI.createURI(uri));
+		return getOutputFile(new Path(converted.toString()));
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.emf.ecore.resource.impl.URIConverterImpl#createPlatformResourceOutputStream(java.lang.String)
+	 */
+	public OutputStream createPlatformResourceOutputStream(String platformResourcePath) throws IOException {
+		IFile file = WORKSPACE_ROOT.getFile(new Path(platformResourcePath));
+		ProjectUtilities.ensureContainerNotReadOnly(file);
+		return new WorkbenchByteArrayOutputStream(file, resourceSetSynchronizer);
+	}
+
+	protected URI getContainerRelativeURI(IFile aFile) {
+		IPath path = WorkbenchResourceHelperBase.getPathFromContainers(inputContainers, aFile.getFullPath());
+		if (path != null)
+			return URI.createURI(path.toString());
+		return null;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.emf.ecore.resource.impl.URIConverterImpl#createPlatformResourceInputStream(java.lang.String)
+	 */
+	public InputStream createPlatformResourceInputStream(String platformResourcePath) throws IOException {
+		IFile file = WORKSPACE_ROOT.getFile(new Path(platformResourcePath));
+		try {
+			if (!file.isSynchronized(IResource.DEPTH_ONE)) {
+				try {
+					File iofile = file.getFullPath().toFile();
+					if (iofile.exists() || file.exists())
+						file.refreshLocal(IResource.DEPTH_ONE, null);
+				} catch (CoreException ce) {
+					if (ce.getStatus().getCode() != IResourceStatus.WORKSPACE_LOCKED)
+						throw ce;
+				}
+			}
+			// CHANGED from <no-args> to <true> [94015]
+			return file.getContents(true);
+		} catch (CoreException exception) {
+			throw new Resource.IOWrappedException(exception);
+		}		
+	}
+
+}
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/nature/EMFNature.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/nature/EMFNature.java
new file mode 100644
index 0000000..f7f288a
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/nature/EMFNature.java
@@ -0,0 +1,554 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $$RCSfile: EMFNature.java,v $$
+ *  $$Revision: 1.4 $$  $$Date: 2005/02/15 23:04:14 $$ 
+ */
+package org.eclipse.jem.util.emf.workbench.nature;
+
+import java.util.*;
+
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.*;
+import org.eclipse.emf.common.util.*;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.xmi.XMLParserPool;
+import org.eclipse.emf.ecore.xmi.impl.XMLParserPoolImpl;
+
+import org.eclipse.jem.internal.util.emf.workbench.nature.EMFNatureRegistry;
+import org.eclipse.jem.util.emf.workbench.*;
+import org.eclipse.jem.util.logger.proxy.Logger;
+
+
+/**
+ * The base EMFNature.
+ * <p>
+ * This is expected to be subclassed by clients, but there are default subclasses available.
+ * </p>
+ * 
+ * @since 1.0.0
+ */
+public abstract class EMFNature implements IProjectNature, IEMFContextContributor {
+
+	protected IProject project;
+
+	protected EMFWorkbenchContextBase emfContext;
+
+	protected boolean hasConfigured = false;
+	
+	public static XMLParserPool SHARED_PARSER_POOL = new XMLParserPoolImpl();	
+
+	public EMFNature() {
+		super();
+	}
+
+	/**
+	 * Add the nature id to the project.
+	 * 
+	 * @param proj
+	 * @param natureId
+	 * @throws CoreException
+	 * 
+	 * @since 1.0.0
+	 */
+	protected static void addNatureToProject(IProject proj, String natureId) throws CoreException {
+		ProjectUtilities.addNatureToProject(proj, natureId);
+	}
+
+	/**
+	 * Configures the project with this nature. This is called by <code>IProject.addNature</code> and should not be called directly by clients. The
+	 * nature extension id is added to the list of natures on the project by <code>IProject.addNature</code>, and need not be added here.
+	 * 
+	 * <p>
+	 * All subtypes must call super. The better way for subtypes is to override primConfigure instead.
+	 * </p>
+	 * 
+	 * @throws CoreException
+	 * @since 1.0.0
+	 */
+	public void configure() throws org.eclipse.core.runtime.CoreException {
+		if (!hasConfigured) {
+			hasConfigured = true;
+			primConfigure();
+		}
+	}
+
+	/**
+	 * Called from configure the first time configure is called on the nature. Default is do nothing. Subclasses should override and add in their own
+	 * configuration.
+	 * 
+	 * @throws org.eclipse.core.runtime.CoreException
+	 * 
+	 * @since 1.0.0
+	 */
+	protected void primConfigure() throws org.eclipse.core.runtime.CoreException {
+
+	}
+
+	/**
+	 * Create an EMF context for the project.
+	 * 
+	 * @throws CoreException
+	 * 
+	 * @since 1.0.0
+	 */
+	protected void createEmfContext() throws CoreException {
+		WorkbenchResourceHelperBase.createEMFContext(getProject(), this);
+	}
+
+	/**
+	 * Create a folder relative to the project based on aProjectRelativePathString.
+	 * 
+	 * @param aProjectRelativePathString
+	 * @return
+	 * @throws CoreException
+	 * 
+	 * @since 1.0.0
+	 */
+	public IFolder createFolder(String aProjectRelativePathString) throws CoreException {
+		if (aProjectRelativePathString != null && aProjectRelativePathString.length() > 0)
+			return createFolder(new Path(aProjectRelativePathString));
+		return null;
+	}
+
+	/**
+	 * Create a folder relative to the project based on aProjectRelativePathString.
+	 * 
+	 * @param aProjectRelativePath
+	 * @return
+	 * @throws CoreException
+	 * 
+	 * @since 1.0.0
+	 */
+	public IFolder createFolder(IPath aProjectRelativePath) throws CoreException {
+		if (aProjectRelativePath != null && !aProjectRelativePath.isEmpty()) {
+			IFolder folder = getWorkspace().getRoot().getFolder(getProjectPath().append(aProjectRelativePath));
+			if (!folder.exists()) {
+				ProjectUtilities.ensureContainerNotReadOnly(folder);
+				folder.create(true, true, null);
+			}
+			return folder;
+		}
+		return null;
+	}
+
+	/**
+	 * Removes this nature from the project, performing any required deconfiguration. This is called by <code>IProject.removeNature</code> and
+	 * should not be called directly by clients. The nature id is removed from the list of natures on the project by
+	 * <code>IProject.removeNature</code>, and need not be removed here.
+	 * 
+	 * @throws CoreException
+	 * @since 1.0.0
+	 */
+	public void deconfigure() throws org.eclipse.core.runtime.CoreException {
+		emfContext = null;
+	}
+
+	/**
+	 * Return true if the IFile with the given name exists in this project.
+	 * 
+	 * @param aFileName
+	 *            filename can be relative to one of the input file paths for the WorkbenchURIConverter.
+	 * @return <code>true</code> if filename exists in this project
+	 * 
+	 * @since 1.0.0
+	 */
+	public boolean fileExists(String aFileName) {
+		if (aFileName == null)
+			return false;
+
+		IPath path = new Path(aFileName);
+		if (path.isAbsolute())
+			return ResourcesPlugin.getWorkspace().getRoot().getFile(path).exists();
+		else
+			return getWorkbenchURIConverter().canGetUnderlyingResource(aFileName);
+	}
+
+	/**
+	 * Get the resource set for the project
+	 * 
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	public ResourceSet getResourceSet() {
+		return getEmfContextBase().getResourceSet();
+	}
+
+	/**
+	 * Returns the EMF root folder for the project. Defaults to the project. Subclasses can override.
+	 * 
+	 * @return EMF root folder for the project.
+	 * 
+	 * @since 1.0.0
+	 */
+	public IContainer getEMFRoot() {
+		return getProject();
+	}
+
+	/**
+	 * Used for optimizations; answers whether a mof context for this nature has exists yet
+	 * 
+	 * @deprecated use hasResourceSet();
+	 * @since 1.0.0
+	 */
+	public boolean hasContext() {
+		return hasResourceSet();
+	}
+
+	/**
+	 * Is there a resource set yet for the project.
+	 * 
+	 * @return <code>true</code> if there is a resource set for the project.
+	 * 
+	 * @since 1.0.0
+	 */
+	public boolean hasResourceSet() {
+		return emfContext != null && emfContext.hasResourceSet();
+	}
+
+	/**
+	 * Lazy initializer; for migration of existing workspaces where configure will never get called.
+	 * 
+	 * @return context base for the project.
+	 * 
+	 * @since 1.0.0
+	 */
+	protected EMFWorkbenchContextBase getEmfContextBase() {
+		if (emfContext == null) {
+			try {
+				createEmfContext();
+			} catch (CoreException ex) {
+				Logger.getLogger().logError(ex);
+			}
+		}
+		return emfContext;
+	}
+
+	/**
+	 * Get the IFile with the given name if it is in this project.
+	 * 
+	 * @param aFileName
+	 *            filename can be relative to one of the input file paths for the WorkbenchURIConverter.
+	 * @return file it it is in this project, or <code>null</code> if it doesn't.
+	 * 
+	 * @since 1.0.0
+	 */
+	public IFile getFile(String aFileName) {
+		return getWorkbenchURIConverter().getFile(aFileName);
+	}
+
+	/**
+	 * Return the nature's ID.
+	 * 
+	 * @return nature id
+	 * 
+	 * @since 1.0.0
+	 */
+	public abstract String getNatureID();
+
+	/**
+	 * Return the ID of the plugin that this nature is contained within.
+	 * 
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	protected abstract String getPluginID();
+
+	/**
+	 * Returns the project to which this project nature applies.
+	 * 
+	 * @return the project handle
+	 * @since 1.0.0
+	 */
+	public org.eclipse.core.resources.IProject getProject() {
+		return project;
+	}
+
+	/**
+	 * Return the full path of the project.
+	 * 
+	 * @return full project path (relative to workspace)
+	 * @since 1.0.0
+	 */
+	public IPath getProjectPath() {
+		return getProject().getFullPath();
+	}
+
+	/**
+	 * Get the server property of the project from the supplied key
+	 * 
+	 * @param key
+	 *            java.lang.String
+	 * @deprecated we cannont use persistent properties because they are not stored in the repository
+	 * @since 1.0.0
+	 */
+	protected String getProjectServerValue(String key) {
+		if (key == null)
+			return null;
+		try {
+			QualifiedName wholeName = qualifiedKey(key);
+			return getProject().getPersistentProperty(wholeName);
+		} catch (CoreException exception) {
+			//If we can't find it assume it is null
+			exception.printStackTrace();
+			return null;
+		}
+	}
+
+	/**
+	 * Get WorkbenchURIConverter for this project.
+	 * <p>
+	 * This method assumes the URIConverter on the ResourceSet is the one that was created for the ResourceSet on behalf of this nature runtime.
+	 * </p>
+	 * 
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	protected WorkbenchURIConverter getWorkbenchURIConverter() {
+		return (WorkbenchURIConverter) getResourceSet().getURIConverter();
+	}
+
+	public IWorkspace getWorkspace() {
+		return getProject().getWorkspace();
+	}
+
+	/**
+	 * @deprecated use getResource(URI)
+	 */
+	public Resource getXmiResource(String uri) {
+		return getResource(URI.createURI(uri));
+	}
+
+	/**
+	 * Get the resource for this uri. It will use the resource set of the project to find it. It will load if not already loaded.
+	 * 
+	 * @param uri
+	 * @return resource or <code>null</code> if resource is not found.
+	 * 
+	 * @since 1.0.0
+	 */
+	public Resource getResource(URI uri) {
+		try {
+			return getResourceSet().getResource(uri, true);
+		} catch (WrappedException ex) {
+			if (!WorkbenchResourceHelperBase.isResourceNotFound(ex))
+				throw ex;
+		}
+		return null;
+	}
+
+	/**
+	 * @deprecated use getResourceSet()
+	 */
+	public ResourceSet getXmiResourceSet() {
+		return getResourceSet();
+	}
+
+	/**
+	 * Make sure that all dependent components are initialized before creating the ResourceSet.
+	 */
+	protected void initializeDependentComponents() {
+		//com.ibm.etools.java.init.JavaInit.init();
+	}
+
+	/**
+	 * @deprecated use createResource(URI)
+	 */
+	public Resource makeXmiResource(String uri) {
+		return createResource(URI.createURI(uri));
+	}
+
+	/**
+	 * @deprecated use createResource(URI)
+	 */
+	public Resource makeXmiResource(String uri, EList anExtent) {
+		Resource res = makeXmiResource(uri);
+		if (res != null)
+			res.getContents().addAll(anExtent);
+		return res;
+	}
+
+	/**
+	 * Create the resource for this uri. It will use the resource set of the project to create it.
+	 * 
+	 * @param uri
+	 * @return resource
+	 * 
+	 * @since 1.0.0
+	 */
+	public Resource createResource(URI uri) {
+		return getResourceSet().createResource(uri);
+	}
+
+	/*
+	 * Return the QualifedValue for key for storage in the repository. The key is qualifed with the package name to avoid collision. @return
+	 * QualifedName @param key java.lang.String
+	 */
+	private QualifiedName qualifiedKey(String key) {
+		return new QualifiedName(getPluginID(), key);
+	}
+
+	/**
+	 * Register the given nature id as an EMFNature.
+	 * 
+	 * @param natureID
+	 * 
+	 * @since 1.0.0
+	 */
+	public static void registerNatureID(String natureID) {
+		EMFNatureRegistry.singleton().REGISTERED_NATURE_IDS.add(natureID);
+	}
+
+	/**
+	 * Sets the project to which this nature applies. Used when instantiating this project nature runtime. This is called by
+	 * <code>IProject.addNature</code> and should not be called directly by clients.
+	 * 
+	 * @param project
+	 *            the project to which this nature applies
+	 * 
+	 * @since 1.0.0
+	 */
+	public void setProject(org.eclipse.core.resources.IProject newProject) {
+		project = newProject;
+	}
+
+	/**
+	 * Set the server property of the project from the supplied value
+	 * 
+	 * @param key
+	 *            java.lang.String
+	 * @param value
+	 *            String
+	 * @deprecated we cannont use persistent properties because they are not stored in the repository
+	 */
+	protected void setProjectServerValue(String key, String value) {
+		if (key != null) {
+			try {
+				QualifiedName wholeName = qualifiedKey(key);
+				getProject().setPersistentProperty(wholeName, value);
+			} catch (CoreException exception) {
+				//If we can't find it assume it is null
+				exception.printStackTrace();
+				return;
+			}
+		}
+	}
+
+	/**
+	 * Shutdown the EMF nature
+	 * 
+	 * 
+	 * @since 1.0.0
+	 */
+	public void shutdown() {
+		if (getResourceSet() != null)
+			((ProjectResourceSet) getResourceSet()).release();
+	}
+
+	/**
+	 * Return a list of EMFNatures based on the natures that have been configured for this project.
+	 * 
+	 * @return List of EMFNatures
+	 * @param project
+	 * @return list of natures configured for the project.
+	 * @since 1.0.0
+	 */
+	public static List getRegisteredRuntimes(IProject project) {
+		List result = null;
+		EMFNature nature = null;
+		if (project != null && project.isAccessible()) {
+			String natureID;
+			Iterator it = EMFNatureRegistry.singleton().REGISTERED_NATURE_IDS.iterator();
+			while (it.hasNext()) {
+				natureID = (String) it.next();
+				try {
+					nature = (EMFNature) project.getNature(natureID);
+				} catch (CoreException e) {
+				}
+				if (nature != null) {
+					if (result == null)
+						result = new ArrayList(2);
+					result.add(nature);
+				}
+			}
+		}
+		return result == null ? Collections.EMPTY_LIST : result;
+	}
+
+	/**
+	 * Return a list of nature ids based on the natures that have been configured for this project.
+	 * 
+	 * @return list of configured nature ids.
+	 * @param project
+	 */
+	public static List getRegisteredRuntimeIDs(IProject project) {
+		List result = null;
+		String natureID = null;
+		if (project != null && project.isAccessible()) {
+			Iterator it = EMFNatureRegistry.singleton().REGISTERED_NATURE_IDS.iterator();
+			while (it.hasNext()) {
+				natureID = (String) it.next();
+				try {
+					if (project.hasNature(natureID)) {
+						if (result == null)
+							result = new ArrayList(2);
+						result.add(natureID);
+					}
+				} catch (CoreException e) {
+				}
+			}
+		}
+		return result == null ? Collections.EMPTY_LIST : result;
+	}
+
+	/**
+	 * Return if the project has the given nature.
+	 * 
+	 * @param project
+	 * @param natureId
+	 * @return <code>true</code> if project has given nature
+	 * 
+	 * @since 1.0.0
+	 */
+	public static boolean hasRuntime(IProject project, String natureId) {
+		if (project == null || !project.isAccessible())
+			return false;
+		try {
+			return project.hasNature(natureId);
+		} catch (CoreException e) {
+			return false;
+		}
+	}
+
+	/**
+	 * Return if the project has any one of the possible given nature ids.
+	 * 
+	 * @param project
+	 * @param possibleNatureIds
+	 * @return <code>true</code> if at least one of the possible natures id is configured for the project.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static boolean hasRuntime(IProject project, String[] possibleNatureIds) {
+		if (project != null) {
+			for (int i = 0; i < possibleNatureIds.length; i++) {
+				if (hasRuntime(project, possibleNatureIds[i]))
+					return true;
+			}
+		}
+		return false;
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/logger/proxyrender/AbstractWorkBenchRenderer.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/logger/proxyrender/AbstractWorkBenchRenderer.java
new file mode 100644
index 0000000..4285566
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/logger/proxyrender/AbstractWorkBenchRenderer.java
@@ -0,0 +1,472 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: AbstractWorkBenchRenderer.java,v $
+ *  $Revision: 1.5 $  $Date: 2005/12/14 21:24:26 $ 
+ */
+package org.eclipse.jem.util.logger.proxyrender;
+
+import java.lang.reflect.Field;
+import java.util.logging.Level;
+
+import org.eclipse.core.runtime.*;
+import org.osgi.framework.Bundle;
+
+import org.eclipse.jem.util.logger.proxy.*;
+
+
+/**
+ * Base log renderer that logs to the workbench.
+ * 
+ * @since 1.1.0
+ */
+public abstract class AbstractWorkBenchRenderer implements ILogRenderer2 {
+
+	private boolean fTraceMode = false; // will we actually punch trace messaged or not
+
+	private boolean fSettingTrace = false;
+
+	protected Bundle fMyBundle = null;
+
+	protected Logger fMyLogger = null;
+
+	protected ILog fWorkBenchLogger = null;
+
+	/**
+	 * Constructer taking a logger.
+	 * 
+	 * @param logger
+	 * 
+	 * @since 1.1.0
+	 */
+	public AbstractWorkBenchRenderer(Logger logger) {
+		super();
+		fMyLogger = logger;
+		fTraceMode = fMyLogger.getTraceMode();
+
+		String pluginID = fMyLogger.getPluginID();
+		fMyBundle = Platform.getBundle(pluginID);
+		if (fMyBundle == null)
+			throw new RuntimeException("Invalid Plugin ID"); //$NON-NLS-1$
+
+		fWorkBenchLogger = Platform.getLog(fMyBundle);
+		setTraceMode(fMyLogger.getTraceMode() || isDebugging(fMyBundle));
+		fMyLogger.setRenderer(this);
+	}
+
+	/*
+	 * This used to come from the Plugin instance. But in new OSGi, there is not necessarily a Plugin instance. So use the same logic they use.
+	 */
+	private boolean isDebugging(Bundle bundle) {
+		String symbolicName = bundle.getSymbolicName();
+		if (symbolicName != null) {
+			String key = symbolicName + "/debug"; //$NON-NLS-1$
+			String value = Platform.getDebugOption(key);
+			return value == null ? false : value.equalsIgnoreCase("true"); //$NON-NLS-1$
+		}
+		return false;
+	}
+
+	/**
+	 * Is the console log for eclipse turned on to sysout. If true, then we shouldn't log to console anything already logged because Eclipse would of
+	 * logged it for us. This comes from the -Declipse.consoleLog="true" which is the default when starting eclipse from PDE.
+	 */
+	protected static final boolean consoleLogOn;
+	static {
+		String consologPropertyName = null;
+		try {
+			// Accessing an internal field, so using reflection. This way if changes in future we won't crash.
+			Class eclipseStarter = Class.forName("org.eclipse.core.runtime.adaptor.EclipseStarter");	//$NON-NLS-1$
+			Field consolelog = eclipseStarter.getDeclaredField("PROP_CONSOLE_LOG");	//$NON-NLS-1$
+			consologPropertyName = (String) consolelog.get(null);
+		} catch (SecurityException e) {
+		} catch (IllegalArgumentException e) {
+		} catch (ClassNotFoundException e) {
+		} catch (NoSuchFieldException e) {
+		} catch (IllegalAccessException e) {
+		}
+		consoleLogOn = consologPropertyName != null && "true".equals(System.getProperty(consologPropertyName)) ;  //$NON-NLS-1$
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer#setTraceMode(boolean)
+	 */
+	public void setTraceMode(boolean flag) {
+		if (fSettingTrace)
+			return; // Do not allow cycles
+
+		fSettingTrace = true;
+		fTraceMode = flag;
+		fMyLogger.setTraceMode(flag);
+		fSettingTrace = false;
+	}
+
+	// The following methods are for historical renderers in case this has been subclassed outside
+	// of util.
+
+	/**
+	 * Log a string to the trace.
+	 * 
+	 * @param param
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	public abstract String log(String param);
+
+	/**
+	 * Default one that log a string to the trace given a level. Default simply passes it to log(String) so that we don't break old subclasses.
+	 * <p>
+	 * If loggedToWorkbench is true, then it shouldn't be logged to console if consoleLogOn is true because workbench already logged to console.
+	 * 
+	 * @param msg
+	 * @param l
+	 * 
+	 * @since 1.0.0
+	 */
+	protected void log(String msg, Level l, boolean loggedToWorkbench) {
+		log(msg);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer#log(java.lang.String, int)
+	 */
+	public String log(String msg, int type) {
+
+		String target = logWorkBench(msg, type);
+		if (fTraceMode || target.equals(NOLOG_DESCRIPTION))
+			return log(msg);
+		else
+			return target;
+	}
+
+	/**
+	 * Log to workbench, a string of the given level <code>ILogRenderer.LOG_</code>. levels.
+	 * 
+	 * @param msg
+	 * @param type
+	 * @return description of the log's destination e.g., <code>CONSOLE_DESCRIPTION</code>
+	 * 
+	 * @see ILogRenderer#LOG_ERROR and all of the other log types.
+	 * @see ILogRenderer#CONSOLE_DESCRIPTION
+	 * @since 1.0.0
+	 */
+	public String logWorkBench(String msg, int type) {
+
+		try {
+			int ErrCode;
+			if (fWorkBenchLogger != null) {
+				switch (type) {
+					case (ILogRenderer.LOG_ERROR):
+						ErrCode = IStatus.ERROR;
+						break;
+					case (ILogRenderer.LOG_WARNING):
+						ErrCode = IStatus.WARNING;
+						break;
+					case (ILogRenderer.LOG_INFO):
+						ErrCode = IStatus.INFO;
+						break;
+					case (ILogRenderer.LOG_TRACE):
+						ErrCode = IStatus.OK;
+						break;
+					default:
+						throw new RuntimeException("Invalid Log Type"); //$NON-NLS-1$
+				}
+				Status status = new Status(ErrCode, fMyBundle.getSymbolicName(), IStatus.OK, msg, null);
+				fWorkBenchLogger.log(status);
+				return WORKBENCH_DESCRIPTION;
+			} else
+				return NOLOG_DESCRIPTION;
+		} catch (Throwable t) {
+			return NOLOG_DESCRIPTION;
+		}
+	}
+
+	// Default implentation of the ILogRenderer2 interface.
+	protected boolean isLogging(Level level) {
+		return fTraceMode || fMyLogger.isLoggingLevel(level);
+	}
+
+	private static final int[] STATUS_LEVEL;
+
+	private static final Level[] STATUS_LEVEL_LOOKUP;
+
+	private static final Level[] LEVEL_STATUS;
+
+	static {
+		// Status levels that correspond to the log levels, from finest to none, same indexes as from STATUS_LEVEL_LOOKUP.
+		STATUS_LEVEL_LOOKUP = new Level[] { Level.INFO, Level.WARNING, Level.SEVERE};
+		STATUS_LEVEL = new int[] { IStatus.INFO, IStatus.WARNING, IStatus.ERROR};
+
+		// Levels that correspond to the IStatus levels.
+		int maxID = Math.max(IStatus.OK, Math.max(IStatus.INFO, Math.max(IStatus.WARNING, IStatus.ERROR)));
+		LEVEL_STATUS = new Level[maxID + 1];
+		LEVEL_STATUS[IStatus.OK] = Level.FINE;
+		LEVEL_STATUS[IStatus.INFO] = Level.INFO;
+		LEVEL_STATUS[IStatus.WARNING] = Level.WARNING;
+		LEVEL_STATUS[IStatus.ERROR] = Level.SEVERE;
+	}
+
+	/**
+	 * Return the Java Level for the status code from the given IStatus.
+	 * 
+	 * @param status
+	 * @return the Java Level
+	 * 
+	 * @since 1.0.0
+	 */
+	protected Level getLogLevel(IStatus status) {
+		return LEVEL_STATUS[status.getSeverity()];
+	}
+
+	/**
+	 * Return the IStatus status code for the given Java Level.
+	 * 
+	 * @param logLevel
+	 * @return the IStatus status code.
+	 * 
+	 * @since 1.0.0
+	 */
+	protected int getStatusSeverity(Level logLevel) {
+		for (int i = 0; i < STATUS_LEVEL_LOOKUP.length; i++) {
+			if (STATUS_LEVEL_LOOKUP[i] == logLevel)
+				return STATUS_LEVEL[i];
+		}
+		return IStatus.OK; // Default to ok.
+	}
+
+	/**
+	 * Log the string to the workbench for the given level
+	 * 
+	 * @param msg
+	 * @param level
+	 * @return description of the log's destination e.g., <code>CONSOLE_DESCRIPTION</code>
+	 * 
+	 * @since 1.1.0
+	 */
+	protected String logWorkbench(String msg, Level level) {
+		String result = NOLOG_DESCRIPTION;
+		// Test again because we could be here simply due to trace mode, in which case we
+		// don't want to workbench log it.
+		if (fMyLogger.isLoggingLevel(level)) {
+			Platform.getLog(fMyBundle).log(new Status(getStatusSeverity(level), fMyBundle.getSymbolicName(), 0, msg, null));
+			result = WORKBENCH_DESCRIPTION;
+			if (fTraceMode)
+				log(msg, level, true);
+		} else if (fTraceMode)
+			log(msg, level, false);
+		return result;
+	}
+
+	private String getStatusMsg(IStatus s, Level l) {
+		if (s.getException() != null)
+			return fMyLogger.getGenericMsg(s.toString() + fMyLogger.fLineSeperator + fMyLogger.exceptionToString(s.getException()), l);
+		else
+			return fMyLogger.getGenericMsg(s.toString(), l);
+	}
+
+	/**
+	 * Log the IStatus to the workbench at the given level.
+	 * 
+	 * @param s
+	 * @param level
+	 * @return description of the log's destination e.g., <code>CONSOLE_DESCRIPTION</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	protected String logWorkbench(IStatus s, Level level) {
+		if (level == DEFAULT)
+			level = getLogLevel(s);
+		String result = NOLOG_DESCRIPTION;
+		// Test again because we could be here simply due to trace mode, in which case we
+		// don't want to workbench log it.
+		if (fMyLogger.isLoggingLevel(level)) {
+			Platform.getLog(fMyBundle).log(s);
+			result = WORKBENCH_DESCRIPTION;
+			if (fTraceMode)
+				log(getStatusMsg(s, level), level, true);
+		} else if (fTraceMode)
+			log(getStatusMsg(s, level), level, false);
+		return result;
+	}
+
+	/**
+	 * Log to the workbench the Throwable at the given level.
+	 * 
+	 * @param t
+	 * @param level
+	 * @return description of the log's destination e.g., <code>CONSOLE_DESCRIPTION</code>
+	 * 
+	 * @since 1.0.0
+	 */
+	protected String logWorkbench(Throwable t, Level level) {
+		String result = NOLOG_DESCRIPTION;
+		// Test again because we could be here simply due to trace mode, in which case we
+		// don't want to workbench log it.
+		if (fMyLogger.isLoggingLevel(level)) {
+			Platform.getLog(fMyBundle).log(new Status(getStatusSeverity(level), fMyBundle.getSymbolicName(), 0, "Exception thrown.", t)); //$NON-NLS-1$
+			result = WORKBENCH_DESCRIPTION;
+			if (fTraceMode)
+				log(fMyLogger.getGenericMsg(fMyLogger.exceptionToString(t), level), level, true);
+		} else if (fTraceMode)
+			log(fMyLogger.getGenericMsg(fMyLogger.exceptionToString(t), level), level, false);
+		return result;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer2#log(byte, java.util.logging.Level)
+	 */
+	public String log(boolean b, Level level) {
+		if (level == DEFAULT)
+			level = Level.FINEST;
+		if (isLogging(level))
+			return logWorkbench(fMyLogger.getGenericMsg(String.valueOf(b), level), level);
+		else
+			return NOLOG_DESCRIPTION;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer2#log(byte, java.util.logging.Level)
+	 */
+	public String log(byte b, Level level) {
+		if (level == DEFAULT)
+			level = Level.FINEST;
+		if (isLogging(level))
+			return logWorkbench(fMyLogger.getGenericMsg(String.valueOf(b), level), level);
+		else
+			return NOLOG_DESCRIPTION;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer2#log(char, java.util.logging.Level)
+	 */
+	public String log(char c, Level level) {
+		if (level == DEFAULT)
+			level = Level.FINEST;
+		if (isLogging(level))
+			return logWorkbench(fMyLogger.getGenericMsg(String.valueOf(c), level), level);
+		else
+			return NOLOG_DESCRIPTION;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer2#log(double, java.util.logging.Level)
+	 */
+	public String log(double d, Level level) {
+		if (level == DEFAULT)
+			level = Level.FINEST;
+		if (isLogging(level))
+			return logWorkbench(fMyLogger.getGenericMsg(String.valueOf(d), level), level);
+		else
+			return NOLOG_DESCRIPTION;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer2#log(float, java.util.logging.Level)
+	 */
+	public String log(float f, Level level) {
+		if (level == DEFAULT)
+			level = Level.FINEST;
+		if (isLogging(level))
+			return logWorkbench(fMyLogger.getGenericMsg(String.valueOf(f), level), level);
+		else
+			return NOLOG_DESCRIPTION;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer2#log(int, java.util.logging.Level)
+	 */
+	public String log(int i, Level level) {
+		if (level == DEFAULT)
+			level = Level.FINEST;
+		if (isLogging(level))
+			return logWorkbench(fMyLogger.getGenericMsg(String.valueOf(i), level), level);
+		else
+			return NOLOG_DESCRIPTION;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer2#log(long, java.util.logging.Level)
+	 */
+	public String log(long l, Level level) {
+		if (level == DEFAULT)
+			level = Level.FINEST;
+		if (isLogging(level))
+			return logWorkbench(fMyLogger.getGenericMsg(String.valueOf(l), level), level);
+		else
+			return NOLOG_DESCRIPTION;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer2#log(java.lang.Object, java.util.logging.Level)
+	 */
+	public String log(Object o, Level level) {
+		if (o instanceof IStatus)
+			return logWorkbench((IStatus) o, level);
+		if (level == DEFAULT)
+			level = Level.FINEST;
+		if (isLogging(level))
+			return logWorkbench(fMyLogger.getGenericMsg(String.valueOf(o), level), level);
+		else
+			return NOLOG_DESCRIPTION;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer2#log(short, java.util.logging.Level)
+	 */
+	public String log(short s, Level level) {
+		if (level == DEFAULT)
+			level = Level.FINEST;
+		if (isLogging(level))
+			return logWorkbench(fMyLogger.getGenericMsg(String.valueOf(s), level), level);
+		else
+			return NOLOG_DESCRIPTION;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxy.ILogRenderer2#log(java.lang.Throwable, java.util.logging.Level)
+	 */
+	public String log(Throwable t, Level level) {
+		if (t instanceof CoreException)
+			return logWorkbench(((CoreException) t).getStatus(), level);
+		if (level == DEFAULT)
+			level = Level.SEVERE;
+		if (isLogging(level)) {
+			return logWorkbench(t, level);
+		} else
+			return NOLOG_DESCRIPTION;
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/logger/proxyrender/ConsoleLogRenderer.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/logger/proxyrender/ConsoleLogRenderer.java
new file mode 100644
index 0000000..90b2963
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/logger/proxyrender/ConsoleLogRenderer.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: ConsoleLogRenderer.java,v $
+ *  $Revision: 1.2 $  $Date: 2005/02/15 23:04:14 $ 
+ */
+package org.eclipse.jem.util.logger.proxyrender;
+
+import java.util.logging.Level;
+
+import org.eclipse.jem.util.logger.proxy.ILogRenderer;
+import org.eclipse.jem.util.logger.proxy.Logger;
+
+
+/**
+ * Log renderer to the console.
+ * 
+ * @since 1.0.0
+ */
+public class ConsoleLogRenderer extends AbstractWorkBenchRenderer {
+
+	/**
+	 * Constructor taking a logger.
+	 * 
+	 * @param logger
+	 * 
+	 * @since 1.0.0
+	 */
+	public ConsoleLogRenderer(Logger logger) {
+		super(logger);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxyrender.AbstractWorkBenchRenderer#log(java.lang.String)
+	 */
+	public String log(String msg) {
+
+		System.out.println(msg);
+		return ILogRenderer.CONSOLE_DESCRIPTION;
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxyrender.AbstractWorkBenchRenderer#log(java.lang.String, java.util.logging.Level, boolean)
+	 */
+	protected void log(String msg, Level l, boolean loggedToWorkbench) {
+		if (!loggedToWorkbench || !consoleLogOn) {
+			if (l == Level.SEVERE)
+				System.err.println(msg);
+			else
+				System.out.println(msg);
+		}
+	}
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/logger/proxyrender/DefaultPluginTraceRenderer.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/logger/proxyrender/DefaultPluginTraceRenderer.java
new file mode 100644
index 0000000..bedf203
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/logger/proxyrender/DefaultPluginTraceRenderer.java
@@ -0,0 +1,113 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: DefaultPluginTraceRenderer.java,v $
+ *  $Revision: 1.2 $  $Date: 2005/02/15 23:04:14 $ 
+ */
+package org.eclipse.jem.util.logger.proxyrender;
+
+import java.io.*;
+import java.util.logging.Level;
+
+import org.eclipse.core.runtime.Platform;
+
+import org.eclipse.jem.util.logger.proxy.Logger;
+
+
+/**
+ * Logger that also logs to a trace file in the plugin's metadata area.
+ * 
+ * @since 1.0.0
+ */
+public class DefaultPluginTraceRenderer extends AbstractWorkBenchRenderer {
+
+	/**
+	 * Name of the trace file in the metadata area.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static final String PluginTraceFileName = "/.log"; //$NON-NLS-1$
+
+	private String fTraceFile = null;
+
+	private PrintWriter traceFile = null;
+
+	/**
+	 * DefaultUILogRenderer constructor.
+	 * 
+	 * @param logger
+	 */
+	public DefaultPluginTraceRenderer(Logger logger) {
+		super(logger);
+
+		fTraceFile = Platform.getStateLocation(fMyBundle).toString() + PluginTraceFileName;
+		(new File(fTraceFile)).delete(); // Start from fresh ... do not want to leak on disk space
+
+	}
+
+	private void closeTraceFile() {
+		if (traceFile == null)
+			return;
+		try {
+			traceFile.flush();
+			traceFile.close();
+		} finally {
+			traceFile = null;
+		}
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxyrender.AbstractWorkBenchRenderer#log(java.lang.String)
+	 */
+	public String log(String msg) {
+
+		System.out.println(msg);
+
+		openTraceFile();
+		if (traceFile != null) {
+			traceFile.println(msg);
+			closeTraceFile();
+		}
+		return fTraceFile;
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jem.util.logger.proxyrender.AbstractWorkBenchRenderer#log(java.lang.String, java.util.logging.Level, boolean)
+	 */
+	protected void log(String msg, Level l, boolean loggedToWorkbench) {
+		if (!loggedToWorkbench || !consoleLogOn) {
+			if (l == Level.SEVERE)
+				System.err.println(msg);
+			else
+				System.out.println(msg);
+		}
+
+		openTraceFile();
+		if (traceFile != null) {
+			traceFile.println(msg);
+			closeTraceFile();
+		}
+	}
+
+	private void openTraceFile() {
+		try {
+			traceFile = new PrintWriter(new FileOutputStream(fTraceFile, true));
+		} catch (IOException e) {
+			// there was a problem opening the log file so log to the console
+			traceFile = null;
+		}
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/logger/proxyrender/EclipseLogger.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/logger/proxyrender/EclipseLogger.java
new file mode 100644
index 0000000..9e40f90
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/logger/proxyrender/EclipseLogger.java
@@ -0,0 +1,123 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: EclipseLogger.java,v $
+ *  $Revision: 1.4 $  $Date: 2005/08/24 21:10:34 $ 
+ */
+package org.eclipse.jem.util.logger.proxyrender;
+
+import java.util.logging.Level;
+
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.Bundle;
+
+import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.jem.util.plugin.JEMUtilPlugin;
+
+ 
+/**
+ * Get an Eclipse logger. This gets a logger that knows it is for a plugin. 
+ * 
+ * For each plugin, the following can be specified in the .option file:
+ * 		{plugin-id}/debug/logTrace
+ * 			The values valid for this are "true", "false", or "default". If true then loggers will be set into
+ * 			trace mode. This means everything logged (even those that are filtered out due to not meeting log level)
+ * 			will be traced out. If the value is "true" they will be traced to the system console.  
+ * 			If it is "default" or not set at all, then it will be the value in the "org.eclipse.jem.util/debug/logTrace" .options setting.
+ * 			If not set there, then default value will be false.
+ * 
+ * 		{plugin-id}/debug/logTraceFile
+ * 			The values valid for this are "true", "false", or "default". If true then loggers will trace to 
+ * 			the system console AND to the ".log" file in the plugins work area in the metadata section of the workspace.
+ * 			If "false" then not traced to a trace file. 
+ * 			If it is "default" or not set at all, then it will be the value in the "org.eclipse.jem.util/debug/logTraceFile" .options setting.
+ * 			If not set there, then default value will be false.
+ * 
+ * 		{plugin-id}.debug/logLevel
+ * 			The values valid for this are the names from <code>java.util.logging.Level</code>, and "default". These
+ * 			are the trace cutoff levels to use. For instance, if the level was SEVERE, then only level SEVERE msgs
+ * 			are logged. The rest are skipped. Or if the level was WARNING, then only level SEVERE and WARNING are
+ * 			logged.
+ * 			If it is "default" or not set at all, then it will be the value in the "org.eclipse.jem.util/debug/logLevel" .options setting.
+ * 			If not set there, then default value will be WARNING.
+ * 
+ * 
+ * @since 1.0.0
+ */
+public class EclipseLogger extends Logger {
+
+	public static final String DEBUG_TRACE_OPTION = "/debug/logtrace"; //$NON-NLS-1$
+	public static final String DEBUG_TRACE_FILE_OPTION = "/debug/logtracefile"; //$NON-NLS-1$
+	public static final String DEBUG_LOG_LEVEL_OPTION = "/debug/loglevel"; // The logging level to use when no Hyaedes. (which we don't support at this time). //$NON-NLS-1$
+	public static final String DEFAULT_OPTION = "default";	// If option value is this, then the value from WTP Common plugin options will be used for both logTrace and logLevel.	 //$NON-NLS-1$
+	
+	/**
+	 * Return a logger based upon the Plugin. 
+	 * @param plugin
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	public static Logger getEclipseLogger(Plugin plugin) {
+		return getEclipseLogger(plugin.getBundle());
+	}
+	
+	/**
+	 * Return a logger based upon the bundle.
+	 * 
+	 * @param bundle
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	public static Logger getEclipseLogger(Bundle bundle) {
+		String id = bundle.getSymbolicName();
+		Logger logger = getLoggerIfExists(id);
+		if (logger != null)
+			return logger;
+		
+		logger = getLogger(id);	// Create one, we will now customize it.
+		
+		String pluginOption = Platform.getDebugOption(id + DEBUG_TRACE_OPTION);
+		if (pluginOption == null || "default".equalsIgnoreCase(pluginOption)) //$NON-NLS-1$
+			pluginOption = Platform.getDebugOption(JEMUtilPlugin.getDefault().getBundle().getSymbolicName() + DEBUG_TRACE_OPTION);
+		boolean logTrace = "true".equalsIgnoreCase(pluginOption); //$NON-NLS-1$
+
+		pluginOption = Platform.getDebugOption(id + DEBUG_TRACE_FILE_OPTION);
+		if (pluginOption == null || "default".equalsIgnoreCase(pluginOption)) //$NON-NLS-1$
+			pluginOption = Platform.getDebugOption(JEMUtilPlugin.getDefault().getBundle().getSymbolicName() + DEBUG_TRACE_FILE_OPTION);
+		boolean logTraceFile = "true".equalsIgnoreCase(pluginOption); //$NON-NLS-1$
+		
+		pluginOption = Platform.getDebugOption(id + DEBUG_LOG_LEVEL_OPTION);
+		if (pluginOption == null || "default".equalsIgnoreCase(pluginOption)) //$NON-NLS-1$
+			pluginOption = Platform.getDebugOption(JEMUtilPlugin.getDefault().getBundle().getSymbolicName() + DEBUG_LOG_LEVEL_OPTION);
+		
+		Level logLevel = Level.WARNING;
+		if (pluginOption != null) {
+			try {
+				logLevel = Level.parse(pluginOption);
+			} catch (IllegalArgumentException e) {
+			}
+		}
+		
+		if (logTrace)
+			logger.setTraceMode(true);
+		logger.setLevel(logLevel);
+		if (!logTraceFile)
+			logger.setRenderer(new ConsoleLogRenderer(logger));
+		else
+			logger.setRenderer(new DefaultPluginTraceRenderer(logger));
+		
+		return logger;
+	}
+	
+}
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/logger/proxyrender/IMsgLogger.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/logger/proxyrender/IMsgLogger.java
new file mode 100644
index 0000000..972ecdd
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/logger/proxyrender/IMsgLogger.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: IMsgLogger.java,v $
+ *  $Revision: 1.2 $  $Date: 2005/02/15 23:04:14 $ 
+ */
+package org.eclipse.jem.util.logger.proxyrender;
+
+import org.eclipse.jem.util.logger.proxy.Logger;
+
+/**
+ * Interface for a message logger.
+ * 
+ * @since 1.0.0
+ */
+public interface IMsgLogger {
+	public Logger getMsgLogger();
+}
diff --git a/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/plugin/JEMUtilPlugin.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/plugin/JEMUtilPlugin.java
new file mode 100644
index 0000000..a7b9b8f
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/plugin/JEMUtilPlugin.java
@@ -0,0 +1,399 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $$RCSfile: JEMUtilPlugin.java,v $$
+ *  $$Revision: 1.5 $$  $$Date: 2006/05/17 20:13:45 $$ 
+ */
+package org.eclipse.jem.util.plugin;
+
+import java.io.File;
+import java.text.MessageFormat;
+
+import org.eclipse.core.resources.*;
+import org.eclipse.core.runtime.*;
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.osgi.framework.Bundle;
+
+import org.eclipse.jem.internal.util.emf.workbench.ProjectResourceSetImpl;
+import org.eclipse.jem.internal.util.emf.workbench.WorkspaceResourceNotifier;
+import org.eclipse.jem.internal.util.emf.workbench.nls.EMFWorkbenchResourceHandler;
+import org.eclipse.jem.util.emf.workbench.ProjectResourceSet;
+import org.eclipse.jem.util.emf.workbench.ResourceHandler;
+import org.eclipse.jem.util.logger.proxy.Logger;
+
+
+/**
+ * Plugin for EMFWorkbench utils.
+ * 
+ * @since 1.0.0
+ */
+public class JEMUtilPlugin extends Plugin {
+
+	public static final String ID = "org.eclipse.jem.util"; //$NON-NLS-1$
+	
+	/**
+	 * Plugin id of this plugin.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static final String PLUGIN_ID = ID;	
+
+	/**
+	 * UI Context extension point.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static final String UI_CONTEXT_EXTENSION_POINT = "uiContextSensitiveClass"; //$NON-NLS-1$
+
+	/**
+	 * UITester element name.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static final String UI_TESTER_EXTENSION_POINT = "uiTester"; //$NON-NLS-1$
+	
+	/**
+	 * Protocol for workspace
+	 * 
+	 * @since 1.0.0
+	 */
+	public static final String WORKSPACE_PROTOCOL = "workspace"; //$NON-NLS-1$
+
+	/**
+	 * Protocol for platform uri's. i.e. "platform:/..."
+	 * 
+	 * @since 1.0.0
+	 *  
+	 */
+	public static final String PLATFORM_PROTOCOL = "platform"; //$NON-NLS-1$
+
+	/**
+	 * Resource indication in platform protocol. Indicates url is for a resource in the workspace. i.e. "platform:/resource/projectname/..."
+	 * 
+	 * @since 1.0.0
+	 */
+	public static final String PLATFORM_RESOURCE = "resource"; //$NON-NLS-1$
+
+	/**
+	 * Plugin indication in platform protocol. Indicates url is for a file/directory in the plugins area. i.e. "platform:/plugin/pluginid/..."
+	 * 
+	 * @since 1.0.0
+	 */
+	public static final String PLATFORM_PLUGIN = "plugin"; //$NON-NLS-1$
+
+	private static WorkspaceResourceNotifier sharedCache;
+
+	private static ResourceSet pluginResourceSet;
+
+	private static String[] GLOBAL_LOADING_PLUGIN_NAMES;
+
+	private static JEMUtilPlugin DEFAULT;
+
+	public JEMUtilPlugin() {
+		super();
+		DEFAULT = this;
+	}
+
+	/**
+	 * Get the workspace. Just use ResourcePlugin.getWorkspace() instead.
+	 * 
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	public static IWorkspace getWorkspace() {
+		return ResourcesPlugin.getWorkspace();
+	}
+
+	/**
+	 * Get the plugin instance.
+	 * 
+	 * @return plugin instance.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static JEMUtilPlugin getDefault() {
+		return DEFAULT;
+	}
+
+	/**
+	 * Gets the sharedCache.
+	 * <p>
+	 * This is not meant to be called by clients.
+	 * </p>
+	 * 
+	 * @return a WorkspaceResourceNotifier
+	 * @since 1.0.0
+	 */
+	public static WorkspaceResourceNotifier getSharedCache() {
+		if (sharedCache == null)
+			sharedCache = new WorkspaceResourceNotifier();
+		return sharedCache;
+	}
+
+	/**
+	 * Sets the sharedCache.
+	 * <p>
+	 * This is not meant to be called by clients.
+	 * </p>
+	 * 
+	 * @param sharedCache
+	 *            The sharedCache to set
+	 * @since 1.0.0
+	 */
+	public static void setSharedCache(WorkspaceResourceNotifier aSharedCache) {
+		sharedCache = aSharedCache;
+	}
+
+	/**
+	 * @deprecated use createIsolatedResourceSet(IProject)
+	 */
+	public static ResourceSet createIsolatedResourceSet() {
+		return null;
+	}
+
+	/**
+	 * Add an Adapter. You can use this api to listen for any shared resource being loaded or removed from any ProjectResourceSet in the Workbench
+	 * instead of trying to listen to each individual ProjectResourceSet.
+	 * 
+	 * @param adapter
+	 * 
+	 * @since 1.0.0
+	 */
+	public static void addWorkspaceEMFResourceListener(Adapter adapter) {
+		if (adapter != null && !getSharedCache().eAdapters().contains(adapter))
+			getSharedCache().eAdapters().add(adapter);
+	}
+
+	/**
+	 * Removes the adapter.
+	 * 
+	 * @param adapter
+	 * 
+	 * @see #addWorkspaceEMFResourceListener(Adapter)
+	 * @since 1.0.0
+	 */
+	public static void removeWorkspaceEMFResourceListener(Adapter adapter) {
+		if (adapter != null)
+			getSharedCache().eAdapters().remove(adapter);
+	}
+
+	/**
+	 * Is this plugin active.
+	 * 
+	 * @return <code>true</code> if active
+	 * 
+	 * @since 1.0.0
+	 */
+	public static boolean isActivated() {
+		Bundle bundle = Platform.getBundle(ID);
+		if (bundle != null)
+			return bundle.getState() == Bundle.ACTIVE;
+		return false;
+	}
+
+	/**
+	 * This method will be called when a WorkbenchContext is instantiated on an EMFNature.
+	 * <p>
+	 * This not meant to be called by clients.
+	 * </p>
+	 * 
+	 * @param aResourceSet
+	 * 
+	 * @see plugin.xml#ResourceHandlerExtension extension point.
+	 * @since 1.0.0
+	 */
+	public void addExtendedResourceHandlers(ProjectResourceSet aResourceSet) {
+		if (aResourceSet == null)
+			return;
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		IExtensionPoint pct = registry.getExtensionPoint(getBundle().getSymbolicName(), "ResourceHandlerExtension"); //$NON-NLS-1$
+		IExtension[] extension = pct.getExtensions();
+		IExtension config;
+		for (int l = 0; l < extension.length; ++l) {
+			config = extension[l];
+			IConfigurationElement[] cElems = config.getConfigurationElements();
+			ResourceHandler handler = null;
+			for (int i = 0; i < cElems.length; i++) {
+				try {
+					handler = (ResourceHandler) cElems[i].createExecutableExtension("run"); //$NON-NLS-1$
+
+				} catch (Exception ex) {
+					handler = null;
+				}
+				if (handler != null)
+					aResourceSet.add(handler);
+			}
+		}
+	}
+
+	/**
+	 * Delete the contents of the directory (and the directory if deleteRoot is true).
+	 * @param root
+	 * @param deleteRoot <code>true</code> to delete the root directory too.
+	 * @param monitor 
+	 * @return <code>true</code> if there was an error deleting anything.
+	 * 
+	 * @since 1.1.0
+	 */
+	public static boolean deleteDirectoryContent(File root, boolean deleteRoot, IProgressMonitor monitor) {
+		boolean error = false;
+		if (root.canRead()) {
+			if (root.isDirectory()) {
+				File[] files = root.listFiles();
+				monitor.beginTask(MessageFormat.format(EMFWorkbenchResourceHandler.getString("ProjectUtil_Delete_1"), new Object[] {root.getName()}), files.length+(deleteRoot ? 1 : 0)); //$NON-NLS-1$
+				for (int i = 0; i < files.length; i++) {
+					if (files[i].isDirectory())
+						error |= deleteDirectoryContent(files[i], true, new SubProgressMonitor(monitor, 1));
+					else {
+						error |= !files[i].delete();
+					}
+					monitor.worked(1);
+				}
+			} else {
+				monitor.beginTask(MessageFormat.format(EMFWorkbenchResourceHandler.getString("ProjectUtil_Delete_1"), new Object[] {root.getName()}), 1);				 //$NON-NLS-1$
+			}
+			if (deleteRoot) {
+				error |= !root.delete();
+				monitor.worked(1);
+			}
+			monitor.done();
+		} else {
+			error = true;
+		}
+		return error;
+	}
+	
+	/**
+	 * Add a clean resource changelistener.
+	 * @param listener
+	 * @param eventMask mask of event types to listen for in addition to ones that are necessary for clean. Use 0 if no additional ones.
+	 * 
+	 * @since 1.1.0
+	 */
+	public static void addCleanResourceChangeListener(CleanResourceChangeListener listener, int eventMask) {
+		// PRE_BUILD: Handle Clean.
+		// TODO Until https://bugs.eclipse.org/bugs/show_bug.cgi?id=101942 is fixed, we must do POST_BUILD, that will probably be sent because a clean will cause a build to occur which should cause a delta.
+		ResourcesPlugin.getWorkspace().addResourceChangeListener(listener, eventMask | IResourceChangeEvent.POST_BUILD);		
+	}
+	
+	/**
+	 * A resource listener that can be used in addition to listen for Clean requests and process them.
+	 * <p>
+	 * Use <code>{@link IResourceChangeEvent#PRE_BUILD}</code> when adding as listener to get the
+	 * clean events.
+	 * <p>
+	 * <b>Note</b> : TODO Until https://bugs.eclipse.org/bugs/show_bug.cgi?id=101942 is fixed, you must do POST_BUILD, that will probably be sent because a clean will cause a build to occur which should cause a delta.
+	 * @since 1.1.0
+	 */
+	public abstract static class CleanResourceChangeListener implements IResourceChangeListener {
+		
+		public void resourceChanged(IResourceChangeEvent event) {
+			// Subclasses can override this to handle more events than just clean.
+			if (event.getBuildKind() == IncrementalProjectBuilder.CLEAN_BUILD) {
+				if (event.getSource() instanceof IProject)
+					cleanProject((IProject) event.getSource());
+				else if (event.getSource() instanceof IWorkspace)
+					cleanAll();				
+			}
+		}
+
+		/**
+		 * Clear out the project.
+		 * @param project
+		 * 
+		 * @since 1.1.0
+		 */
+		protected abstract void cleanProject(IProject project);
+
+		/**
+		 * Clean all.
+		 * <p>
+		 * By default this will simply call a clean project on each open project. Subclasses should override and either
+		 * add more function to clear out non-project data and then call super. Or if they can handle all of the projects
+		 * in a faster way, then can completely handle this.
+		 * 
+		 * @since 1.1.0
+		 */
+		protected void cleanAll() {
+			IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+			for (int i = 0; i < projects.length; i++) {
+				IProject project = projects[i];
+				if (project.isOpen()) {
+					cleanProject(project);
+				}
+			}
+		}
+	}
+
+	/**
+	 * Get the project resource set for the plugin (there is one for the whole system).
+	 * 
+	 * @return system-wide resource set.
+	 * @since 1.0.0
+	 */
+	public static ResourceSet getPluginResourceSet() {
+		if (pluginResourceSet == null)
+			pluginResourceSet = new ProjectResourceSetImpl(null);
+		return pluginResourceSet;
+	}
+
+	/**
+	 * Set the system-wide resource set.
+	 * 
+	 * @param set
+	 * @since 1.0.0
+	 */
+	public static void setPluginResourceSet(ResourceSet set) {
+		pluginResourceSet = set;
+	}
+
+	/**
+	 * Get the global loading plugin names.
+	 * <p>
+	 * This is not meant to be called by clients.
+	 * </p>
+	 * 
+	 * @return
+	 * 
+	 * @since 1.0.0
+	 */
+	public static String[] getGlobalLoadingPluginNames() {
+		if (GLOBAL_LOADING_PLUGIN_NAMES == null)
+			GLOBAL_LOADING_PLUGIN_NAMES = readGlobalLoadingPluginNames();
+		return GLOBAL_LOADING_PLUGIN_NAMES;
+	}
+
+	/**
+	 * Get the Logger for this plugin.
+	 * 
+	 * @return logger for this plugin.
+	 * 
+	 * @since 1.0.0
+	 */
+	public static Logger getLogger() {
+		return Logger.getLogger(ID);
+	}
+
+	private static String[] readGlobalLoadingPluginNames() {
+		IExtensionRegistry reg = Platform.getExtensionRegistry();
+		IExtensionPoint exPoint = reg.getExtensionPoint(ID, "globalPluginResourceLoad"); //$NON-NLS-1$
+		IExtension[] extensions = exPoint.getExtensions();
+		String[] names = new String[extensions.length];
+		if (extensions.length > 0) {
+			for (int i = 0; i < extensions.length; i++)
+				names[i] = extensions[i].getContributor().getName();
+		}
+		return names;
+	}
+
+}
diff --git a/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/.classpath b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/.classpath
new file mode 100644
index 0000000..065ac06
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/.cvsignore b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/.cvsignore
new file mode 100644
index 0000000..c5e82d7
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/.cvsignore
@@ -0,0 +1 @@
+bin
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/.project b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/.project
new file mode 100644
index 0000000..5e29c82
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.perfmsr.core</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/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/PERFMSR.README.txt b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/PERFMSR.README.txt
new file mode 100644
index 0000000..3186a36
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/PERFMSR.README.txt
@@ -0,0 +1,14 @@
+This is a stub plugin for perfmsr. It is here just so that org.eclipse.jem.util can compile.
+
+It should not be an open project during normal usage. Whenever any of the files in this project
+are changed, "perfmsr.jardesc" should be used to create the new changed appropriate jar. Do this by:
+
+1) Select perfmsr.jardesc
+2) On popup menu select "Create JAR"
+3) Hit "Finish"
+4) Commit all changes to CVS.
+5) Go to org.eclipse.jem.util project, select the org.eclipse.perfmsr.core.stub folder
+   and select Replace->Latest from HEAD. This will cause your just committed changes
+   from step 4 to be put into org.eclipse.jem.util and will be picked up for that
+   plugin to compile against.
+6) Either close or delete the org.eclipse.perfmsr.core.stuf project from the workspace.
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/about.html b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/about.html
new file mode 100644
index 0000000..f9f238e
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/about.html
@@ -0,0 +1,32 @@
+<!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>30th March, 2004</p>	
+<h3>License</h3>
+<p>Eclipse.org 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>
+
+<h3>Contributions</h3>
+
+<p>If this Content is licensed to you under the terms and conditions of the EPL, any Contributions, as defined in the EPL, uploaded, submitted, or otherwise
+made available to Eclipse.org, members of Eclipse.org and/or the host of Eclipse.org web site, by you that relate to such
+Content are provided under the terms and conditions of the EPL and can be made available to others under the terms of the EPL.</p>
+
+<p>If this Content is licensed to you under license terms and conditions other than the EPL (&quot;Other License&quot;), any modifications, enhancements and/or
+other code and/or documentation (&quot;Modifications&quot;) uploaded, submitted, or otherwise made available to Eclipse.org, members of Eclipse.org and/or the
+host of Eclipse.org, by you that relate to such Content are provided under terms and conditions of the Other License and can be made available
+to others under the terms of the Other License.  In addition, with regard to Modifications for which you are the copyright holder, you are also
+providing the Modifications under the terms and conditions of the EPL and such Modifications can be made available to others under the terms of
+the EPL.</p>
+
+<p><b>Version:</b> v20040624a
+
+</body>
+</html>
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/build.properties b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/build.properties
new file mode 100644
index 0000000..3a4db57
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/build.properties
@@ -0,0 +1,14 @@
+###############################################################################
+# Copyright (c) 2003, 2005 IBM Corporation 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+bin.includes = plugin.xml,\
+               plugin.properties,\
+               *.jar
+source.perfmsr.jar = src/
diff --git a/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/perfmsr.jar b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/perfmsr.jar
new file mode 100644
index 0000000..1ebba8f
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/perfmsr.jar
Binary files differ
diff --git a/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/perfmsr.jardesc b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/perfmsr.jardesc
new file mode 100644
index 0000000..d48e223
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/perfmsr.jardesc
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<jardesc>
+    <jar path="org.eclipse.perfmsr.core.stub/perfmsr.jar"/>
+    <options buildIfNeeded="true" compress="true" descriptionLocation="/org.eclipse.perfmsr.core.stub/perfmsr.jardesc" exportErrors="true" exportWarnings="true" overwrite="false" saveDescription="true" useSourceFolders="false"/>
+    <manifest generateManifest="true" manifestLocation="/VEScrapProject/MANIFEST.mf" manifestVersion="1.0" reuseManifest="false" saveManifest="false" usesManifest="true">
+        <sealing sealJar="false">
+            <packagesToSeal/>
+            <packagesToUnSeal/>
+        </sealing>
+    </manifest>
+    <selectedElements exportClassFiles="true" exportJavaFiles="true" exportOutputFolder="false">
+        <javaElement handleIdentifier="=org.eclipse.perfmsr.core.stub/src"/>
+    </selectedElements>
+</jardesc>
diff --git a/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/plugin.properties b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/plugin.properties
new file mode 100644
index 0000000..5720eeb
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/plugin.properties
@@ -0,0 +1,12 @@
+###############################################################################
+# Copyright (c) 2003, 2005 IBM Corporation 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+Plugin.name=Performance Monitor
+
diff --git a/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/plugin.xml b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/plugin.xml
new file mode 100644
index 0000000..596926d
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/plugin.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin
+   id="org.eclipse.perfmsr.core"
+   name="%Plugin.name"
+   version="3.0.0"
+   provider-name="Eclipse.org"
+   class="org.eclipse.perfmsr.core.PerfMsrCorePlugin">
+
+   <runtime>
+      <library name="perfmsr.jar"><export name="*"/></library>
+   </runtime>
+   
+   <requires>
+      <import plugin="org.eclipse.core.runtime"/>
+   </requires>
+</plugin>
diff --git a/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/src/org/eclipse/perfmsr/core/IPerformanceMonitor.java b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/src/org/eclipse/perfmsr/core/IPerformanceMonitor.java
new file mode 100644
index 0000000..bd992c7
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/src/org/eclipse/perfmsr/core/IPerformanceMonitor.java
@@ -0,0 +1,195 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.perfmsr.core;
+
+/**
+ * Take snapshots of the various performance counters.
+ * ************* This is just a stub of the real interface to get org.eclipse.jem.util 
+ *               to compile. It is not usable by itself. ****************************
+ */
+public interface IPerformanceMonitor
+{
+	/**
+	 * These constants control how much information is gathered for a particular snapshot.
+	 * They are or'ed together and passed into the snapshot method.  
+	 */
+	interface Types
+	{
+		/** 
+		 * 1 - Write out the performance counters from the operating system. These
+		 * include working set, peak working set, elapsed time, user time, and 
+		 * kernel time.
+		 */
+		int OperatingSystemCounters		= 1;
+		
+		/**
+		 * 2 - Write out the global performance info. This includes things like the total
+		 * committed memory for the entire system.
+		 * 
+		 * This function depends on the GetPerformanceInfo() function being available in
+		 * the Windows psapi.dll. This is available in XP but is usually not available
+		 * in Win/2000. If it is not available then this function throws an UnsupportedOperationException.
+		 */
+		int GlobalSystemCounters		= 2;
+		
+		/**
+		 * 4 - Write out the size of the Java Heap.
+		 */
+		int JavaHeapSize				= 4;
+
+		/**
+		 * 8 - Write out how much of the Java heap is being used. This calls the 
+		 * garbage collector so it may skew timing results.
+		 */
+		int JavaHeapUsed				= 8;
+		
+		/**
+		 * 16 - The plugin startup and size information.
+		 */
+		int PluginInfo					= 16;
+		
+		/** 0xffff - Everything. */
+		int All							= 0xffff;	
+	}
+	
+	/**
+	 * Add some more "extra" variations. 
+	 * 
+	 * The variations that are in effect are made up of these extra variations plus any variations
+	 * that may have been set with the setVar() method.
+	 * 
+	 * @param varList a comma separated list of variations
+	 */
+	public void addVarAppend(String varList);
+	
+	/**
+	 * Set the driver name. 
+	 * 
+	 * @param driver a label that identifies the driver that is being tested. If it is a WSAD
+	 * driver, this will usually be set by the extension.
+	 */
+	public void setDriver(String driver);
+	
+	/**
+	 * Set the location of the performance measurement file, that is the place where
+	 * the measurements are stored.
+	 * 
+	 * @param logFile the file name of where the log should be written. Usually this is fully qualified
+	 * path name. For example "x:\logs\timer.xml".
+	 */
+	public void setLogFile(String logFile);
+	
+	/**
+	 * Set the performance monitor to be on or off. If it is off then most of the other 
+	 * operations will no-op.
+	 * 
+	 * The default is for the performance monitor to be off unless it's special environment variable is set. 
+	 * When called from the UI, the UI should call this to make sure that it is on.
+	 */
+	public void setIsOn(boolean isOn);
+	
+	/**
+	 * Sets the test case number for this measurement run.
+	 *  
+	 * @param testd test case identifier
+	 */
+	public void setTestd(int testd);
+	
+	/**
+	 * Sets the test case name. If will cause a new test case to be created if it does not already exist.
+	 * 
+	 * @param testName a simple (short) test case name. In the case of JUnit test cases, it would usually 
+	 * be the JUnit name.
+	 */
+	public void setTestName(String testName);
+	
+	/**
+	 * Set the variations that are in effect.
+	 * 
+	 * @param var a comma delimited string of variation numbers
+	 */
+	public void setVar(String var);
+	
+	/**
+	 * Set the upload host
+	 * 
+	 * @param host DNS name of the upload host
+	 */
+	public void setUploadHost(String host);
+	
+	/**
+	 * Set the upload port
+	 * 
+	 * @param port upload port
+	 */
+	public void setUploadPort(int port);
+	
+	/**
+	 * Set the upload userid
+	 * 
+	 * @param userid
+	 */
+	public void setUploadUserid(String userid);
+	
+	/**
+	 * Take a snapshot of some default performance measurements.
+	 * 
+	 * @param step this identifies the step that the snapshot is for
+	 */
+	void snapshot(int step);
+	
+	/**
+	 * Take a snapshot of the selected performance measurements.
+	 * 
+	 * @param step this identifies the step that the snapshot is for
+	 * 
+	 * @param types This controls which measurements are selected. It is an or'd together
+	 * list of the IPerformanceMonitor.Types constants.
+	 * 
+	 * @see IPerformanceMonitor.Types 
+	 */
+	void snapshot(int step, int types);
+	
+	/**
+	 * Write the comment to the performance measurement file.
+	 * 
+	 * @param comment
+	 */
+	void writeComment(String comment);
+	
+	/**
+	 * Upload the results to the server. This causes the file to be
+	 * closed, and the monitor to be placed into the finished state.
+	 * 
+	 * This method can only be called if the uploadhost, uploadport and uploaduserid
+	 * have been configured before hand.
+	 * 
+	 * @param description an optional description (it can be null)
+	 * 
+	 * @return some status information
+	 */
+	public Upload.Status upload(String description);
+//	
+//	/**
+//	 * Upload the results to the server. This causes the file to be
+//	 * closed, and the monitor to be placed into the finished state.
+//	 * 
+//	 * @param host the host name that the file is being sent to
+//	 * @param port the port on the host
+//	 * @param userid the userid that is doing the upload
+//	 * @param description an optional description (it can be null)
+//	 * 
+//	 * @return some status information
+//	 */
+//	Upload.Status upload(String host, int port, String userid, String description);
+
+
+}
diff --git a/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/src/org/eclipse/perfmsr/core/PerfMsrCorePlugin.java b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/src/org/eclipse/perfmsr/core/PerfMsrCorePlugin.java
new file mode 100644
index 0000000..2b86e9e
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/src/org/eclipse/perfmsr/core/PerfMsrCorePlugin.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: PerfMsrCorePlugin.java,v $
+ *  $Revision: 1.2 $  $Date: 2005/02/15 23:06:47 $ 
+ */
+package org.eclipse.perfmsr.core;
+
+import org.eclipse.core.runtime.Plugin;
+ 
+
+/**
+ * ************* This is just a stub of the real class to get org.eclipse.jem.util 
+ *               to compile. It is not usable by itself. ****************************
+ * @since 1.0.0
+ */
+public class PerfMsrCorePlugin extends Plugin {
+	
+	public static IPerformanceMonitor getPerformanceMonitor(boolean bool) {
+		return null;
+	}
+
+}
diff --git a/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/src/org/eclipse/perfmsr/core/Upload.java b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/src/org/eclipse/perfmsr/core/Upload.java
new file mode 100644
index 0000000..c412f52
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/org.eclipse.perfmsr.core.stub/src/org/eclipse/perfmsr/core/Upload.java
@@ -0,0 +1,27 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*
+ *  $RCSfile: Upload.java,v $
+ *  $Revision: 1.2 $  $Date: 2005/02/15 23:06:47 $ 
+ */
+package org.eclipse.perfmsr.core;
+ 
+
+/**
+ * Upload.
+ * ************* This is just a stub of the real interface to get org.eclipse.jem.util 
+ *               to compile. It is not usable by itself. ****************************
+ */
+public interface Upload {
+	public static class Status {
+		public boolean success;
+	}
+}
diff --git a/plugins/org.eclipse.jem.util/plugin.properties b/plugins/org.eclipse.jem.util/plugin.properties
new file mode 100644
index 0000000..a53db6a
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/plugin.properties
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2005 IBM Corporation 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+#
+# $Source: /cvsroot/webtools/common.move/webtools.common.git/plugins/org.eclipse.jem.util/plugin.properties,v $
+# $Revision: 1.2 $  $Date: 2005/02/15 23:07:45 $
+#
+
+
+pluginName=Java EMF Model Utilities
+providerName = Eclipse.org
diff --git a/plugins/org.eclipse.jem.util/plugin.xml b/plugins/org.eclipse.jem.util/plugin.xml
new file mode 100644
index 0000000..591be42
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/plugin.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+
+    
+<!-- Extension point to register ResourceHandlers that will always be added to 
+	new WorkbenchContexts -->
+   <extension-point id="ResourceHandlerExtension" name="ResourceHandlerExtension"/>
+   <extension-point id="globalPluginResourceLoad" name="Global Plugin Resource Load"/>
+   <extension-point id="nature_registration" name="EMF Nature registration"/>
+   <extension-point id="internalWorkbenchContextFactory" name="Internal Workbench Context Factory"/>
+   <extension-point id="uiContextSensitiveClass" name="UI Context Sensitive Class" schema="schema/uiContextSensitiveClass.exsd"/>
+   <extension-point id="uiTester" name="UI Tester" schema="schema/uiTester.exsd"/>   
+   
+</plugin>
diff --git a/plugins/org.eclipse.jem.util/property_files/emfworkbench.properties b/plugins/org.eclipse.jem.util/property_files/emfworkbench.properties
new file mode 100644
index 0000000..cad9483
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/property_files/emfworkbench.properties
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2005 IBM Corporation 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+EMFWorkbenchContextBase_ERROR_0=IWAE0003E Method not yet implemented.
+EMFWorkbenchContextBase_ERROR_1=IWAE0005E Project can not be null.
+EMFWorkbenchContextBase_ERROR_2=IWAE0006E Attempt to create resource set with null project
+EMFNatureRegistry_ERROR_0=IWAE0007E Duplicate EMF nature registration for id: {0}
+EMFWorkbenchContextFactory_UI_0=The project should not be null.
+EMFWorkbenchContextFactory_UI_1=The project \"{0}\" is not accessible.
+
+ProjectUtil_Delete_1=Deleting \"{0}\".
\ No newline at end of file
diff --git a/plugins/org.eclipse.jem.util/schema/uiContextSensitiveClass.exsd b/plugins/org.eclipse.jem.util/schema/uiContextSensitiveClass.exsd
new file mode 100644
index 0000000..df70e98
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/schema/uiContextSensitiveClass.exsd
@@ -0,0 +1,169 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.jem.util">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.jem.util" id="uiContextSensitiveClass" name="UI Context Sensitive Class"/>
+      </appInfo>
+      <documentation>
+         Components are often designed in such a way that the &quot;Headless&quot; or non-graphical portions are separate from the Graphical User Interface (GUI) portions. Sometimes this is done to follow good design principles, other times there is a specific use case for doing so. When plugins follow this practice because they must vary their behavior based on whether they are running in a headless environment or a graphical environment, they often need to choose the correct implementation of a particular type. The org.eclipse.jem.util.uiContextSensitiveClass extension point provided by the JEM component solves exactly this problem.
+&lt;p&gt;    
+To use the extension point, you must provide two extensions that are linked by a key. The key is a unique String-based value that you will later use to instanitate your class.
+&lt;p&gt;
+The first usage of the extension specifies your key, and the Headless context, and the class that should be instantiated for this (key, context) pair. This means in the headless environment this class will be instantiated when requested.
+&lt;p&gt;
+The second extension specifies the UI context and the same key, but a different implementation designed for graphical environments. This means in the UI environment this other class will be instantiated when requested.
+&lt;p&gt;
+The actual request is done in your code via:
+&lt;pre&gt;
+IMyInterface instance = (IMyInterface) UIContextDetermination.createInstance(&quot;myKey&quot;);
+&lt;/pre&gt;
+where &lt;code&gt;&quot;myKey&quot;&lt;/code&gt; is the key used on both extensions. It will then choose either the UI or the Headless extension depending upon the context.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence>
+            <element ref="uiContextSensitiveClass" minOccurs="1" maxOccurs="unbounded"/>
+         </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>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="uiContextSensitiveClass">
+      <annotation>
+         <documentation>
+            An extension point that defines an instance of a class and its appropriate context (UI or Headless)
+         </documentation>
+      </annotation>
+      <complexType>
+         <attribute name="key" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The key that should be used to create an instance of the Context Sensitive super class/interface.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="className" type="string" use="required">
+            <annotation>
+               <documentation>
+                  A concrete implementation for either a UI or Headless context.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="context" use="required">
+            <annotation>
+               <documentation>
+                  One of &quot;UI&quot; or &quot;Headless&quot; This is case-sensitive. It must match exactly as shown here.
+               </documentation>
+            </annotation>
+            <simpleType>
+               <restriction base="string">
+                  <enumeration value="UI">
+                  </enumeration>
+                  <enumeration value="Headless">
+                  </enumeration>
+               </restriction>
+            </simpleType>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         6.0
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         Usage for the UI context:
+&lt;pre&gt;
+   &lt;extension
+       id=&quot;context.Sensitive.Class.workingCopyManager&quot;
+       name=&quot;Working Copy Manager - UI Context Class&quot;
+       point=&quot;org.eclipse.jem.util.ContextSensitiveClass&quot;&gt;
+     &lt;uiContextSensitiveClass
+       context=&quot;UI&quot;
+       key=&quot;workingCopyManager&quot;
+       className=&quot;com.ibm.wtp.common.ui.WTPUIWorkingCopyManager&quot;/&gt;
+   &lt;/extension&gt;
+&lt;/pre&gt;
+&lt;br&gt;
+Usage for the Headless context:
+&lt;pre&gt;
+   &lt;extension
+       id=&quot;context.Sensitive.Class.workingCopyManager&quot;
+       name=&quot;Working Copy Manager - Headless Context Class&quot;
+       point=&quot;org.eclipse.jem.util.ContextSensitiveClass&quot;&gt;
+     &lt;uiContextSensitiveClass
+         context=&quot;Headless&quot;
+         key=&quot;workingCopyManager&quot;
+         className=&quot;com.ibm.wtp.common.ui.WTPHeadlessWorkingCopyManager&quot;/&gt;
+   &lt;/extension&gt;
+&lt;/pre&gt;
+&lt;br&gt;
+And finally the retrieval of the class for the current context:
+
+&lt;pre&gt;
+IWorkingCopyManager manager = (IWorkingCopyManager) UIContextDetermination.createInstance(&quot;workingCopyManager&quot;);
+&lt;/pre&gt;
+
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         See &lt;code&gt;org.eclipse.jem.util.UIContextDetermination&lt;/code&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) IBM 2003.
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/plugins/org.eclipse.jem.util/schema/uiTester.exsd b/plugins/org.eclipse.jem.util/schema/uiTester.exsd
new file mode 100644
index 0000000..729ab32
--- /dev/null
+++ b/plugins/org.eclipse.jem.util/schema/uiTester.exsd
@@ -0,0 +1,128 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.jem.util">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.jem.util" id="uiTester" name="UI Tester"/>
+      </appInfo>
+      <documentation>
+         This is used to tell JEM that it is running in a non-HEADLESS environment. Typically UI environment is non-HEADLESS. The default if there are no implementers of this extension point that return true is HEADLESS.
+&lt;p&gt;
+A HEADLESS environment is typically a batch situation where there is no UI and the workspace is used for one operation and then terminated. Most headless tasks are done under one operation and the JavaReflectionSynchronizer may not have a chance to flush a bad reflection before the real type needs to be found and can be found. So what would happen is if a class was created during this one operation it would not be found because the notifications had not yet gone out. 
+&lt;p&gt;
+In a UI environment the operations are typically short and do only a few things and the results aren&apos;t needed until after the operation has completed. In that case it is more efficient to not keep checking if a class has appeared everytime a request is made, instead it will wait for the notification of the added class to appear before resetting the definition to allow checking again later.
+&lt;p&gt;
+If there is more than one implementer of this interface in the application, then it will go through each of them once until one returns true. As soon as one returns true it will stop and mark the application as being non-HEADLESS. This will be done only once for the application. It will not be again until the next session of the application.
+&lt;p&gt;
+This is typically an internal extension point only. The JEM UI plugin will provide an implementation that will return true if the Platform UI is active. So this will normally not be needed to be implemented by most customers.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence>
+            <element ref="uiTester"/>
+         </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>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="uiTester">
+      <annotation>
+         <documentation>
+            The uiTester definition element.
+         </documentation>
+      </annotation>
+      <complexType>
+         <attribute name="className" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The class name of the UITester for this extension. It must implement &lt;samp&gt;org.eclipse.jem.util.UITester&lt;/samp&gt;.
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.jem.util.UITester"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         1.0.0
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         The following is an example of an implementer: 
+
+&lt;p&gt;
+&lt;pre&gt;
+ &lt;extension point=&quot;org.eclipse.jem.util.uiTester&quot;&gt;
+  &lt;uiTester
+   className=&quot;com.example.UITesterImplementation&quot;/&gt;
+ &lt;/extension&gt;
+&lt;/pre&gt;
+&lt;/p&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         The &lt;samp&gt;className&lt;/samp&gt; attribute must be a fully-qualified class that implements the &lt;samp&gt;org.eclipse.jem.util.UITester&lt;/samp&gt; interface for the tester.
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         There is no default implementation for this class.
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2004, 2006 IBM Corporation and others.&lt;br&gt;
+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 
+&lt;a href=&quot;http://www.eclipse.org/legal/epl-v10.html&quot;&gt;http://www.eclipse.org/legal/epl-v10.html&lt;/a&gt;
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/plugins/org.eclipse.wst.common.core/.classpath b/plugins/org.eclipse.wst.common.core/.classpath
new file mode 100644
index 0000000..202d634
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src-search"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.wst.common.core/.cvsignore b/plugins/org.eclipse.wst.common.core/.cvsignore
new file mode 100644
index 0000000..0f861fd
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/.cvsignore
@@ -0,0 +1,6 @@
+bin
+build.xml
+javaCompiler...args
+src.zip
+@dot
+temp.folder
diff --git a/plugins/org.eclipse.wst.common.core/.options b/plugins/org.eclipse.wst.common.core/.options
new file mode 100644
index 0000000..2e5ed2a
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/.options
@@ -0,0 +1 @@
+org.eclipse.wst.common.search/perf=false
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.core/.project b/plugins/org.eclipse.wst.common.core/.project
new file mode 100644
index 0000000..6bb12ef
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.wst.common.core</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/plugins/org.eclipse.wst.common.core/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.wst.common.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..7406de6
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,59 @@
+#Mon Jan 30 23:40:52 EST 2006
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.2
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.4
+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=warning
+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=warning
+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.overridingPackageDefaultMethod=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=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.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+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.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.3
diff --git a/plugins/org.eclipse.wst.common.core/.settings/org.eclipse.jdt.ui.prefs b/plugins/org.eclipse.wst.common.core/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..c68ceb4
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,3 @@
+#Mon Jan 30 19:45:41 EST 2006
+eclipse.preferences.version=1
+internal.default.compliance=default
diff --git a/plugins/org.eclipse.wst.common.core/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.common.core/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..ca5beff
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/META-INF/MANIFEST.MF
@@ -0,0 +1,18 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.eclipse.wst.common.core; singleton:=true
+Bundle-Version: 1.1.100.qualifier
+Bundle-Activator: org.eclipse.wst.common.core.search.SearchPlugin
+Bundle-Localization: plugin
+Export-Package: org.eclipse.wst.common.core.search,
+ org.eclipse.wst.common.core.search.document,
+ org.eclipse.wst.common.core.search.internal;x-internal:=true,
+ org.eclipse.wst.common.core.search.pattern,
+ org.eclipse.wst.common.core.search.scope,
+ org.eclipse.wst.common.core.search.util
+Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.2.0,3.4.0)",
+ org.eclipse.core.resources;bundle-version="[3.2.0,3.4.0)",
+ org.eclipse.core.expressions;bundle-version="[3.2.0,3.4.0)"
+Eclipse-LazyStart: true
+Bundle-Vendor: %pluginProvider
diff --git a/plugins/org.eclipse.wst.common.core/about.html b/plugins/org.eclipse.wst.common.core/about.html
new file mode 100644
index 0000000..4ec5989
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/about.html
@@ -0,0 +1,34 @@
+<!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">
+
+<H3>About This Content</H3>
+
+<P>May 2, 2006</P>
+
+<H3>License</H3>
+
+<P>The Eclipse Foundation makes available all content in this plug-in 
+("Content"). Unless otherwise indicated below, the Content is provided to you 
+under the terms and conditions of the Eclipse Public License Version 1.0 
+("EPL"). A copy of the EPL is available at
+<A href="http://www.eclipse.org/org/documents/epl-v10.php">http://www.eclipse.org/org/documents/epl-v10.php</A>. 
+For purposes of the EPL, "Program" 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 ("Redistributor") 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/">http://www.eclipse.org/</A>.</P>
+
+</BODY>
+</HTML>
diff --git a/plugins/org.eclipse.wst.common.core/build.properties b/plugins/org.eclipse.wst.common.core/build.properties
new file mode 100644
index 0000000..cd3e92f
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/build.properties
@@ -0,0 +1,8 @@
+source.. = src-search/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml,\
+               schema/,\
+               plugin.properties,\
+               about.html
diff --git a/plugins/org.eclipse.wst.common.core/component.xml b/plugins/org.eclipse.wst.common.core/component.xml
new file mode 100644
index 0000000..3e9239c
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/component.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component xmlns="http://eclipse.org/wtp/releng/tools/component-model" 
+  name="org.eclipse.wst.common.core">
+  <component-depends unrestricted="true"></component-depends>
+  <plugin id="org.eclipse.wst.common.core" fragment="false" />
+</component>
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.core/plugin.properties b/plugins/org.eclipse.wst.common.core/plugin.properties
new file mode 100644
index 0000000..ff6cdef
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/plugin.properties
@@ -0,0 +1,3 @@
+! Plug-in properties
+pluginName     = WST Common Core Plug-in
+pluginProvider = Eclipse.org
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.core/plugin.xml b/plugins/org.eclipse.wst.common.core/plugin.xml
new file mode 100644
index 0000000..c82f6a0
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/plugin.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+   <extension-point id="searchParticipants" name="%searchParticipants" />      
+</plugin>
+
+
diff --git a/plugins/org.eclipse.wst.common.core/schema/searchParticipants.exsd b/plugins/org.eclipse.wst.common.core/schema/searchParticipants.exsd
new file mode 100644
index 0000000..367c943
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/schema/searchParticipants.exsd
@@ -0,0 +1,89 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.wst.common.core">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.wst.common.search" id="searchParticipants" name="%searchPArticipants"/>
+      </appInfo>
+      <documentation>
+         [Enter description of this extension point.]
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <complexType>
+         <sequence>
+         </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>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         [Enter the first release in which this extension point appears.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         [Enter extension point usage example here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         [Enter API information here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="implementation"/>
+      </appInfo>
+      <documentation>
+         [Enter information about supplied implementation of this extension point.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/ISearchOptions.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/ISearchOptions.java
new file mode 100644
index 0000000..33305e5
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/ISearchOptions.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.common.core.search;
+
+/**
+ * This interface provides values that can be used in the map of search options passed
+ * to
+ * {@link SearchEngine#search(org.eclipse.wst.common.core.search.pattern.SearchPattern, SearchRequestor, org.eclipse.wst.common.core.search.scope.SearchScope, java.util.Map, org.eclipse.core.runtime.IProgressMonitor)
+ * SearchEngine.search()}.
+ * <p>
+ * Note that not all search participants will provide specialized behavior based on
+ * use of these search options.
+ * <p>
+ * Also note that individual search participants may support additional options not
+ * listed here. These search options should be formed so that a search participant can
+ * safely ignore any that it does not understand.
+ * 
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ */
+public interface ISearchOptions {
+
+	/**
+	 * Search option specifying a trade-off choice between search performance and
+	 * completeness.
+	 */
+	public static final String PRIORITY_OPTION = "org.eclipse.wst.common.core.search.PRIORITY"; //$NON_NLS_1$
+	/**
+	 * Choice for the {@link #PRIORITY_OPTION} search option that emphasizes
+	 * performance at the possible expense of accuracy. This value should be used for
+	 * all search calls made on the user interface thread. In some cases, search
+	 * results may not be complete because of inaccuracies caused by timing windows.
+	 */
+	public static final String PRIORITY_VALUE_TIMELINESS = "FAST_SEARCH"; //$NON_NLS_1$
+	/**
+	 * Choice for the {@link #PRIORITY_OPTION} search option that emphasizes
+	 * accuracy at the possible expense of timeliness. This value should never be used
+	 * for search calls made on the user interface thread, because some search
+	 * participants may choose to use time-consuming background processing to return a
+	 * complete set of matches.
+	 */
+	public static final String PRIORITY_VALUE_COMPLETENESS = "COMPLETE_SEARCH"; //$NON_NLS_1$
+	/**
+	 * Default choice for the {@link #PRIORITY_OPTION} search option.
+	 */
+	public static final String PRIORITY_VALUE_DEFAULT = PRIORITY_VALUE_TIMELINESS;
+
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/SearchEngine.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/SearchEngine.java
new file mode 100644
index 0000000..3fed117
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/SearchEngine.java
@@ -0,0 +1,213 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.core.search;
+
+import java.util.Map;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.wst.common.core.search.document.SearchDocumentSet;
+import org.eclipse.wst.common.core.search.internal.Messages;
+import org.eclipse.wst.common.core.search.internal.SearchDocumentSetImpl;
+import org.eclipse.wst.common.core.search.pattern.SearchPattern;
+import org.eclipse.wst.common.core.search.scope.SearchScope;
+
+/**
+ * The {@link SearchEngine} class provides a generic way of searching for information
+ * without the need of knowing how or where that information is stored. The results
+ * returned by a search could be scattered in a number of files or stored in an index.
+ * Examples of the information you can search for include element declarations and
+ * references, references between files, and use of qualifiers.
+ * <p>
+ * The search can be limited to a specified search scope, or the entire workspace can
+ * be searched. Search matches are returned to the specified {@link SearchRequestor}.
+ * <p>
+ * This class may be instantiated; it is not intended to be subclassed.
+ * 
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ */
+public class SearchEngine implements ISearchOptions
+{
+
+	/**
+	 * Searches for matches of a given search pattern using a specified set of search
+	 * participants and search scope. Search patterns can be created using factory
+	 * methods and encapsulate the description of the information to be searched for
+	 * (for example, element declarations of a specified type, in a case sensitive
+	 * manner).
+	 * @param pattern
+	 *            The pattern describing the information to search for
+	 * @param requestor
+	 *            Callback object to notify with the results of the search (each match
+	 *            is reported to {@link SearchRequestor#acceptSearchMatch(SearchMatch)})
+	 * @param participants
+	 *            The search participants that will conduct the search
+	 * @param scope
+	 *            Optional search scope to limit the source of search candidates;
+	 *            specify <code>null</code> to search the entire workspace
+	 * @param searchOptions
+	 *            Optional map of options and values defining behavior of the search;
+	 *            some options and values are provided by {@link ISearchOptions}
+	 * @param monitor
+	 *            Optional progress monitor used to report work completed
+	 * @exception CoreException
+	 *            if the search fails
+	 */
+	public void search(SearchPattern pattern, SearchRequestor requestor,
+			SearchParticipant[] participants, SearchScope scope, Map searchOptions,
+			IProgressMonitor monitor) throws CoreException
+	{
+
+		if (monitor != null && monitor.isCanceled())
+			throw new OperationCanceledException();
+
+		/* initialize progress monitor */
+		if (monitor != null)
+			monitor.beginTask(Messages.engine_searching, 100);
+
+        SearchDocumentSet set = new SearchDocumentSetImpl();
+		try
+		{
+			// requestor.beginReporting();
+            SearchScope[] scopeArray = new SearchScope[participants.length];
+			for (int i = 0, l = participants == null ? 0 : participants.length; i < l; i++)
+			{
+				if (monitor != null && monitor.isCanceled())
+					throw new OperationCanceledException();
+
+				SearchParticipant participant = participants[i];
+				SubProgressMonitor subMonitor = monitor == null ? null
+						: new SubProgressMonitor(monitor, 1000);
+				if (subMonitor != null)
+					subMonitor.beginTask("", 1000); //$NON-NLS-1$
+				try
+				{
+					if (subMonitor != null)
+						subMonitor.subTask(Messages.bind(
+								Messages.engine_searching_locatingDocuments,
+								new String[]
+								{ participant.getDescription() }));
+					participant.beginSearching(pattern, searchOptions);
+					// requestor.enterParticipant(participant);
+					// participant creates it's own search scope 
+					SearchScope newScope =
+						participant.selectDocumentLocations(pattern, scope, searchOptions, monitor);
+                    scopeArray[i] = newScope;
+					// participant creates search documents based on it's search scope
+					participant.createSearchDocuments(set, pattern, newScope, searchOptions, subMonitor);
+                }
+                catch(Exception e)
+                {                  
+                }
+			}
+            for (int i = 0, l = participants == null ? 0 : participants.length; i < l; i++)
+            {        
+                if (monitor != null && monitor.isCanceled())                                  
+                    throw new OperationCanceledException();
+                
+                SearchParticipant participant = participants[i];
+                SubProgressMonitor subMonitor = monitor == null ? null
+                    : new SubProgressMonitor(monitor, 1000);                     
+                if (subMonitor != null && subMonitor.isCanceled())
+                    throw new OperationCanceledException();
+                try
+                {
+                // locate index matches if any (note that all search matches
+                // could have been issued during index querying)
+                if (subMonitor != null)
+                    subMonitor.subTask(Messages.bind(
+                            Messages.engine_searching_matching,
+                            new String[]
+                            { participant.getDescription() }));
+                // a search document set should contain enough info to reduce the search scope even further 
+                // before finding precize locations
+                
+                // the scope could be null if the partcipant barfed and exeption in the first loop 
+                if (scopeArray[i] != null)
+                {  
+                  participant.locateMatches(set, pattern, scopeArray[i], requestor, searchOptions, subMonitor);
+                }  
+                }
+                catch (Exception e)
+                {
+                  
+                }
+                finally
+                {
+                  // requestor.exitParticipant(participant);
+                  participant.doneSearching(pattern, searchOptions);
+                }         
+            }    
+		} finally
+		{
+            set.dispose();
+			// requestor.endReporting();
+			if (monitor != null)
+				monitor.done();
+		}
+	}
+
+	/**
+	 * Searches for matches of a given search pattern. Search patterns can be created
+	 * using factory methods and encapsulate the description of the information to be
+	 * searched for (for example, element declarations of a specified type, in a case
+	 * sensitive manner).
+	 * @param pattern
+	 *            The pattern describing the information to search for
+	 * @param requestor
+	 *            Callback object to notify with the results of the search (each match
+	 *            is reported to {@link SearchRequestor#acceptSearchMatch(SearchMatch)})
+	 * @param scope
+	 *            Optional search scope to limit the source of search candidates;
+	 *            specify <code>null</code> to search the entire workspace
+	 * @param searchOptions
+	 *            Optional map of options and values defining behavior of the search;
+	 *            some options and values are provided by {@link ISearchOptions}
+	 * @param monitor
+	 *            Optional progress monitor used to report work completed
+	 * @exception CoreException
+	 *            if the search fails
+	 */
+	public void search(SearchPattern pattern, SearchRequestor requestor,
+			SearchScope scope, Map searchOptions, IProgressMonitor monitor)
+			throws CoreException
+	{
+		SearchParticipant[] participants =
+			getApplicableParticipants(pattern, searchOptions);
+        //System.out.println("participants = " + participants.length);
+		search(pattern, requestor, participants, scope, searchOptions, monitor);
+	}
+
+	/**
+	 * Queries the set of participants that support searches described by the
+	 * specified search pattern and options.
+	 * @param pattern
+	 *            The pattern describing the information to search for
+	 * @param searchOptions
+	 *            Optional map of options and values defining behavior of the search;
+	 *            some options and values are provided by {@link ISearchOptions}
+	 * @return Array of applicable search participants
+	 */
+	public SearchParticipant[] getApplicableParticipants(SearchPattern pattern,
+			Map searchOptions)
+	{
+		return SearchPlugin.getDefault().loadSearchParticipants(pattern, searchOptions);
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/SearchMatch.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/SearchMatch.java
new file mode 100644
index 0000000..4890fc5
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/SearchMatch.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.core.search;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.wst.common.core.search.pattern.SearchPattern;
+
+/**
+ * A search match represents the result of a search query.
+ * <p>
+ * This class is intended to be instantiated and subclassed by clients.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * 
+ * @see SearchEngine#search(SearchPattern, SearchParticipant[], ISearchScope,
+ *      SearchRequestor, org.eclipse.core.runtime.IProgressMonitor)
+ */
+public class SearchMatch implements IAdaptable
+{
+
+	/**
+	 * Optional resource of the element
+	 */
+	IFile file; // resource where match is found
+
+	/**
+	 * The offset the match starts at, or -1 if unknown
+	 */
+	int offset;
+
+	/**
+	 * The length the length of the match, or -1 if unknown
+	 */
+	int length;
+
+	/**
+	 * Optional element that encloses or corresponds to the match
+	 */
+	Object object;
+
+	/**
+	 * Creates a new search match.
+	 * 
+	 * @param element
+	 *            the element that encloses or corresponds to the match, or
+	 *            <code>null</code> if none
+	 * @param offset
+	 *            the offset the match starts at, or -1 if unknown
+	 * @param length
+	 *            the length of the match, or -1 if unknown
+	 * @param participant
+	 *            the search participant that created the match
+	 * @param resource
+	 *            the resource of the element, or <code>null</code> if none
+	 */
+	public SearchMatch(Object element, int offset, int length, IFile resource)
+	{
+		this.object = element;
+		this.offset = offset;
+		this.length = length;
+		this.file = resource;
+	}
+
+	public IFile getFile()
+	{
+		return file;
+	}
+
+	public void setFile(IFile file)
+	{
+		this.file = file;
+	}
+
+	public int getLength()
+	{
+		return length;
+	}
+
+	public void setLength(int length)
+	{
+		this.length = length;
+	}
+
+	// issue (cs/eb) holding objects is a bit odd, since it implies the object's
+	// life span
+	// is the same as the SearchMatch. What happens when an object is deleted?
+	// does the SearchMatch get deleted? Aren't coordinates good enough?
+	// at the very least we should document that using this field has some
+	// consequences
+	/**
+	 * (eb) see comments for {@link #setObject(Object)}
+	 */
+	public Object getObject()
+	{
+		return object;
+	}
+
+	/**
+	 * @param object
+	 *            Object is an instance of some part of the model that represent
+	 *            the content that was searched. It may require to calculate
+	 *            some additional information that may be required by the tools
+	 *            through {@link #getObject()) (e.g. XML node namespace,
+	 *            nessesary to obtain the prefix for the refactoring tool).
+	 *            <p>
+	 *            There should be no danger here of preventing the object from
+	 *            garbage collection because instances of the search matches
+	 *            supposed to be short lived. {@link SearchMatch} is usually
+	 *            collected by {@link SearchRequestor} which itself is lived for
+	 *            the time of the search and then discarded or re-initialized.
+	 *            Usually the tool that requested a search extracts the
+	 *            information from the collected {@link SearchMatch} and after
+	 *            that {@link SearchMatch} could be garbage collected, releasing
+	 *            object that they hold to.
+	 *            </p>
+	 */
+	public void setObject(Object object)
+	{
+		this.object = object;
+	}
+
+	public int getOffset()
+	{
+		return offset;
+	}
+
+	public void setOffset(int offset)
+	{
+		this.offset = offset;
+	}
+
+	public Object getAdapter(Class adapter)
+	{
+		return Platform.getAdapterManager().getAdapter(this, adapter);
+	}
+    
+    public Map map = new HashMap(); 
+
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/SearchParticipant.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/SearchParticipant.java
new file mode 100644
index 0000000..95a0446
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/SearchParticipant.java
@@ -0,0 +1,281 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.core.search;
+
+import java.util.Map;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.wst.common.core.search.document.SearchDocument;
+import org.eclipse.wst.common.core.search.document.SearchDocumentSet;
+import org.eclipse.wst.common.core.search.pattern.SearchPattern;
+import org.eclipse.wst.common.core.search.scope.SearchScope;
+
+/**
+ * <p>
+ * A search participant describes a particular extension to a generic search
+ * mechanism, permitting combined search actions which will involve all required
+ * participants.
+ * </p>
+ * <p>
+ * When there is a need to search a document that has some mixed content, then
+ * using a one participant will not be enough. E.g. for the searching of the JSP
+ * content, a JSP participant needs to create {@link SearchDocument} that
+ * contain Java compilation unit and then pass it to the default Java search
+ * participant of the Java Search Engine. The same with XML: when there is an
+ * XML content that default search participant could not process, but it is
+ * required to be search on, a new search participant needs to be defined. That
+ * search participant would know how create search document from the content and
+ * then it can call default XML search participant.
+ * </p>
+ * <p>
+ * Passing its own {@link SearchRequestor} this participant can then map the
+ * match positions back to the original contents, create its own matches and
+ * report them to the original requestor.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * 
+ */
+public abstract class SearchParticipant implements ISearchOptions 
+{
+
+	protected static final boolean debugPerf = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.common.core/perf")); //$NON-NLS-1$ //$NON-NLS-2$
+
+	protected String id;
+	/**
+	 * Creates a new search participant.
+	 */
+	protected SearchParticipant()
+	{
+		// do nothing
+	}
+
+	/**
+	 * Callback method allowing a search participant to indicate whether it supports
+	 * the specified search pattern and options.
+	 * <p>
+	 * If this method returns <code>true</code>, the participant will participate in
+	 * finding matches for the search defined by the search pattern. In this case, the
+	 * search pattern and options will be passed to the following methods of the
+	 * search participant:
+	 * <ol>
+	 * <li>{@link #beginSearching(SearchPattern, Map)}
+	 * <li>{@link #selectDocumentLocations(SearchPattern, SearchScope, Map, IProgressMonitor)}
+	 * <li>{@link #createSearchDocuments(SearchDocumentSet, SearchPattern, SearchScope, Map, IProgressMonitor)}
+	 * <li>{@link #locateMatches(SearchDocumentSet, SearchPattern, SearchScope, SearchRequestor, Map, IProgressMonitor)}
+	 * <li>{@link #doneSearching(SearchPattern, Map)}
+	 * </ol>
+	 * <p>
+	 * If this method returns <code>false</code>, none of the above methods will be
+	 * called, and the search participant contributes no matches for the search
+	 * requrest.
+	 * <p>
+	 * A search participant should only participate in a search when in understands
+	 * the search pattern. Unrecognized search options, however, can be ignored.
+	 * <p>
+	 * This method returns <code>false</code> by default. As a result, subclasses must
+	 * override this method to participate in any searches.
+	 * @param pattern The pattern describing the information to search for
+	 * @param searchOptions Map of options and values defining behavior of the search;
+	 *         <code>null</code> if no options are specified;
+	 *         some options and values are provided by {@link ISearchOptions}
+	 * @return <code>true</code> if the search participant will participate in the
+	 *         search request; <code>false</code> otherwise
+	 */
+	 public abstract boolean isApplicable(SearchPattern pattern, Map searchOptions);
+
+	/**
+	 * Notification that this participant's help is needed in a search.
+	 * <p>
+	 * This method should be re-implemented in subclasses that need to do
+	 * something when the participant is needed in a search.
+	 * </p>
+	 * @param pattern The pattern describing the information to search for
+	 * @param searchOptions Map of options and values defining behavior of the search;
+	 *         <code>null</code> if no options are specified;
+	 *         some options and values are provided by {@link ISearchOptions}
+	 */
+	public void beginSearching(SearchPattern pattern, Map searchOptions)
+	{
+		// do nothing
+	}
+
+	/**
+	 * Notification that this participant's help is no longer needed.
+	 * <p>
+	 * This method should be re-implemented in subclasses that need to do
+	 * something when the participant is no longer needed in a search.
+	 * </p>
+	 * @param pattern
+	 *            The pattern describing the information to search for
+	 * @param searchOptions
+	 *            Map of options and values defining behavior of the search;
+	 *            <code>null</code> if no options are specified;
+	 *            some options and values are provided by {@link ISearchOptions}
+	 */
+	public void doneSearching(SearchPattern pattern, Map searchOptions)
+	{
+		// do nothing
+	}
+	
+	/**
+	 * Returns a displayable name of this search participant.
+	 * <p>
+	 * This method should be re-implemented in subclasses that need to display a
+	 * meaningfull name.
+	 * </p>
+	 * 
+	 * @return the displayable name of this search participant
+	 */
+	public String getDescription()
+	{
+		return "Search participant"; //$NON-NLS-1$
+	}
+
+	/**
+	 * Returns a search document for the given path. The given document path is
+	 * a string that uniquely identifies the document. Most of the time it is a
+	 * workspace-relative path, but it can also be a file system path, or a path
+	 * inside a zip file.
+	 * <p>
+	 * Implementors of this method can either create an instance of their own
+	 * subclass of {@link SearchDocument} or return an existing instance of such
+	 * a subclass.
+	 * </p>
+	 * 
+	 * @param documentPath
+	 *            the path of the document.
+	 * @return a search document
+	 */
+	public abstract SearchDocument createSearchDocument(String documentPath);
+
+	/**
+	 * Locates the matches in the given documents. This method should be called
+	 * by the other search participant or search client once it has
+	 * pre-processed documents and delegating search to this search participant.
+	 * @param documentSet
+	 *            The documents to locate matches in
+	 * @param pattern
+	 *            The pattern describing the information to search for
+	 * @param scope
+	 *            Search scope to limit the source of search candidates;
+	 *            <code>null</code> indicates that the entire workspace is to be
+	 *            searched
+	 * @param requestor
+	 *            Callback object to notify with the results of the search (each match
+	 *            is reported to {@link SearchRequestor#acceptSearchMatch(SearchMatch)})
+	 * @param searchOptions
+	 *            Map of options and values defining behavior of the search;
+	 *            <code>null</code> if no options are specified;
+	 *            some options and values are provided by {@link ISearchOptions}
+	 * @param monitor
+	 *            Progress monitor used to report work completed; <code>null</code>
+	 *            if no progress needs to be reported
+	 * @throws CoreException
+	 *            If the requestor had problem accepting one of the matches
+	 */
+	public abstract void locateMatches(SearchDocumentSet documentSet,
+			SearchPattern pattern, SearchScope scope,
+			SearchRequestor requestor, Map searchOptions, IProgressMonitor monitor)
+			throws CoreException;
+
+	/**
+	 * 
+	 * @param document
+	 * @param pattern
+	 */
+	public abstract void populateSearchDocument(SearchDocument document,
+			SearchPattern pattern);
+
+	/**
+	 * Returns the collection of document locations to consider when performing
+	 * the given search query in the given scope. The search engine calls this
+	 * method before locating matches.
+	 * <p>
+	 * An document location represents a path workspace to the file with the
+	 * content that has potential matches
+	 * </p>
+	 * <p>
+	 * Clients are not expected to call this method.
+	 * </p>
+	 * @param pattern
+	 *            The pattern describing the information to search for
+	 * @param scope
+	 *            Search scope to limit the source of search candidates;
+	 *            <code>null</code> indicates that the entire workspace is to be
+	 *            searched
+	 * @param searchOptions
+	 *            Map of options and values defining behavior of the search;
+	 *            <code>null</code> if no options are specified;
+	 *            some options and values are provided by {@link ISearchOptions}
+	 * @param monitor
+	 *            Progress monitor used to report work completed; <code>null</code>
+	 *            if no progress needs to be reported
+	 * @return the collection of document paths to consider
+	 */
+	public SearchScope selectDocumentLocations(SearchPattern pattern,
+			SearchScope scope, Map searchOptions, IProgressMonitor monitor)
+	{	
+		return scope;
+	}
+
+	/**
+	 * <p>
+	 * This method calls the following methods for each file in the search scope:
+	 * <ol>
+	 * <li>{@link #createSearchDocument(String)}
+	 * <li>{@link #populateSearchDocument(SearchDocument, SearchPattern)}
+	 * </ol>
+	 * @param documentSet
+	 *            The documents to locate matches in
+	 * @param pattern
+	 *            The pattern describing the information to search for
+	 * @param scope
+	 *            Search scope to limit the source of search candidates;
+	 *            <code>null</code> indicates that the entire workspace is to be
+	 *            searched
+	 * @param searchOptions
+	 *            Map of options and values defining behavior of the search;
+	 *            <code>null</code> if no options are specified;
+	 *            some options and values are provided by {@link ISearchOptions}
+	 * @param monitor
+	 *            Progress monitor used to report work completed; <code>null</code>
+	 *            if no progress needs to be reported
+	 */
+	public void createSearchDocuments(SearchDocumentSet documentSet,
+			SearchPattern pattern, SearchScope scope, Map searchOptions,
+			IProgressMonitor monitor)
+	{
+		Assert.isNotNull(id, "The SearchPartipants id has not been initalized");
+		IFile[] files = scope.enclosingFiles();
+		
+		for (int i = 0; i < files.length; i++)
+		{
+			String location = files[i].getLocation().toString();
+			SearchDocument document = documentSet.getSearchDocument(location, id);
+			if(document == null && id != null){
+				documentSet.putSearchDocument(id, document = createSearchDocument(location));
+			}
+			populateSearchDocument(document, pattern); 
+			
+		}
+
+	}	
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/SearchPlugin.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/SearchPlugin.java
new file mode 100644
index 0000000..cf7a9fc
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/SearchPlugin.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.core.search;
+
+import java.util.Map;
+
+import org.eclipse.core.runtime.Plugin;
+import org.eclipse.wst.common.core.search.internal.SearchParticipantRegistry;
+import org.eclipse.wst.common.core.search.internal.SearchParticipantRegistryReader;
+import org.eclipse.wst.common.core.search.pattern.SearchPattern;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The main plugin class to be used in the desktop.
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ */
+public class SearchPlugin extends Plugin implements ISearchOptions
+{
+
+	private SearchParticipantRegistry searchParticipantRegistry;
+
+	// The shared instance.
+	private static SearchPlugin plugin;
+
+	/**
+	 * The constructor.
+	 */
+	public SearchPlugin()
+	{
+		plugin = this;
+	}
+
+	/**
+	 * This method is called upon plug-in activation
+	 */
+	public void start(BundleContext context) throws Exception
+	{
+		super.start(context);
+	}
+
+	/**
+	 * This method is called when the plug-in is stopped
+	 */
+	public void stop(BundleContext context) throws Exception
+	{
+		super.stop(context);
+		plugin = null;
+	}
+
+	/**
+	 * Returns the shared instance.
+	 */
+	public static SearchPlugin getDefault()
+	{
+		return plugin;
+	}
+
+	private SearchParticipantRegistry getSearchParticipantRegistry()
+	{
+		if (searchParticipantRegistry == null)
+		{
+			searchParticipantRegistry = new SearchParticipantRegistry();
+			new SearchParticipantRegistryReader(searchParticipantRegistry)
+					.readRegistry();
+		}
+		return searchParticipantRegistry;
+	}
+
+
+	public SearchParticipant getSearchParticipant(String id)
+	{
+		return getSearchParticipantRegistry().getSearchParticipant(id);
+	}
+
+	/**
+	 * Returns the registered search participants that support the specified search
+	 * pattern and options, loading and creating the search participants if necessary.
+	 * @param pattern The pattern representing a search request
+	 * @param searchOptions Map of options and values defining behavior of the search;
+	 *         <code>null</code> if no options are specified;
+	 *         some options and values are provided by {@link ISearchOptions}
+	 * @return Array of search participants that support the specified search request 
+	 */
+	SearchParticipant[] loadSearchParticipants(SearchPattern pattern, Map searchOptions)
+	{
+		return getSearchParticipantRegistry().getParticipants(pattern, searchOptions);
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/SearchRequestor.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/SearchRequestor.java
new file mode 100644
index 0000000..460b589
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/SearchRequestor.java
@@ -0,0 +1,47 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.core.search;
+
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ * Collects the results from a search engine query. Clients implement a subclass
+ * to pass to <code>SearchEngine.search</code> and implement the
+ * {@link #acceptSearchMatch(SearchMatch)} method.
+ * <p>
+ * The subclasses of the SearchRequestor could collected search matches, filter,
+ * sort and group them. It's up to the client to pass the required extension of
+ * the SearchRequestor to the search engine.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * 
+ * @see SearchEngine
+ */
+public abstract class SearchRequestor
+{
+
+	/**
+	 * Accepts the given search match.
+	 * 
+	 * @param match
+	 *            the found match
+	 * @throws CoreException
+	 */
+	public abstract void acceptSearchMatch(SearchMatch match)
+			throws CoreException;
+
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/document/ComponentDeclarationEntry.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/document/ComponentDeclarationEntry.java
new file mode 100644
index 0000000..f193937
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/document/ComponentDeclarationEntry.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.core.search.document;
+
+import org.eclipse.wst.common.core.search.pattern.QualifiedName;
+
+/**
+ * 
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ *
+ */
+public class ComponentDeclarationEntry extends Entry
+{
+	QualifiedName metaName;
+    QualifiedName name;
+
+	public QualifiedName getName()
+	{
+		return name;
+	}
+
+	public void setName(QualifiedName name)
+	{
+		this.name = name;
+	}
+
+  public QualifiedName getMetaName()
+  {
+    return metaName;
+  }
+
+  public void setMetaName(QualifiedName metaName)
+  {
+    this.metaName = metaName;
+  }
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/document/ComponentReferenceEntry.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/document/ComponentReferenceEntry.java
new file mode 100644
index 0000000..d532f26
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/document/ComponentReferenceEntry.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.core.search.document;
+
+import org.eclipse.wst.common.core.search.pattern.QualifiedName;
+
+/**
+ * 
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ *
+ */
+public class ComponentReferenceEntry extends Entry
+{
+	QualifiedName name;
+
+	public QualifiedName getName()
+	{
+		return name;
+	}
+
+	public void setName(QualifiedName name)
+	{
+		this.name = name;
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/document/Entry.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/document/Entry.java
new file mode 100644
index 0000000..acd10a6
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/document/Entry.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.core.search.document;
+
+/**
+ * 
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ *
+ */
+public class Entry
+{
+  String key;
+  String category;
+
+	public Entry()
+{
+	super();
+	
+}
+
+	public String getCategory()
+	{
+		return category;
+	}
+
+	
+
+	public String getKey()
+	{
+		return key;
+	}
+
+	public void setCategory(String category)
+	{
+		this.category = category;
+	}
+
+	public void setKey(String key)
+	{
+		this.key = key;
+	}
+
+	
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/document/FileReferenceEntry.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/document/FileReferenceEntry.java
new file mode 100644
index 0000000..2789503
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/document/FileReferenceEntry.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.core.search.document;
+
+/**
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ *
+ */
+public class FileReferenceEntry extends Entry
+{
+	String relativeFilePath;
+    String resolvedURI;
+	String publicIdentifier;
+
+	public String getPublicIdentifier()
+	{
+		return publicIdentifier;
+	}
+
+	public void setPublicIdentifier(String publicIdentifier)
+	{
+		this.publicIdentifier = publicIdentifier;
+	}
+
+	public String getRelativeFilePath()
+	{
+		return relativeFilePath;
+	}
+
+	public void setRelativeFilePath(String relativeFilePath)
+	{
+		this.relativeFilePath = relativeFilePath;
+	}
+
+  public String getResolvedURI()
+  {
+    return resolvedURI;
+  }
+
+  public void setResolvedURI(String resolvedURI)
+  {
+    this.resolvedURI = resolvedURI;
+  }
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/document/SearchDocument.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/document/SearchDocument.java
new file mode 100644
index 0000000..d808f19
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/document/SearchDocument.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.core.search.document;
+
+import org.eclipse.wst.common.core.search.SearchParticipant;
+import org.eclipse.wst.common.core.search.SearchRequestor;
+
+/**
+ * A search document encapsulates a content to be searched in. A search
+ * participant creates a search document based on the file locations to locate
+ * matches.
+ * <p>
+ * This class is intended to be subclassed by clients.
+ * </p>
+ * issue (cs/eb) does a search participant always create a SearchDocument?
+ * 
+ * <p>
+ * SearchParticipant or search client create search documents for the search
+ * pass where precise locations of the matches will be determined by calling
+ * {@link SearchParticipan#locateMatches}
+ * </p>
+ * <p>
+ * SearchParticipant knows how to create search document that it can process.
+ * </p>
+ * <p>
+ * The intent of the separation of the {@link SearchDocument} from the
+ * {@link SearchParticipant} is to enable the other search participants to
+ * process parts of the document. For example, if XML document has a fragment
+ * that it can not process, e.g. Java, then XML participant would create
+ * SearchDocument for that fragment which contains Java compilation unit, and
+ * pass it to the Java search participant. Passing its own
+ * {@link SearchRequestor} this participant can then map the match positions
+ * back to the original contents, create its own matches and report them to the
+ * original requestor.
+ * </p>
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ * 
+ * @see SearchParticipant
+ */
+public abstract class SearchDocument
+{
+
+	private String documentPath;
+	private SearchParticipant participant; 
+
+	/**
+	 * Creates a new search document. The given document path is a string that
+	 * uniquely identifies the document. Most of the time it is a
+	 * workspace-relative path, but it can also be a file system path, or a path
+	 * inside a zip file.
+	 * 
+	 * @param documentPath
+	 *            the path to the document, or <code>null</code> if none
+	 */
+	protected SearchDocument(String documentPath, SearchParticipant participant)
+	{
+		this.documentPath = documentPath;
+		this.participant = participant;
+	}
+
+	public abstract Entry[] getEntries(String category, String key, int matchRule);
+
+	/**
+	 * Returns the model of this document. Model may be different from actual
+	 * resource at corresponding document path due to preprocessing.
+	 * <p>
+	 * This method must be implemented in subclasses.
+	 * </p>
+	 * 
+	 * @return the model of this document, or <code>null</code> if none
+	 */
+	public abstract Object getModel();
+	
+	
+	/**
+	 * Returns the participant that created this document.
+	 * 
+	 * @return the participant that created this document
+	 */
+	public final SearchParticipant getParticipant() {
+		return this.participant;
+	}
+	
+	
+//	 this class represents a collection of information
+//	 that has been produced by a search participant
+//	 typically after a file has been processed
+//	 an Entry is typically course grained info that results from the SearchParticipants
+//	 first step ... and is used to compute more accurate SearchMatches during a SearchParticipants 2nd step
+
+	/**
+	 * Returns the path to the original document.
+	 * 
+	 * @return the path to the document
+	 */
+	public final String getPath()
+	{
+		return this.documentPath;
+	} 
+	
+	public abstract void putEntry(Entry entry);
+    
+    public void dispose()
+    {      
+    }
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/document/SearchDocumentSet.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/document/SearchDocumentSet.java
new file mode 100644
index 0000000..42fb34c
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/document/SearchDocumentSet.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.core.search.document;
+
+/**
+ * The class is used to manage a set of search documents
+ * that have been constructed by various participants
+ * 
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ *
+ */
+public abstract class SearchDocumentSet
+{
+  public abstract SearchDocument getSearchDocument(String resourcePath, String participantId);
+  public abstract SearchDocument[] getSearchDocuments(String participantId);
+  public abstract void putSearchDocument(String participantId, SearchDocument document);
+  public abstract SearchDocument _tempGetSearchDocumetn(String resourcePath);
+  public abstract void dispose();
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/internal/Messages.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/internal/Messages.java
new file mode 100644
index 0000000..cc3522b
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/internal/Messages.java
@@ -0,0 +1,37 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.core.search.internal;
+
+import org.eclipse.osgi.util.NLS;
+
+// issue (cs) is this a UI issue?  where does the framework need to expose stings?
+public class Messages extends NLS
+{
+
+	private static final String BUNDLE_NAME = "org.eclipse.wst.common.core.internal.messages";//$NON-NLS-1$
+
+	public static String engine_searching;
+
+	public static String engine_searching_locatingDocuments;
+
+	public static String engine_searching_matching;
+
+	private Messages()
+	{
+		// Do not instantiate
+	}
+
+	static
+	{
+		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/internal/SearchDocumentSetImpl.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/internal/SearchDocumentSetImpl.java
new file mode 100644
index 0000000..e3f6c33
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/internal/SearchDocumentSetImpl.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.core.search.internal;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.wst.common.core.search.document.SearchDocument;
+import org.eclipse.wst.common.core.search.document.SearchDocumentSet;
+
+public class SearchDocumentSetImpl extends SearchDocumentSet
+{
+    public Map documentPathMap = new HashMap(); //path --> documetn
+	Map documentMap = new HashMap();  // participantId - > list (document)
+	
+	public SearchDocumentSetImpl()
+	{
+		super();
+	}
+    
+    public SearchDocument _tempGetSearchDocumetn(String resourcePath)
+    {      
+       return (SearchDocument)documentPathMap.get(resourcePath);      
+    }
+    
+    public SearchDocument getSearchDocument(String resourcePath, String participantId)
+	{
+		if(resourcePath == null){
+			return null;
+		}
+		SearchDocument[] documents = getSearchDocuments(participantId);
+		for (int i = 0; i < documents.length; i++)
+		{
+			SearchDocument document = documents[i];
+			if(resourcePath.equals(document.getPath())){
+				return document;
+			}
+		}
+		return null;
+	}
+
+	public SearchDocument[] getSearchDocuments(String participantId)
+	{
+		
+		Object object = documentMap.get(participantId);
+		List documentList = null;
+		if(object instanceof List){
+			documentList = (List)object;
+		}
+		else{
+			documentMap.put(participantId, documentList = new ArrayList());
+		}
+		return (SearchDocument[]) documentList.toArray(new SearchDocument[documentList.size()]);
+		
+	}
+
+	public void putSearchDocument(String participantId, SearchDocument document)
+	{
+		Object object = documentMap.get(participantId);
+		List documentList = null;
+		if(object instanceof List){
+			documentList = (List)object;
+		}
+		else{
+			documentMap.put(participantId, documentList = new ArrayList());
+		}
+		documentList.add(document);
+        documentPathMap.put(document.getPath(), document);
+	}
+
+    
+    public void dispose()
+    {
+      try
+      {
+      for (Iterator i = documentMap.values().iterator(); i.hasNext(); )
+      {
+        Object o = i.next();
+        if (o instanceof List)
+        {  
+          for (Iterator j = ((List)o).iterator(); j.hasNext(); )
+          {
+            Object o2 = j.next();
+            if (o2 instanceof SearchDocument)
+            {  
+               SearchDocument searchDocument = (SearchDocument)o2;
+               searchDocument.dispose();
+            }   
+          }          
+        }       
+      }
+      }
+      catch (Exception e)
+      {
+        e.printStackTrace();
+      }
+    }
+
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/internal/SearchParticipantDescriptor.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/internal/SearchParticipantDescriptor.java
new file mode 100644
index 0000000..8e39e12
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/internal/SearchParticipantDescriptor.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.core.search.internal;
+
+import org.eclipse.core.expressions.EvaluationResult;
+import org.eclipse.core.expressions.Expression;
+import org.eclipse.core.expressions.ExpressionConverter;
+import org.eclipse.core.expressions.ExpressionTagNames;
+import org.eclipse.core.expressions.IEvaluationContext;
+import org.eclipse.core.runtime.Assert; 
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.wst.common.core.search.SearchParticipant;
+
+public class SearchParticipantDescriptor
+{
+
+	private IConfigurationElement fElement;
+
+	private SearchParticipant participant;
+
+	public SearchParticipantDescriptor(IConfigurationElement element)
+	{
+		this.fElement = element;
+	}
+
+	public SearchParticipant getSearchParticipant()
+	{
+		if (participant == null)
+		{
+			try
+			{
+				participant = (SearchParticipant) fElement
+						.createExecutableExtension("class"); //$NON-NLS-1$
+			} catch (Exception e)
+			{
+				// e.printStackTrace();
+			}
+		}
+		return participant;
+	}
+
+	public boolean matches(IEvaluationContext context) throws CoreException
+	{
+		IConfigurationElement[] elements = fElement
+				.getChildren(ExpressionTagNames.ENABLEMENT);
+		if (elements.length == 0)
+			return false;
+		Assert.isTrue(elements.length == 1);
+		Expression exp = ExpressionConverter.getDefault().perform(elements[0]);
+		return convert(exp.evaluate(context));
+	}
+
+	private boolean convert(EvaluationResult eval)
+	{
+		if (eval == EvaluationResult.FALSE)
+			return false;
+		return true;
+	}
+
+	/**
+	 * @deprecated No replacement
+	 */
+	public String[] getSupportedContentTypes()
+	{
+		return new String[0];
+	}
+
+	/**
+	 * @deprecated No replacement
+	 */
+	public void addSupportedContentTypeId(String contentTypeId)
+	{
+	}
+	
+	public String getElementId(){
+		return fElement.getAttribute("id");
+		
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/internal/SearchParticipantRegistry.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/internal/SearchParticipantRegistry.java
new file mode 100644
index 0000000..a169e91
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/internal/SearchParticipantRegistry.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.core.search.internal;
+
+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 java.util.Set;
+import org.eclipse.core.expressions.EvaluationContext;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.wst.common.core.search.SearchParticipant;
+import org.eclipse.wst.common.core.search.pattern.SearchPattern;
+
+public class SearchParticipantRegistry
+{
+
+	protected Map idMap = new HashMap(); // maps searchParticipant id to a
+											// searchParticipant descriptor
+
+	public SearchParticipantRegistry()
+	{
+	}
+
+	public void putSearchParticipant(String id,
+			SearchParticipantDescriptor searchParticipantDescriptor)
+	{
+		idMap.put(id, searchParticipantDescriptor);
+	}
+
+	public String[] getSearchParticipantIds()
+	{
+		Set ids = idMap.keySet();
+		return (String[]) ids.toArray(new String[ids.size()]);
+	}
+
+	public Collection getSearchParticipants()
+	{
+		return idMap.values();
+	}
+
+
+	public SearchParticipant getSearchParticipant(String id)
+	{
+		SearchParticipantDescriptor searchParticipantDescriptor = null;
+		if (id != null)
+		{
+			searchParticipantDescriptor = (SearchParticipantDescriptor) idMap
+					.get(id);
+		}
+		return searchParticipantDescriptor != null ? searchParticipantDescriptor
+				.getSearchParticipant()
+				: null;
+
+	}
+
+	public SearchParticipant[] getParticipants(SearchPattern pattern, Map searchOptions)
+	{
+
+		EvaluationContext evalContext = createEvaluationContext(pattern);
+		List result = new ArrayList();
+		for (Iterator iter = getSearchParticipants().iterator(); iter.hasNext();)
+		{
+			SearchParticipantDescriptor descriptor = (SearchParticipantDescriptor) iter
+					.next();
+			try
+			{
+				if (descriptor.matches(evalContext))
+				{
+					try
+					{
+						SearchParticipant participant = descriptor
+								.getSearchParticipant();
+						if (!SearchParticipant.class.isInstance(participant))
+							throw new ClassCastException();
+						if (participant.isApplicable(pattern, searchOptions))
+						{
+							result.add(participant);
+						}
+					} catch (ClassCastException e)
+					{
+						iter.remove();
+					}
+				}
+
+			} catch (CoreException e)
+			{
+				iter.remove();
+			}
+
+		}
+
+		return (SearchParticipant[]) result
+				.toArray(new SearchParticipant[result.size()]);
+	}
+
+	private static EvaluationContext createEvaluationContext(
+			SearchPattern pattern)
+	{
+		EvaluationContext result = new EvaluationContext(null, pattern);
+		result.addVariable("pattern", pattern); //$NON-NLS-1$
+		return result;
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/internal/SearchParticipantRegistryReader.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/internal/SearchParticipantRegistryReader.java
new file mode 100644
index 0000000..7757ce3
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/internal/SearchParticipantRegistryReader.java
@@ -0,0 +1,69 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.core.search.internal;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.Platform;
+
+public class SearchParticipantRegistryReader
+{
+	protected static final String EXTENSION_POINT_ID = "searchParticipants"; //$NON-NLS-1$
+
+	protected static final String TAG_NAME = "searchParticipant"; //$NON-NLS-1$
+
+	protected static final String ATT_CLASS = "class"; //$NON-NLS-1$
+
+	protected static final String ATT_ID = "id"; //$NON-NLS-1$
+
+	protected String pluginId, extensionPointId;
+
+	protected SearchParticipantRegistry registry;
+
+	public SearchParticipantRegistryReader(SearchParticipantRegistry registry)
+	{
+		this.registry = registry;
+	}
+
+	public void readRegistry()
+	{
+		String bundleid = "org.eclipse.wst.common.core"; //$NON-NLS-1$
+		IExtensionPoint point = Platform.getExtensionRegistry()
+				.getExtensionPoint(bundleid, EXTENSION_POINT_ID);
+		if (point != null)
+		{
+			IConfigurationElement[] elements = point.getConfigurationElements();
+			for (int i = 0; i < elements.length; i++)
+			{
+				readElement(elements[i]);
+			}
+		}
+	}
+
+	protected void readElement(IConfigurationElement element)
+	{
+		if (element.getName().equals(TAG_NAME))
+		{
+			String contributorClass = element.getAttribute(ATT_CLASS);
+			String id = element.getAttribute(ATT_ID);
+			if (id != null)
+			{
+				if (contributorClass != null)
+				{
+					SearchParticipantDescriptor descriptor = new SearchParticipantDescriptor(
+							element);
+					registry.putSearchParticipant(id, descriptor);
+				}
+			}
+		}
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/internal/messages.properties b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/internal/messages.properties
new file mode 100644
index 0000000..e3a01a8
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/internal/messages.properties
@@ -0,0 +1,15 @@
+###############################################################################
+# Copyright (c) 2005, 2006 IBM Corporation 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:
+#     IBM Corporation - initial API and implementation
+###############################################################################
+### Search messages.
+
+engine_searching = Searching...
+engine_searching_locatingDocuments = {0}: locate search documents...
+engine_searching_matching = {0}: locate matches...
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/pattern/ComponentDeclarationPattern.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/pattern/ComponentDeclarationPattern.java
new file mode 100644
index 0000000..16f3ffe
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/pattern/ComponentDeclarationPattern.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.core.search.pattern;
+
+/**
+ *
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ *
+ */
+public class ComponentDeclarationPattern extends ComponentSearchPattern
+{
+
+	public ComponentDeclarationPattern(QualifiedName name,
+			QualifiedName metaName, int matchRule)
+	{
+		super(null, name, metaName, matchRule);
+
+	}
+
+	public ComponentDeclarationPattern(QualifiedName name,
+			QualifiedName metaName)
+	{
+		super(null, name, metaName);
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/pattern/ComponentReferencePattern.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/pattern/ComponentReferencePattern.java
new file mode 100644
index 0000000..2f1e101
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/pattern/ComponentReferencePattern.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.core.search.pattern;
+
+import org.eclipse.core.resources.IFile;
+
+/**
+ * 
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ *
+ */
+public class ComponentReferencePattern extends ComponentSearchPattern
+{
+
+	public ComponentReferencePattern(IFile file, QualifiedName elementQName,
+			QualifiedName typeQName, int matchRule)
+	{
+		super(file, elementQName, typeQName, matchRule);
+
+	}
+
+	public ComponentReferencePattern(IFile file, QualifiedName elementQName,
+			QualifiedName typeQName)
+	{
+		super(file, elementQName, typeQName);
+
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/pattern/ComponentSearchPattern.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/pattern/ComponentSearchPattern.java
new file mode 100644
index 0000000..4741a10
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/pattern/ComponentSearchPattern.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.core.search.pattern;
+
+import org.eclipse.core.resources.IFile;
+
+/**
+ * This class defines generic component pattern. Usually there are two types of
+ * component search patterns: pattern for component declaration and for
+ * component definition.
+ * 
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ */
+public abstract class ComponentSearchPattern extends SearchPattern
+{
+
+	QualifiedName name;
+
+	QualifiedName metaName;
+
+	IFile file; // (optional) location where component is defined
+
+	public ComponentSearchPattern(IFile file, QualifiedName elementQName,
+			QualifiedName typeQName, int matchRule)
+	{
+		super(matchRule);
+		this.file = file;
+		name = elementQName;
+		metaName = typeQName;
+
+	}
+
+	public ComponentSearchPattern(IFile file, QualifiedName elementQName,
+			QualifiedName typeQName)
+	{
+
+		this.file = file;
+		name = elementQName;
+		metaName = typeQName;
+
+	}
+
+	public IFile getFile()
+	{
+		return file;
+	}
+
+	public QualifiedName getMetaName()
+	{
+		return metaName;
+	}
+
+	public QualifiedName getName()
+	{
+		return name;
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/pattern/FileReferencePattern.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/pattern/FileReferencePattern.java
new file mode 100644
index 0000000..27c1165
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/pattern/FileReferencePattern.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.core.search.pattern;
+
+import org.eclipse.core.resources.IFile;
+
+/**
+ * 
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ *
+ */
+public class FileReferencePattern extends SearchPattern
+{
+
+	IFile file;
+
+	public FileReferencePattern(IFile file)
+	{
+		this.file = file;
+	}
+
+	public FileReferencePattern(IFile file, int matchRule)
+	{
+		super(matchRule);
+		this.file = file;
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/pattern/QualifiedName.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/pattern/QualifiedName.java
new file mode 100644
index 0000000..0f7ab17
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/pattern/QualifiedName.java
@@ -0,0 +1,226 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.core.search.pattern;
+
+/**
+ * This data class represents a qualified name, consisting of a local name and a
+ * qualifier
+ * 
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ */
+// issue (cs) should this go in the 'matching' package (BTW... rename
+// matching->pattern)
+public class QualifiedName
+{
+
+	private String qualifier;
+
+	private String name;
+
+	private static final String NS_DELIM_1 = "{"; //$NON-NLS-1$
+
+	private static final String NS_DELIM_2 = "}"; //$NON-NLS-1$
+
+	/**
+	 * Constructor Creates a qualified name from a namespace and local name.
+	 * 
+	 * @param namespace
+	 * @param localName
+	 */
+	public QualifiedName(String namespace, String localName)
+	{
+
+		super();
+
+		this.qualifier = namespace;
+		if (namespace != null && namespace.length() == 0)
+		{
+			this.qualifier = null;
+		}
+		if (this.qualifier != null && this.qualifier.length() == 0)
+		{
+			this.qualifier = null;
+		}
+
+		this.name = localName;
+		if (localName != null && localName.length() == 0)
+		{
+			this.name = null;
+		}
+
+	}
+
+	/**
+	 * Returns the namespace component of the qualified name.
+	 * 
+	 * @return The namespace; <code>null</code> if none is specified
+	 */
+	public String getNamespace()
+	{
+		return this.qualifier;
+	}
+
+	/**
+	 * Returns the local name component of the qualified name.
+	 * 
+	 * @return The local name; <code>null</code> if none is specified
+	 */
+	public String getLocalName()
+	{
+		return this.name;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#equals(java.lang.Object)
+	 */
+	public boolean equals(Object obj)
+	{
+		boolean isEqual = false;
+		if (this == obj)
+		{
+		  isEqual = true;
+		}
+		else
+		{	
+		  if (obj instanceof QualifiedName)
+		  {
+			QualifiedName that = (QualifiedName) obj;
+		    isEqual = isMatch(this.getNamespace(), that.getNamespace()) &&
+		              isMatch(this.getLocalName(), that.getLocalName());	
+		  }  
+		}
+		return isEqual;
+	}
+	
+	protected boolean isMatch(String a, String b)
+	{
+	  return a != null ? a.equals(b) : a == b;
+	}	
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see java.lang.Object#hashCode()
+	 */
+	public int hashCode()
+	{
+		int hash = 0;
+		if (this.qualifier != null)
+		{
+			hash += this.qualifier.hashCode();
+		}
+		if (this.name != null)
+		{
+			hash += this.name.hashCode();
+		}
+		return hash;
+	}
+
+	/**
+	 * Returns a string representation of the qualified name, of the form:
+	 * {namespace}localname. If no namespace is specified, the string has the
+	 * form: {}localname. Note that the string format may change in the future.
+	 * 
+	 * @return The string value
+	 */
+	public String toString()
+	{
+
+		return appendStrings(new String[]
+		{ NS_DELIM_1, // {
+				this.qualifier, NS_DELIM_2, // }
+				this.name });
+
+	}
+
+	/**
+	 * Factory-like method to create a QName object from the string form of a
+	 * QName. The string must have the same format as returned by
+	 * QName.toString().
+	 * 
+	 * @param qnameString -
+	 *            String form of a QName
+	 * @return The created QName object created from the specified string
+	 * @throws IllegalArgumentException -
+	 *             Missing namespace delimiters
+	 */
+	public static QualifiedName valueOf(String qnameString)
+			throws IllegalArgumentException
+	{
+
+		String namespace = null;
+		String localName = null;
+		if (qnameString == null || qnameString.length() == 0)
+		{
+			// Both namespace and local name are null.
+		} else if (qnameString.startsWith(NS_DELIM_1))
+		{
+			// The QName has the notation specifying a namespace.
+			int index = qnameString.indexOf(NS_DELIM_2);
+			if (index == -1)
+			{
+				// The end delimiter for the namespace was not found. The QName
+				// string
+				// is malformed.
+				throw new IllegalArgumentException(
+						"qnameString = " + qnameString); //$NON-NLS-1$
+			}
+			namespace = qnameString.substring(1, index);
+			localName = qnameString.substring(index + 1);
+		} else
+		{
+			// Assume no namespace is specified and the string is a local name.
+			localName = qnameString;
+		}
+		return new QualifiedName(namespace, localName);
+
+	}
+
+	/**
+	 * Creates a single string by appending together an array of strings,
+	 * skipping null strings.
+	 * 
+	 * @param strings -
+	 *            Strings to be appended together
+	 * @return Resulting string
+	 */
+	public static String appendStrings(String[] strings)
+	{
+
+		String result = null;
+		if (strings != null)
+		{
+			StringBuffer tokenBuffer = new StringBuffer();
+			int maxCount = strings.length;
+			String string;
+			for (int i = 0; i < maxCount; i++)
+			{
+				string = strings[i];
+				if (string != null && string.length() > 0)
+				{
+					tokenBuffer.append(string);
+				}// if
+			}// for
+			result = tokenBuffer.toString();
+		}// if
+		return result;
+
+	}// appendStrings()
+
+}// class QName
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/pattern/SearchPattern.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/pattern/SearchPattern.java
new file mode 100644
index 0000000..df0aaf6
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/pattern/SearchPattern.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2006 IBM Corporation 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:
+ *     IBM Corporation - Initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.core.search.pattern;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.Platform;
+
+/**
+ * A search defines how search results are found.
+ * 
+ * This class is intended to be subclassed by clients.
+ * 
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ */
+public abstract class SearchPattern implements IAdaptable
+{
+
+	/**
+	 * Match rule: The search pattern matches the search result only if cases
+	 * are the same. Can be combined to previous rules, e.g.
+	 * {@link #R_EXACT_MATCH} | {@link #R_CASE_SENSITIVE}
+	 */
+	public static final int R_CASE_SENSITIVE = 8;
+
+	// Rules for pattern matching: (exact, prefix, pattern) [ | case sensitive]
+	/**
+	 * Match rule: The search pattern matches exactly the search result, that
+	 * is, the source of the search result equals the search pattern.
+	 */
+	public static final int R_EXACT_MATCH = 0;
+
+	/**
+	 * Match rule: The search pattern contains one or more wild cards ('*')
+	 * where a wild-card can replace 0 or more characters in the search result.
+	 */
+	public static final int R_PATTERN_MATCH = 2;
+
+	/**
+	 * Match rule: The search pattern is a prefix of the search result.
+	 */
+	public static final int R_PREFIX_MATCH = 1;
+
+	/**
+	 * Match rule: The search pattern contains a regular expression.
+	 */
+	public static final int R_REGEXP_MATCH = 4;
+
+	private int matchRule;
+
+	public SearchPattern()
+	{
+		this.matchRule = R_EXACT_MATCH | R_CASE_SENSITIVE;
+	}
+
+	public SearchPattern(int matchRule)
+	{
+		this.matchRule = matchRule;
+
+	}
+
+	public final int getMatchRule()
+	{
+		return this.matchRule;
+	}
+
+	public Object getAdapter(Class adapter)
+	{
+		return Platform.getAdapterManager().getAdapter(this, adapter);
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/scope/ContentTypeSearchScope.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/scope/ContentTypeSearchScope.java
new file mode 100644
index 0000000..c67af17
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/scope/ContentTypeSearchScope.java
@@ -0,0 +1,105 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.common.core.search.scope;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.content.IContentDescription;
+import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.content.IContentTypeManager;
+
+/**
+ * Scope that has filterers files based on content types. It can limit other
+ * scopes with the given file content types.
+ * 
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ */
+public class ContentTypeSearchScope extends SearchScopeImpl
+{
+
+	private List validContentIds = new ArrayList();
+
+	public ContentTypeSearchScope(SearchScope scope, String[] validContentTypes)
+	{
+		if (validContentTypes != null)
+		{
+			for (int i = 0; i < validContentTypes.length; i++)
+			{
+				this.validContentIds.add(validContentTypes[i]);
+			}
+		}
+		if (scope.enclosingFiles() != null)
+		{
+			for (int i = 0; i < scope.enclosingFiles().length; i++)
+			{
+				IFile file = (IFile) scope.enclosingFiles()[i];
+				acceptFile(file);
+			}
+		}
+
+	}
+
+	protected boolean acceptFile(IFile file)
+	{
+
+		if (file == null)
+		{
+			return false;
+		} else
+		{
+			try
+			{
+				IContentDescription description = file.getContentDescription();
+				if (description != null)
+				{
+					IContentType contentType = description.getContentType();
+					if (contentType != null)
+					{
+						// TODO use IContentType.isKindOf
+						for (Iterator iter = validContentIds.iterator(); iter
+								.hasNext();)
+						{
+							String contentId = (String) iter.next();
+							IContentTypeManager contentTypeManager = Platform.getContentTypeManager();
+							IContentType supportedContentType = contentTypeManager.getContentType(contentId);
+							if (supportedContentType != null)
+							{
+								if (contentType.isKindOf(supportedContentType))
+								{
+									files.add(file);
+									projects.add(file.getProject());
+									return true;
+								}
+							}
+
+						}
+
+					}
+				}
+			} catch (CoreException e)
+			{
+				// ignore the file
+			}
+		}
+		return false;
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/scope/ProjectSearchScope.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/scope/ProjectSearchScope.java
new file mode 100644
index 0000000..12ace71
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/scope/ProjectSearchScope.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.common.core.search.scope;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+
+/**
+ *
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ */
+public class ProjectSearchScope extends SearchScopeImpl
+{
+
+	/**
+	 * Creates a scope that ecloses workspace path and eclosing project
+	 * 
+	 * @param workspacePath -
+	 *            path to the resource in the workspace, e.g.
+	 *            /MyProject/MyFile.xml
+	 */
+	public ProjectSearchScope(IPath workspacePath)
+	{
+		super();
+		initialize(workspacePath);
+
+	}
+
+	protected void initialize(IPath workspacePath)
+	{
+		IResource resource = ResourcesPlugin.getWorkspace().getRoot()
+				.findMember(workspacePath);
+		if (resource != null)
+		{
+			IProject project = resource.getProject();
+			traverseContainer(project);
+		}
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/scope/SearchScope.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/scope/SearchScope.java
new file mode 100644
index 0000000..1dd3efd
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/scope/SearchScope.java
@@ -0,0 +1,49 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.common.core.search.scope;
+
+import org.eclipse.core.resources.IFile;
+
+/**
+ * A <code>SearchScope</code> defines where search result should be found by a
+ * <code>SearchEngine</code> (e.g. project, workspace).
+ * 
+ * Clients must pass an instance of this class to the <code>search(...)</code>
+ * methods. Such an instance can be created using the following factory methods
+ * on <code>SearchScope</code>: <code>newSearchScope(IResource[])</code>,
+ * <code>newWorkspaceScope()</code>
+ * 
+ * The default implementaion of the search scope has no filter, and at creation
+ * does not contain any files, It could accept any workspace file.
+ * 
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ */
+public abstract class SearchScope
+{
+	/**
+	 * Returns the path to the workspace files that belong in this search scope.
+	 * (see <code>IResource.getFullPath()</code>). For example,
+	 * /MyProject/MyFile.txt
+	 * 
+	 * @return an array of files in the workspace that belong to this scope.
+	 */
+	public abstract IFile[] enclosingFiles();
+
+
+
+	
+
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/scope/SearchScopeImpl.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/scope/SearchScopeImpl.java
new file mode 100644
index 0000000..33c4c69
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/scope/SearchScopeImpl.java
@@ -0,0 +1,133 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.common.core.search.scope;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceVisitor;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+
+/**
+ *
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ */
+public class SearchScopeImpl extends SearchScope
+{
+
+	protected List files = new ArrayList();
+
+	protected HashSet projects = new HashSet();
+
+	public SearchScopeImpl()
+	{
+		super();
+	}
+
+	/**
+	 * Checks whether the resource at the given path is belongs to this scope.
+	 * Resource path could be added to the scope, if scope conditions are met.
+	 * if {@link ISearchScope.encloses(String resourcePath)} returns false and
+	 * then this method is called and returns true, next call to
+	 * {@link ISearchScope.eclipses(String resourcePath)} should return true.
+	 * 
+	 * @param file -
+	 *            workspace file
+	 * @return whether the resource is enclosed by this scope
+	 */
+	protected boolean acceptFile(IFile file)
+	{
+		if (file == null)
+		{
+			return false;
+		}
+		files.add(file);
+		projects.add(file.getProject());
+		return true;
+
+	}
+
+	/**
+	 * Checks whether the resource at the given path is enclosed by this scope.
+	 * 
+	 * @param resourcePath -
+	 *            workspace relative resource path
+	 * @return whether the resource is enclosed by this scope
+	 */
+	protected boolean encloses(String resourcePath)
+	{
+		IResource resource = ResourcesPlugin.getWorkspace().getRoot()
+				.findMember(resourcePath);
+		if (resource == null)
+			return false;
+		return (files.contains(resource));
+	}
+
+	/**
+	 * Returns the path to the workspace files that belong in this search scope.
+	 * (see <code>IResource.getFullPath()</code>). For example,
+	 * /MyProject/MyFile.txt
+	 * 
+	 * @return an array of files in the workspace that belong to this scope.
+	 */
+	public IFile[] enclosingFiles()
+	{
+		if (files == null)
+			return new IFile[0];
+		return (IFile[]) files.toArray(new IFile[files.size()]);
+	}
+
+	/**
+	 * Returns the paths to the enclosing projects for this search scope. (see
+	 * <code>IResource.getFullPath()</code>). For example, /MyProject
+	 * 
+	 * @return an array of paths to the enclosing projects.
+	 */
+	protected IProject[] enclosingProjects()
+	{
+
+		return (IProject[]) projects.toArray(new IProject[projects.size()]);
+
+	}
+	
+	protected void traverseContainer(IContainer container)
+	{
+
+		IResourceVisitor visitor = new IResourceVisitor()
+		{
+			public boolean visit(IResource resource)
+			{
+				if (resource.getType() == IResource.FILE)
+					acceptFile((IFile) resource);
+				return true;
+			}
+		};
+		try
+		{
+			container.accept(visitor);
+		} catch (CoreException e)
+		{
+			// ignore resource
+		}
+
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/scope/SelectionSearchScope.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/scope/SelectionSearchScope.java
new file mode 100644
index 0000000..4ffcd3e
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/scope/SelectionSearchScope.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.common.core.search.scope;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IResource;
+
+/**
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ */
+public class SelectionSearchScope extends SearchScopeImpl
+{
+
+	protected IResource[] resources;
+
+	/**
+	 * Creates a scope that ecloses workspace path and eclosing project
+	 * 
+	 * @param workspacePath -
+	 *            path to the resource in the workspace, e.g.
+	 *            /MyProject/MyFile.xml
+	 */
+	public SelectionSearchScope(IResource[] resources)
+	{
+		super();
+		this.resources = resources;
+		initialize();
+
+	}
+
+	protected void initialize()
+	{
+		if (resources == null)
+			return;
+		for (int index = 0; index < resources.length; index++)
+		{
+			IResource resource = resources[index];
+			if (resource != null)
+			{
+				if (resource.getType() == IResource.FOLDER)
+				{
+					traverseContainer((IFolder) resource);
+				} else if (resource.getType() == IResource.FILE)
+				{
+					acceptFile((IFile) resource);
+				}
+			}
+
+		}
+
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/scope/WorkingSetSearchScope.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/scope/WorkingSetSearchScope.java
new file mode 100644
index 0000000..cab1a19
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/scope/WorkingSetSearchScope.java
@@ -0,0 +1,81 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *     
+ *******************************************************************************/
+package org.eclipse.wst.common.core.search.scope;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.IAdaptable;
+
+/**
+ * This class is required to wrap the content of an IWorkingSet.
+ * We can't use IWorkingSet directly because it's part of an eclipse.ui
+ * component. Therefore, we need to create this object as a surrogate.
+ * <br>
+ * Usage: We get the array IAdaptable[] of the IWorkingSet object and use this
+ * array as argument for all methods of this class including the constructor.
+ */
+public class WorkingSetSearchScope extends SearchScopeImpl{
+	
+	/**
+	 * Creates an empty scope when no resources is given.
+	 */
+	public WorkingSetSearchScope(){
+		super();
+	}
+  
+	/**
+	 * Intended to be used with an IWorkingSet
+	 * <br>
+	 * For example:
+	 * <pre>
+	 * IWorkingSet oneWorkingSet;
+	 * ...
+	 * IAdaptable[] elements = oneWorkingSet.getElements();
+	 * WorkingSetSearchScope scope = new WorkingSetSearchScope(elements);
+	 * </pre>
+	 */
+	public WorkingSetSearchScope(IAdaptable[] elements)
+	{
+		super();
+		addElementsOfWorkingSet(elements);
+	}
+	
+	/**
+	 * Intended to be used with an IWorkingSet
+	 * <br>
+	 * For example:
+	 * <pre>
+	 * WorkingSetSearchScope scope = ..; 
+	 * ...
+	 * IWorkingSet anotherWorkingSet; 
+	 * IAdaptable[] elements = anotherWorkingSet.getElements();
+	 * scope.addAWorkingSetToScope(elements);
+	 * </pre>
+	 */
+	public void addAWorkingSetToScope(IAdaptable[] elements){
+		addElementsOfWorkingSet(elements);
+	}
+	
+	private void addElementsOfWorkingSet(IAdaptable[] elements){
+		for (int j = 0; j < elements.length; j++){
+			IContainer container = (IContainer) elements[j].getAdapter(IContainer.class);
+			if ( container != null ){
+				traverseContainer(container);
+			}
+			else{
+				IFile aFile = (IFile) elements[j].getAdapter(IFile.class);
+				if ( aFile != null)
+					acceptFile(aFile);
+			}
+		}
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/scope/WorkspaceSearchScope.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/scope/WorkspaceSearchScope.java
new file mode 100644
index 0000000..e01c201
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/scope/WorkspaceSearchScope.java
@@ -0,0 +1,51 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.common.core.search.scope;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+
+/**
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ */
+public class WorkspaceSearchScope extends SearchScopeImpl
+{
+
+	protected IResource currentResource;
+
+	/**
+	 * Creates a scope that ecloses workspace path and eclosing project
+	 * 
+	 * @param workspacePath -
+	 *            path to the resource in the workspace, e.g.
+	 *            /MyProject/MyFile.xml
+	 */
+	public WorkspaceSearchScope()
+	{
+		super();
+		initialize();
+
+	}
+
+	protected void initialize()
+	{
+		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+		traverseContainer(root);
+
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/util/CollectingSearchRequestor.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/util/CollectingSearchRequestor.java
new file mode 100644
index 0000000..d227f93
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/search/util/CollectingSearchRequestor.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2006 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.common.core.search.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.wst.common.core.search.SearchMatch;
+import org.eclipse.wst.common.core.search.SearchRequestor;
+
+/**
+ * Collects the results returned by a <code>ISearchEngine</code>.
+ * 
+ * <p>
+ * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to
+ * change significantly before reaching stability. It is being made available at this early stage to solicit feedback
+ * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken
+ * (repeatedly) as the API evolves.
+ * </p>
+ */
+// issue should you move this to a util package? what does jdt do?
+public class CollectingSearchRequestor extends SearchRequestor
+{
+	private ArrayList fFound;
+
+	public CollectingSearchRequestor()
+	{
+		fFound = new ArrayList();
+	}
+
+	/**
+	 * @return a List of {@link SearchMatch}es (not sorted)
+	 */
+	public List/* <SearchMatch> */getResults()
+	{
+		return fFound;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.core.search.internal.provisional.SearchRequestor#acceptSearchMatch(org.eclipse.wst.common.search.internal.provisional.SearchMatch)
+	 */
+	public void acceptSearchMatch(SearchMatch match) throws CoreException
+	{
+		fFound.add(match);
+
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.infopop/.cvsignore b/plugins/org.eclipse.wst.common.infopop/.cvsignore
new file mode 100644
index 0000000..c14487c
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.infopop/.cvsignore
@@ -0,0 +1 @@
+build.xml
diff --git a/plugins/org.eclipse.wst.common.infopop/.project b/plugins/org.eclipse.wst.common.infopop/.project
new file mode 100644
index 0000000..d8e0250
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.infopop/.project
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.wst.common.infopop</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<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>
+	</natures>
+</projectDescription>
diff --git a/plugins/org.eclipse.wst.common.infopop/.settings/org.eclipse.core.resources.prefs b/plugins/org.eclipse.wst.common.infopop/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..76d68cc
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.infopop/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,3 @@
+#Mon Apr 17 03:12:42 EDT 2006
+eclipse.preferences.version=1
+encoding/<project>=ISO-8859-1
diff --git a/plugins/org.eclipse.wst.common.infopop/.settings/org.eclipse.pde.prefs b/plugins/org.eclipse.wst.common.infopop/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..f774e3c
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.infopop/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,14 @@
+#Mon Apr 17 03:12:36 EDT 2006
+compilers.incompatible-environment=0
+compilers.p.build=0
+compilers.p.deprecated=1
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=0
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=0
+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/plugins/org.eclipse.wst.common.infopop/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.common.infopop/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..5ab4ff2
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.infopop/META-INF/MANIFEST.MF
@@ -0,0 +1,8 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-SymbolicName: org.eclipse.wst.common.infopop; singleton:=true
+Bundle-Version: 1.0.001.qualifier
+Bundle-Vendor: %Bundle-Vendor.0
+Bundle-Localization: plugin
+Eclipse-LazyStart: true
diff --git a/plugins/org.eclipse.wst.common.infopop/SnippetsContexts.xml b/plugins/org.eclipse.wst.common.infopop/SnippetsContexts.xml
new file mode 100644
index 0000000..b3b0c43
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.infopop/SnippetsContexts.xml
@@ -0,0 +1,107 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?NLS type="org.eclipse.help.contexts"?>
+<!-- /*******************************************************************************
+ * Copyright (c) 2000, 2005 IBM Corporation 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:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/ -->
+
+<contexts>
+<context id="libv1000">
+<description>Use this view to catalog and organize reusable programming objects, such as HTML tagging, JavaScript, and JSP markup, along with custom tags, that can be embedded in existing files.
+</description>
+<topic label="Snippets view" href="../org.eclipse.wst.sse.doc.user/topics/csrcedt001.html"/>
+</context>
+
+<context id="libv1100">
+<description>Supply values in this dialog to define the Snippets view object to be inserted in the current file at the cursor position. Assign a value to the variables being inserted.
+</description>
+<topic label="Inserting and editing items in the active editor" href="../org.eclipse.wst.sse.doc.user/topics/tsrcedt015.html"/>
+<topic label="Snippets view" href="../org.eclipse.wst.sse.doc.user/topics/csrcedt001.html"/>
+</context>
+
+<context id="libv1200">
+<description>In the <b>Name</b> field, type the name of the object as you want it be displayed in the Snippets view.  Optionally, add a description of the object in the <b>Description</b> field.
+
+Select the <b>Hide</b> check box to make this snippet object not visible in the view.
+
+To add a new variable, click the <b>New</b> push button, and type values in the cells of the <b>Variables</b> table. The <b>Name</b> field represents name of the variable that will be inserted when you add it to a document. <b>Default value</b> is the initial value of the named variable. Optionally, add a description of the variable.
+
+Insert the variables that you define into the <b>Template Pattern</b> field using the <b>Insert Variable Placeholder</b> push button.
+</description>
+<topic label="Deleting or hiding snippet items or drawers" href="../org.eclipse.wst.sse.doc.user/topics/tsrcedt016.html"/>
+<topic label="Snippets view" href="../org.eclipse.wst.sse.doc.user/topics/csrcedt001.html"/>
+</context>
+
+<context id="libv1300">
+<description>Type the name of the new category in the <b>Name</b> field and optionally add a description of the category in the <b>Description</b> field.
+
+Select <b>Open drawer at start-up</b> to have the category drawer opened in the Snippets view when the workbench starts up.
+
+You can specify how you want the category drawer displayed in the Snippets view by selecting a radio button for the <b>Show/Hide Drawer</b> field.
+</description>
+<topic label="Snippets view" href="../org.eclipse.wst.sse.doc.user/topics/csrcedt001.html"/>
+<topic label="Deleting or hiding snippet items or drawers" href="../org.eclipse.wst.sse.doc.user/topics/tsrcedt016.html"/>
+</context>
+
+<context id="snip0010">
+<description>Select this option to open the <b>Import</b> dialog, which lets you import snippet categories from the file system.
+</description>
+<topic label="Snippets view" href="../org.eclipse.wst.sse.doc.user/topics/csrcedt001.html"/>
+<topic label="Adding items to snippets drawers" href="../org.eclipse.wst.sse.doc.user/topics/tsrcedt015.html"/>
+</context>
+
+<context id="snip0020">
+<description>Select this option to open the <b>Export</b> dialog, which lets you export snippet categories to the file system.
+</description>
+<topic label="Snippets view" href="../org.eclipse.wst.sse.doc.user/topics/csrcedt001.html"/>
+<topic label="Adding items to snippets drawers" href="../org.eclipse.wst.sse.doc.user/topics/tsrcedt015.html"/>
+</context>
+
+<context id="snip0030">
+<description>Select the content types that should be visible in this drawer for in the Snippets view.
+</description>
+<topic label="Snippets view" href="../org.eclipse.wst.sse.doc.user/topics/csrcedt001.html"/>
+<topic label="Deleting or hiding snippet items or drawers" href="../org.eclipse.wst.sse.doc.user/topics/tsrcedt016.html"/>
+</context>
+
+<context id="snip0040">
+<description>This menu item adds the selected text to the Snippets view as a new item.
+</description>
+<topic label="Snippets view" href="../org.eclipse.wst.sse.doc.user/topics/csrcedt001.html"/>
+<topic label="Adding items to snippets drawers" href="../org.eclipse.wst.sse.doc.user/topics/tsrcedt015.html"/>
+</context>
+
+<context id="snip0050">
+<description>This menu item cuts the selected Snippet item to the clipboard.
+</description>
+<topic label="Snippets view" href="../org.eclipse.wst.sse.doc.user/topics/csrcedt001.html"/>
+<topic label="Editing snippet items" href="../org.eclipse.wst.sse.doc.user/topics/tsrcedt022.html"/>
+</context>
+
+<context id="snip0060">
+<description>This menu item copies the selected Snippet item to the clipboard.
+</description>
+<topic label="Snippets view" href="../org.eclipse.wst.sse.doc.user/topics/csrcedt001.html"/>
+<topic label="Editing snippet items" href="../org.eclipse.wst.sse.doc.user/topics/tsrcedt022.html"/>
+</context>
+
+<context id="snip0070">
+<description>This menu item creates a new Snippets view item containing the current contents of the clipboard.
+</description>
+<topic label="Snippets view" href="../org.eclipse.wst.sse.doc.user/topics/csrcedt001.html"/>
+<topic label="Adding items to snippets drawers" href="../org.eclipse.wst.sse.doc.user/topics/tsrcedt015.html"/>
+</context>
+<context id="snip0080">
+<description>Type a name for the category. The category appears in the Customize Palette dialog box. Once you have created a category, you can add items to the category.
+</description>
+<topic label="Snippets view" href="../org.eclipse.wst.sse.doc.user/topics/csrcedt001.html"/>
+<topic label="Adding items to snippets drawers" href="../org.eclipse.wst.sse.doc.user/topics/tsrcedt015.html"/>
+</context>
+
+</contexts>
diff --git a/plugins/org.eclipse.wst.common.infopop/about.html b/plugins/org.eclipse.wst.common.infopop/about.html
new file mode 100644
index 0000000..4ec5989
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.infopop/about.html
@@ -0,0 +1,34 @@
+<!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">
+
+<H3>About This Content</H3>
+
+<P>May 2, 2006</P>
+
+<H3>License</H3>
+
+<P>The Eclipse Foundation makes available all content in this plug-in 
+("Content"). Unless otherwise indicated below, the Content is provided to you 
+under the terms and conditions of the Eclipse Public License Version 1.0 
+("EPL"). A copy of the EPL is available at
+<A href="http://www.eclipse.org/org/documents/epl-v10.php">http://www.eclipse.org/org/documents/epl-v10.php</A>. 
+For purposes of the EPL, "Program" 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 ("Redistributor") 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/">http://www.eclipse.org/</A>.</P>
+
+</BODY>
+</HTML>
diff --git a/plugins/org.eclipse.wst.common.infopop/build.properties b/plugins/org.eclipse.wst.common.infopop/build.properties
new file mode 100644
index 0000000..c1d3dbf
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.infopop/build.properties
@@ -0,0 +1,5 @@
+bin.includes = plugin.xml,\
+               about.html,\
+               SnippetsContexts.xml,\
+               META-INF/,\
+               plugin.properties
diff --git a/plugins/org.eclipse.wst.common.infopop/plugin.properties b/plugins/org.eclipse.wst.common.infopop/plugin.properties
new file mode 100644
index 0000000..74f0260
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.infopop/plugin.properties
@@ -0,0 +1,3 @@
+# properties file for org.eclipse.wst.common.infopop
+Bundle-Name.0 = Common WST infopops
+Bundle-Vendor.0 = Eclipse.org
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.infopop/plugin.xml b/plugins/org.eclipse.wst.common.infopop/plugin.xml
new file mode 100644
index 0000000..f1e178c
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.infopop/plugin.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<!-- ================================================= -->
+<!-- This is the plugin for declaring the help         -->
+<!-- contributions for using the tool.                 -->
+<!-- ================================================= -->
+
+<plugin>
+
+<extension point="org.eclipse.help.contexts">
+       <contexts file="SnippetsContexts.xml" plugin ="org.eclipse.wst.common.snippets"/>
+</extension>
+
+
+</plugin>
\ No newline at end of file