This commit was manufactured by cvs2svn to create tag 'R3_2_0'.
diff --git a/docs/org.eclipse.wst.validation.doc.isv/META-INF/MANIFEST.MF b/docs/org.eclipse.wst.validation.doc.isv/META-INF/MANIFEST.MF
index 09c6699..f261572 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/META-INF/MANIFEST.MF
+++ b/docs/org.eclipse.wst.validation.doc.isv/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Bundle-Name.0
 Bundle-SymbolicName: org.eclipse.wst.validation.doc.isv; singleton:=true
-Bundle-Version: 1.2.0.qualifier
+Bundle-Version: 1.2.200.qualifier
 Bundle-Vendor: %Bundle-Vendor.0
 Bundle-Localization: plugin
 Require-Bundle: org.eclipse.help.ui;bundle-version="[3.2.0,4.0.0)"
diff --git a/docs/org.eclipse.wst.validation.doc.isv/about.html b/docs/org.eclipse.wst.validation.doc.isv/about.html
new file mode 100644
index 0000000..2199df3
--- /dev/null
+++ b/docs/org.eclipse.wst.validation.doc.isv/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>June, 2008</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.doc.isv/book.css b/docs/org.eclipse.wst.validation.doc.isv/book.css
new file mode 100644
index 0000000..84d8880
--- /dev/null
+++ b/docs/org.eclipse.wst.validation.doc.isv/book.css
@@ -0,0 +1 @@
+@import "../PRODUCT_PLUGIN/book.css";
diff --git a/docs/org.eclipse.wst.validation.doc.isv/build.properties b/docs/org.eclipse.wst.validation.doc.isv/build.properties
index 63a6dfe..1a2e751 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/build.properties
+++ b/docs/org.eclipse.wst.validation.doc.isv/build.properties
@@ -3,4 +3,5 @@
                plugin.properties,\
                reference/,\
                toc.xml,\
-               topics_ExtPoint_Reference.xml
+               topics_ExtPoint_Reference.xml,\
+               about.html
diff --git a/docs/org.eclipse.wst.validation.doc.isv/overview.html b/docs/org.eclipse.wst.validation.doc.isv/overview.html
index ce1394d..e71ef7f 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/overview.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/overview.html
@@ -5,7 +5,7 @@
 <body>
 <p>A framework for calling validators that are build based.</p>
 <h2>Approach</h2>
-<p>In WTP 3.4 a new validation framework has been added. This was developed at 
+<p>In WTP 3.0 a new validation framework has been added. This was developed at 
 the request of validator owners and end users. To ease the transition to this 
 new framework, that approach that has been taken is to support both the old and 
 the new frameworks for a while. This means that the old validators work exactly 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/plugin.properties b/docs/org.eclipse.wst.validation.doc.isv/plugin.properties
index 353f05e..94b985b 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/plugin.properties
+++ b/docs/org.eclipse.wst.validation.doc.isv/plugin.properties
@@ -10,5 +10,5 @@
 ###############################################################################
 
 Bundle-Name.0 = Validation Framework - Developer Guide
-Bundle-Vendor.0 = Eclipse.org
+Bundle-Vendor.0 = Eclipse Web Tools Platform
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/allclasses-frame.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/allclasses-frame.html
index ebc6a49..2804d46 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/allclasses-frame.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/allclasses-frame.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 All Classes
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
 
@@ -33,6 +33,8 @@
 <BR>
 <A HREF="org/eclipse/wst/validation/internal/provisional/core/IMetaModelContext.html" title="interface in org.eclipse.wst.validation.internal.provisional.core" target="classFrame"><I>IMetaModelContext</I></A>
 <BR>
+<A HREF="org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation" target="classFrame"><I>IMutableValidator</I></A>
+<BR>
 <A HREF="org/eclipse/wst/validation/IPerformanceMonitor.html" title="interface in org.eclipse.wst.validation" target="classFrame"><I>IPerformanceMonitor</I></A>
 <BR>
 <A HREF="org/eclipse/wst/validation/IPerformanceMonitor.CollectionLevel.html" title="enum in org.eclipse.wst.validation" target="classFrame">IPerformanceMonitor.CollectionLevel</A>
@@ -55,10 +57,16 @@
 <BR>
 <A HREF="org/eclipse/wst/validation/MessageSeveritySetting.Severity.html" title="enum in org.eclipse.wst.validation" target="classFrame">MessageSeveritySetting.Severity</A>
 <BR>
+<A HREF="org/eclipse/wst/validation/MutableProjectSettings.html" title="class in org.eclipse.wst.validation" target="classFrame">MutableProjectSettings</A>
+<BR>
+<A HREF="org/eclipse/wst/validation/MutableWorkspaceSettings.html" title="class in org.eclipse.wst.validation" target="classFrame">MutableWorkspaceSettings</A>
+<BR>
 <A HREF="org/eclipse/wst/validation/PerformanceCounters.html" title="class in org.eclipse.wst.validation" target="classFrame">PerformanceCounters</A>
 <BR>
 <A HREF="org/eclipse/wst/validation/ReporterHelper.html" title="class in org.eclipse.wst.validation" target="classFrame">ReporterHelper</A>
 <BR>
+<A HREF="org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation" target="classFrame">ValidationEvent</A>
+<BR>
 <A HREF="org/eclipse/wst/validation/ValidationFramework.html" title="class in org.eclipse.wst.validation" target="classFrame">ValidationFramework</A>
 <BR>
 <A HREF="org/eclipse/wst/validation/ValidationFramework.ResourceAdder.html" title="class in org.eclipse.wst.validation" target="classFrame">ValidationFramework.ResourceAdder</A>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/allclasses-noframe.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/allclasses-noframe.html
index a8650c8..85aa704 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/allclasses-noframe.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/allclasses-noframe.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 All Classes
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
 
@@ -33,6 +33,8 @@
 <BR>
 <A HREF="org/eclipse/wst/validation/internal/provisional/core/IMetaModelContext.html" title="interface in org.eclipse.wst.validation.internal.provisional.core"><I>IMetaModelContext</I></A>
 <BR>
+<A HREF="org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation"><I>IMutableValidator</I></A>
+<BR>
 <A HREF="org/eclipse/wst/validation/IPerformanceMonitor.html" title="interface in org.eclipse.wst.validation"><I>IPerformanceMonitor</I></A>
 <BR>
 <A HREF="org/eclipse/wst/validation/IPerformanceMonitor.CollectionLevel.html" title="enum in org.eclipse.wst.validation">IPerformanceMonitor.CollectionLevel</A>
@@ -55,10 +57,16 @@
 <BR>
 <A HREF="org/eclipse/wst/validation/MessageSeveritySetting.Severity.html" title="enum in org.eclipse.wst.validation">MessageSeveritySetting.Severity</A>
 <BR>
+<A HREF="org/eclipse/wst/validation/MutableProjectSettings.html" title="class in org.eclipse.wst.validation">MutableProjectSettings</A>
+<BR>
+<A HREF="org/eclipse/wst/validation/MutableWorkspaceSettings.html" title="class in org.eclipse.wst.validation">MutableWorkspaceSettings</A>
+<BR>
 <A HREF="org/eclipse/wst/validation/PerformanceCounters.html" title="class in org.eclipse.wst.validation">PerformanceCounters</A>
 <BR>
 <A HREF="org/eclipse/wst/validation/ReporterHelper.html" title="class in org.eclipse.wst.validation">ReporterHelper</A>
 <BR>
+<A HREF="org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A>
+<BR>
 <A HREF="org/eclipse/wst/validation/ValidationFramework.html" title="class in org.eclipse.wst.validation">ValidationFramework</A>
 <BR>
 <A HREF="org/eclipse/wst/validation/ValidationFramework.ResourceAdder.html" title="class in org.eclipse.wst.validation">ValidationFramework.ResourceAdder</A>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/constant-values.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/constant-values.html
index e70dc8e..b2482ce 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/constant-values.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/constant-values.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Constant Field Values
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/deprecated-list.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/deprecated-list.html
index 297295b..1557af7 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/deprecated-list.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/deprecated-list.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Deprecated List
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
 
@@ -85,6 +85,7 @@
 <HR SIZE="4" NOSHADE>
 <B>Contents</B><UL>
 <LI><A HREF="#exception">Deprecated Exceptions</A>
+<LI><A HREF="#field">Deprecated Fields</A>
 <LI><A HREF="#method">Deprecated Methods</A>
 </UL>
 
@@ -103,6 +104,20 @@
 </TABLE>
 &nbsp;
 <P>
+<A NAME="field"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Deprecated Fields</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><A HREF="org/eclipse/wst/validation/ValidationState.html#TriggerResource">org.eclipse.wst.validation.ValidationState.TriggerResource</A>
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<I>This approach is not thread safe, the longer form of the AbstractValidator validate method should be used instead.</I>&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<P>
 <A NAME="method"><!-- --></A>
 <TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
 <TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/help-doc.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/help-doc.html
index c9524b5..8c436e4 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/help-doc.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/help-doc.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 API Help
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/index.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/index.html
index 546f443..3f37e39 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/index.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/index.html
@@ -2,7 +2,7 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc on Tue May 20 09:50:55 EDT 2008-->
+<!-- Generated by javadoc on Tue Jan 27 04:28:33 EST 2009-->
 <TITLE>
 Generated Documentation (Untitled)
 </TITLE>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/AbstractValidator.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/AbstractValidator.html
index d033ac1..ffa763f 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/AbstractValidator.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/AbstractValidator.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:54 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:32 EST 2009 -->
 <TITLE>
 AbstractValidator
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
@@ -159,7 +159,16 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE>abstract &nbsp;<A HREF="../../../../org/eclipse/wst/validation/ValidationResult.html" title="class in org.eclipse.wst.validation">ValidationResult</A></CODE></FONT></TD>
+<CODE>&nbsp;boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/AbstractValidator.html#shouldClearMarkers(org.eclipse.wst.validation.ValidationEvent)">shouldClearMarkers</A></B>(<A HREF="../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A>&nbsp;event)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Should the validation framework first clear the markers that this
+ validator has placed on this resource?</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../org/eclipse/wst/validation/ValidationResult.html" title="class in org.eclipse.wst.validation">ValidationResult</A></CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/AbstractValidator.html#validate(IResource, int, org.eclipse.wst.validation.ValidationState, IProgressMonitor)">validate</A></B>(IResource&nbsp;resource,
          int&nbsp;kind,
          <A HREF="../../../../org/eclipse/wst/validation/ValidationState.html" title="class in org.eclipse.wst.validation">ValidationState</A>&nbsp;state,
@@ -170,6 +179,16 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../org/eclipse/wst/validation/ValidationResult.html" title="class in org.eclipse.wst.validation">ValidationResult</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/AbstractValidator.html#validate(org.eclipse.wst.validation.ValidationEvent, org.eclipse.wst.validation.ValidationState, IProgressMonitor)">validate</A></B>(<A HREF="../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A>&nbsp;event,
+         <A HREF="../../../../org/eclipse/wst/validation/ValidationState.html" title="class in org.eclipse.wst.validation">ValidationState</A>&nbsp;state,
+         IProgressMonitor&nbsp;monitor)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Validate the resource.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>&nbsp;void</CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/AbstractValidator.html#validationFinishing(IProject, org.eclipse.wst.validation.ValidationState, IProgressMonitor)">validationFinishing</A></B>(IProject&nbsp;project,
                     <A HREF="../../../../org/eclipse/wst/validation/ValidationState.html" title="class in org.eclipse.wst.validation">ValidationState</A>&nbsp;state,
@@ -231,14 +250,16 @@
 <A NAME="validate(IResource, int, org.eclipse.wst.validation.ValidationState, IProgressMonitor)"><!-- --></A><H3>
 validate</H3>
 <PRE>
-public abstract <A HREF="../../../../org/eclipse/wst/validation/ValidationResult.html" title="class in org.eclipse.wst.validation">ValidationResult</A> <B>validate</B>(IResource&nbsp;resource,
-                                          int&nbsp;kind,
-                                          <A HREF="../../../../org/eclipse/wst/validation/ValidationState.html" title="class in org.eclipse.wst.validation">ValidationState</A>&nbsp;state,
-                                          IProgressMonitor&nbsp;monitor)</PRE>
+public <A HREF="../../../../org/eclipse/wst/validation/ValidationResult.html" title="class in org.eclipse.wst.validation">ValidationResult</A> <B>validate</B>(IResource&nbsp;resource,
+                                 int&nbsp;kind,
+                                 <A HREF="../../../../org/eclipse/wst/validation/ValidationState.html" title="class in org.eclipse.wst.validation">ValidationState</A>&nbsp;state,
+                                 IProgressMonitor&nbsp;monitor)</PRE>
 <DL>
 <DD>Validate the resource. The validator is called from a WorkspaceJob, so
- the validator itself does not need to establish it's own
- IWorkspaceRunnable.
+ the validator itself does not need to establish it's own IWorkspaceRunnable.
+ <p>
+ If you override this method then you should not override the other validate method.
+ </p>
 <P>
 <DD><DL>
 <DT><B>Parameters:</B><DD><CODE>resource</CODE> - The resource to be validated.<DD><CODE>kind</CODE> - The way the resource changed. It uses the same values as the kind
@@ -254,6 +275,37 @@
 </DL>
 <HR>
 
+<A NAME="validate(org.eclipse.wst.validation.ValidationEvent, org.eclipse.wst.validation.ValidationState, IProgressMonitor)"><!-- --></A><H3>
+validate</H3>
+<PRE>
+public <A HREF="../../../../org/eclipse/wst/validation/ValidationResult.html" title="class in org.eclipse.wst.validation">ValidationResult</A> <B>validate</B>(<A HREF="../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A>&nbsp;event,
+                                 <A HREF="../../../../org/eclipse/wst/validation/ValidationState.html" title="class in org.eclipse.wst.validation">ValidationState</A>&nbsp;state,
+                                 IProgressMonitor&nbsp;monitor)</PRE>
+<DL>
+<DD>Validate the resource. The validator is called from a WorkspaceJob, so
+ the validator itself does not need to establish it's own
+ IWorkspaceRunnable.
+ <p>
+ If you override this method then you should not override the other
+ validate method.
+ </p>
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>event</CODE> - An object that describes the resource to be validated and why
+            it should be validated.<DD><CODE>state</CODE> - A way to pass arbitrary, validator specific, data from one
+            invocation of a validator to the next, during the validation
+            phase. At the end of the validation phase, this object will be
+            cleared, thereby allowing any of this state information to be
+            garbaged collected.<DD><CODE>monitor</CODE> - A monitor that you can use to report your progress. To be a
+            well behaved validator you need to check the isCancelled()
+            method at appropriate times.
+<DT><B>Returns:</B><DD>the result of the validation. Null should never be returned. If
+         null is returned then the other validate method will be called as
+         well.</DL>
+</DD>
+</DL>
+<HR>
+
 <A NAME="clean(IProject, org.eclipse.wst.validation.ValidationState, IProgressMonitor)"><!-- --></A><H3>
 clean</H3>
 <PRE>
@@ -319,6 +371,26 @@
 </DL>
 <HR>
 
+<A NAME="shouldClearMarkers(org.eclipse.wst.validation.ValidationEvent)"><!-- --></A><H3>
+shouldClearMarkers</H3>
+<PRE>
+public boolean <B>shouldClearMarkers</B>(<A HREF="../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A>&nbsp;event)</PRE>
+<DL>
+<DD>Should the validation framework first clear the markers that this
+ validator has placed on this resource? This method can be overridden by
+ validator implementors to provide a validator specific behavior.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>event</CODE> - The validation event that triggered the validation.
+<DT><B>Returns:</B><DD>true if the validation framework should first clear all the
+         markers that this validator produced. This is the default
+         behavior. Return false to leave the markers unchanged. It then
+         becomes the responsibility of the validator to manage it's own
+         markers for this resource, for this validation event.</DL>
+</DD>
+</DL>
+<HR>
+
 <A NAME="getParent()"><!-- --></A><H3>
 getParent</H3>
 <PRE>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/DependentResource.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/DependentResource.html
index 892a24b..fd25a4e 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/DependentResource.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/DependentResource.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:54 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:32 EST 2009 -->
 <TITLE>
 DependentResource
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Friend.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Friend.html
index 845921b..7ae6360 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Friend.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Friend.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:54 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:32 EST 2009 -->
 <TITLE>
 Friend
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
@@ -155,6 +155,15 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Friend.html#setMigrated(org.eclipse.wst.validation.Validator, boolean)">setMigrated</A></B>(<A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>&nbsp;validator,
+            boolean&nbsp;migrated)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>static&nbsp;boolean</CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Friend.html#shouldValidate(org.eclipse.wst.validation.Validator, IResource, boolean, boolean, org.eclipse.wst.validation.internal.ContentTypeWrapper)">shouldValidate</A></B>(<A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>&nbsp;validator,
                IResource&nbsp;resource,
@@ -269,6 +278,18 @@
 </DL>
 </DD>
 </DL>
+<HR>
+
+<A NAME="setMigrated(org.eclipse.wst.validation.Validator, boolean)"><!-- --></A><H3>
+setMigrated</H3>
+<PRE>
+public static void <B>setMigrated</B>(<A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>&nbsp;validator,
+                               boolean&nbsp;migrated)</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
 <!-- ========= END OF CLASS DATA ========= -->
 <HR>
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/IDependencyIndex.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/IDependencyIndex.html
index d8cfab4..1178af8 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/IDependencyIndex.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/IDependencyIndex.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:54 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:32 EST 2009 -->
 <TITLE>
 IDependencyIndex
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
@@ -55,7 +55,7 @@
 <TR>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
 &nbsp;<A HREF="../../../../org/eclipse/wst/validation/Friend.html" title="class in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
-&nbsp;<A HREF="../../../../org/eclipse/wst/validation/IPerformanceMonitor.html" title="interface in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
   <A HREF="../../../../index.html?org/eclipse/wst/validation/IDependencyIndex.html" target="_top"><B>FRAMES</B></A>  &nbsp;
 &nbsp;<A HREF="IDependencyIndex.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
@@ -317,7 +317,7 @@
 <TR>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
 &nbsp;<A HREF="../../../../org/eclipse/wst/validation/Friend.html" title="class in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
-&nbsp;<A HREF="../../../../org/eclipse/wst/validation/IPerformanceMonitor.html" title="interface in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
   <A HREF="../../../../index.html?org/eclipse/wst/validation/IDependencyIndex.html" target="_top"><B>FRAMES</B></A>  &nbsp;
 &nbsp;<A HREF="IDependencyIndex.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/IMutableValidator.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/IMutableValidator.html
new file mode 100644
index 0000000..59b4895
--- /dev/null
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/IMutableValidator.html
@@ -0,0 +1,333 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:32 EST 2009 -->
+<TITLE>
+IMutableValidator
+</TITLE>
+
+<META NAME="date" CONTENT="2009-01-27">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="IMutableValidator";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/IMutableValidator.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../serialized-form.html"><FONT CLASS="NavBarFont1"><B>Serialized</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/IDependencyIndex.html" title="interface in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/IPerformanceMonitor.html" title="interface in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/eclipse/wst/validation/IMutableValidator.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="IMutableValidator.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL:&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+org.eclipse.wst.validation</FONT>
+<BR>
+Interface IMutableValidator</H2>
+<HR>
+<DL>
+<DT><PRE>public interface <B>IMutableValidator</B></DL>
+</PRE>
+
+<P>
+A validator that has fields that can be updated.
+ <p>
+ The following procedure is used to change a Validator's settings.
+ <ol>
+ <li>An IMutableValidator is retrieved.</li>
+ <li>The IMutableValidator is changed.</li>
+ <li>The IMutableValidator is "activated".</li>
+ </ol>
+ </p>
+ <p>The methods <CODE>ValidationFramework#getProjectSettings(org.eclipse.core.resources.IProject)</CODE> and 
+ <A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html#getWorkspaceSettings()"><CODE>ValidationFramework.getWorkspaceSettings()</CODE></A> can be used to retrieve IMutableValidator's.
+ <p>
+ <b>Provisional API:</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>
+<P>
+
+<P>
+<HR>
+
+<P>
+
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/IMutableValidator.html#getId()">getId</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Answer the validator's id.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;java.lang.String</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/IMutableValidator.html#getName()">getName</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Answer the validator's name.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/IMutableValidator.html#isBuildValidation()">isBuildValidation</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Answer if the validator is enabled for build based validation.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/IMutableValidator.html#isManualValidation()">isManualValidation</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Answer if the validator is enabled for manual based validation.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/IMutableValidator.html#setBuildValidation(boolean)">setBuildValidation</A></B>(boolean&nbsp;build)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set whether the validator should be enabled for build based validation.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/IMutableValidator.html#setManualValidation(boolean)">setManualValidation</A></B>(boolean&nbsp;manual)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set whether the validator should be enabled for manual based validation.</TD>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="getId()"><!-- --></A><H3>
+getId</H3>
+<PRE>
+java.lang.String <B>getId</B>()</PRE>
+<DL>
+<DD>Answer the validator's id.
+<P>
+<DD><DL>
+
+<DT><B>Returns:</B><DD></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getName()"><!-- --></A><H3>
+getName</H3>
+<PRE>
+java.lang.String <B>getName</B>()</PRE>
+<DL>
+<DD>Answer the validator's name.
+<P>
+<DD><DL>
+
+<DT><B>Returns:</B><DD></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="isBuildValidation()"><!-- --></A><H3>
+isBuildValidation</H3>
+<PRE>
+boolean <B>isBuildValidation</B>()</PRE>
+<DL>
+<DD>Answer if the validator is enabled for build based validation.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="isManualValidation()"><!-- --></A><H3>
+isManualValidation</H3>
+<PRE>
+boolean <B>isManualValidation</B>()</PRE>
+<DL>
+<DD>Answer if the validator is enabled for manual based validation.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="setBuildValidation(boolean)"><!-- --></A><H3>
+setBuildValidation</H3>
+<PRE>
+void <B>setBuildValidation</B>(boolean&nbsp;build)</PRE>
+<DL>
+<DD>Set whether the validator should be enabled for build based validation.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="setManualValidation(boolean)"><!-- --></A><H3>
+setManualValidation</H3>
+<PRE>
+void <B>setManualValidation</B>(boolean&nbsp;manual)</PRE>
+<DL>
+<DD>Set whether the validator should be enabled for manual based validation.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/IMutableValidator.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../serialized-form.html"><FONT CLASS="NavBarFont1"><B>Serialized</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/IDependencyIndex.html" title="interface in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/IPerformanceMonitor.html" title="interface in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/eclipse/wst/validation/IMutableValidator.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="IMutableValidator.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL:&nbsp;FIELD&nbsp;|&nbsp;CONSTR&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/IPerformanceMonitor.CollectionLevel.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/IPerformanceMonitor.CollectionLevel.html
index f7728f3..a149580 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/IPerformanceMonitor.CollectionLevel.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/IPerformanceMonitor.CollectionLevel.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:54 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:32 EST 2009 -->
 <TITLE>
 IPerformanceMonitor.CollectionLevel
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/IPerformanceMonitor.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/IPerformanceMonitor.html
index dc226ad..59dd553 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/IPerformanceMonitor.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/IPerformanceMonitor.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:54 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:32 EST 2009 -->
 <TITLE>
 IPerformanceMonitor
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
@@ -54,7 +54,7 @@
 
 <TR>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
-&nbsp;<A HREF="../../../../org/eclipse/wst/validation/IDependencyIndex.html" title="interface in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
 &nbsp;<A HREF="../../../../org/eclipse/wst/validation/IPerformanceMonitor.CollectionLevel.html" title="enum in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
   <A HREF="../../../../index.html?org/eclipse/wst/validation/IPerformanceMonitor.html" target="_top"><B>FRAMES</B></A>  &nbsp;
@@ -327,7 +327,7 @@
 
 <TR>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
-&nbsp;<A HREF="../../../../org/eclipse/wst/validation/IDependencyIndex.html" title="interface in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
 &nbsp;<A HREF="../../../../org/eclipse/wst/validation/IPerformanceMonitor.CollectionLevel.html" title="enum in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
   <A HREF="../../../../index.html?org/eclipse/wst/validation/IPerformanceMonitor.html" target="_top"><B>FRAMES</B></A>  &nbsp;
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/IValidatorGroupListener.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/IValidatorGroupListener.html
index 51c981f..b871d44 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/IValidatorGroupListener.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/IValidatorGroupListener.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:54 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:32 EST 2009 -->
 <TITLE>
 IValidatorGroupListener
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/MessageSeveritySetting.Severity.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/MessageSeveritySetting.Severity.html
index 12a4401..102cdf4 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/MessageSeveritySetting.Severity.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/MessageSeveritySetting.Severity.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:54 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:32 EST 2009 -->
 <TITLE>
 MessageSeveritySetting.Severity
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
@@ -55,7 +55,7 @@
 <TR>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
 &nbsp;<A HREF="../../../../org/eclipse/wst/validation/MessageSeveritySetting.html" title="class in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
-&nbsp;<A HREF="../../../../org/eclipse/wst/validation/PerformanceCounters.html" title="class in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/MutableProjectSettings.html" title="class in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
   <A HREF="../../../../index.html?org/eclipse/wst/validation/MessageSeveritySetting.Severity.html" target="_top"><B>FRAMES</B></A>  &nbsp;
 &nbsp;<A HREF="MessageSeveritySetting.Severity.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
@@ -348,7 +348,7 @@
 <TR>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
 &nbsp;<A HREF="../../../../org/eclipse/wst/validation/MessageSeveritySetting.html" title="class in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
-&nbsp;<A HREF="../../../../org/eclipse/wst/validation/PerformanceCounters.html" title="class in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/MutableProjectSettings.html" title="class in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
   <A HREF="../../../../index.html?org/eclipse/wst/validation/MessageSeveritySetting.Severity.html" target="_top"><B>FRAMES</B></A>  &nbsp;
 &nbsp;<A HREF="MessageSeveritySetting.Severity.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/MessageSeveritySetting.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/MessageSeveritySetting.html
index 3324bfd..8abee0c 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/MessageSeveritySetting.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/MessageSeveritySetting.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:54 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:32 EST 2009 -->
 <TITLE>
 MessageSeveritySetting
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/MutableProjectSettings.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/MutableProjectSettings.html
new file mode 100644
index 0000000..bafc744
--- /dev/null
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/MutableProjectSettings.html
@@ -0,0 +1,382 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
+<TITLE>
+MutableProjectSettings
+</TITLE>
+
+<META NAME="date" CONTENT="2009-01-27">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="MutableProjectSettings";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/MutableProjectSettings.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../serialized-form.html"><FONT CLASS="NavBarFont1"><B>Serialized</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/MessageSeveritySetting.Severity.html" title="enum in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html" title="class in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/eclipse/wst/validation/MutableProjectSettings.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="MutableProjectSettings.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL:&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+org.eclipse.wst.validation</FONT>
+<BR>
+Class MutableProjectSettings</H2>
+<PRE>
+java.lang.Object
+  <IMG SRC="../../../../resources/inherit.gif" ALT="extended by "><B>org.eclipse.wst.validation.MutableProjectSettings</B>
+</PRE>
+<HR>
+<DL>
+<DT><PRE>public final class <B>MutableProjectSettings</B><DT>extends java.lang.Object</DL>
+</PRE>
+
+<P>
+This class holds the overall project validation settings.
+ <p>
+ The following procedure is used to change a project's Validation settings.
+ <ol>
+ <li>The MutableProjectSettings are retrieved.</li>
+ <li>The MutableProjectSettings are changed.</li>
+ <li>The MutableProjectSettings are "applied".</li>
+ </ol>
+ </p>
+ <p>In order for a project's validation setting to be effective, both 
+ <A HREF="../../../../org/eclipse/wst/validation/MutableProjectSettings.html#getOverride()"><CODE>getOverride()</CODE></A> and <A HREF="../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html#getOverride()"><CODE>MutableWorkspaceSettings.getOverride()</CODE></A>
+ must be true.
+ </p>
+ <p>
+ These settings can be retrieved with <A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html#getProjectSettings(IProject)"><CODE>ValidationFramework.getProjectSettings(IProject)</CODE></A>.
+ </p>
+ <p>
+ <b>Provisional API:</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>
+<P>
+
+<P>
+<HR>
+
+<P>
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/MutableProjectSettings.html#MutableProjectSettings(IProject, org.eclipse.wst.validation.IMutableValidator[])">MutableProjectSettings</A></B>(IProject&nbsp;project,
+                       <A HREF="../../../../org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation">IMutableValidator</A>[]&nbsp;validators)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/MutableProjectSettings.html#getOverride()">getOverride</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Can this project override the workspace level validation settings?</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;IProject</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/MutableProjectSettings.html#getProject()">getProject</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Answer the project that these settings are for.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/MutableProjectSettings.html#getSuspend()">getSuspend</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Is validation suspended for this project?</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation">IMutableValidator</A>[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/MutableProjectSettings.html#getValidators()">getValidators</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/MutableProjectSettings.html#setOverride(boolean)">setOverride</A></B>(boolean&nbsp;override)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Change whether this project can override workspace level validation settings.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/MutableProjectSettings.html#setSuspend(boolean)">setSuspend</A></B>(boolean&nbsp;suspend)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Change whether this project is suspending it's validation.</TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.Object</B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Constructor Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="MutableProjectSettings(IProject, org.eclipse.wst.validation.IMutableValidator[])"><!-- --></A><H3>
+MutableProjectSettings</H3>
+<PRE>
+public <B>MutableProjectSettings</B>(IProject&nbsp;project,
+                              <A HREF="../../../../org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation">IMutableValidator</A>[]&nbsp;validators)</PRE>
+<DL>
+</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="getValidators()"><!-- --></A><H3>
+getValidators</H3>
+<PRE>
+public <A HREF="../../../../org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation">IMutableValidator</A>[] <B>getValidators</B>()</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getOverride()"><!-- --></A><H3>
+getOverride</H3>
+<PRE>
+public boolean <B>getOverride</B>()</PRE>
+<DL>
+<DD>Can this project override the workspace level validation settings?
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="setOverride(boolean)"><!-- --></A><H3>
+setOverride</H3>
+<PRE>
+public void <B>setOverride</B>(boolean&nbsp;override)</PRE>
+<DL>
+<DD>Change whether this project can override workspace level validation settings.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>override</CODE> - Set to true if the project is allowed to override workspace level validation settings.</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getSuspend()"><!-- --></A><H3>
+getSuspend</H3>
+<PRE>
+public boolean <B>getSuspend</B>()</PRE>
+<DL>
+<DD>Is validation suspended for this project?
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="setSuspend(boolean)"><!-- --></A><H3>
+setSuspend</H3>
+<PRE>
+public void <B>setSuspend</B>(boolean&nbsp;suspend)</PRE>
+<DL>
+<DD>Change whether this project is suspending it's validation.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>suspend</CODE> - Set to true, to suspend validation for this project.</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getProject()"><!-- --></A><H3>
+getProject</H3>
+<PRE>
+public IProject <B>getProject</B>()</PRE>
+<DL>
+<DD>Answer the project that these settings are for.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/MutableProjectSettings.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../serialized-form.html"><FONT CLASS="NavBarFont1"><B>Serialized</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/MessageSeveritySetting.Severity.html" title="enum in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html" title="class in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/eclipse/wst/validation/MutableProjectSettings.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="MutableProjectSettings.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL:&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/MutableWorkspaceSettings.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/MutableWorkspaceSettings.html
new file mode 100644
index 0000000..8ba12c1
--- /dev/null
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/MutableWorkspaceSettings.html
@@ -0,0 +1,414 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
+<TITLE>
+MutableWorkspaceSettings
+</TITLE>
+
+<META NAME="date" CONTENT="2009-01-27">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="MutableWorkspaceSettings";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/MutableWorkspaceSettings.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../serialized-form.html"><FONT CLASS="NavBarFont1"><B>Serialized</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/MutableProjectSettings.html" title="class in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/PerformanceCounters.html" title="class in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/eclipse/wst/validation/MutableWorkspaceSettings.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="MutableWorkspaceSettings.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL:&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+org.eclipse.wst.validation</FONT>
+<BR>
+Class MutableWorkspaceSettings</H2>
+<PRE>
+java.lang.Object
+  <IMG SRC="../../../../resources/inherit.gif" ALT="extended by "><B>org.eclipse.wst.validation.MutableWorkspaceSettings</B>
+</PRE>
+<HR>
+<DL>
+<DT><PRE>public final class <B>MutableWorkspaceSettings</B><DT>extends java.lang.Object</DL>
+</PRE>
+
+<P>
+This class holds the overall workspace validation settings.
+ <p>
+ The following procedure is used to change a project's Validation settings.
+ <ol>
+ <li>The MutableWorkspaceSettings are retrieved.</li>
+ <li>The MutableWorkspaceSettings are changed.</li>
+ <li>The MutableWorkspaceSettings are "applied".</li>
+ </ol>
+ </p>
+ <p>
+ These settings can be retrieved with <A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html#getWorkspaceSettings()"><CODE>ValidationFramework.getWorkspaceSettings()</CODE></A>.
+ </p>
+ <p>
+ <b>Provisional API:</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>
+<P>
+
+<P>
+<HR>
+
+<P>
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html#MutableWorkspaceSettings(org.eclipse.wst.validation.IMutableValidator[], org.eclipse.wst.validation.internal.model.GlobalPreferencesValues)">MutableWorkspaceSettings</A></B>(<A HREF="../../../../org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation">IMutableValidator</A>[]&nbsp;validators,
+                         org.eclipse.wst.validation.internal.model.GlobalPreferencesValues&nbsp;values)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html#getAutoSave()">getAutoSave</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;org.eclipse.wst.validation.internal.model.GlobalPreferencesValues</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html#getGlobalPreferencesValues()">getGlobalPreferencesValues</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html#getOverride()">getOverride</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Can this project override the workspace level validation settings?</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html#getSuspend()">getSuspend</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Is validation suspended for this project?</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation">IMutableValidator</A>[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html#getValidators()">getValidators</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html#setAutoSave(boolean)">setAutoSave</A></B>(boolean&nbsp;autoSave)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html#setOverride(boolean)">setOverride</A></B>(boolean&nbsp;override)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Change whether this project can override workspace level validation settings.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html#setSuspend(boolean)">setSuspend</A></B>(boolean&nbsp;suspend)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Change whether this project is suspending it's validation.</TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.Object</B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Constructor Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="MutableWorkspaceSettings(org.eclipse.wst.validation.IMutableValidator[], org.eclipse.wst.validation.internal.model.GlobalPreferencesValues)"><!-- --></A><H3>
+MutableWorkspaceSettings</H3>
+<PRE>
+public <B>MutableWorkspaceSettings</B>(<A HREF="../../../../org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation">IMutableValidator</A>[]&nbsp;validators,
+                                org.eclipse.wst.validation.internal.model.GlobalPreferencesValues&nbsp;values)</PRE>
+<DL>
+</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="getValidators()"><!-- --></A><H3>
+getValidators</H3>
+<PRE>
+public <A HREF="../../../../org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation">IMutableValidator</A>[] <B>getValidators</B>()</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getGlobalPreferencesValues()"><!-- --></A><H3>
+getGlobalPreferencesValues</H3>
+<PRE>
+public org.eclipse.wst.validation.internal.model.GlobalPreferencesValues <B>getGlobalPreferencesValues</B>()</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getAutoSave()"><!-- --></A><H3>
+getAutoSave</H3>
+<PRE>
+public boolean <B>getAutoSave</B>()</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="setAutoSave(boolean)"><!-- --></A><H3>
+setAutoSave</H3>
+<PRE>
+public void <B>setAutoSave</B>(boolean&nbsp;autoSave)</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getOverride()"><!-- --></A><H3>
+getOverride</H3>
+<PRE>
+public boolean <B>getOverride</B>()</PRE>
+<DL>
+<DD>Can this project override the workspace level validation settings?
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="setOverride(boolean)"><!-- --></A><H3>
+setOverride</H3>
+<PRE>
+public void <B>setOverride</B>(boolean&nbsp;override)</PRE>
+<DL>
+<DD>Change whether this project can override workspace level validation settings.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>override</CODE> - Set to true if the project is allowed to override workspace level validation settings.</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getSuspend()"><!-- --></A><H3>
+getSuspend</H3>
+<PRE>
+public boolean <B>getSuspend</B>()</PRE>
+<DL>
+<DD>Is validation suspended for this project?
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="setSuspend(boolean)"><!-- --></A><H3>
+setSuspend</H3>
+<PRE>
+public void <B>setSuspend</B>(boolean&nbsp;suspend)</PRE>
+<DL>
+<DD>Change whether this project is suspending it's validation.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>suspend</CODE> - Set to true, to suspend validation for this project.</DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/MutableWorkspaceSettings.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../serialized-form.html"><FONT CLASS="NavBarFont1"><B>Serialized</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/MutableProjectSettings.html" title="class in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/PerformanceCounters.html" title="class in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/eclipse/wst/validation/MutableWorkspaceSettings.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="MutableWorkspaceSettings.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL:&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/PerformanceCounters.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/PerformanceCounters.html
index 525b9dd..7f8fd75 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/PerformanceCounters.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/PerformanceCounters.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:54 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 PerformanceCounters
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
@@ -54,7 +54,7 @@
 
 <TR>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
-&nbsp;<A HREF="../../../../org/eclipse/wst/validation/MessageSeveritySetting.Severity.html" title="enum in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html" title="class in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
 &nbsp;<A HREF="../../../../org/eclipse/wst/validation/ReporterHelper.html" title="class in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
   <A HREF="../../../../index.html?org/eclipse/wst/validation/PerformanceCounters.html" target="_top"><B>FRAMES</B></A>  &nbsp;
@@ -399,7 +399,7 @@
 
 <TR>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
-&nbsp;<A HREF="../../../../org/eclipse/wst/validation/MessageSeveritySetting.Severity.html" title="enum in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html" title="class in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
 &nbsp;<A HREF="../../../../org/eclipse/wst/validation/ReporterHelper.html" title="class in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
   <A HREF="../../../../index.html?org/eclipse/wst/validation/PerformanceCounters.html" target="_top"><B>FRAMES</B></A>  &nbsp;
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ReporterHelper.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ReporterHelper.html
index 8e37927..e8c8da7 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ReporterHelper.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ReporterHelper.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:54 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 ReporterHelper
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
@@ -55,7 +55,7 @@
 <TR>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
 &nbsp;<A HREF="../../../../org/eclipse/wst/validation/PerformanceCounters.html" title="class in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
-&nbsp;<A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html" title="class in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
   <A HREF="../../../../index.html?org/eclipse/wst/validation/ReporterHelper.html" target="_top"><B>FRAMES</B></A>  &nbsp;
 &nbsp;<A HREF="ReporterHelper.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
@@ -470,7 +470,7 @@
 <TR>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
 &nbsp;<A HREF="../../../../org/eclipse/wst/validation/PerformanceCounters.html" title="class in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
-&nbsp;<A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html" title="class in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
   <A HREF="../../../../index.html?org/eclipse/wst/validation/ReporterHelper.html" target="_top"><B>FRAMES</B></A>  &nbsp;
 &nbsp;<A HREF="ReporterHelper.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidationEvent.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidationEvent.html
new file mode 100644
index 0000000..4184f69
--- /dev/null
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidationEvent.html
@@ -0,0 +1,317 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
+<TITLE>
+ValidationEvent
+</TITLE>
+
+<META NAME="date" CONTENT="2009-01-27">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="ValidationEvent";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/ValidationEvent.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../serialized-form.html"><FONT CLASS="NavBarFont1"><B>Serialized</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/ReporterHelper.html" title="class in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html" title="class in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/eclipse/wst/validation/ValidationEvent.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="ValidationEvent.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL:&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<!-- ======== START OF CLASS DATA ======== -->
+<H2>
+<FONT SIZE="-1">
+org.eclipse.wst.validation</FONT>
+<BR>
+Class ValidationEvent</H2>
+<PRE>
+java.lang.Object
+  <IMG SRC="../../../../resources/inherit.gif" ALT="extended by "><B>org.eclipse.wst.validation.ValidationEvent</B>
+</PRE>
+<HR>
+<DL>
+<DT><PRE>public final class <B>ValidationEvent</B><DT>extends java.lang.Object</DL>
+</PRE>
+
+<P>
+An object that describes which object should be validated and what triggered its validation.
+ <p>
+ <b>Provisional API:</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>
+<P>
+
+<P>
+<HR>
+
+<P>
+
+<!-- ======== CONSTRUCTOR SUMMARY ======== -->
+
+<A NAME="constructor_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Constructor Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationEvent.html#ValidationEvent(IResource, int, IResourceDelta)">ValidationEvent</A></B>(IResource&nbsp;resource,
+                int&nbsp;kind,
+                IResourceDelta&nbsp;dependsOn)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Create an object that describes what should be validated.</TD>
+</TR>
+</TABLE>
+&nbsp;
+<!-- ========== METHOD SUMMARY =========== -->
+
+<A NAME="method_summary"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+<B>Method Summary</B></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;IResourceDelta</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationEvent.html#getDependsOn()">getDependsOn</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;If the resource is being validated because one of it's dependencies has changed, that change is described here.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;int</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationEvent.html#getKind()">getKind</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The way the resource changed.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;IResource</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationEvent.html#getResource()">getResource</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;The resource to be validated.</TD>
+</TR>
+</TABLE>
+&nbsp;<A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#EEEEFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left"><B>Methods inherited from class java.lang.Object</B></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE>equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait</CODE></TD>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+
+<!-- ========= CONSTRUCTOR DETAIL ======== -->
+
+<A NAME="constructor_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Constructor Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="ValidationEvent(IResource, int, IResourceDelta)"><!-- --></A><H3>
+ValidationEvent</H3>
+<PRE>
+public <B>ValidationEvent</B>(IResource&nbsp;resource,
+                       int&nbsp;kind,
+                       IResourceDelta&nbsp;dependsOn)</PRE>
+<DL>
+<DD>Create an object that describes what should be validated.
+<P>
+<DL>
+<DT><B>Parameters:</B><DD><CODE>resource</CODE> - The resource to be validated.<DD><CODE>kind</CODE> - The way the resource changed. It uses the same values as the
+            kind parameter in IResourceDelta.<DD><CODE>dependsOn</CODE> - If the resource is being validated because one of it's
+            dependencies has changed, that change is described here. This
+            can be null.</DL>
+</DL>
+
+<!-- ============ METHOD DETAIL ========== -->
+
+<A NAME="method_detail"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="1"><FONT SIZE="+2">
+<B>Method Detail</B></FONT></TH>
+</TR>
+</TABLE>
+
+<A NAME="getResource()"><!-- --></A><H3>
+getResource</H3>
+<PRE>
+public IResource <B>getResource</B>()</PRE>
+<DL>
+<DD>The resource to be validated.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getKind()"><!-- --></A><H3>
+getKind</H3>
+<PRE>
+public int <B>getKind</B>()</PRE>
+<DL>
+<DD>The way the resource changed. It uses the same values as the kind
+ parameter in IResourceDelta.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getDependsOn()"><!-- --></A><H3>
+getDependsOn</H3>
+<PRE>
+public IResourceDelta <B>getDependsOn</B>()</PRE>
+<DL>
+<DD>If the resource is being validated because one of it's dependencies has changed, that change is described here.
+ This method will return null when the trigger is not because of a dependency change.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<!-- ========= END OF CLASS DATA ========= -->
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Class</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="class-use/ValidationEvent.html"><FONT CLASS="NavBarFont1"><B>Use</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../serialized-form.html"><FONT CLASS="NavBarFont1"><B>Serialized</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/ReporterHelper.html" title="class in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html" title="class in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../index.html?org/eclipse/wst/validation/ValidationEvent.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="ValidationEvent.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+<TR>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+  SUMMARY:&nbsp;NESTED&nbsp;|&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_summary">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_summary">METHOD</A></FONT></TD>
+<TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">
+DETAIL:&nbsp;FIELD&nbsp;|&nbsp;<A HREF="#constructor_detail">CONSTR</A>&nbsp;|&nbsp;<A HREF="#method_detail">METHOD</A></FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidationFramework.ResourceAdder.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidationFramework.ResourceAdder.html
index d824cf4..3b3a7a1 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidationFramework.ResourceAdder.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidationFramework.ResourceAdder.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:54 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 ValidationFramework.ResourceAdder
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidationFramework.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidationFramework.html
index d2a4eaa..2d0b61e 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidationFramework.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidationFramework.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:54 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 ValidationFramework
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
@@ -54,7 +54,7 @@
 
 <TR>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
-&nbsp;<A HREF="../../../../org/eclipse/wst/validation/ReporterHelper.html" title="class in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
 &nbsp;<A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.ResourceAdder.html" title="class in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
   <A HREF="../../../../index.html?org/eclipse/wst/validation/ValidationFramework.html" target="_top"><B>FRAMES</B></A>  &nbsp;
@@ -144,6 +144,33 @@
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html#addValidationBuilder(IProject)">addValidationBuilder</A></B>(IProject&nbsp;project)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Add the validation builder to the project, so that the project can support
+ build time validation.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html#applyChanges(org.eclipse.wst.validation.MutableProjectSettings, boolean)">applyChanges</A></B>(<A HREF="../../../../org/eclipse/wst/validation/MutableProjectSettings.html" title="class in org.eclipse.wst.validation">MutableProjectSettings</A>&nbsp;settings,
+             boolean&nbsp;persist)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Apply the changes that have been been to the validation settings.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html#applyChanges(org.eclipse.wst.validation.MutableWorkspaceSettings, boolean)">applyChanges</A></B>(<A HREF="../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html" title="class in org.eclipse.wst.validation">MutableWorkspaceSettings</A>&nbsp;settings,
+             boolean&nbsp;persist)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Apply the changes that have been been to the validation settings.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html#clearMessages(IResource, java.lang.String)">clearMessages</A></B>(IResource&nbsp;resource,
               java.lang.String&nbsp;validatorId)</CODE>
 
@@ -206,7 +233,16 @@
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html#getPreferenceStore()">getPreferenceStore</A></B>()</CODE>
 
 <BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Answer the preference store that holds the global validation settings.</TD>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Answer the preference store that holds the persisted global validation settings.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../org/eclipse/wst/validation/MutableProjectSettings.html" title="class in org.eclipse.wst.validation">MutableProjectSettings</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html#getProjectSettings(IProject)">getProjectSettings</A></B>(IProject&nbsp;project)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Answer the validation settings that have been defined on the
+ project.</TD>
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
@@ -238,6 +274,23 @@
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>&nbsp;<A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html#getValidators()">getValidators</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Answer copies of all the registered validators.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html#getValidatorsConfiguredForProject(IProject)">getValidatorsConfiguredForProject</A></B>(IProject&nbsp;project)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Validators can use project level settings (Project natures and facets) to
+ determine if they are applicable to the project or not.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>[]</CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html#getValidatorsFor(IResource)">getValidatorsFor</A></B>(IResource&nbsp;resource)</CODE>
 
 <BR>
@@ -255,6 +308,14 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html" title="class in org.eclipse.wst.validation">MutableWorkspaceSettings</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html#getWorkspaceSettings()">getWorkspaceSettings</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Answer the validation settings that have been defined at the workspace level.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>&nbsp;boolean</CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html#hasValidators(IResource, boolean, boolean)">hasValidators</A></B>(IResource&nbsp;resource,
               boolean&nbsp;isManual,
@@ -266,6 +327,15 @@
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>&nbsp;boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html#isLoaded(org.eclipse.wst.validation.Validator)">isLoaded</A></B>(<A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>&nbsp;validator)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Answer whether or not the validator has been activated, i.e. has the
+ bundle that defines the validator been loaded.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;boolean</CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html#isProjectSuspended(IProject)">isProjectSuspended</A></B>(IProject&nbsp;project)</CODE>
 
 <BR>
@@ -299,6 +369,14 @@
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html#saveValidators(org.eclipse.wst.validation.Validator[])">saveValidators</A></B>(<A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>[]&nbsp;validators)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Save the validators settings into the persistent store, there by making their settings the active settings.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html#suspendAllValidation(boolean)">suspendAllValidation</A></B>(boolean&nbsp;suspend)</CODE>
 
 <BR>
@@ -317,6 +395,15 @@
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>&nbsp;<A HREF="../../../../org/eclipse/wst/validation/ValidationResults.html" title="class in org.eclipse.wst.validation">ValidationResults</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html#validate(IFile, IProgressMonitor)">validate</A></B>(IFile&nbsp;file,
+         IProgressMonitor&nbsp;monitor)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Validate a specific file resource.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../org/eclipse/wst/validation/ValidationResults.html" title="class in org.eclipse.wst.validation">ValidationResults</A></CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html#validate(IProject[], boolean, boolean, IProgressMonitor)">validate</A></B>(IProject[]&nbsp;projects,
          boolean&nbsp;isManual,
          boolean&nbsp;isBuild,
@@ -361,6 +448,21 @@
 </DL>
 <HR>
 
+<A NAME="addValidationBuilder(IProject)"><!-- --></A><H3>
+addValidationBuilder</H3>
+<PRE>
+public void <B>addValidationBuilder</B>(IProject&nbsp;project)</PRE>
+<DL>
+<DD>Add the validation builder to the project, so that the project can support
+ build time validation. It is safe to call this method, if the builder was
+ previously added to the project. It will not be added more than once.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>project</CODE> - The project that the builder is added to.</DL>
+</DD>
+</DL>
+<HR>
+
 <A NAME="clearMessages(IResource, java.lang.String)"><!-- --></A><H3>
 clearMessages</H3>
 <PRE>
@@ -444,7 +546,7 @@
 <PRE>
 public IEclipsePreferences <B>getPreferenceStore</B>()</PRE>
 <DL>
-<DD>Answer the preference store that holds the global validation settings.
+<DD>Answer the preference store that holds the persisted global validation settings.
 <P>
 <DD><DL>
 </DL>
@@ -549,6 +651,108 @@
 </DL>
 <HR>
 
+<A NAME="getValidators()"><!-- --></A><H3>
+getValidators</H3>
+<PRE>
+public <A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>[] <B>getValidators</B>()</PRE>
+<DL>
+<DD>Answer copies of all the registered validators.
+<P>
+<DD><DL>
+
+<DT><B>Returns:</B><DD>Answer an empty array if there are no validators.</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getProjectSettings(IProject)"><!-- --></A><H3>
+getProjectSettings</H3>
+<PRE>
+public <A HREF="../../../../org/eclipse/wst/validation/MutableProjectSettings.html" title="class in org.eclipse.wst.validation">MutableProjectSettings</A> <B>getProjectSettings</B>(IProject&nbsp;project)</PRE>
+<DL>
+<DD>Answer the validation settings that have been defined on the
+ project. To "activate" any changes to these settings, the
+ <A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html#applyChanges(org.eclipse.wst.validation.MutableProjectSettings, boolean)"><CODE>applyChanges(MutableProjectSettings, boolean)</CODE></A> method needs to be
+ called.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>project</CODE> - The project who's settings you wish to examine or change.
+<DT><B>Returns:</B><DD>Validation settings that apply to the given project.</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getWorkspaceSettings()"><!-- --></A><H3>
+getWorkspaceSettings</H3>
+<PRE>
+public <A HREF="../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html" title="class in org.eclipse.wst.validation">MutableWorkspaceSettings</A> <B>getWorkspaceSettings</B>()
+                                              throws java.lang.reflect.InvocationTargetException</PRE>
+<DL>
+<DD>Answer the validation settings that have been defined at the workspace level.
+ To "activate" any changes to these settings, the
+ <A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html#applyChanges(org.eclipse.wst.validation.MutableWorkspaceSettings, boolean)"><CODE>applyChanges(MutableWorkspaceSettings, boolean)</CODE></A> method needs to be
+ called.
+<P>
+<DD><DL>
+
+<DT><B>Returns:</B><DD>Validation settings that apply to the entire workspace.
+<DT><B>Throws:</B>
+<DD><CODE>java.lang.reflect.InvocationTargetException</CODE></DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="applyChanges(org.eclipse.wst.validation.MutableProjectSettings, boolean)"><!-- --></A><H3>
+applyChanges</H3>
+<PRE>
+public void <B>applyChanges</B>(<A HREF="../../../../org/eclipse/wst/validation/MutableProjectSettings.html" title="class in org.eclipse.wst.validation">MutableProjectSettings</A>&nbsp;settings,
+                         boolean&nbsp;persist)</PRE>
+<DL>
+<DD>Apply the changes that have been been to the validation settings.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>settings</CODE> - The project settings.<DD><CODE>persist</CODE> - If true then the changes are persisted to the property files.
+            If false the changes are applied to the validators, but are
+            not persisted.</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="applyChanges(org.eclipse.wst.validation.MutableWorkspaceSettings, boolean)"><!-- --></A><H3>
+applyChanges</H3>
+<PRE>
+public void <B>applyChanges</B>(<A HREF="../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html" title="class in org.eclipse.wst.validation">MutableWorkspaceSettings</A>&nbsp;settings,
+                         boolean&nbsp;persist)</PRE>
+<DL>
+<DD>Apply the changes that have been been to the validation settings.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>settings</CODE> - The workspace settings.<DD><CODE>persist</CODE> - If true then the changes are persisted to the property files.
+            If false the changes are applied to the validators, but are
+            not persisted.</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="getValidatorsConfiguredForProject(IProject)"><!-- --></A><H3>
+getValidatorsConfiguredForProject</H3>
+<PRE>
+public <A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>[] <B>getValidatorsConfiguredForProject</B>(IProject&nbsp;project)
+                                              throws org.eclipse.wst.validation.internal.ProjectUnavailableError</PRE>
+<DL>
+<DD>Validators can use project level settings (Project natures and facets) to
+ determine if they are applicable to the project or not.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>project</CODE> - The project that the configuration is based on.
+<DT><B>Returns:</B><DD>The copies of the validators that are configured to run on this project based
+         on the project level settings.
+<DT><B>Throws:</B>
+<DD><CODE>org.eclipse.wst.validation.internal.ProjectUnavailableError</CODE></DL>
+</DD>
+</DL>
+<HR>
+
 <A NAME="getValidatorsFor(IResource)"><!-- --></A><H3>
 getValidatorsFor</H3>
 <PRE>
@@ -581,6 +785,24 @@
 </DL>
 <HR>
 
+<A NAME="isLoaded(org.eclipse.wst.validation.Validator)"><!-- --></A><H3>
+isLoaded</H3>
+<PRE>
+public boolean <B>isLoaded</B>(<A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>&nbsp;validator)</PRE>
+<DL>
+<DD>Answer whether or not the validator has been activated, i.e. has the
+ bundle that defines the validator been loaded. We do not want to cause
+ unnecessary bundle loading, so this check can be performed by third party
+ callers, to prevent making other calls that will force the validator to
+ be loaded.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>validator</CODE> - The validator that is being tested.
+<DT><B>Returns:</B><DD>true if the validator has already been loaded.</DL>
+</DD>
+</DL>
+<HR>
+
 <A NAME="join(IProgressMonitor)"><!-- --></A><H3>
 join</H3>
 <PRE>
@@ -643,6 +865,37 @@
 </DL>
 <HR>
 
+<A NAME="saveValidators(org.eclipse.wst.validation.Validator[])"><!-- --></A><H3>
+saveValidators</H3>
+<PRE>
+public void <B>saveValidators</B>(<A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>[]&nbsp;validators)
+                    throws java.lang.reflect.InvocationTargetException</PRE>
+<DL>
+<DD>Save the validators settings into the persistent store, there by making their settings the active settings.
+ <p>
+ A common use of this method would be to change whether particular validators are enabled or not. For example
+ if you only wanted the JSP validator enabled, you could use code similar to this:
+ <pre>
+ ValidationFramework vf = ValidationFramework.getDefault();
+ Validator[] vals = vf.getValidators();
+ for (Validator v : vals){
+   boolean enabled = false;
+   if (v.getValidatorClassname().equals("org.eclipse.jst.jsp.core.internal.validation.JSPBatchValidator"))enabled = true;
+     v.setBuildValidation(enabled);
+     v.setManualValidation(enabled);
+  }
+ vf.saveValidators(vals);
+ </pre>
+ </p>
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>validators</CODE> - The validators that you are saving.
+<DT><B>Throws:</B>
+<DD><CODE>java.lang.reflect.InvocationTargetException</CODE></DL>
+</DD>
+</DL>
+<HR>
+
 <A NAME="suspendAllValidation(boolean)"><!-- --></A><H3>
 suspendAllValidation</H3>
 <PRE>
@@ -730,6 +983,24 @@
 <DD><CODE>CoreException</CODE></DL>
 </DD>
 </DL>
+<HR>
+
+<A NAME="validate(IFile, IProgressMonitor)"><!-- --></A><H3>
+validate</H3>
+<PRE>
+public <A HREF="../../../../org/eclipse/wst/validation/ValidationResults.html" title="class in org.eclipse.wst.validation">ValidationResults</A> <B>validate</B>(IFile&nbsp;file,
+                                  IProgressMonitor&nbsp;monitor)
+                           throws CoreException</PRE>
+<DL>
+<DD>Validate a specific file resource.
+<P>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>file</CODE> - The file to be validated.<DD><CODE>monitor</CODE> - Progress monitor.
+<DT><B>Returns:</B><DD>the result of validating the file.
+<DT><B>Throws:</B>
+<DD><CODE>CoreException</CODE></DL>
+</DD>
+</DL>
 <!-- ========= END OF CLASS DATA ========= -->
 <HR>
 
@@ -760,7 +1031,7 @@
 
 <TR>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
-&nbsp;<A HREF="../../../../org/eclipse/wst/validation/ReporterHelper.html" title="class in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
+&nbsp;<A HREF="../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation"><B>PREV CLASS</B></A>&nbsp;
 &nbsp;<A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.ResourceAdder.html" title="class in org.eclipse.wst.validation"><B>NEXT CLASS</B></A></FONT></TD>
 <TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
   <A HREF="../../../../index.html?org/eclipse/wst/validation/ValidationFramework.html" target="_top"><B>FRAMES</B></A>  &nbsp;
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidationResult.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidationResult.html
index 15272b7..0c2c0eb 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidationResult.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidationResult.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:54 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 ValidationResult
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
@@ -166,6 +166,14 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../org/eclipse/wst/validation/ValidatorMessage.html" title="class in org.eclipse.wst.validation">ValidatorMessage</A>[]</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationResult.html#getMessagesAsCopy()">getMessagesAsCopy</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Answer a copy of any validation messages that were added by the validator.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>&nbsp;int</CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationResult.html#getNumberOfValidatedResources()">getNumberOfValidatedResources</A></B>()</CODE>
 
@@ -391,12 +399,14 @@
  one type of message, and those messages can be either be directly used by
  the caller, or automatically converted into IMarkers by the validation
  framework.
+ </p>
  <p>
  To make matters even more complicated there is a third way to return
  messages. To make it easier for old validators to port to the new
  framework, they can continue to use an IReporter. If a validator calls
  the getReporter() method then it is assumed by the framework that that is
  the approach that they have chosen.
+ </p>
 <P>
 <DD><DL>
 <DT><B>Parameters:</B><DD><CODE>message</CODE> - A validation message.<DT><B>See Also:</B><DD><A HREF="../../../../org/eclipse/wst/validation/ValidationResult.html#getReporter(IProgressMonitor)"><CODE>getReporter(IProgressMonitor)</CODE></A></DL>
@@ -461,6 +471,21 @@
 </DL>
 <HR>
 
+<A NAME="getMessagesAsCopy()"><!-- --></A><H3>
+getMessagesAsCopy</H3>
+<PRE>
+public <A HREF="../../../../org/eclipse/wst/validation/ValidatorMessage.html" title="class in org.eclipse.wst.validation">ValidatorMessage</A>[] <B>getMessagesAsCopy</B>()</PRE>
+<DL>
+<DD>Answer a copy of any validation messages that were added by the validator. The array is a new
+ array, and each message is a copy.
+<P>
+<DD><DL>
+
+<DT><B>Returns:</B><DD>an array is returned even if there are no messages.</DL>
+</DD>
+</DL>
+<HR>
+
 <A NAME="setDependsOn(IResource[])"><!-- --></A><H3>
 setDependsOn</H3>
 <PRE>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidationResults.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidationResults.html
index bd78ec7..9c71970 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidationResults.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidationResults.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:54 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 ValidationResults
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
@@ -96,7 +96,7 @@
 </PRE>
 <HR>
 <DL>
-<DT><PRE>public class <B>ValidationResults</B><DT>extends java.lang.Object</DL>
+<DT><PRE>public final class <B>ValidationResults</B><DT>extends java.lang.Object</DL>
 </PRE>
 
 <P>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidationState.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidationState.html
index b01263c..06a4007 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidationState.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidationState.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:54 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 ValidationState
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
@@ -96,7 +96,7 @@
 </PRE>
 <HR>
 <DL>
-<DT><PRE>public class <B>ValidationState</B><DT>extends java.lang.Object</DL>
+<DT><PRE>public final class <B>ValidationState</B><DT>extends java.lang.Object</DL>
 </PRE>
 
 <P>
@@ -135,7 +135,7 @@
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidationState.html#TriggerResource">TriggerResource</A></B></CODE>
 
 <BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This is a special id.</TD>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<B>Deprecated.</B>&nbsp;<I>This approach is not thread safe, the longer form of the AbstractValidator validate method should be used instead.</I></TD>
 </TR>
 </TABLE>
 &nbsp;
@@ -208,7 +208,7 @@
 <PRE>
 public static final java.lang.String <B>TriggerResource</B></PRE>
 <DL>
-<DD>This is a special id.
+<DD><B>Deprecated.</B>&nbsp;<I>This approach is not thread safe, the longer form of the AbstractValidator validate method should be used instead.</I><DD>This is a special id.
  <p>
  If a resource that is depended on by others is changed, then the
  dependent resources are validated. The depended on resource, which is the
@@ -217,7 +217,7 @@
  </p>
 <P>
 <DL>
-</DL>
+<DT><B>See Also:</B><DD><CODE>AbstractValidator#validate(ValidationEvent, ValidationState, org.eclipse.core.runtime.IProgressMonitor)</CODE></DL>
 </DL>
 
 <!-- ========= CONSTRUCTOR DETAIL ======== -->
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Validator.Level.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Validator.Level.html
index ab475aa..3755b02 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Validator.Level.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Validator.Level.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:54 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Validator.Level
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Validator.V1.V1Copy.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Validator.V1.V1Copy.html
index 53263cb..c75c83a 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Validator.V1.V1Copy.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Validator.V1.V1Copy.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:54 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Validator.V1.V1Copy
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
@@ -104,7 +104,7 @@
 </DL>
 <HR>
 <DL>
-<DT><PRE>public static class <B>Validator.V1.V1Copy</B><DT>extends <A HREF="../../../../org/eclipse/wst/validation/Validator.V1.html" title="class in org.eclipse.wst.validation">Validator.V1</A></DL>
+<DT><PRE>public static final class <B>Validator.V1.V1Copy</B><DT>extends <A HREF="../../../../org/eclipse/wst/validation/Validator.V1.html" title="class in org.eclipse.wst.validation">Validator.V1</A></DL>
 </PRE>
 
 <P>
@@ -150,8 +150,9 @@
 <B>Constructor Summary</B></FONT></TH>
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
-<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.V1.V1Copy.html#Validator.V1.V1Copy(ValidatorMetaData, ValidationConfiguration)">Validator.V1.V1Copy</A></B>(ValidatorMetaData&nbsp;vmd,
-                    ValidationConfiguration&nbsp;vc)</CODE>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.V1.V1Copy.html#Validator.V1.V1Copy(ValidatorMetaData, ValidationConfiguration, IProject)">Validator.V1.V1Copy</A></B>(ValidatorMetaData&nbsp;vmd,
+                    ValidationConfiguration&nbsp;vc,
+                    IProject&nbsp;project)</CODE>
 
 <BR>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
@@ -168,15 +169,7 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE>&nbsp;void</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.V1.V1Copy.html#become(org.eclipse.wst.validation.Validator)">become</A></B>(<A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>&nbsp;val)</CODE>
-
-<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Take the instance variables from the incoming validator and set them to yourself.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE>&nbsp;void</CODE></FONT></TD>
+<CODE>&nbsp;boolean</CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.V1.V1Copy.html#setBuildValidation(boolean)">setBuildValidation</A></B>(boolean&nbsp;bool)</CODE>
 
 <BR>
@@ -184,7 +177,7 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE>&nbsp;void</CODE></FONT></TD>
+<CODE>&nbsp;boolean</CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.V1.V1Copy.html#setManualValidation(boolean)">setManualValidation</A></B>(boolean&nbsp;bool)</CODE>
 
 <BR>
@@ -206,7 +199,7 @@
 <TH ALIGN="left"><B>Methods inherited from class org.eclipse.wst.validation.<A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A></B></TH>
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
-<TD><CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#asV2Validator()">asV2Validator</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#bumpChangeCountGlobal()">bumpChangeCountGlobal</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#bumpChangeCountMessages()">bumpChangeCountMessages</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#clean(IProject, IProgressMonitor)">clean</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#compareTo(org.eclipse.wst.validation.Validator)">compareTo</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#copy()">copy</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#create(IConfigurationElement, IProject)">create</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#create(ValidatorMetaData, ValidationConfiguration, IProject)">create</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getChangeCountGlobal()">getChangeCountGlobal</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getChangeCountMessages()">getChangeCountMessages</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getDelegatingId()">getDelegatingId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getMarkerId()">getMarkerId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getMessage(java.lang.String)">getMessage</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getMessageSettings()">getMessageSettings</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getProject()">getProject</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getSourceId()">getSourceId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getVersion()">getVersion</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#hashCodeForConfig()">hashCodeForConfig</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#isBuildValidation()">isBuildValidation</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#isChanged()">isChanged</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#isManualValidation()">isManualValidation</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#resetChangeCounters()">resetChangeCounters</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#sameConfig(org.eclipse.wst.validation.Validator)">sameConfig</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setDelegatingId(java.lang.String)">setDelegatingId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setMarkerId(java.lang.String)">setMarkerId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setSourceId(java.lang.String)">setSourceId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setVersion(int)">setVersion</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidate(IResource, boolean, boolean)">shouldValidate</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidate(IResource, org.eclipse.wst.validation.internal.ValType)">shouldValidate</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidateProject(IProject, boolean, boolean)">shouldValidateProject</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidateProject(IProject, org.eclipse.wst.validation.internal.ValType)">shouldValidateProject</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#toString()">toString</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#validationFinishing(IProject, org.eclipse.wst.validation.ValidationState, IProgressMonitor)">validationFinishing</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#validationStarting(IProject, org.eclipse.wst.validation.ValidationState, IProgressMonitor)">validationStarting</A></CODE></TD>
+<TD><CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#asV2Validator()">asV2Validator</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#bumpChangeCountGlobal()">bumpChangeCountGlobal</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#bumpChangeCountMessages()">bumpChangeCountMessages</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#clean(IProject, org.eclipse.wst.validation.internal.ValOperation, IProgressMonitor)">clean</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#compareTo(org.eclipse.wst.validation.Validator)">compareTo</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#copy()">copy</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#create(IConfigurationElement, IProject)">create</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#create(ValidatorMetaData, ValidationConfiguration, IProject)">create</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getChangeCountGlobal()">getChangeCountGlobal</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getChangeCountMessages()">getChangeCountMessages</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getDelegatingId()">getDelegatingId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getMarkerId()">getMarkerId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getMessage(java.lang.String)">getMessage</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getMessageSettings()">getMessageSettings</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getProject()">getProject</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getSourceId()">getSourceId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getVersion()">getVersion</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#hasGlobalChanges()">hasGlobalChanges</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#hashCodeForConfig()">hashCodeForConfig</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#isBuildValidation()">isBuildValidation</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#isChanged()">isChanged</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#isManualValidation()">isManualValidation</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#resetChangeCounters()">resetChangeCounters</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#sameConfig(org.eclipse.wst.validation.Validator)">sameConfig</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setDelegatingId(java.lang.String)">setDelegatingId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setMarkerId(java.lang.String)">setMarkerId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setSourceId(java.lang.String)">setSourceId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setVersion(int)">setVersion</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldClearMarkers(org.eclipse.wst.validation.ValidationEvent)">shouldClearMarkers</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidate(IResource, boolean, boolean)">shouldValidate</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidate(IResource, org.eclipse.wst.validation.internal.ValType)">shouldValidate</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidateProject(IProject, boolean, boolean)">shouldValidateProject</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidateProject(IProject, org.eclipse.wst.validation.internal.ValType)">shouldValidateProject</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#toString()">toString</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#validate(IResource, int, org.eclipse.wst.validation.internal.ValOperation, IProgressMonitor, org.eclipse.wst.validation.ValidationEvent)">validate</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#validationFinishing(IProject, org.eclipse.wst.validation.ValidationState, IProgressMonitor)">validationFinishing</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#validationStarting(IProject, org.eclipse.wst.validation.ValidationState, IProgressMonitor)">validationStarting</A></CODE></TD>
 </TR>
 </TABLE>
 &nbsp;<A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
@@ -231,11 +224,12 @@
 </TR>
 </TABLE>
 
-<A NAME="Validator.V1.V1Copy(ValidatorMetaData, ValidationConfiguration)"><!-- --></A><H3>
+<A NAME="Validator.V1.V1Copy(ValidatorMetaData, ValidationConfiguration, IProject)"><!-- --></A><H3>
 Validator.V1.V1Copy</H3>
 <PRE>
 public <B>Validator.V1.V1Copy</B>(ValidatorMetaData&nbsp;vmd,
-                           ValidationConfiguration&nbsp;vc)</PRE>
+                           ValidationConfiguration&nbsp;vc,
+                           IProject&nbsp;project)</PRE>
 <DL>
 </DL>
 
@@ -252,7 +246,7 @@
 <A NAME="setManualValidation(boolean)"><!-- --></A><H3>
 setManualValidation</H3>
 <PRE>
-public void <B>setManualValidation</B>(boolean&nbsp;bool)</PRE>
+public boolean <B>setManualValidation</B>(boolean&nbsp;bool)</PRE>
 <DL>
 <DD><B>Description copied from class: <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#setManualValidation(boolean)">Validator</A></CODE></B></DD>
 <DD>Set whether this validator should be triggered as part of a manual validation.
@@ -261,7 +255,8 @@
 <DT><B>Overrides:</B><DD><CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.V1.html#setManualValidation(boolean)">setManualValidation</A></CODE> in class <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.V1.html" title="class in org.eclipse.wst.validation">Validator.V1</A></CODE></DL>
 </DD>
 <DD><DL>
-</DL>
+
+<DT><B>Returns:</B><DD>true if the setting changed.</DL>
 </DD>
 </DL>
 <HR>
@@ -269,7 +264,7 @@
 <A NAME="setBuildValidation(boolean)"><!-- --></A><H3>
 setBuildValidation</H3>
 <PRE>
-public void <B>setBuildValidation</B>(boolean&nbsp;bool)</PRE>
+public boolean <B>setBuildValidation</B>(boolean&nbsp;bool)</PRE>
 <DL>
 <DD><B>Description copied from class: <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#setBuildValidation(boolean)">Validator</A></CODE></B></DD>
 <DD>Set whether this validator should be triggered by the build process.
@@ -278,24 +273,8 @@
 <DT><B>Overrides:</B><DD><CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.V1.html#setBuildValidation(boolean)">setBuildValidation</A></CODE> in class <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.V1.html" title="class in org.eclipse.wst.validation">Validator.V1</A></CODE></DL>
 </DD>
 <DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
 
-<A NAME="become(org.eclipse.wst.validation.Validator)"><!-- --></A><H3>
-become</H3>
-<PRE>
-public void <B>become</B>(<A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>&nbsp;val)</PRE>
-<DL>
-<DD><B>Description copied from class: <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#become(org.eclipse.wst.validation.Validator)">Validator</A></CODE></B></DD>
-<DD>Take the instance variables from the incoming validator and set them to yourself.
-<P>
-<DD><DL>
-<DT><B>Overrides:</B><DD><CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.V1.html#become(org.eclipse.wst.validation.Validator)">become</A></CODE> in class <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.V1.html" title="class in org.eclipse.wst.validation">Validator.V1</A></CODE></DL>
-</DD>
-<DD><DL>
-</DL>
+<DT><B>Returns:</B><DD>true if the setting changed.</DL>
 </DD>
 </DL>
 <!-- ========= END OF CLASS DATA ========= -->
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Validator.V1.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Validator.V1.html
index d94f147..7edf03d 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Validator.V1.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Validator.V1.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:54 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Validator.V1
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
@@ -154,8 +154,9 @@
 <B>Constructor Summary</B></FONT></TH>
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
-<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.V1.html#Validator.V1(ValidatorMetaData, ValidationConfiguration)">Validator.V1</A></B>(ValidatorMetaData&nbsp;vmd,
-             ValidationConfiguration&nbsp;config)</CODE>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.V1.html#Validator.V1(ValidatorMetaData, ValidationConfiguration, IProject)">Validator.V1</A></B>(ValidatorMetaData&nbsp;vmd,
+             ValidationConfiguration&nbsp;config,
+             IProject&nbsp;project)</CODE>
 
 <BR>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Create a new version 1 validator.</TD>
@@ -188,14 +189,6 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE>&nbsp;void</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.V1.html#become(org.eclipse.wst.validation.Validator)">become</A></B>(<A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>&nbsp;val)</CODE>
-
-<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Take the instance variables from the incoming validator and set them to yourself.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>&nbsp;<A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A></CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.V1.html#copy(boolean)">copy</A></B>(boolean&nbsp;includeChangeCounts)</CODE>
 
@@ -236,7 +229,7 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE>&nbsp;void</CODE></FONT></TD>
+<CODE>&nbsp;boolean</CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.V1.html#setBuildValidation(boolean)">setBuildValidation</A></B>(boolean&nbsp;buildValidation)</CODE>
 
 <BR>
@@ -244,7 +237,7 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE>&nbsp;void</CODE></FONT></TD>
+<CODE>&nbsp;boolean</CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.V1.html#setManualValidation(boolean)">setManualValidation</A></B>(boolean&nbsp;manualValidation)</CODE>
 
 <BR>
@@ -268,7 +261,7 @@
 <TH ALIGN="left"><B>Methods inherited from class org.eclipse.wst.validation.<A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A></B></TH>
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
-<TD><CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#asV2Validator()">asV2Validator</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#bumpChangeCountGlobal()">bumpChangeCountGlobal</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#bumpChangeCountMessages()">bumpChangeCountMessages</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#clean(IProject, IProgressMonitor)">clean</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#compareTo(org.eclipse.wst.validation.Validator)">compareTo</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#copy()">copy</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#create(IConfigurationElement, IProject)">create</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#create(ValidatorMetaData, ValidationConfiguration, IProject)">create</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getChangeCountGlobal()">getChangeCountGlobal</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getChangeCountMessages()">getChangeCountMessages</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getDelegatingId()">getDelegatingId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getMarkerId()">getMarkerId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getMessage(java.lang.String)">getMessage</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getMessageSettings()">getMessageSettings</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getProject()">getProject</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getSourceId()">getSourceId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getVersion()">getVersion</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#hashCodeForConfig()">hashCodeForConfig</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#isBuildValidation()">isBuildValidation</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#isChanged()">isChanged</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#isManualValidation()">isManualValidation</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#resetChangeCounters()">resetChangeCounters</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#sameConfig(org.eclipse.wst.validation.Validator)">sameConfig</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setDelegatingId(java.lang.String)">setDelegatingId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setMarkerId(java.lang.String)">setMarkerId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setSourceId(java.lang.String)">setSourceId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setVersion(int)">setVersion</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidate(IResource, boolean, boolean)">shouldValidate</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidate(IResource, org.eclipse.wst.validation.internal.ValType)">shouldValidate</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidateProject(IProject, boolean, boolean)">shouldValidateProject</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidateProject(IProject, org.eclipse.wst.validation.internal.ValType)">shouldValidateProject</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#toString()">toString</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#validationFinishing(IProject, org.eclipse.wst.validation.ValidationState, IProgressMonitor)">validationFinishing</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#validationStarting(IProject, org.eclipse.wst.validation.ValidationState, IProgressMonitor)">validationStarting</A></CODE></TD>
+<TD><CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#asV2Validator()">asV2Validator</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#bumpChangeCountGlobal()">bumpChangeCountGlobal</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#bumpChangeCountMessages()">bumpChangeCountMessages</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#clean(IProject, org.eclipse.wst.validation.internal.ValOperation, IProgressMonitor)">clean</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#compareTo(org.eclipse.wst.validation.Validator)">compareTo</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#copy()">copy</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#create(IConfigurationElement, IProject)">create</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#create(ValidatorMetaData, ValidationConfiguration, IProject)">create</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getChangeCountGlobal()">getChangeCountGlobal</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getChangeCountMessages()">getChangeCountMessages</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getDelegatingId()">getDelegatingId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getMarkerId()">getMarkerId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getMessage(java.lang.String)">getMessage</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getMessageSettings()">getMessageSettings</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getProject()">getProject</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getSourceId()">getSourceId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getVersion()">getVersion</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#hasGlobalChanges()">hasGlobalChanges</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#hashCodeForConfig()">hashCodeForConfig</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#isBuildValidation()">isBuildValidation</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#isChanged()">isChanged</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#isManualValidation()">isManualValidation</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#resetChangeCounters()">resetChangeCounters</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#sameConfig(org.eclipse.wst.validation.Validator)">sameConfig</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setDelegatingId(java.lang.String)">setDelegatingId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setMarkerId(java.lang.String)">setMarkerId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setSourceId(java.lang.String)">setSourceId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setVersion(int)">setVersion</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldClearMarkers(org.eclipse.wst.validation.ValidationEvent)">shouldClearMarkers</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidate(IResource, boolean, boolean)">shouldValidate</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidate(IResource, org.eclipse.wst.validation.internal.ValType)">shouldValidate</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidateProject(IProject, boolean, boolean)">shouldValidateProject</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidateProject(IProject, org.eclipse.wst.validation.internal.ValType)">shouldValidateProject</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#toString()">toString</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#validate(IResource, int, org.eclipse.wst.validation.internal.ValOperation, IProgressMonitor, org.eclipse.wst.validation.ValidationEvent)">validate</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#validationFinishing(IProject, org.eclipse.wst.validation.ValidationState, IProgressMonitor)">validationFinishing</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#validationStarting(IProject, org.eclipse.wst.validation.ValidationState, IProgressMonitor)">validationStarting</A></CODE></TD>
 </TR>
 </TABLE>
 &nbsp;<A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
@@ -293,11 +286,12 @@
 </TR>
 </TABLE>
 
-<A NAME="Validator.V1(ValidatorMetaData, ValidationConfiguration)"><!-- --></A><H3>
+<A NAME="Validator.V1(ValidatorMetaData, ValidationConfiguration, IProject)"><!-- --></A><H3>
 Validator.V1</H3>
 <PRE>
 public <B>Validator.V1</B>(ValidatorMetaData&nbsp;vmd,
-                    ValidationConfiguration&nbsp;config)</PRE>
+                    ValidationConfiguration&nbsp;config,
+                    IProject&nbsp;project)</PRE>
 <DL>
 <DD>Create a new version 1 validator.
 <P>
@@ -346,23 +340,6 @@
 </DL>
 <HR>
 
-<A NAME="become(org.eclipse.wst.validation.Validator)"><!-- --></A><H3>
-become</H3>
-<PRE>
-public void <B>become</B>(<A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>&nbsp;val)</PRE>
-<DL>
-<DD><B>Description copied from class: <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#become(org.eclipse.wst.validation.Validator)">Validator</A></CODE></B></DD>
-<DD>Take the instance variables from the incoming validator and set them to yourself.
-<P>
-<DD><DL>
-<DT><B>Overrides:</B><DD><CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#become(org.eclipse.wst.validation.Validator)">become</A></CODE> in class <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A></CODE></DL>
-</DD>
-<DD><DL>
-</DL>
-</DD>
-</DL>
-<HR>
-
 <A NAME="copy(boolean)"><!-- --></A><H3>
 copy</H3>
 <PRE>
@@ -436,7 +413,7 @@
 <A NAME="setBuildValidation(boolean)"><!-- --></A><H3>
 setBuildValidation</H3>
 <PRE>
-public void <B>setBuildValidation</B>(boolean&nbsp;buildValidation)</PRE>
+public boolean <B>setBuildValidation</B>(boolean&nbsp;buildValidation)</PRE>
 <DL>
 <DD><B>Description copied from class: <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#setBuildValidation(boolean)">Validator</A></CODE></B></DD>
 <DD>Set whether this validator should be triggered by the build process.
@@ -445,7 +422,8 @@
 <DT><B>Overrides:</B><DD><CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#setBuildValidation(boolean)">setBuildValidation</A></CODE> in class <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A></CODE></DL>
 </DD>
 <DD><DL>
-</DL>
+
+<DT><B>Returns:</B><DD>true if the setting changed.</DL>
 </DD>
 </DL>
 <HR>
@@ -453,7 +431,7 @@
 <A NAME="setManualValidation(boolean)"><!-- --></A><H3>
 setManualValidation</H3>
 <PRE>
-public void <B>setManualValidation</B>(boolean&nbsp;manualValidation)</PRE>
+public boolean <B>setManualValidation</B>(boolean&nbsp;manualValidation)</PRE>
 <DL>
 <DD><B>Description copied from class: <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#setManualValidation(boolean)">Validator</A></CODE></B></DD>
 <DD>Set whether this validator should be triggered as part of a manual validation.
@@ -462,7 +440,8 @@
 <DT><B>Overrides:</B><DD><CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#setManualValidation(boolean)">setManualValidation</A></CODE> in class <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A></CODE></DL>
 </DD>
 <DD><DL>
-</DL>
+
+<DT><B>Returns:</B><DD>true if the setting changed.</DL>
 </DD>
 </DL>
 <HR>
@@ -482,8 +461,10 @@
 <DT><B>Specified by:</B><DD><CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#validate(IResource, int, org.eclipse.wst.validation.internal.ValOperation, IProgressMonitor)">validate</A></CODE> in class <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A></CODE></DL>
 </DD>
 <DD><DL>
-<DT><B>Parameters:</B><DD><CODE>resource</CODE> - the resource to be validated<DD><CODE>kind</CODE> - the kind of resource change, see IResourceDelta for values.<DD><CODE>operation</CODE> - the operation that this validation is running under. This can be null.<DD><CODE>monitor</CODE> - a way to report progress. This can be null.
-<DT><B>Returns:</B><DD>the result of doing the validation, it can be, but usually isn't null.</DL>
+<DT><B>Parameters:</B><DD><CODE>resource</CODE> - The resource to be validated.<DD><CODE>kind</CODE> - The kind of resource change, see IResourceDelta for values.<DD><CODE>operation</CODE> - The operation that this validation is running under. This can
+            be null.<DD><CODE>monitor</CODE> - A way to report progress. This can be null.
+<DT><B>Returns:</B><DD>the result of doing the validation, it can be, but usually isn't
+         null.</DL>
 </DD>
 </DL>
 <!-- ========= END OF CLASS DATA ========= -->
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Validator.V2.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Validator.V2.html
index fcf3bd1..479aa98 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Validator.V2.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Validator.V2.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:54 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Validator.V2
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
@@ -169,14 +169,6 @@
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>&nbsp;void</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.V2.html#become(org.eclipse.wst.validation.Validator)">become</A></B>(<A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>&nbsp;val)</CODE>
-
-<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Take the instance variables from the incoming validator and set them to yourself.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE>&nbsp;void</CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.V2.html#bumpChangeCountGroups()">bumpChangeCountGroups</A></B>()</CODE>
 
 <BR>
@@ -185,7 +177,8 @@
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>&nbsp;void</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.V2.html#clean(IProject, IProgressMonitor)">clean</A></B>(IProject&nbsp;project,
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.V2.html#clean(IProject, org.eclipse.wst.validation.internal.ValOperation, IProgressMonitor)">clean</A></B>(IProject&nbsp;project,
+      org.eclipse.wst.validation.internal.ValOperation&nbsp;operation,
       IProgressMonitor&nbsp;monitor)</CODE>
 
 <BR>
@@ -307,6 +300,15 @@
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.V2.html#replaceFilterGroup(org.eclipse.wst.validation.internal.model.FilterGroup, org.eclipse.wst.validation.internal.model.FilterGroup)">replaceFilterGroup</A></B>(org.eclipse.wst.validation.internal.model.FilterGroup&nbsp;existing,
+                   org.eclipse.wst.validation.internal.model.FilterGroup&nbsp;merged)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.V2.html#resetChangeCounters()">resetChangeCounters</A></B>()</CODE>
 
 <BR>
@@ -355,6 +357,15 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.V2.html#shouldClearMarkers(org.eclipse.wst.validation.ValidationEvent)">shouldClearMarkers</A></B>(<A HREF="../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A>&nbsp;event)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Should the validation framework first clear the markers that this
+ validator has placed on this resource?</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>&nbsp;<A HREF="../../../../org/eclipse/wst/validation/ValidationResult.html" title="class in org.eclipse.wst.validation">ValidationResult</A></CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.V2.html#validate(IResource, int, org.eclipse.wst.validation.internal.ValOperation, IProgressMonitor)">validate</A></B>(IResource&nbsp;resource,
          int&nbsp;kind,
@@ -366,6 +377,18 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../org/eclipse/wst/validation/ValidationResult.html" title="class in org.eclipse.wst.validation">ValidationResult</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.V2.html#validate(IResource, int, org.eclipse.wst.validation.internal.ValOperation, IProgressMonitor, org.eclipse.wst.validation.ValidationEvent)">validate</A></B>(IResource&nbsp;resource,
+         int&nbsp;kind,
+         org.eclipse.wst.validation.internal.ValOperation&nbsp;operation,
+         IProgressMonitor&nbsp;monitor,
+         <A HREF="../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A>&nbsp;event)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Validate the resource.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>&nbsp;void</CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.V2.html#validationFinishing(IProject, org.eclipse.wst.validation.ValidationState, IProgressMonitor)">validationFinishing</A></B>(IProject&nbsp;project,
                     <A HREF="../../../../org/eclipse/wst/validation/ValidationState.html" title="class in org.eclipse.wst.validation">ValidationState</A>&nbsp;state,
@@ -391,7 +414,7 @@
 <TH ALIGN="left"><B>Methods inherited from class org.eclipse.wst.validation.<A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A></B></TH>
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
-<TD><CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#asV1Validator()">asV1Validator</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#bumpChangeCountGlobal()">bumpChangeCountGlobal</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#bumpChangeCountMessages()">bumpChangeCountMessages</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#compareTo(org.eclipse.wst.validation.Validator)">compareTo</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#copy()">copy</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#create(IConfigurationElement, IProject)">create</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#create(ValidatorMetaData, ValidationConfiguration, IProject)">create</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getChangeCountGlobal()">getChangeCountGlobal</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getChangeCountMessages()">getChangeCountMessages</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getDelegatingId()">getDelegatingId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getMarkerId()">getMarkerId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getMessage(java.lang.String)">getMessage</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getMessageSettings()">getMessageSettings</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getProject()">getProject</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getSourceId()">getSourceId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getVersion()">getVersion</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#isBuildValidation()">isBuildValidation</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#isManualValidation()">isManualValidation</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#sameConfig(org.eclipse.wst.validation.Validator)">sameConfig</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setBuildValidation(boolean)">setBuildValidation</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setManualValidation(boolean)">setManualValidation</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setMarkerId(java.lang.String)">setMarkerId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setSourceId(java.lang.String)">setSourceId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setVersion(int)">setVersion</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidate(IResource, boolean, boolean)">shouldValidate</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidate(IResource, org.eclipse.wst.validation.internal.ValType)">shouldValidate</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidateProject(IProject, boolean, boolean)">shouldValidateProject</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidateProject(IProject, org.eclipse.wst.validation.internal.ValType)">shouldValidateProject</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#toString()">toString</A></CODE></TD>
+<TD><CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#asV1Validator()">asV1Validator</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#bumpChangeCountGlobal()">bumpChangeCountGlobal</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#bumpChangeCountMessages()">bumpChangeCountMessages</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#compareTo(org.eclipse.wst.validation.Validator)">compareTo</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#copy()">copy</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#create(IConfigurationElement, IProject)">create</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#create(ValidatorMetaData, ValidationConfiguration, IProject)">create</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getChangeCountGlobal()">getChangeCountGlobal</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getChangeCountMessages()">getChangeCountMessages</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getDelegatingId()">getDelegatingId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getMarkerId()">getMarkerId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getMessage(java.lang.String)">getMessage</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getMessageSettings()">getMessageSettings</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getProject()">getProject</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getSourceId()">getSourceId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#getVersion()">getVersion</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#hasGlobalChanges()">hasGlobalChanges</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#isBuildValidation()">isBuildValidation</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#isManualValidation()">isManualValidation</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#sameConfig(org.eclipse.wst.validation.Validator)">sameConfig</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setBuildValidation(boolean)">setBuildValidation</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setManualValidation(boolean)">setManualValidation</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setMarkerId(java.lang.String)">setMarkerId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setSourceId(java.lang.String)">setSourceId</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#setVersion(int)">setVersion</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidate(IResource, boolean, boolean)">shouldValidate</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidate(IResource, org.eclipse.wst.validation.internal.ValType)">shouldValidate</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidateProject(IProject, boolean, boolean)">shouldValidateProject</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidateProject(IProject, org.eclipse.wst.validation.internal.ValType)">shouldValidateProject</A>, <A HREF="../../../../org/eclipse/wst/validation/Validator.html#toString()">toString</A></CODE></TD>
 </TR>
 </TABLE>
 &nbsp;<A NAME="methods_inherited_from_class_java.lang.Object"><!-- --></A>
@@ -458,16 +481,17 @@
 </DL>
 <HR>
 
-<A NAME="clean(IProject, IProgressMonitor)"><!-- --></A><H3>
+<A NAME="clean(IProject, org.eclipse.wst.validation.internal.ValOperation, IProgressMonitor)"><!-- --></A><H3>
 clean</H3>
 <PRE>
 public void <B>clean</B>(IProject&nbsp;project,
+                  org.eclipse.wst.validation.internal.ValOperation&nbsp;operation,
                   IProgressMonitor&nbsp;monitor)</PRE>
 <DL>
 <DD>Let the validator know that a clean is about to happen.
 <P>
 <DD><DL>
-<DT><B>Overrides:</B><DD><CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#clean(IProject, IProgressMonitor)">clean</A></CODE> in class <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A></CODE></DL>
+<DT><B>Overrides:</B><DD><CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#clean(IProject, org.eclipse.wst.validation.internal.ValOperation, IProgressMonitor)">clean</A></CODE> in class <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A></CODE></DL>
 </DD>
 <DD><DL>
 <DT><B>Parameters:</B><DD><CODE>project</CODE> - the project that is being cleaned. This can be null which means that the workspace
@@ -654,7 +678,7 @@
 public boolean <B>isChanged</B>()</PRE>
 <DL>
 <DD><B>Description copied from class: <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#isChanged()">Validator</A></CODE></B></DD>
-<DD>Has the validator changed since it was last created or copied?
+<DD>Has the validator changed since it was last created or copied? Or was it migrated from an earlier version.
 <P>
 <DD><DL>
 <DT><B>Overrides:</B><DD><CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#isChanged()">isChanged</A></CODE> in class <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A></CODE></DL>
@@ -665,6 +689,30 @@
 </DL>
 <HR>
 
+<A NAME="shouldClearMarkers(org.eclipse.wst.validation.ValidationEvent)"><!-- --></A><H3>
+shouldClearMarkers</H3>
+<PRE>
+public boolean <B>shouldClearMarkers</B>(<A HREF="../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A>&nbsp;event)</PRE>
+<DL>
+<DD><B>Description copied from class: <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldClearMarkers(org.eclipse.wst.validation.ValidationEvent)">Validator</A></CODE></B></DD>
+<DD>Should the validation framework first clear the markers that this
+ validator has placed on this resource? This method can be overridden by
+ validator implementors to provide a validator specific behavior.
+<P>
+<DD><DL>
+<DT><B>Overrides:</B><DD><CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldClearMarkers(org.eclipse.wst.validation.ValidationEvent)">shouldClearMarkers</A></CODE> in class <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A></CODE></DL>
+</DD>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>event</CODE> - The validation event that triggered the validation.
+<DT><B>Returns:</B><DD>true if the validation framework should first clear all the
+         markers that this validator produced. This is the default
+         behavior. Return false to leave the markers unchanged. It then
+         becomes the responsibility of the validator to manage it's own
+         markers for this resource, for this validation event.</DL>
+</DD>
+</DL>
+<HR>
+
 <A NAME="setDelegatingId(java.lang.String)"><!-- --></A><H3>
 setDelegatingId</H3>
 <PRE>
@@ -731,8 +779,35 @@
 <DT><B>Specified by:</B><DD><CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#validate(IResource, int, org.eclipse.wst.validation.internal.ValOperation, IProgressMonitor)">validate</A></CODE> in class <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A></CODE></DL>
 </DD>
 <DD><DL>
-<DT><B>Parameters:</B><DD><CODE>resource</CODE> - the resource to be validated<DD><CODE>kind</CODE> - the kind of resource change, see IResourceDelta for values.<DD><CODE>operation</CODE> - the operation that this validation is running under. This can be null.<DD><CODE>monitor</CODE> - a way to report progress. This can be null.
-<DT><B>Returns:</B><DD>the result of doing the validation, it can be, but usually isn't null.</DL>
+<DT><B>Parameters:</B><DD><CODE>resource</CODE> - The resource to be validated.<DD><CODE>kind</CODE> - The kind of resource change, see IResourceDelta for values.<DD><CODE>operation</CODE> - The operation that this validation is running under. This can
+            be null.<DD><CODE>monitor</CODE> - A way to report progress. This can be null.
+<DT><B>Returns:</B><DD>the result of doing the validation, it can be, but usually isn't
+         null.</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="validate(IResource, int, org.eclipse.wst.validation.internal.ValOperation, IProgressMonitor, org.eclipse.wst.validation.ValidationEvent)"><!-- --></A><H3>
+validate</H3>
+<PRE>
+public <A HREF="../../../../org/eclipse/wst/validation/ValidationResult.html" title="class in org.eclipse.wst.validation">ValidationResult</A> <B>validate</B>(IResource&nbsp;resource,
+                                 int&nbsp;kind,
+                                 org.eclipse.wst.validation.internal.ValOperation&nbsp;operation,
+                                 IProgressMonitor&nbsp;monitor,
+                                 <A HREF="../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A>&nbsp;event)</PRE>
+<DL>
+<DD><B>Description copied from class: <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#validate(IResource, int, org.eclipse.wst.validation.internal.ValOperation, IProgressMonitor, org.eclipse.wst.validation.ValidationEvent)">Validator</A></CODE></B></DD>
+<DD>Validate the resource.
+<P>
+<DD><DL>
+<DT><B>Overrides:</B><DD><CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#validate(IResource, int, org.eclipse.wst.validation.internal.ValOperation, IProgressMonitor, org.eclipse.wst.validation.ValidationEvent)">validate</A></CODE> in class <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A></CODE></DL>
+</DD>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>resource</CODE> - The resource to be validated.<DD><CODE>kind</CODE> - The kind of resource change, see IResourceDelta for values.<DD><CODE>operation</CODE> - The operation that this validation is running under. This can
+            be null.<DD><CODE>monitor</CODE> - A way to report progress. This can be null.<DD><CODE>event</CODE> - An event that describes in more detail what should be
+            validated and why it should be validated. This can be null.
+<DT><B>Returns:</B><DD>the result of doing the validation, it can be, but usually isn't
+         null.</DL>
 </DD>
 </DL>
 <HR>
@@ -818,17 +893,12 @@
 </DL>
 <HR>
 
-<A NAME="become(org.eclipse.wst.validation.Validator)"><!-- --></A><H3>
-become</H3>
+<A NAME="replaceFilterGroup(org.eclipse.wst.validation.internal.model.FilterGroup, org.eclipse.wst.validation.internal.model.FilterGroup)"><!-- --></A><H3>
+replaceFilterGroup</H3>
 <PRE>
-public void <B>become</B>(<A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>&nbsp;val)</PRE>
+public void <B>replaceFilterGroup</B>(org.eclipse.wst.validation.internal.model.FilterGroup&nbsp;existing,
+                               org.eclipse.wst.validation.internal.model.FilterGroup&nbsp;merged)</PRE>
 <DL>
-<DD><B>Description copied from class: <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#become(org.eclipse.wst.validation.Validator)">Validator</A></CODE></B></DD>
-<DD>Take the instance variables from the incoming validator and set them to yourself.
-<P>
-<DD><DL>
-<DT><B>Overrides:</B><DD><CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html#become(org.eclipse.wst.validation.Validator)">become</A></CODE> in class <CODE><A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A></CODE></DL>
-</DD>
 <DD><DL>
 </DL>
 </DD>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Validator.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Validator.html
index 29f48d9..10606f5 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Validator.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/Validator.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:54 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Validator
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
@@ -159,7 +159,7 @@
 <B>Constructor Summary</B></FONT></TH>
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
-<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.html#Validator()">Validator</A></B>()</CODE>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.html#Validator(IProject)">Validator</A></B>(IProject&nbsp;project)</CODE>
 
 <BR>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
@@ -201,14 +201,6 @@
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>&nbsp;void</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.html#become(org.eclipse.wst.validation.Validator)">become</A></B>(<A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>&nbsp;validator)</CODE>
-
-<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Take the instance variables from the incoming validator and set them to yourself.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE>&nbsp;void</CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.html#bumpChangeCountGlobal()">bumpChangeCountGlobal</A></B>()</CODE>
 
 <BR>
@@ -225,7 +217,8 @@
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>&nbsp;void</CODE></FONT></TD>
-<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.html#clean(IProject, IProgressMonitor)">clean</A></B>(IProject&nbsp;project,
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.html#clean(IProject, org.eclipse.wst.validation.internal.ValOperation, IProgressMonitor)">clean</A></B>(IProject&nbsp;project,
+      org.eclipse.wst.validation.internal.ValOperation&nbsp;operation,
       IProgressMonitor&nbsp;monitor)</CODE>
 
 <BR>
@@ -373,6 +366,14 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.html#hasGlobalChanges()">hasGlobalChanges</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>&nbsp;int</CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.html#hashCodeForConfig()">hashCodeForConfig</A></B>()</CODE>
 
@@ -422,7 +423,7 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE>&nbsp;void</CODE></FONT></TD>
+<CODE>&nbsp;boolean</CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.html#setBuildValidation(boolean)">setBuildValidation</A></B>(boolean&nbsp;buildValidation)</CODE>
 
 <BR>
@@ -439,7 +440,7 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE>&nbsp;void</CODE></FONT></TD>
+<CODE>&nbsp;boolean</CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.html#setManualValidation(boolean)">setManualValidation</A></B>(boolean&nbsp;manualValidation)</CODE>
 
 <BR>
@@ -472,6 +473,15 @@
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>&nbsp;boolean</CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldClearMarkers(org.eclipse.wst.validation.ValidationEvent)">shouldClearMarkers</A></B>(<A HREF="../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A>&nbsp;event)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Should the validation framework first clear the markers that this
+ validator has placed on this resource?</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;boolean</CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.html#shouldValidate(IResource, boolean, boolean)">shouldValidate</A></B>(IResource&nbsp;resource,
                boolean&nbsp;isManual,
                boolean&nbsp;isBuild)</CODE>
@@ -530,6 +540,18 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../org/eclipse/wst/validation/ValidationResult.html" title="class in org.eclipse.wst.validation">ValidationResult</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.html#validate(IResource, int, org.eclipse.wst.validation.internal.ValOperation, IProgressMonitor, org.eclipse.wst.validation.ValidationEvent)">validate</A></B>(IResource&nbsp;resource,
+         int&nbsp;kind,
+         org.eclipse.wst.validation.internal.ValOperation&nbsp;operation,
+         IProgressMonitor&nbsp;monitor,
+         <A HREF="../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A>&nbsp;event)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Validate the resource.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>&nbsp;void</CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/Validator.html#validationFinishing(IProject, org.eclipse.wst.validation.ValidationState, IProgressMonitor)">validationFinishing</A></B>(IProject&nbsp;project,
                     <A HREF="../../../../org/eclipse/wst/validation/ValidationState.html" title="class in org.eclipse.wst.validation">ValidationState</A>&nbsp;state,
@@ -571,10 +593,10 @@
 </TR>
 </TABLE>
 
-<A NAME="Validator()"><!-- --></A><H3>
+<A NAME="Validator(IProject)"><!-- --></A><H3>
 Validator</H3>
 <PRE>
-public <B>Validator</B>()</PRE>
+public <B>Validator</B>(IProject&nbsp;project)</PRE>
 <DL>
 </DL>
 
@@ -657,10 +679,11 @@
 </DL>
 <HR>
 
-<A NAME="clean(IProject, IProgressMonitor)"><!-- --></A><H3>
+<A NAME="clean(IProject, org.eclipse.wst.validation.internal.ValOperation, IProgressMonitor)"><!-- --></A><H3>
 clean</H3>
 <PRE>
 public void <B>clean</B>(IProject&nbsp;project,
+                  org.eclipse.wst.validation.internal.ValOperation&nbsp;operation,
                   IProgressMonitor&nbsp;monitor)</PRE>
 <DL>
 <DD>The project is being cleaned, this method gives the validator a chance to do any special cleanup.
@@ -721,6 +744,29 @@
 </DL>
 <HR>
 
+<A NAME="shouldClearMarkers(org.eclipse.wst.validation.ValidationEvent)"><!-- --></A><H3>
+shouldClearMarkers</H3>
+<PRE>
+public boolean <B>shouldClearMarkers</B>(<A HREF="../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A>&nbsp;event)</PRE>
+<DL>
+<DD>Should the validation framework first clear the markers that this
+ validator has placed on this resource? This method can be overridden by
+ validator implementors to provide a validator specific behavior.
+<P>
+<DD><DL>
+</DL>
+</DD>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>event</CODE> - The validation event that triggered the validation.
+<DT><B>Returns:</B><DD>true if the validation framework should first clear all the
+         markers that this validator produced. This is the default
+         behavior. Return false to leave the markers unchanged. It then
+         becomes the responsibility of the validator to manage it's own
+         markers for this resource, for this validation event.</DL>
+</DD>
+</DL>
+<HR>
+
 <A NAME="shouldValidate(IResource, boolean, boolean)"><!-- --></A><H3>
 shouldValidate</H3>
 <PRE>
@@ -817,8 +863,34 @@
 </DL>
 </DD>
 <DD><DL>
-<DT><B>Parameters:</B><DD><CODE>resource</CODE> - the resource to be validated<DD><CODE>kind</CODE> - the kind of resource change, see IResourceDelta for values.<DD><CODE>operation</CODE> - the operation that this validation is running under. This can be null.<DD><CODE>monitor</CODE> - a way to report progress. This can be null.
-<DT><B>Returns:</B><DD>the result of doing the validation, it can be, but usually isn't null.</DL>
+<DT><B>Parameters:</B><DD><CODE>resource</CODE> - The resource to be validated.<DD><CODE>kind</CODE> - The kind of resource change, see IResourceDelta for values.<DD><CODE>operation</CODE> - The operation that this validation is running under. This can
+            be null.<DD><CODE>monitor</CODE> - A way to report progress. This can be null.
+<DT><B>Returns:</B><DD>the result of doing the validation, it can be, but usually isn't
+         null.</DL>
+</DD>
+</DL>
+<HR>
+
+<A NAME="validate(IResource, int, org.eclipse.wst.validation.internal.ValOperation, IProgressMonitor, org.eclipse.wst.validation.ValidationEvent)"><!-- --></A><H3>
+validate</H3>
+<PRE>
+public <A HREF="../../../../org/eclipse/wst/validation/ValidationResult.html" title="class in org.eclipse.wst.validation">ValidationResult</A> <B>validate</B>(IResource&nbsp;resource,
+                                 int&nbsp;kind,
+                                 org.eclipse.wst.validation.internal.ValOperation&nbsp;operation,
+                                 IProgressMonitor&nbsp;monitor,
+                                 <A HREF="../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A>&nbsp;event)</PRE>
+<DL>
+<DD>Validate the resource.
+<P>
+<DD><DL>
+</DL>
+</DD>
+<DD><DL>
+<DT><B>Parameters:</B><DD><CODE>resource</CODE> - The resource to be validated.<DD><CODE>kind</CODE> - The kind of resource change, see IResourceDelta for values.<DD><CODE>operation</CODE> - The operation that this validation is running under. This can
+            be null.<DD><CODE>monitor</CODE> - A way to report progress. This can be null.<DD><CODE>event</CODE> - An event that describes in more detail what should be
+            validated and why it should be validated. This can be null.
+<DT><B>Returns:</B><DD>the result of doing the validation, it can be, but usually isn't
+         null.</DL>
 </DD>
 </DL>
 <HR>
@@ -1008,7 +1080,7 @@
 <A NAME="setManualValidation(boolean)"><!-- --></A><H3>
 setManualValidation</H3>
 <PRE>
-public void <B>setManualValidation</B>(boolean&nbsp;manualValidation)</PRE>
+public boolean <B>setManualValidation</B>(boolean&nbsp;manualValidation)</PRE>
 <DL>
 <DD>Set whether this validator should be triggered as part of a manual validation.
 <P>
@@ -1016,7 +1088,8 @@
 </DL>
 </DD>
 <DD><DL>
-<DT><B>Parameters:</B><DD><CODE>manualValidation</CODE> - </DL>
+<DT><B>Parameters:</B><DD><CODE>manualValidation</CODE> - 
+<DT><B>Returns:</B><DD>true if the setting changed.</DL>
 </DD>
 </DL>
 <HR>
@@ -1042,7 +1115,7 @@
 <PRE>
 public boolean <B>isChanged</B>()</PRE>
 <DL>
-<DD>Has the validator changed since it was last created or copied?
+<DD>Has the validator changed since it was last created or copied? Or was it migrated from an earlier version.
 <P>
 <DD><DL>
 </DL>
@@ -1056,7 +1129,7 @@
 <A NAME="setBuildValidation(boolean)"><!-- --></A><H3>
 setBuildValidation</H3>
 <PRE>
-public void <B>setBuildValidation</B>(boolean&nbsp;buildValidation)</PRE>
+public boolean <B>setBuildValidation</B>(boolean&nbsp;buildValidation)</PRE>
 <DL>
 <DD>Set whether this validator should be triggered by the build process.
 <P>
@@ -1064,7 +1137,8 @@
 </DL>
 </DD>
 <DD><DL>
-<DT><B>Parameters:</B><DD><CODE>buildValidation</CODE> - </DL>
+<DT><B>Parameters:</B><DD><CODE>buildValidation</CODE> - 
+<DT><B>Returns:</B><DD>true if the setting changed.</DL>
 </DD>
 </DL>
 <HR>
@@ -1173,22 +1247,6 @@
 </DL>
 <HR>
 
-<A NAME="become(org.eclipse.wst.validation.Validator)"><!-- --></A><H3>
-become</H3>
-<PRE>
-public void <B>become</B>(<A HREF="../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>&nbsp;validator)</PRE>
-<DL>
-<DD>Take the instance variables from the incoming validator and set them to yourself.
-<P>
-<DD><DL>
-</DL>
-</DD>
-<DD><DL>
-<DT><B>Parameters:</B><DD><CODE>validator</CODE> - </DL>
-</DD>
-</DL>
-<HR>
-
 <A NAME="getChangeCountGlobal()"><!-- --></A><H3>
 getChangeCountGlobal</H3>
 <PRE>
@@ -1203,6 +1261,20 @@
 </DL>
 <HR>
 
+<A NAME="hasGlobalChanges()"><!-- --></A><H3>
+hasGlobalChanges</H3>
+<PRE>
+public boolean <B>hasGlobalChanges</B>()</PRE>
+<DL>
+<DD><DL>
+</DL>
+</DD>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
 <A NAME="getChangeCountMessages()"><!-- --></A><H3>
 getChangeCountMessages</H3>
 <PRE>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidatorMessage.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidatorMessage.html
index 0715c3c..84f3ebd 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidatorMessage.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/ValidatorMessage.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 ValidatorMessage
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
@@ -151,6 +151,14 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../org/eclipse/wst/validation/ValidatorMessage.html" title="class in org.eclipse.wst.validation">ValidatorMessage</A></CODE></FONT></TD>
+<TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidatorMessage.html#asCopy()">asCopy</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Answer a copy of yourself.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>static&nbsp;<A HREF="../../../../org/eclipse/wst/validation/ValidatorMessage.html" title="class in org.eclipse.wst.validation">ValidatorMessage</A></CODE></FONT></TD>
 <TD><CODE><B><A HREF="../../../../org/eclipse/wst/validation/ValidatorMessage.html#create(java.lang.String, IResource)">create</A></B>(java.lang.String&nbsp;message,
        IResource&nbsp;resource)</CODE>
@@ -326,6 +334,19 @@
 </DL>
 <HR>
 
+<A NAME="asCopy()"><!-- --></A><H3>
+asCopy</H3>
+<PRE>
+public <A HREF="../../../../org/eclipse/wst/validation/ValidatorMessage.html" title="class in org.eclipse.wst.validation">ValidatorMessage</A> <B>asCopy</B>()</PRE>
+<DL>
+<DD>Answer a copy of yourself.
+<P>
+<DD><DL>
+</DL>
+</DD>
+</DL>
+<HR>
+
 <A NAME="getAttribute(java.lang.String)"><!-- --></A><H3>
 getAttribute</H3>
 <PRE>
@@ -529,7 +550,8 @@
  table. The values must be an instance of one of the following classes:
  <code>String</code>, <code>Integer</code>, or <code>Boolean</code>.
  Attributes previously set on the marker but not included in the given map
- are considered to be removals. Setting the given map to be
+ are considered to be removals. This includes the text of the message.
+ Setting the given map to be
  <code>null</code> is equivalent to removing all marker attributes.
 <P>
 <DD><DL>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/AbstractValidator.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/AbstractValidator.html
index 9a223c8..2e51fb3 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/AbstractValidator.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/AbstractValidator.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Class org.eclipse.wst.validation.AbstractValidator
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/DependentResource.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/DependentResource.html
index 38950b1..37af1ac 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/DependentResource.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/DependentResource.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Class org.eclipse.wst.validation.DependentResource
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Friend.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Friend.html
index 8041ab0..ec4f773 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Friend.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Friend.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Class org.eclipse.wst.validation.Friend
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/IDependencyIndex.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/IDependencyIndex.html
index 062b090..1b69aef 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/IDependencyIndex.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/IDependencyIndex.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Interface org.eclipse.wst.validation.IDependencyIndex
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/IMutableValidator.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/IMutableValidator.html
new file mode 100644
index 0000000..051ad21
--- /dev/null
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/IMutableValidator.html
@@ -0,0 +1,208 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
+<TITLE>
+Uses of Interface org.eclipse.wst.validation.IMutableValidator
+</TITLE>
+
+<META NAME="date" CONTENT="2009-01-27">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Uses of Interface org.eclipse.wst.validation.IMutableValidator";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../serialized-form.html"><FONT CLASS="NavBarFont1"><B>Serialized</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../../index.html?org/eclipse/wst/validation/\class-useIMutableValidator.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="IMutableValidator.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+<B>Uses of Interface<br>org.eclipse.wst.validation.IMutableValidator</B></H2>
+</CENTER>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+Packages that use <A HREF="../../../../../org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation">IMutableValidator</A></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><A HREF="#org.eclipse.wst.validation"><B>org.eclipse.wst.validation</B></A></TD>
+<TD>A framework for calling validators that are build based.&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+<A NAME="org.eclipse.wst.validation"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+Uses of <A HREF="../../../../../org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation">IMutableValidator</A> in <A HREF="../../../../../org/eclipse/wst/validation/package-summary.html">org.eclipse.wst.validation</A></FONT></TH>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="2">Methods in <A HREF="../../../../../org/eclipse/wst/validation/package-summary.html">org.eclipse.wst.validation</A> that return <A HREF="../../../../../org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation">IMutableValidator</A></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../../org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation">IMutableValidator</A>[]</CODE></FONT></TD>
+<TD><CODE><B>MutableWorkspaceSettings.</B><B><A HREF="../../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html#getValidators()">getValidators</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../../org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation">IMutableValidator</A>[]</CODE></FONT></TD>
+<TD><CODE><B>MutableProjectSettings.</B><B><A HREF="../../../../../org/eclipse/wst/validation/MutableProjectSettings.html#getValidators()">getValidators</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="2">Constructors in <A HREF="../../../../../org/eclipse/wst/validation/package-summary.html">org.eclipse.wst.validation</A> with parameters of type <A HREF="../../../../../org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation">IMutableValidator</A></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../../../org/eclipse/wst/validation/MutableProjectSettings.html#MutableProjectSettings(IProject, org.eclipse.wst.validation.IMutableValidator[])">MutableProjectSettings</A></B>(IProject&nbsp;project,
+                       <A HREF="../../../../../org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation">IMutableValidator</A>[]&nbsp;validators)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><CODE><B><A HREF="../../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html#MutableWorkspaceSettings(org.eclipse.wst.validation.IMutableValidator[], org.eclipse.wst.validation.internal.model.GlobalPreferencesValues)">MutableWorkspaceSettings</A></B>(<A HREF="../../../../../org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation">IMutableValidator</A>[]&nbsp;validators,
+                         org.eclipse.wst.validation.internal.model.GlobalPreferencesValues&nbsp;values)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../serialized-form.html"><FONT CLASS="NavBarFont1"><B>Serialized</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../../index.html?org/eclipse/wst/validation/\class-useIMutableValidator.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="IMutableValidator.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/IPerformanceMonitor.CollectionLevel.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/IPerformanceMonitor.CollectionLevel.html
index e2e7ae4..4b9780c 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/IPerformanceMonitor.CollectionLevel.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/IPerformanceMonitor.CollectionLevel.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Class org.eclipse.wst.validation.IPerformanceMonitor.CollectionLevel
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/IPerformanceMonitor.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/IPerformanceMonitor.html
index fff6174..8ec29e2 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/IPerformanceMonitor.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/IPerformanceMonitor.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Interface org.eclipse.wst.validation.IPerformanceMonitor
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/IValidatorGroupListener.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/IValidatorGroupListener.html
index 4e6d82a..5fec1ee 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/IValidatorGroupListener.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/IValidatorGroupListener.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Interface org.eclipse.wst.validation.IValidatorGroupListener
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/MessageSeveritySetting.Severity.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/MessageSeveritySetting.Severity.html
index a1ba239..9809030 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/MessageSeveritySetting.Severity.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/MessageSeveritySetting.Severity.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Class org.eclipse.wst.validation.MessageSeveritySetting.Severity
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/MessageSeveritySetting.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/MessageSeveritySetting.html
index 71f2569..ce1e888 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/MessageSeveritySetting.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/MessageSeveritySetting.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Class org.eclipse.wst.validation.MessageSeveritySetting
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/MutableProjectSettings.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/MutableProjectSettings.html
new file mode 100644
index 0000000..05c57a9
--- /dev/null
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/MutableProjectSettings.html
@@ -0,0 +1,196 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
+<TITLE>
+Uses of Class org.eclipse.wst.validation.MutableProjectSettings
+</TITLE>
+
+<META NAME="date" CONTENT="2009-01-27">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Uses of Class org.eclipse.wst.validation.MutableProjectSettings";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../org/eclipse/wst/validation/MutableProjectSettings.html" title="class in org.eclipse.wst.validation"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../serialized-form.html"><FONT CLASS="NavBarFont1"><B>Serialized</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../../index.html?org/eclipse/wst/validation/\class-useMutableProjectSettings.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="MutableProjectSettings.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+<B>Uses of Class<br>org.eclipse.wst.validation.MutableProjectSettings</B></H2>
+</CENTER>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+Packages that use <A HREF="../../../../../org/eclipse/wst/validation/MutableProjectSettings.html" title="class in org.eclipse.wst.validation">MutableProjectSettings</A></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><A HREF="#org.eclipse.wst.validation"><B>org.eclipse.wst.validation</B></A></TD>
+<TD>A framework for calling validators that are build based.&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+<A NAME="org.eclipse.wst.validation"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+Uses of <A HREF="../../../../../org/eclipse/wst/validation/MutableProjectSettings.html" title="class in org.eclipse.wst.validation">MutableProjectSettings</A> in <A HREF="../../../../../org/eclipse/wst/validation/package-summary.html">org.eclipse.wst.validation</A></FONT></TH>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="2">Methods in <A HREF="../../../../../org/eclipse/wst/validation/package-summary.html">org.eclipse.wst.validation</A> that return <A HREF="../../../../../org/eclipse/wst/validation/MutableProjectSettings.html" title="class in org.eclipse.wst.validation">MutableProjectSettings</A></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../../org/eclipse/wst/validation/MutableProjectSettings.html" title="class in org.eclipse.wst.validation">MutableProjectSettings</A></CODE></FONT></TD>
+<TD><CODE><B>ValidationFramework.</B><B><A HREF="../../../../../org/eclipse/wst/validation/ValidationFramework.html#getProjectSettings(IProject)">getProjectSettings</A></B>(IProject&nbsp;project)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Answer the validation settings that have been defined on the
+ project.</TD>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="2">Methods in <A HREF="../../../../../org/eclipse/wst/validation/package-summary.html">org.eclipse.wst.validation</A> with parameters of type <A HREF="../../../../../org/eclipse/wst/validation/MutableProjectSettings.html" title="class in org.eclipse.wst.validation">MutableProjectSettings</A></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B>ValidationFramework.</B><B><A HREF="../../../../../org/eclipse/wst/validation/ValidationFramework.html#applyChanges(org.eclipse.wst.validation.MutableProjectSettings, boolean)">applyChanges</A></B>(<A HREF="../../../../../org/eclipse/wst/validation/MutableProjectSettings.html" title="class in org.eclipse.wst.validation">MutableProjectSettings</A>&nbsp;settings,
+             boolean&nbsp;persist)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Apply the changes that have been been to the validation settings.</TD>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../org/eclipse/wst/validation/MutableProjectSettings.html" title="class in org.eclipse.wst.validation"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../serialized-form.html"><FONT CLASS="NavBarFont1"><B>Serialized</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../../index.html?org/eclipse/wst/validation/\class-useMutableProjectSettings.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="MutableProjectSettings.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/MutableWorkspaceSettings.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/MutableWorkspaceSettings.html
new file mode 100644
index 0000000..85407ff
--- /dev/null
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/MutableWorkspaceSettings.html
@@ -0,0 +1,195 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
+<TITLE>
+Uses of Class org.eclipse.wst.validation.MutableWorkspaceSettings
+</TITLE>
+
+<META NAME="date" CONTENT="2009-01-27">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Uses of Class org.eclipse.wst.validation.MutableWorkspaceSettings";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html" title="class in org.eclipse.wst.validation"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../serialized-form.html"><FONT CLASS="NavBarFont1"><B>Serialized</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../../index.html?org/eclipse/wst/validation/\class-useMutableWorkspaceSettings.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="MutableWorkspaceSettings.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+<B>Uses of Class<br>org.eclipse.wst.validation.MutableWorkspaceSettings</B></H2>
+</CENTER>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+Packages that use <A HREF="../../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html" title="class in org.eclipse.wst.validation">MutableWorkspaceSettings</A></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><A HREF="#org.eclipse.wst.validation"><B>org.eclipse.wst.validation</B></A></TD>
+<TD>A framework for calling validators that are build based.&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+<A NAME="org.eclipse.wst.validation"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+Uses of <A HREF="../../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html" title="class in org.eclipse.wst.validation">MutableWorkspaceSettings</A> in <A HREF="../../../../../org/eclipse/wst/validation/package-summary.html">org.eclipse.wst.validation</A></FONT></TH>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="2">Methods in <A HREF="../../../../../org/eclipse/wst/validation/package-summary.html">org.eclipse.wst.validation</A> that return <A HREF="../../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html" title="class in org.eclipse.wst.validation">MutableWorkspaceSettings</A></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html" title="class in org.eclipse.wst.validation">MutableWorkspaceSettings</A></CODE></FONT></TD>
+<TD><CODE><B>ValidationFramework.</B><B><A HREF="../../../../../org/eclipse/wst/validation/ValidationFramework.html#getWorkspaceSettings()">getWorkspaceSettings</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Answer the validation settings that have been defined at the workspace level.</TD>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="2">Methods in <A HREF="../../../../../org/eclipse/wst/validation/package-summary.html">org.eclipse.wst.validation</A> with parameters of type <A HREF="../../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html" title="class in org.eclipse.wst.validation">MutableWorkspaceSettings</A></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B>ValidationFramework.</B><B><A HREF="../../../../../org/eclipse/wst/validation/ValidationFramework.html#applyChanges(org.eclipse.wst.validation.MutableWorkspaceSettings, boolean)">applyChanges</A></B>(<A HREF="../../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html" title="class in org.eclipse.wst.validation">MutableWorkspaceSettings</A>&nbsp;settings,
+             boolean&nbsp;persist)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Apply the changes that have been been to the validation settings.</TD>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html" title="class in org.eclipse.wst.validation"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../serialized-form.html"><FONT CLASS="NavBarFont1"><B>Serialized</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../../index.html?org/eclipse/wst/validation/\class-useMutableWorkspaceSettings.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="MutableWorkspaceSettings.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/PerformanceCounters.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/PerformanceCounters.html
index 8e3aa96..bec8f5b 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/PerformanceCounters.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/PerformanceCounters.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Class org.eclipse.wst.validation.PerformanceCounters
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ReporterHelper.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ReporterHelper.html
index c844ade..44c7be5 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ReporterHelper.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ReporterHelper.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Class org.eclipse.wst.validation.ReporterHelper
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidationEvent.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidationEvent.html
new file mode 100644
index 0000000..ae5b6c1
--- /dev/null
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidationEvent.html
@@ -0,0 +1,230 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<!--NewPage-->
+<HTML>
+<HEAD>
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
+<TITLE>
+Uses of Class org.eclipse.wst.validation.ValidationEvent
+</TITLE>
+
+<META NAME="date" CONTENT="2009-01-27">
+
+<LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
+
+<SCRIPT type="text/javascript">
+function windowTitle()
+{
+    if (location.href.indexOf('is-external=true') == -1) {
+        parent.document.title="Uses of Class org.eclipse.wst.validation.ValidationEvent";
+    }
+}
+</SCRIPT>
+<NOSCRIPT>
+</NOSCRIPT>
+
+</HEAD>
+
+<BODY BGCOLOR="white" onload="windowTitle();">
+<HR>
+
+
+<!-- ========= START OF TOP NAVBAR ======= -->
+<A NAME="navbar_top"><!-- --></A>
+<A HREF="#skip-navbar_top" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_top_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../serialized-form.html"><FONT CLASS="NavBarFont1"><B>Serialized</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../../index.html?org/eclipse/wst/validation/\class-useValidationEvent.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="ValidationEvent.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_top"></A>
+<!-- ========= END OF TOP NAVBAR ========= -->
+
+<HR>
+<CENTER>
+<H2>
+<B>Uses of Class<br>org.eclipse.wst.validation.ValidationEvent</B></H2>
+</CENTER>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+Packages that use <A HREF="../../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><A HREF="#org.eclipse.wst.validation"><B>org.eclipse.wst.validation</B></A></TD>
+<TD>A framework for calling validators that are build based.&nbsp;</TD>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+<A NAME="org.eclipse.wst.validation"><!-- --></A>
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableHeadingColor">
+<TH ALIGN="left" COLSPAN="2"><FONT SIZE="+2">
+Uses of <A HREF="../../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A> in <A HREF="../../../../../org/eclipse/wst/validation/package-summary.html">org.eclipse.wst.validation</A></FONT></TH>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+
+<TABLE BORDER="1" WIDTH="100%" CELLPADDING="3" CELLSPACING="0" SUMMARY="">
+<TR BGCOLOR="#CCCCFF" CLASS="TableSubHeadingColor">
+<TH ALIGN="left" COLSPAN="2">Methods in <A HREF="../../../../../org/eclipse/wst/validation/package-summary.html">org.eclipse.wst.validation</A> with parameters of type <A HREF="../../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A></FONT></TH>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;boolean</CODE></FONT></TD>
+<TD><CODE><B>Validator.</B><B><A HREF="../../../../../org/eclipse/wst/validation/Validator.html#shouldClearMarkers(org.eclipse.wst.validation.ValidationEvent)">shouldClearMarkers</A></B>(<A HREF="../../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A>&nbsp;event)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Should the validation framework first clear the markers that this
+ validator has placed on this resource?</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;boolean</CODE></FONT></TD>
+<TD><CODE><B>Validator.V2.</B><B><A HREF="../../../../../org/eclipse/wst/validation/Validator.V2.html#shouldClearMarkers(org.eclipse.wst.validation.ValidationEvent)">shouldClearMarkers</A></B>(<A HREF="../../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A>&nbsp;event)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;boolean</CODE></FONT></TD>
+<TD><CODE><B>AbstractValidator.</B><B><A HREF="../../../../../org/eclipse/wst/validation/AbstractValidator.html#shouldClearMarkers(org.eclipse.wst.validation.ValidationEvent)">shouldClearMarkers</A></B>(<A HREF="../../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A>&nbsp;event)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Should the validation framework first clear the markers that this
+ validator has placed on this resource?</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../../org/eclipse/wst/validation/ValidationResult.html" title="class in org.eclipse.wst.validation">ValidationResult</A></CODE></FONT></TD>
+<TD><CODE><B>Validator.</B><B><A HREF="../../../../../org/eclipse/wst/validation/Validator.html#validate(IResource, int, org.eclipse.wst.validation.internal.ValOperation, IProgressMonitor, org.eclipse.wst.validation.ValidationEvent)">validate</A></B>(IResource&nbsp;resource,
+         int&nbsp;kind,
+         org.eclipse.wst.validation.internal.ValOperation&nbsp;operation,
+         IProgressMonitor&nbsp;monitor,
+         <A HREF="../../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A>&nbsp;event)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Validate the resource.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../../org/eclipse/wst/validation/ValidationResult.html" title="class in org.eclipse.wst.validation">ValidationResult</A></CODE></FONT></TD>
+<TD><CODE><B>Validator.V2.</B><B><A HREF="../../../../../org/eclipse/wst/validation/Validator.V2.html#validate(IResource, int, org.eclipse.wst.validation.internal.ValOperation, IProgressMonitor, org.eclipse.wst.validation.ValidationEvent)">validate</A></B>(IResource&nbsp;resource,
+         int&nbsp;kind,
+         org.eclipse.wst.validation.internal.ValOperation&nbsp;operation,
+         IProgressMonitor&nbsp;monitor,
+         <A HREF="../../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A>&nbsp;event)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../../org/eclipse/wst/validation/ValidationResult.html" title="class in org.eclipse.wst.validation">ValidationResult</A></CODE></FONT></TD>
+<TD><CODE><B>AbstractValidator.</B><B><A HREF="../../../../../org/eclipse/wst/validation/AbstractValidator.html#validate(org.eclipse.wst.validation.ValidationEvent, org.eclipse.wst.validation.ValidationState, IProgressMonitor)">validate</A></B>(<A HREF="../../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A>&nbsp;event,
+         <A HREF="../../../../../org/eclipse/wst/validation/ValidationState.html" title="class in org.eclipse.wst.validation">ValidationState</A>&nbsp;state,
+         IProgressMonitor&nbsp;monitor)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Validate the resource.</TD>
+</TR>
+</TABLE>
+&nbsp;
+<P>
+<HR>
+
+
+<!-- ======= START OF BOTTOM NAVBAR ====== -->
+<A NAME="navbar_bottom"><!-- --></A>
+<A HREF="#skip-navbar_bottom" title="Skip navigation links"></A>
+<TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY="">
+<TR>
+<TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1">
+<A NAME="navbar_bottom_firstrow"><!-- --></A>
+<TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY="">
+  <TR ALIGN="center" VALIGN="top">
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>Overview</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../package-summary.html"><FONT CLASS="NavBarFont1"><B>Package</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation"><FONT CLASS="NavBarFont1"><B>Class</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> &nbsp;<FONT CLASS="NavBarFont1Rev"><B>Use</B></FONT>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../serialized-form.html"><FONT CLASS="NavBarFont1"><B>Serialized</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>Deprecated</B></FONT></A>&nbsp;</TD>
+  <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1">    <A HREF="../../../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>Help</B></FONT></A>&nbsp;</TD>
+  </TR>
+</TABLE>
+</TD>
+<TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM>
+</EM>
+</TD>
+</TR>
+
+<TR>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+&nbsp;PREV&nbsp;
+&nbsp;NEXT</FONT></TD>
+<TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2">
+  <A HREF="../../../../../index.html?org/eclipse/wst/validation/\class-useValidationEvent.html" target="_top"><B>FRAMES</B></A>  &nbsp;
+&nbsp;<A HREF="ValidationEvent.html" target="_top"><B>NO FRAMES</B></A>  &nbsp;
+&nbsp;<SCRIPT type="text/javascript">
+  <!--
+  if(window==top) {
+    document.writeln('<A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>');
+  }
+  //-->
+</SCRIPT>
+<NOSCRIPT>
+  <A HREF="../../../../../allclasses-noframe.html"><B>All Classes</B></A>
+</NOSCRIPT>
+
+
+</FONT></TD>
+</TR>
+</TABLE>
+<A NAME="skip-navbar_bottom"></A>
+<!-- ======== END OF BOTTOM NAVBAR ======= -->
+
+<HR>
+
+</BODY>
+</HTML>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidationFramework.ResourceAdder.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidationFramework.ResourceAdder.html
index 9db2ba7..56c7ee6 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidationFramework.ResourceAdder.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidationFramework.ResourceAdder.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Class org.eclipse.wst.validation.ValidationFramework.ResourceAdder
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidationFramework.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidationFramework.html
index 69fd936..e5cafd2 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidationFramework.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidationFramework.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Class org.eclipse.wst.validation.ValidationFramework
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidationResult.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidationResult.html
index e8fb5b8..baee6e6 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidationResult.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidationResult.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Class org.eclipse.wst.validation.ValidationResult
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
 
@@ -111,7 +111,7 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE>abstract &nbsp;<A HREF="../../../../../org/eclipse/wst/validation/ValidationResult.html" title="class in org.eclipse.wst.validation">ValidationResult</A></CODE></FONT></TD>
+<CODE>&nbsp;<A HREF="../../../../../org/eclipse/wst/validation/ValidationResult.html" title="class in org.eclipse.wst.validation">ValidationResult</A></CODE></FONT></TD>
 <TD><CODE><B>AbstractValidator.</B><B><A HREF="../../../../../org/eclipse/wst/validation/AbstractValidator.html#validate(IResource, int, org.eclipse.wst.validation.ValidationState, IProgressMonitor)">validate</A></B>(IResource&nbsp;resource,
          int&nbsp;kind,
          <A HREF="../../../../../org/eclipse/wst/validation/ValidationState.html" title="class in org.eclipse.wst.validation">ValidationState</A>&nbsp;state,
@@ -153,6 +153,40 @@
 <BR>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
 </TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../../org/eclipse/wst/validation/ValidationResult.html" title="class in org.eclipse.wst.validation">ValidationResult</A></CODE></FONT></TD>
+<TD><CODE><B>Validator.</B><B><A HREF="../../../../../org/eclipse/wst/validation/Validator.html#validate(IResource, int, org.eclipse.wst.validation.internal.ValOperation, IProgressMonitor, org.eclipse.wst.validation.ValidationEvent)">validate</A></B>(IResource&nbsp;resource,
+         int&nbsp;kind,
+         org.eclipse.wst.validation.internal.ValOperation&nbsp;operation,
+         IProgressMonitor&nbsp;monitor,
+         <A HREF="../../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A>&nbsp;event)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Validate the resource.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../../org/eclipse/wst/validation/ValidationResult.html" title="class in org.eclipse.wst.validation">ValidationResult</A></CODE></FONT></TD>
+<TD><CODE><B>Validator.V2.</B><B><A HREF="../../../../../org/eclipse/wst/validation/Validator.V2.html#validate(IResource, int, org.eclipse.wst.validation.internal.ValOperation, IProgressMonitor, org.eclipse.wst.validation.ValidationEvent)">validate</A></B>(IResource&nbsp;resource,
+         int&nbsp;kind,
+         org.eclipse.wst.validation.internal.ValOperation&nbsp;operation,
+         IProgressMonitor&nbsp;monitor,
+         <A HREF="../../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A>&nbsp;event)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../../org/eclipse/wst/validation/ValidationResult.html" title="class in org.eclipse.wst.validation">ValidationResult</A></CODE></FONT></TD>
+<TD><CODE><B>AbstractValidator.</B><B><A HREF="../../../../../org/eclipse/wst/validation/AbstractValidator.html#validate(org.eclipse.wst.validation.ValidationEvent, org.eclipse.wst.validation.ValidationState, IProgressMonitor)">validate</A></B>(<A HREF="../../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A>&nbsp;event,
+         <A HREF="../../../../../org/eclipse/wst/validation/ValidationState.html" title="class in org.eclipse.wst.validation">ValidationState</A>&nbsp;state,
+         IProgressMonitor&nbsp;monitor)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Validate the resource.</TD>
+</TR>
 </TABLE>
 &nbsp;
 <P>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidationResults.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidationResults.html
index bd6ac8c..43e4c15 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidationResults.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidationResults.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Class org.eclipse.wst.validation.ValidationResults
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
 
@@ -112,6 +112,15 @@
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>&nbsp;<A HREF="../../../../../org/eclipse/wst/validation/ValidationResults.html" title="class in org.eclipse.wst.validation">ValidationResults</A></CODE></FONT></TD>
+<TD><CODE><B>ValidationFramework.</B><B><A HREF="../../../../../org/eclipse/wst/validation/ValidationFramework.html#validate(IFile, IProgressMonitor)">validate</A></B>(IFile&nbsp;file,
+         IProgressMonitor&nbsp;monitor)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Validate a specific file resource.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../../org/eclipse/wst/validation/ValidationResults.html" title="class in org.eclipse.wst.validation">ValidationResults</A></CODE></FONT></TD>
 <TD><CODE><B>ValidationFramework.</B><B><A HREF="../../../../../org/eclipse/wst/validation/ValidationFramework.html#validate(IProject[], boolean, boolean, IProgressMonitor)">validate</A></B>(IProject[]&nbsp;projects,
          boolean&nbsp;isManual,
          boolean&nbsp;isBuild,
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidationState.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidationState.html
index 8ecbda6..4eaa40d 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidationState.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidationState.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Class org.eclipse.wst.validation.ValidationState
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
 
@@ -122,7 +122,7 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE>abstract &nbsp;<A HREF="../../../../../org/eclipse/wst/validation/ValidationResult.html" title="class in org.eclipse.wst.validation">ValidationResult</A></CODE></FONT></TD>
+<CODE>&nbsp;<A HREF="../../../../../org/eclipse/wst/validation/ValidationResult.html" title="class in org.eclipse.wst.validation">ValidationResult</A></CODE></FONT></TD>
 <TD><CODE><B>AbstractValidator.</B><B><A HREF="../../../../../org/eclipse/wst/validation/AbstractValidator.html#validate(IResource, int, org.eclipse.wst.validation.ValidationState, IProgressMonitor)">validate</A></B>(IResource&nbsp;resource,
          int&nbsp;kind,
          <A HREF="../../../../../org/eclipse/wst/validation/ValidationState.html" title="class in org.eclipse.wst.validation">ValidationState</A>&nbsp;state,
@@ -133,6 +133,16 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../../org/eclipse/wst/validation/ValidationResult.html" title="class in org.eclipse.wst.validation">ValidationResult</A></CODE></FONT></TD>
+<TD><CODE><B>AbstractValidator.</B><B><A HREF="../../../../../org/eclipse/wst/validation/AbstractValidator.html#validate(org.eclipse.wst.validation.ValidationEvent, org.eclipse.wst.validation.ValidationState, IProgressMonitor)">validate</A></B>(<A HREF="../../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A>&nbsp;event,
+         <A HREF="../../../../../org/eclipse/wst/validation/ValidationState.html" title="class in org.eclipse.wst.validation">ValidationState</A>&nbsp;state,
+         IProgressMonitor&nbsp;monitor)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Validate the resource.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>&nbsp;void</CODE></FONT></TD>
 <TD><CODE><B>Validator.</B><B><A HREF="../../../../../org/eclipse/wst/validation/Validator.html#validationFinishing(IProject, org.eclipse.wst.validation.ValidationState, IProgressMonitor)">validationFinishing</A></B>(IProject&nbsp;project,
                     <A HREF="../../../../../org/eclipse/wst/validation/ValidationState.html" title="class in org.eclipse.wst.validation">ValidationState</A>&nbsp;state,
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Validator.Level.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Validator.Level.html
index dccf718..56415b3 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Validator.Level.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Validator.Level.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Class org.eclipse.wst.validation.Validator.Level
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Validator.V1.V1Copy.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Validator.V1.V1Copy.html
index e99c3a8..61eeb18 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Validator.V1.V1Copy.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Validator.V1.V1Copy.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Class org.eclipse.wst.validation.Validator.V1.V1Copy
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Validator.V1.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Validator.V1.html
index 6b5a42b..4c65806 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Validator.V1.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Validator.V1.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Class org.eclipse.wst.validation.Validator.V1
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Validator.V2.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Validator.V2.html
index 58517e7..dd17ed8 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Validator.V2.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Validator.V2.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Class org.eclipse.wst.validation.Validator.V2
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Validator.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Validator.html
index d825c84..1c9f725 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Validator.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/Validator.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Class org.eclipse.wst.validation.Validator
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
 
@@ -221,6 +221,23 @@
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>&nbsp;<A HREF="../../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>[]</CODE></FONT></TD>
+<TD><CODE><B>ValidationFramework.</B><B><A HREF="../../../../../org/eclipse/wst/validation/ValidationFramework.html#getValidators()">getValidators</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Answer copies of all the registered validators.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>[]</CODE></FONT></TD>
+<TD><CODE><B>ValidationFramework.</B><B><A HREF="../../../../../org/eclipse/wst/validation/ValidationFramework.html#getValidatorsConfiguredForProject(IProject)">getValidatorsConfiguredForProject</A></B>(IProject&nbsp;project)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Validators can use project level settings (Project natures and facets) to
+ determine if they are applicable to the project or not.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>[]</CODE></FONT></TD>
 <TD><CODE><B>ValidationFramework.</B><B><A HREF="../../../../../org/eclipse/wst/validation/ValidationFramework.html#getValidatorsFor(IResource)">getValidatorsFor</A></B>(IResource&nbsp;resource)</CODE>
 
 <BR>
@@ -264,38 +281,6 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE>&nbsp;void</CODE></FONT></TD>
-<TD><CODE><B>Validator.</B><B><A HREF="../../../../../org/eclipse/wst/validation/Validator.html#become(org.eclipse.wst.validation.Validator)">become</A></B>(<A HREF="../../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>&nbsp;validator)</CODE>
-
-<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Take the instance variables from the incoming validator and set them to yourself.</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE>&nbsp;void</CODE></FONT></TD>
-<TD><CODE><B>Validator.V1.</B><B><A HREF="../../../../../org/eclipse/wst/validation/Validator.V1.html#become(org.eclipse.wst.validation.Validator)">become</A></B>(<A HREF="../../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>&nbsp;val)</CODE>
-
-<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE>&nbsp;void</CODE></FONT></TD>
-<TD><CODE><B>Validator.V1.V1Copy.</B><B><A HREF="../../../../../org/eclipse/wst/validation/Validator.V1.V1Copy.html#become(org.eclipse.wst.validation.Validator)">become</A></B>(<A HREF="../../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>&nbsp;val)</CODE>
-
-<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
-<CODE>&nbsp;void</CODE></FONT></TD>
-<TD><CODE><B>Validator.V2.</B><B><A HREF="../../../../../org/eclipse/wst/validation/Validator.V2.html#become(org.eclipse.wst.validation.Validator)">become</A></B>(<A HREF="../../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>&nbsp;val)</CODE>
-
-<BR>
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
-</TR>
-<TR BGCOLOR="white" CLASS="TableRowColor">
-<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>&nbsp;int</CODE></FONT></TD>
 <TD><CODE><B>Validator.</B><B><A HREF="../../../../../org/eclipse/wst/validation/Validator.html#compareTo(org.eclipse.wst.validation.Validator)">compareTo</A></B>(<A HREF="../../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>&nbsp;validator)</CODE>
 
@@ -304,6 +289,15 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;boolean</CODE></FONT></TD>
+<TD><CODE><B>ValidationFramework.</B><B><A HREF="../../../../../org/eclipse/wst/validation/ValidationFramework.html#isLoaded(org.eclipse.wst.validation.Validator)">isLoaded</A></B>(<A HREF="../../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>&nbsp;validator)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Answer whether or not the validator has been activated, i.e. has the
+ bundle that defines the validator been loaded.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>static&nbsp;boolean</CODE></FONT></TD>
 <TD><CODE><B>Friend.</B><B><A HREF="../../../../../org/eclipse/wst/validation/Friend.html#isLoaded(org.eclipse.wst.validation.Validator)">isLoaded</A></B>(<A HREF="../../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>&nbsp;validator)</CODE>
 
@@ -320,6 +314,14 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B>ValidationFramework.</B><B><A HREF="../../../../../org/eclipse/wst/validation/ValidationFramework.html#saveValidators(org.eclipse.wst.validation.Validator[])">saveValidators</A></B>(<A HREF="../../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>[]&nbsp;validators)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Save the validators settings into the persistent store, there by making their settings the active settings.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>static&nbsp;void</CODE></FONT></TD>
 <TD><CODE><B>Friend.</B><B><A HREF="../../../../../org/eclipse/wst/validation/Friend.html#setMessages(org.eclipse.wst.validation.Validator, java.util.Map)">setMessages</A></B>(<A HREF="../../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>&nbsp;validator,
             java.util.Map&lt;java.lang.String,<A HREF="../../../../../org/eclipse/wst/validation/MessageSeveritySetting.html" title="class in org.eclipse.wst.validation">MessageSeveritySetting</A>&gt;&nbsp;map)</CODE>
@@ -329,6 +331,15 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>static&nbsp;void</CODE></FONT></TD>
+<TD><CODE><B>Friend.</B><B><A HREF="../../../../../org/eclipse/wst/validation/Friend.html#setMigrated(org.eclipse.wst.validation.Validator, boolean)">setMigrated</A></B>(<A HREF="../../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>&nbsp;validator,
+            boolean&nbsp;migrated)</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>static&nbsp;boolean</CODE></FONT></TD>
 <TD><CODE><B>Friend.</B><B><A HREF="../../../../../org/eclipse/wst/validation/Friend.html#shouldValidate(org.eclipse.wst.validation.Validator, IResource, boolean, boolean, org.eclipse.wst.validation.internal.ContentTypeWrapper)">shouldValidate</A></B>(<A HREF="../../../../../org/eclipse/wst/validation/Validator.html" title="class in org.eclipse.wst.validation">Validator</A>&nbsp;validator,
                IResource&nbsp;resource,
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidatorMessage.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidatorMessage.html
index 874d3fa..ebdc152 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidatorMessage.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/class-use/ValidatorMessage.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Class org.eclipse.wst.validation.ValidatorMessage
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" TITLE="Style">
 
@@ -111,6 +111,14 @@
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
 <TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../../org/eclipse/wst/validation/ValidatorMessage.html" title="class in org.eclipse.wst.validation">ValidatorMessage</A></CODE></FONT></TD>
+<TD><CODE><B>ValidatorMessage.</B><B><A HREF="../../../../../org/eclipse/wst/validation/ValidatorMessage.html#asCopy()">asCopy</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Answer a copy of yourself.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
 <CODE>static&nbsp;<A HREF="../../../../../org/eclipse/wst/validation/ValidatorMessage.html" title="class in org.eclipse.wst.validation">ValidatorMessage</A></CODE></FONT></TD>
 <TD><CODE><B>ValidatorMessage.</B><B><A HREF="../../../../../org/eclipse/wst/validation/ValidatorMessage.html#create(java.lang.String, IResource)">create</A></B>(java.lang.String&nbsp;message,
        IResource&nbsp;resource)</CODE>
@@ -134,6 +142,14 @@
 <BR>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Answer any validation messages that were added by the validator.</TD>
 </TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD ALIGN="right" VALIGN="top" WIDTH="1%"><FONT SIZE="-1">
+<CODE>&nbsp;<A HREF="../../../../../org/eclipse/wst/validation/ValidatorMessage.html" title="class in org.eclipse.wst.validation">ValidatorMessage</A>[]</CODE></FONT></TD>
+<TD><CODE><B>ValidationResult.</B><B><A HREF="../../../../../org/eclipse/wst/validation/ValidationResult.html#getMessagesAsCopy()">getMessagesAsCopy</A></B>()</CODE>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Answer a copy of any validation messages that were added by the validator.</TD>
+</TR>
 </TABLE>
 &nbsp;
 <P>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/doc-files/faq.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/doc-files/faq.html
new file mode 100644
index 0000000..8096d0a
--- /dev/null
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/doc-files/faq.html
@@ -0,0 +1,40 @@
+<html>
+<head>
+<title>Validation Framework - Frequently Asked Questions</title>
+</head>
+<body>
+<h1>Validation Framework - Frequently Asked Questions</h1>
+<h3>How do I create Problem Markers?</h3>
+<p>There are three different ways to create problem markers.</p>
+<ol>
+	<li>Use the native support in the validation framework.</li>
+	<li>Manage your own markers.</li>
+	<li>Use the support in the previous version of the validation framework.</li>
+</ol>
+<p>The first approach, is the recommended approach.</p>
+
+<h4>1. Use the native support in the validation framework</h4>
+<p>After you have finished performing your validation, and are returning control back to
+the validation framework, add your messages into the 
+<a href="../ValidationResult.html">ValidationResult</a> by using
+the <a href="../ValidationResult.html#add(org.eclipse.wst.validation.ValidatorMessage)">add(ValidatorMessage message)</a> method.
+
+<h4>2. Manage your own markers</h4>
+
+<p>Create and remove your own markers. So that summary information can still be displayed, set the counts of any newly
+created markers in the <a href="../ValidationResult.html">ValidationResult</a> by using the setSeverityXXX() methods.
+For example, if this validation pass generated two error markers, you would call 
+<a href="../ValidationResult.html#setSeverityError(int)">setSeverityError(2)</a>. 
+</p>
+
+<h4>3. Use the support in the previous version of the validation framework</h4>
+
+<p>If you are porting a validator that used the previous version of the validation framework, and you wish to continue to use an
+<A HREF="../../../../../org/eclipse/wst/validation/internal/provisional/core/IReporter.html">IReporter</a> to
+report your markers, you can continue to do so.</p>
+<p>For this approach, use the
+<a href="../ValidationResult.html#getReporter(IProgressMonitor)">getReporter(IProgressMonitor&nbsp;monitor)</a> method,
+and return your messages through the IReporter. If this method is called it is assumed by the framework, 
+that this IReporter will be used as the only way of passing messages back to the framework. 
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IMessage.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IMessage.html
index 412654d..0d8d7f2 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IMessage.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IMessage.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 IMessage
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IMetaModelContext.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IMetaModelContext.html
index a128b13..5609b67 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IMetaModelContext.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IMetaModelContext.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 IMetaModelContext
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IProjectValidationContext.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IProjectValidationContext.html
index f83580c..4942d7b 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IProjectValidationContext.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IProjectValidationContext.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 IProjectValidationContext
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IReporter.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IReporter.html
index ce6dbbb..b7e55ef 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IReporter.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IReporter.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 IReporter
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IValidationContext.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IValidationContext.html
index fbd58e9..4bbbf4b 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IValidationContext.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IValidationContext.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 IValidationContext
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IValidator.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IValidator.html
index d24cd04..1b1c66e 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IValidator.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IValidator.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 IValidator
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IValidatorJob.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IValidatorJob.html
index 05cf5ff..6f6efe8 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IValidatorJob.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/IValidatorJob.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 IValidatorJob
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/MessageLimitException.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/MessageLimitException.html
index b8c0880..3947043 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/MessageLimitException.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/MessageLimitException.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 MessageLimitException
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IMessage.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IMessage.html
index 7da29f6..862659d 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IMessage.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IMessage.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Interface org.eclipse.wst.validation.internal.provisional.core.IMessage
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IMetaModelContext.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IMetaModelContext.html
index d5e29a0..9fdac81 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IMetaModelContext.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IMetaModelContext.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Interface org.eclipse.wst.validation.internal.provisional.core.IMetaModelContext
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IProjectValidationContext.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IProjectValidationContext.html
index 1cbbc44..42b54d5 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IProjectValidationContext.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IProjectValidationContext.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Interface org.eclipse.wst.validation.internal.provisional.core.IProjectValidationContext
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IReporter.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IReporter.html
index 9e17c17..bfc32f3 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IReporter.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IReporter.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Interface org.eclipse.wst.validation.internal.provisional.core.IReporter
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IValidationContext.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IValidationContext.html
index 35f2dd8..2cd7f6e 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IValidationContext.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IValidationContext.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Interface org.eclipse.wst.validation.internal.provisional.core.IValidationContext
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IValidator.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IValidator.html
index cea5a3c..0168f1b 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IValidator.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IValidator.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Interface org.eclipse.wst.validation.internal.provisional.core.IValidator
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IValidatorJob.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IValidatorJob.html
index e560b26..55d0066 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IValidatorJob.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/IValidatorJob.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Interface org.eclipse.wst.validation.internal.provisional.core.IValidatorJob
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/MessageLimitException.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/MessageLimitException.html
index 6ca09b0..ec4cbdb 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/MessageLimitException.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/class-use/MessageLimitException.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Class org.eclipse.wst.validation.internal.provisional.core.MessageLimitException
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/package-frame.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/package-frame.html
index 448beff..edf1615 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/package-frame.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/package-frame.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 org.eclipse.wst.validation.internal.provisional.core
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/package-summary.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/package-summary.html
index 5265b55..5a11f72 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/package-summary.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/package-summary.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 org.eclipse.wst.validation.internal.provisional.core
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/package-use.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/package-use.html
index ed0f9b8..44e11e4 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/package-use.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/internal/provisional/core/package-use.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Package org.eclipse.wst.validation.internal.provisional.core
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../../../../stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/package-frame.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/package-frame.html
index 602a944..1aede36 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/package-frame.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/package-frame.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 org.eclipse.wst.validation
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
@@ -25,6 +25,8 @@
 <BR>
 <A HREF="IDependencyIndex.html" title="interface in org.eclipse.wst.validation" target="classFrame"><I>IDependencyIndex</I></A>
 <BR>
+<A HREF="IMutableValidator.html" title="interface in org.eclipse.wst.validation" target="classFrame"><I>IMutableValidator</I></A>
+<BR>
 <A HREF="IPerformanceMonitor.html" title="interface in org.eclipse.wst.validation" target="classFrame"><I>IPerformanceMonitor</I></A>
 <BR>
 <A HREF="IValidatorGroupListener.html" title="interface in org.eclipse.wst.validation" target="classFrame"><I>IValidatorGroupListener</I></A></FONT></TD>
@@ -46,10 +48,16 @@
 <BR>
 <A HREF="MessageSeveritySetting.html" title="class in org.eclipse.wst.validation" target="classFrame">MessageSeveritySetting</A>
 <BR>
+<A HREF="MutableProjectSettings.html" title="class in org.eclipse.wst.validation" target="classFrame">MutableProjectSettings</A>
+<BR>
+<A HREF="MutableWorkspaceSettings.html" title="class in org.eclipse.wst.validation" target="classFrame">MutableWorkspaceSettings</A>
+<BR>
 <A HREF="PerformanceCounters.html" title="class in org.eclipse.wst.validation" target="classFrame">PerformanceCounters</A>
 <BR>
 <A HREF="ReporterHelper.html" title="class in org.eclipse.wst.validation" target="classFrame">ReporterHelper</A>
 <BR>
+<A HREF="ValidationEvent.html" title="class in org.eclipse.wst.validation" target="classFrame">ValidationEvent</A>
+<BR>
 <A HREF="ValidationFramework.html" title="class in org.eclipse.wst.validation" target="classFrame">ValidationFramework</A>
 <BR>
 <A HREF="ValidationFramework.ResourceAdder.html" title="class in org.eclipse.wst.validation" target="classFrame">ValidationFramework.ResourceAdder</A>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/package-summary.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/package-summary.html
index dbccd21..17d6874 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/package-summary.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/package-summary.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 org.eclipse.wst.validation
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
@@ -98,6 +98,10 @@
 <TD>This service is used to specify the resources that a particular resource depends on.</TD>
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../../org/eclipse/wst/validation/IMutableValidator.html" title="interface in org.eclipse.wst.validation">IMutableValidator</A></B></TD>
+<TD>A validator that has fields that can be updated.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
 <TD WIDTH="15%"><B><A HREF="../../../../org/eclipse/wst/validation/IPerformanceMonitor.html" title="interface in org.eclipse.wst.validation">IPerformanceMonitor</A></B></TD>
 <TD>A service that collects performance information on validation operations.</TD>
 </TR>
@@ -133,6 +137,14 @@
 <TD>Associate a message severity with a message category.</TD>
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../../org/eclipse/wst/validation/MutableProjectSettings.html" title="class in org.eclipse.wst.validation">MutableProjectSettings</A></B></TD>
+<TD>This class holds the overall project validation settings.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../../org/eclipse/wst/validation/MutableWorkspaceSettings.html" title="class in org.eclipse.wst.validation">MutableWorkspaceSettings</A></B></TD>
+<TD>This class holds the overall workspace validation settings.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
 <TD WIDTH="15%"><B><A HREF="../../../../org/eclipse/wst/validation/PerformanceCounters.html" title="class in org.eclipse.wst.validation">PerformanceCounters</A></B></TD>
 <TD>Some performance information for a validation invocation.</TD>
 </TR>
@@ -141,6 +153,10 @@
 <TD>This is a temporary class to ease the transition from the previous validation framework.</TD>
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
+<TD WIDTH="15%"><B><A HREF="../../../../org/eclipse/wst/validation/ValidationEvent.html" title="class in org.eclipse.wst.validation">ValidationEvent</A></B></TD>
+<TD>An object that describes which object should be validated and what triggered its validation.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
 <TD WIDTH="15%"><B><A HREF="../../../../org/eclipse/wst/validation/ValidationFramework.html" title="class in org.eclipse.wst.validation">ValidationFramework</A></B></TD>
 <TD>The central class of the Validation Framework.</TD>
 </TR>
@@ -213,13 +229,14 @@
 
 <P>
 <p>A framework for calling validators that are build based.</p>
+<p>Also see <a href="doc-files/faq.html">Frequently Asked Questions</a></p>
 <p>
 There are two main types of validation, <b>build based</b> and 
 <b>as you type</b>. This framework supports build based
 validation. If auto build is turned on then the validators are called
 when the user saves their file. If auto build is not turned on then
 the validators are called when the user starts a build.</p>
-<p>This framework was added to WTP in version 3.4.</p>
+<p>This framework was added to WTP in version 3.0.</p>
 <h3>Dependency Support</h3>
 <p>Sometimes resources depend on other resources, to determine whether they are 
 valid or not. An example would be that an XML resource could depend on a DTD. If at some 
@@ -237,7 +254,7 @@
 product.
 <p>In particular when the validate method returns, a
 <a href="ValidationResult.html">ValidationResult</a> must be returned, inside of 
-this result, all your dependencies need to be specified with the&nbsp;
+this result, all your dependencies need to be specified with the
 <a href="ValidationResult.html#setDependsOn(org.eclipse.core.resources.IResource[])">
 setDependsOn</a> method.<p>In addition to keeping the dependency information 
 up-to-date through the normal course of validation, direct access is also 
@@ -245,6 +262,17 @@
 <a href="ValidationFramework.html#getDependencyIndex()">getDependencyIndex</a> 
 method. The <a href="IDependencyIndex.html">IDependencyIndex</a> allows you to 
 directly manipulate the dependency information for a validator.
+<h3>Entry Points into the Validation Framework</h3>
+<p>Here are some of the points where the platform calls into the framework:</p>
+<ul>
+<li><b>Builder</b> - ValidationBuilder</li>
+<li><b>IFacetedProjectListener</b> - ValManager</li>
+<li><b>IJobChangeListener</b> - ValidationOperation, ValidationOperation.ValidationLauncherJob</li>
+<li><b>IProjectChangeListener</b> - ValManager</li>
+<li><b>IPropertyChangeListener</b> - ValidationConfiguration, DisabledResourceManager</li>
+<li><b>IResourceChangeListener</b> - EventManger</li>
+<li><b>IValChangedListener</b> - ValManager, DisabledValidatorManager</li>
+</ul>
 <P>
 
 <P>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/package-use.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/package-use.html
index 3711e20..7429d3f 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/package-use.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/org/eclipse/wst/validation/package-use.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Uses of Package org.eclipse.wst.validation
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
 
@@ -120,6 +120,12 @@
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This service is used to specify the resources that a particular resource depends on.</TD>
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><B><A HREF="../../../../org/eclipse/wst/validation/class-use/IMutableValidator.html#org.eclipse.wst.validation"><B>IMutableValidator</B></A></B>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A validator that has fields that can be updated.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
 <TD><B><A HREF="../../../../org/eclipse/wst/validation/class-use/IPerformanceMonitor.html#org.eclipse.wst.validation"><B>IPerformanceMonitor</B></A></B>
 
 <BR>
@@ -144,12 +150,30 @@
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</TD>
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><B><A HREF="../../../../org/eclipse/wst/validation/class-use/MutableProjectSettings.html#org.eclipse.wst.validation"><B>MutableProjectSettings</B></A></B>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This class holds the overall project validation settings.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><B><A HREF="../../../../org/eclipse/wst/validation/class-use/MutableWorkspaceSettings.html#org.eclipse.wst.validation"><B>MutableWorkspaceSettings</B></A></B>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;This class holds the overall workspace validation settings.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
 <TD><B><A HREF="../../../../org/eclipse/wst/validation/class-use/PerformanceCounters.html#org.eclipse.wst.validation"><B>PerformanceCounters</B></A></B>
 
 <BR>
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Some performance information for a validation invocation.</TD>
 </TR>
 <TR BGCOLOR="white" CLASS="TableRowColor">
+<TD><B><A HREF="../../../../org/eclipse/wst/validation/class-use/ValidationEvent.html#org.eclipse.wst.validation"><B>ValidationEvent</B></A></B>
+
+<BR>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;An object that describes which object should be validated and what triggered its validation.</TD>
+</TR>
+<TR BGCOLOR="white" CLASS="TableRowColor">
 <TD><B><A HREF="../../../../org/eclipse/wst/validation/class-use/ValidationFramework.html#org.eclipse.wst.validation"><B>ValidationFramework</B></A></B>
 
 <BR>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/overview-frame.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/overview-frame.html
index c93ee38..a6942e2 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/overview-frame.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/overview-frame.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Overview List
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/overview-summary.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/overview-summary.html
index 160dd5f..c138162 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/overview-summary.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/overview-summary.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Overview
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
 
@@ -110,7 +110,7 @@
 <P>
 <p>A framework for calling validators that are build based.</p>
 <h2>Approach</h2>
-<p>In WTP 3.4 a new validation framework has been added. This was developed at 
+<p>In WTP 3.0 a new validation framework has been added. This was developed at 
 the request of validator owners and end users. To ease the transition to this 
 new framework, that approach that has been taken is to support both the old and 
 the new frameworks for a while. This means that the old validators work exactly 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/api/serialized-form.html b/docs/org.eclipse.wst.validation.doc.isv/reference/api/serialized-form.html
index 68c22c5..b679969 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/api/serialized-form.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/api/serialized-form.html
@@ -2,12 +2,12 @@
 <!--NewPage-->
 <HTML>
 <HEAD>
-<!-- Generated by javadoc (build 1.6.0) on Tue May 20 09:50:55 EDT 2008 -->
+<!-- Generated by javadoc (build 1.6.0) on Tue Jan 27 04:28:33 EST 2009 -->
 <TITLE>
 Serialized Form
 </TITLE>
 
-<META NAME="date" CONTENT="2008-05-20">
+<META NAME="date" CONTENT="2009-01-27">
 
 <LINK REL ="stylesheet" TYPE="text/css" HREF="stylesheet.css" TITLE="Style">
 
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/extension-points/index.html b/docs/org.eclipse.wst.validation.doc.isv/reference/extension-points/index.html
index 8e7ebc2..2cd4e15 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/extension-points/index.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/extension-points/index.html
@@ -9,7 +9,7 @@
    		<title>Validation Framework Extension Points</title>
 		<LINK REL="STYLESHEET" HREF="../../book.css" CHARSET="ISO-8859-1" TYPE="text/css">
 		</head>
-<body vlink="#800080" link="#0000FF">
+<body link="#0000FF" vlink="#800080">
 <center>
 <h1>Validation Framework Extension Points </h1>
 </center>The following extension points can be used to add new validators: <h3>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/extension-points/vf/org_eclipse_wst_validation_exclude.html b/docs/org.eclipse.wst.validation.doc.isv/reference/extension-points/vf/org_eclipse_wst_validation_exclude.html
index 6872ca7..81271f8 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/extension-points/vf/org_eclipse_wst_validation_exclude.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/extension-points/vf/org_eclipse_wst_validation_exclude.html
@@ -68,7 +68,7 @@
 <li><b>caseSensitive</b> - If the file name is not case senstitive, then this needs to be set to false.</li>
 <li><b>type</b> - Type of name, there are three choices. <ul><li>folder - specifies a project relative folder name.</li><li>file - a simple file name (i.e. no path information).</li><li>full - a fully qualified (project relative) file name.</li></ul></li>
 </ul>
-<br><p class="code SchemaDtd">&lt;!ELEMENT <a name="e.rules">rules</a> (<a href="#e.fileext">fileext</a>* , <a href="#e.file">file</a>* , <a href="#e.projectNature">projectNature</a>* , <a href="#e.facet">facet</a>* , <a href="#e.contentType">contentType</a>*)&gt;</p>
+<br><p class="code SchemaDtd">&lt;!ELEMENT <a name="e.rules">rules</a> (<a href="#e.fileext">fileext</a>* , <a href="#e.file">file</a>* , <a href="#e.projectNature">projectNature</a>* , <a href="#e.facet">facet</a>* , <a href="#e.contentType">contentType</a>* , <a href="#e.pattern">pattern</a>*)&gt;</p>
 <p></p>
 <p class="ConfigMarkupElementDesc">
 A set of rules for determining if a resource is passed to this validator or not. The rules are OR'ed together.</p>
@@ -91,6 +91,18 @@
 <li><b>id</b> - The content type id.</li>
 <li><b>exactMatch</b> - Set to true if the content type needs to match exactly. Set to false if sub types are considered matches as well.</li>
 </ul>
+<br><p class="code SchemaDtd">&lt;!ELEMENT <a name="e.pattern">pattern</a> EMPTY&gt;</p>
+<p class="code SchemaDtd">&lt;!ATTLIST pattern</p>
+<p class="code SchemaDtdAttlist">regex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDATA #REQUIRED<p class="code SchemaDtdAttlist">caseSensitive&nbsp;(true | false) &gt;</p>
+<p></p>
+<p class="ConfigMarkupElementDesc">
+Holds a regualr expression, that matches the resource's project relative name.</p>
+<br>
+<ul class="ConfigMarkupAttlistDesc">
+<li><b>regex</b> - Holds a Java regular expression. See the class java.util.regex.Pattern for more details. This regular expression is matched against a resource's project relative path, after that path has been converted into a portable path.
+<p>The path will always start with a forward slash (/) so that folder names can be more easily matched.</li>
+<li><b>caseSensitive</b> - If the file name is not case senstitive, then this needs to be set to false.</li>
+</ul>
 <br><h6 class="CaptionFigColumn SchemaHeader">Examples: </h6><!-- A plug-in is turning off the T1A validator for projects that have the ModuleCoreNature -->
  <extension
        id="exclude1"
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/extension-points/vf/org_eclipse_wst_validation_validatorGroup.html b/docs/org.eclipse.wst.validation.doc.isv/reference/extension-points/vf/org_eclipse_wst_validation_validatorGroup.html
index 1c7ac25..7a40e1b 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/extension-points/vf/org_eclipse_wst_validation_validatorGroup.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/extension-points/vf/org_eclipse_wst_validation_validatorGroup.html
@@ -9,7 +9,7 @@
 <H1 style="text-align:center">Validator Group</H1>
 <p></p>
 <h6 class="CaptionFigColumn SchemaHeader">Identifier: </h6>org.eclipse.wst.validation.validatorGroup<p></p>
-<h6 class="CaptionFigColumn SchemaHeader">Since: </h6>WebTools 3.4
+<h6 class="CaptionFigColumn SchemaHeader">Since: </h6>WebTools 3.0
 <p></p>
 
 <h6 class="CaptionFigColumn SchemaHeader">Description: </h6>Defines a grouping for validators with listeners notified of group members' activites.  Useful for pre-caching common information used by multiple validators and disposing of that information when they're all done.<p></p>
diff --git a/docs/org.eclipse.wst.validation.doc.isv/reference/extension-points/vf/org_eclipse_wst_validation_validatorV2.html b/docs/org.eclipse.wst.validation.doc.isv/reference/extension-points/vf/org_eclipse_wst_validation_validatorV2.html
index 91bf709..ef5d812 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/reference/extension-points/vf/org_eclipse_wst_validation_validatorV2.html
+++ b/docs/org.eclipse.wst.validation.doc.isv/reference/extension-points/vf/org_eclipse_wst_validation_validatorV2.html
@@ -9,7 +9,7 @@
 <H1 style="text-align:center">Validator V2</H1>
 <p></p>
 <h6 class="CaptionFigColumn SchemaHeader">Identifier: </h6>org.eclipse.wst.validation.validator-v2<p></p>
-<h6 class="CaptionFigColumn SchemaHeader">Since: </h6>WebTools 3.4.
+<h6 class="CaptionFigColumn SchemaHeader">Since: </h6>WebTools 3.0.
 <p></p>
 
 <h6 class="CaptionFigColumn SchemaHeader">Description: </h6>This is used to register a validator to the validation framework (version 2). In addition to specifying the validator to invoke, it registers a set of default filter rules, to control which resources are passsed to the validator.<p></p>
@@ -79,17 +79,18 @@
 <li><b>caseSensitive</b> - If the file name is not case senstitive, then this needs to be set to false.</li>
 <li><b>type</b> - Type of name, there are three choices. <ul><li>folder - specifies a project relative folder name.</li><li>file - a simple file name (i.e. no path information).</li><li>full - a fully qualified (project relative) file name.</li></ul></li>
 </ul>
-<br><p class="code SchemaDtd">&lt;!ELEMENT <a name="e.rules">rules</a> (<a href="#e.fileext">fileext</a>* , <a href="#e.file">file</a>* , <a href="#e.projectNature">projectNature</a>* , <a href="#e.facet">facet</a>* , <a href="#e.contentType">contentType</a>*)&gt;</p>
+<br><p class="code SchemaDtd">&lt;!ELEMENT <a name="e.rules">rules</a> (<a href="#e.fileext">fileext</a>* , <a href="#e.file">file</a>* , <a href="#e.projectNature">projectNature</a>* , <a href="#e.facet">facet</a>* , <a href="#e.contentType">contentType</a>* , <a href="#e.pattern">pattern</a>*)&gt;</p>
 <p></p>
 <p class="ConfigMarkupElementDesc">
 A set of rules for determining if a resource is passed to this validator or not. The rules are OR'ed together.</p>
 <br><br>
 <p class="code SchemaDtd">&lt;!ELEMENT <a name="e.facet">facet</a> EMPTY&gt;</p>
 <p class="code SchemaDtd">&lt;!ATTLIST facet</p>
-<p class="code SchemaDtdAttlist">id&nbsp;CDATA #REQUIRED&gt;</p>
+<p class="code SchemaDtdAttlist">id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDATA #REQUIRED<p class="code SchemaDtdAttlist">version&nbsp;CDATA #IMPLIED&gt;</p>
 <p></p>
 <ul class="ConfigMarkupAttlistDesc">
 <li><b>id</b> - The facet id.</li>
+<li><b>version</b> - A version expression that can be used to futher qualify the match. If not specifed, then versions are not used as a criteria for selecting the facet. The syntax of this expression, is the same syntax that is used by the facet framework.</li>
 </ul>
 <br><p class="code SchemaDtd">&lt;!ELEMENT <a name="e.group">group</a> EMPTY&gt;</p>
 <p class="code SchemaDtd">&lt;!ATTLIST group</p>
@@ -124,6 +125,18 @@
 <li><b>label</b> - A short, one line label that is displayed to the end user, that describes the message category.</li>
 <li><b>severity</b> - The default severity for this category.</li>
 </ul>
+<br><p class="code SchemaDtd">&lt;!ELEMENT <a name="e.pattern">pattern</a> EMPTY&gt;</p>
+<p class="code SchemaDtd">&lt;!ATTLIST pattern</p>
+<p class="code SchemaDtdAttlist">regex&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CDATA #REQUIRED<p class="code SchemaDtdAttlist">caseSensitive&nbsp;(true | false) &gt;</p>
+<p></p>
+<p class="ConfigMarkupElementDesc">
+Holds a regualr expression, that matches the resource's project relative name.</p>
+<br>
+<ul class="ConfigMarkupAttlistDesc">
+<li><b>regex</b> - Holds a Java regular expression. See the class java.util.regex.Pattern for more details. This regular expression is matched against a resource's project relative path, after that path has been converted into a portable path.
+<p>The path will always start with a forward slash (/) so that folder names can be more easily matched.</li>
+<li><b>caseSensitive</b> - If the file name is not case senstitive, then this needs to be set to false.</li>
+</ul>
 <br><h6 class="CaptionFigColumn SchemaHeader">Examples: </h6>An example of a validator that will be called on resources that have html or htm file extensions.
 <pre class="Example"><span class="code SchemaTag">
    &lt;extension
diff --git a/docs/org.eclipse.wst.validation.doc.isv/topics_ExtPoint_Reference.xml b/docs/org.eclipse.wst.validation.doc.isv/topics_ExtPoint_Reference.xml
index d8ec999..35b5eca 100644
--- a/docs/org.eclipse.wst.validation.doc.isv/topics_ExtPoint_Reference.xml
+++ b/docs/org.eclipse.wst.validation.doc.isv/topics_ExtPoint_Reference.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
 <?NLS TYPE="org.eclipse.help.toc"?>
 	 	<toc label="Extension Points Reference">
-<topic href="reference/extension-points/vf/org_eclipse_wst_validation_validator.html" label="org.eclipse.wst.validation.validator"/>
-</toc>
+<topic label="org.eclipse.wst.validation.validatorGroup" href="reference/extension-points/vf/org_eclipse_wst_validation_validatorGroup.html"/>
+<topic label="org.eclipse.wst.validation.validatorV2" href="reference/extension-points/vf/org_eclipse_wst_validation_validatorV2.html"/>
+</toc>
\ No newline at end of file
diff --git a/features/org.eclipse.wst.common_core.feature/feature.properties b/features/org.eclipse.wst.common_core.feature/feature.properties
index 41d223f..3c68cf8 100644
--- a/features/org.eclipse.wst.common_core.feature/feature.properties
+++ b/features/org.eclipse.wst.common_core.feature/feature.properties
@@ -18,10 +18,8 @@
 featureName=WST Common Core
 
 # "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
+providerName=Eclipse Web Tools Platform
 
-# "updateSiteName" property - label for the update site
-updateSiteName=The Eclipse Web Tools Platform (WTP) Project update site
 
 # "description" property - description of the feature
 description=WST common core functionality.
@@ -45,8 +43,8 @@
 # "license" property - text of the "Feature Update License"
 # should be plain text version of license agreement pointed to be "licenseURL"
 license=\
-ECLIPSE FOUNDATION SOFTWARE USER AGREEMENT\n\
-June 06, 2007\n\
+Eclipse Foundation Software User Agreement\n\
+April 14, 2010\n\
 \n\
 Usage Of Content\n\
 \n\
@@ -54,42 +52,38 @@
 OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
 USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
 AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
 AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
 AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
 TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
 OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
 BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
 \n\
 Applicable Licenses\n\
 \n\
-Unless otherwise indicated, all Content made available by the Eclipse Foundation\n\
-is provided to you under the terms and conditions of the Eclipse Public\n\
-License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
-Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
 For purposes of the EPL, "Program" will mean the Content.\n\
 \n\
 Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse.org CVS\n\
-repository ("Repository") in CVS modules ("Modules") and made available\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
 as downloadable archives ("Downloads").\n\
 \n\
-   - Content may be structured and packaged into modules to facilitate delivering,\n\
-     extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-     plug-in fragments ("Fragments"), and features ("Features").\n\
-   - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java? ARchive)\n\
-     in a directory named "plugins".\n\
-   - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-     Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-     Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-     numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-   - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-     named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-Features may also include other Features ("Included Features"). Files named\n\
-"feature.xml" may contain a list of the names and version numbers of\n\
-Included Features.\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
 \n\
 The terms and conditions governing Plug-ins and Fragments should be\n\
 contained in files named "about.html" ("Abouts"). The terms and\n\
@@ -98,48 +92,77 @@
 Licenses may be located in any directory of a Download or Module\n\
 including, but not limited to the following locations:\n\
 \n\
-   - The top-level (root) directory\n\
-   - Plug-in and Fragment directories\n\
-   - Inside Plug-ins and Fragments packaged as JARs\n\
-   - Sub-directories of the directory named "src" of certain Plug-ins\n\
-   - Feature directories\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
 \n\
 Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Eclipse Update Manager, you must agree to a license ("Feature Update\n\
-License") during the installation process. If the Feature contains\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
 Included Features, the Feature Update License should either provide you\n\
 with the terms and conditions governing the Included Features or inform\n\
 you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties". Such Abouts,\n\
-Feature Licenses and Feature Update Licenses contain the terms and\n\
-conditions (or references to such terms and conditions) that govern your\n\
-use of the associated Content in that directory.\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
 \n\
-THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
 TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
 SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
 \n\
-    - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-    - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-    - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-    - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
-    - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-    - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-    - Common Development and Distribution License (CDDL) Version 1.0 (available at http://www.sun.com/cddl/cddl.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
 \n\
 IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License or Feature Update License\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
 is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
 govern that particular Content.\n\
 \n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
 Cryptography\n\
 \n\
 Content may contain encryption software. The country in which you are\n\
 currently may have restrictions on the import, possession, and use,\n\
 and/or re-export to another country, of encryption software. BEFORE\n\
 using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use,\n\
-and re-export of encryption software, to see if this is permitted.\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
 \n\
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
 ########### end of license property ##########################################
diff --git a/features/org.eclipse.wst.common_core.feature/feature.xml b/features/org.eclipse.wst.common_core.feature/feature.xml
index f82ad54..bc6f2c0 100644
--- a/features/org.eclipse.wst.common_core.feature/feature.xml
+++ b/features/org.eclipse.wst.common_core.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.wst.common_core.feature"
       label="%featureName"
-      version="3.0.0.qualifier"
+      version="3.2.0.qualifier"
       provider-name="%providerName">
 
    <description>
@@ -17,15 +17,6 @@
       %license
    </license>
 
-   <url>
-      <update label="%updateSiteName" url="http://download.eclipse.org/webtools/updates/"/>
-   </url>
-
-   <requires>
-      <import feature="org.eclipse.platform" version="3.4.0"/>
-      <import feature="org.eclipse.emf.edit" version="2.4.0"/>
-      <import feature="org.eclipse.emf.ecore" version="2.4.0"/>
-   </requires>
 
    <plugin
          id="org.eclipse.wst.common.emfworkbench.integration"
@@ -35,19 +26,6 @@
          unpack="false"/>
 
    <plugin
-         id="org.eclipse.wst.command.env"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-   <plugin
-         id="org.eclipse.wst.command.env.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
          id="org.eclipse.wst.common.emf"
          download-size="0"
          install-size="0"
@@ -76,13 +54,6 @@
          unpack="false"/>
 
    <plugin
-         id="org.eclipse.wst.common.project.facet.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
          id="org.eclipse.wst.common.uriresolver"
          download-size="0"
          install-size="0"
diff --git a/features/org.eclipse.wst.common_core.feature/license.html b/features/org.eclipse.wst.common_core.feature/license.html
index 76abfb4..c184ca3 100644
--- a/features/org.eclipse.wst.common_core.feature/license.html
+++ b/features/org.eclipse.wst.common_core.feature/license.html
@@ -1,98 +1,107 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
-<!-- saved from url=(0044)http://www.eclipse.org/legal/epl/notice.html -->
-<HTML><HEAD><TITLE>Eclipse.org Software User Agreement</TITLE>
-<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<META content="MSHTML 6.00.2800.1479" name=GENERATOR></HEAD>
-<BODY lang=EN-US vLink=purple link=blue>
-<H2>Eclipse Foundation Software User Agreement</H2>
-<P>June 06, 2007</P>
-<H3>Usage Of Content</H3>
-<P>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION 
-AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT"). USE OF 
-THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE 
-TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED 
-BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED 
-BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE 
-AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE 
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY 
-APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU 
-MAY NOT USE THE CONTENT.</P>
-<H3>Applicable Licenses</H3>
-<P>Unless otherwise indicated, all Content made available by the Eclipse 
-Foundation is provided to you under the terms and conditions of the Eclipse 
-Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this 
-Content and is also available at <A 
-href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>. 
-For purposes of the EPL, "Program" will mean the Content.</P>
-<P>Content includes, but is not limited to, source code, object code, 
-documentation and other files maintained in the Eclipse.org CVS repository 
-("Repository") in CVS modules ("Modules") and made available as downloadable 
-archives ("Downloads").</P>
-<P>Content may be apportioned into plug-ins ("Plug-ins"), plug-in fragments 
-("Fragments"), and features ("Features"). A Feature is a bundle of one or more 
-Plug-ins and/or Fragments and associated material. Files named "feature.xml" may 
-contain a list of the names and version numbers of the Plug-ins and/or Fragments 
-associated with a Feature. Plug-ins and Fragments are located in directories 
-named "plugins" and Features are located in directories named "features".</P>
-<P>Features may also include other Features ("Included Features"). Files named 
-"feature.xml" may contain a list of the names and version numbers of Included 
-Features.</P>
-<P>The terms and conditions governing Plug-ins and Fragments should be contained 
-in files named "about.html" ("Abouts"). The terms and conditions governing 
-Features and Included Features should be contained in files named "license.html" 
-("Feature Licenses"). Abouts and Feature Licenses may be located in any 
-directory of a Download or Module including, but not limited to the following 
-locations:</P>
-<UL>
-  <LI>The top-level (root) directory 
-  <LI>Plug-in and Fragment directories 
-  <LI>Subdirectories of the directory named "src" of certain Plug-ins 
-  <LI>Feature directories </LI></UL>
-<P>Note: if a Feature made available by the Eclipse Foundation is installed 
-using the Eclipse Update Manager, you must agree to a license ("Feature Update 
-License") during the installation process. If the Feature contains Included 
-Features, the Feature Update License should either provide you with the terms 
-and conditions governing the Included Features or inform you where you can 
-locate them. Feature Update Licenses may be found in the "license" property of 
-files named "feature.properties". Such Abouts, Feature Licenses and Feature 
-Update Licenses contain the terms and conditions (or references to such terms 
-and conditions) that govern your use of the associated Content in that 
-directory.</P>
-<P>THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL 
-OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE 
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</P>
-<UL>
-  <LI>Common Public License Version 1.0 (available at <A 
-  href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</A>) 
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
 
-  <LI>Apache Software License 1.1 (available at <A 
-  href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</A>) 
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>April 14, 2010</p>
 
-  <LI>Apache Software License 2.0 (available at <A 
-  href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</A>) 
+<h3>Usage Of Content</h3>
 
-  <LI>IBM Public License 1.0 (available at <A 
-  href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</A>) 
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
 
-  <LI>Metro Link Public License 1.00 (available at <A 
-  href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</A>) 
+<h3>Applicable Licenses</h3>
 
-  <LI>Mozilla Public License Version 1.1 (available at <A 
-  href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</A>) 
-  </LI>
-   
-  <LI>Common Development and Distribution License (CDDL) Version 1.0 (available at <A 
-  href="http://www.sun.com/cddl/cddl.html">http://www.sun.com/cddl/cddl.html)</A>
-  </LI>
-</UL>
-<P>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR 
-TO USE OF THE CONTENT. If no About, Feature License or Feature Update License is 
-provided, please contact the Eclipse Foundation to determine what terms and 
-conditions govern that particular Content.</P>
-<H3>Cryptography</H3>
-<P>Content may contain encryption software. The country in which you are 
-currently may have restrictions on the import, possession, and use, and/or 
-re-export to another country, of encryption software. BEFORE using any 
-encryption software, please check the country's laws, regulations and policies 
-concerning the import, possession, or use, and re-export of encryption software, 
-to see if this is permitted.</P></BODY></HTML>
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <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>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/features/org.eclipse.wst.common_core.feature/sourceTemplateFeature/feature.properties b/features/org.eclipse.wst.common_core.feature/sourceTemplateFeature/feature.properties
index 52d0f54..a242948 100644
--- a/features/org.eclipse.wst.common_core.feature/sourceTemplateFeature/feature.properties
+++ b/features/org.eclipse.wst.common_core.feature/sourceTemplateFeature/feature.properties
@@ -17,10 +17,8 @@
 # "featureName" property - name of the feature
 featureName=WST Common Core Developer Resources
 # "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
+providerName=Eclipse Web Tools Platform
 
-# "updateSiteName" property - label for the update site
-updateSiteName=The Eclipse Web Tools Platform (WTP) Project update site
 
 # "description" property - description of the feature
 description=Source code zips for WST common core.
@@ -44,8 +42,8 @@
 # "license" property - text of the "Feature Update License"
 # should be plain text version of license agreement pointed to be "licenseURL"
 license=\
-ECLIPSE FOUNDATION SOFTWARE USER AGREEMENT\n\
-June 06, 2007\n\
+Eclipse Foundation Software User Agreement\n\
+April 14, 2010\n\
 \n\
 Usage Of Content\n\
 \n\
@@ -53,42 +51,38 @@
 OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
 USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
 AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
 AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
 AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
 TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
 OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
 BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
 \n\
 Applicable Licenses\n\
 \n\
-Unless otherwise indicated, all Content made available by the Eclipse Foundation\n\
-is provided to you under the terms and conditions of the Eclipse Public\n\
-License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
-Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
 For purposes of the EPL, "Program" will mean the Content.\n\
 \n\
 Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse.org CVS\n\
-repository ("Repository") in CVS modules ("Modules") and made available\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
 as downloadable archives ("Downloads").\n\
 \n\
-   - Content may be structured and packaged into modules to facilitate delivering,\n\
-     extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-     plug-in fragments ("Fragments"), and features ("Features").\n\
-   - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java? ARchive)\n\
-     in a directory named "plugins".\n\
-   - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-     Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-     Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-     numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-   - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-     named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-Features may also include other Features ("Included Features"). Files named\n\
-"feature.xml" may contain a list of the names and version numbers of\n\
-Included Features.\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
 \n\
 The terms and conditions governing Plug-ins and Fragments should be\n\
 contained in files named "about.html" ("Abouts"). The terms and\n\
@@ -97,48 +91,77 @@
 Licenses may be located in any directory of a Download or Module\n\
 including, but not limited to the following locations:\n\
 \n\
-   - The top-level (root) directory\n\
-   - Plug-in and Fragment directories\n\
-   - Inside Plug-ins and Fragments packaged as JARs\n\
-   - Sub-directories of the directory named "src" of certain Plug-ins\n\
-   - Feature directories\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
 \n\
 Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Eclipse Update Manager, you must agree to a license ("Feature Update\n\
-License") during the installation process. If the Feature contains\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
 Included Features, the Feature Update License should either provide you\n\
 with the terms and conditions governing the Included Features or inform\n\
 you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties". Such Abouts,\n\
-Feature Licenses and Feature Update Licenses contain the terms and\n\
-conditions (or references to such terms and conditions) that govern your\n\
-use of the associated Content in that directory.\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
 \n\
-THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
 TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
 SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
 \n\
-    - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-    - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-    - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-    - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
-    - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-    - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-    - Common Development and Distribution License (CDDL) Version 1.0 (available at http://www.sun.com/cddl/cddl.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
 \n\
 IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License or Feature Update License\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
 is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
 govern that particular Content.\n\
 \n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
 Cryptography\n\
 \n\
 Content may contain encryption software. The country in which you are\n\
 currently may have restrictions on the import, possession, and use,\n\
 and/or re-export to another country, of encryption software. BEFORE\n\
 using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use,\n\
-and re-export of encryption software, to see if this is permitted.\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
 \n\
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
 ########### end of license property ##########################################
diff --git a/features/org.eclipse.wst.common_core.feature/sourceTemplateFeature/license.html b/features/org.eclipse.wst.common_core.feature/sourceTemplateFeature/license.html
index fec4a48..c184ca3 100644
--- a/features/org.eclipse.wst.common_core.feature/sourceTemplateFeature/license.html
+++ b/features/org.eclipse.wst.common_core.feature/sourceTemplateFeature/license.html
@@ -1,13 +1,14 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<title>Eclipse.org Software User Agreement</title>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
 </head>
 
-<body lang="EN-US" link=blue vlink=purple>
+<body lang="EN-US">
 <h2>Eclipse Foundation Software User Agreement</h2>
-<p>June 06, 2007</p>
+<p>April 14, 2010</p>
 
 <h3>Usage Of Content</h3>
 
@@ -17,37 +18,37 @@
    OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
    NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
    CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-   
-<h3>Applicable Licenses</h3>   
-   
+
+<h3>Applicable Licenses</h3>
+
 <p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
    (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <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>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-   
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
 <ul>
-	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
       and/or Fragments associated with that Feature.</li>
-	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>   
- 
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
 <p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
 Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
 including, but not limited to the following locations:</p>
 
 <ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Inside Plug-ins and Fragments packaged as JARs</li>
-	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
 </ul>
-		
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
 installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
 inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
 Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
@@ -57,26 +58,50 @@
 OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
 
 <ul>
-	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
-	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-  <LI>Common Development and Distribution License (CDDL) Version 1.0 (available at <A 
-  href="http://www.sun.com/cddl/cddl.html">http://www.sun.com/cddl/cddl.html)</A>
-  </LI>
-</UL>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
 
 <p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
 contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
 
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
 <h3>Cryptography</h3>
 
 <p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
    another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
    possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-   
-<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
 </body>
 </html>
diff --git a/features/org.eclipse.wst.common_sdk.feature/feature.properties b/features/org.eclipse.wst.common_sdk.feature/feature.properties
index 446e00e..4836af4 100644
--- a/features/org.eclipse.wst.common_sdk.feature/feature.properties
+++ b/features/org.eclipse.wst.common_sdk.feature/feature.properties
@@ -18,10 +18,8 @@
 featureName=WST Common Plug-in Developer Resources
 
 # "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
+providerName=Eclipse Web Tools Platform
 
-# "updateSiteName" property - label for the update site
-updateSiteName=The Eclipse Web Tools Platform (WTP) Project update site
 
 # "description" property - description of the feature
 description=Source code zips for WST common tools
@@ -45,8 +43,8 @@
 # "license" property - text of the "Feature Update License"
 # should be plain text version of license agreement pointed to be "licenseURL"
 license=\
-ECLIPSE FOUNDATION SOFTWARE USER AGREEMENT\n\
-June 06, 2007\n\
+Eclipse Foundation Software User Agreement\n\
+April 14, 2010\n\
 \n\
 Usage Of Content\n\
 \n\
@@ -54,42 +52,38 @@
 OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
 USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
 AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
 AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
 AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
 TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
 OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
 BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
 \n\
 Applicable Licenses\n\
 \n\
-Unless otherwise indicated, all Content made available by the Eclipse Foundation\n\
-is provided to you under the terms and conditions of the Eclipse Public\n\
-License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
-Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
 For purposes of the EPL, "Program" will mean the Content.\n\
 \n\
 Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse.org CVS\n\
-repository ("Repository") in CVS modules ("Modules") and made available\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
 as downloadable archives ("Downloads").\n\
 \n\
-   - Content may be structured and packaged into modules to facilitate delivering,\n\
-     extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-     plug-in fragments ("Fragments"), and features ("Features").\n\
-   - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java? ARchive)\n\
-     in a directory named "plugins".\n\
-   - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-     Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-     Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-     numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-   - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-     named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-Features may also include other Features ("Included Features"). Files named\n\
-"feature.xml" may contain a list of the names and version numbers of\n\
-Included Features.\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
 \n\
 The terms and conditions governing Plug-ins and Fragments should be\n\
 contained in files named "about.html" ("Abouts"). The terms and\n\
@@ -98,48 +92,77 @@
 Licenses may be located in any directory of a Download or Module\n\
 including, but not limited to the following locations:\n\
 \n\
-   - The top-level (root) directory\n\
-   - Plug-in and Fragment directories\n\
-   - Inside Plug-ins and Fragments packaged as JARs\n\
-   - Sub-directories of the directory named "src" of certain Plug-ins\n\
-   - Feature directories\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
 \n\
 Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Eclipse Update Manager, you must agree to a license ("Feature Update\n\
-License") during the installation process. If the Feature contains\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
 Included Features, the Feature Update License should either provide you\n\
 with the terms and conditions governing the Included Features or inform\n\
 you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties". Such Abouts,\n\
-Feature Licenses and Feature Update Licenses contain the terms and\n\
-conditions (or references to such terms and conditions) that govern your\n\
-use of the associated Content in that directory.\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
 \n\
-THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
 TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
 SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
 \n\
-    - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-    - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-    - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-    - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
-    - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-    - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-    - Common Development and Distribution License (CDDL) Version 1.0 (available at http://www.sun.com/cddl/cddl.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
 \n\
 IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License or Feature Update License\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
 is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
 govern that particular Content.\n\
 \n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
 Cryptography\n\
 \n\
 Content may contain encryption software. The country in which you are\n\
 currently may have restrictions on the import, possession, and use,\n\
 and/or re-export to another country, of encryption software. BEFORE\n\
 using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use,\n\
-and re-export of encryption software, to see if this is permitted.\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
 \n\
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
 ########### end of license property ##########################################
diff --git a/features/org.eclipse.wst.common_sdk.feature/feature.xml b/features/org.eclipse.wst.common_sdk.feature/feature.xml
index eb186b2..9a686b9 100644
--- a/features/org.eclipse.wst.common_sdk.feature/feature.xml
+++ b/features/org.eclipse.wst.common_sdk.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.wst.common_sdk.feature"
       label="%featureName"
-      version="3.0.0.qualifier"
+      version="3.2.0.qualifier"
       provider-name="%providerName">
 
    <description>
@@ -17,9 +17,6 @@
       %license
    </license>
 
-   <url>
-      <update label="%updateSiteName" url="http://download.eclipse.org/webtools/updates/"/>
-   </url>
 
    <includes
          id="org.eclipse.wst.common_ui.feature"
@@ -30,13 +27,6 @@
          version="0.0.0"/>
 
    <plugin
-         id="org.eclipse.wst.common.project.facet.doc.api"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
          id="org.eclipse.wst.common.api.doc"
          download-size="0"
          install-size="0"
diff --git a/features/org.eclipse.wst.common_sdk.feature/license.html b/features/org.eclipse.wst.common_sdk.feature/license.html
index 5644598..c184ca3 100644
--- a/features/org.eclipse.wst.common_sdk.feature/license.html
+++ b/features/org.eclipse.wst.common_sdk.feature/license.html
@@ -1,98 +1,107 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
-<!-- saved from url=(0044)http://www.eclipse.org/legal/epl/notice.html -->
-<HTML><HEAD><TITLE>Eclipse.org Software User Agreement</TITLE>
-<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<META content="MSHTML 6.00.2800.1479" name=GENERATOR></HEAD>
-<BODY lang=EN-US vLink=purple link=blue>
-<H2>Eclipse Foundation Software User Agreement</H2>
-<P>June 06, 2007</P>
-<H3>Usage Of Content</H3>
-<P>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION 
-AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT"). USE OF 
-THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE 
-TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED 
-BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED 
-BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE 
-AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE 
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY 
-APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU 
-MAY NOT USE THE CONTENT.</P>
-<H3>Applicable Licenses</H3>
-<P>Unless otherwise indicated, all Content made available by the Eclipse 
-Foundation is provided to you under the terms and conditions of the Eclipse 
-Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this 
-Content and is also available at <A 
-href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>. 
-For purposes of the EPL, "Program" will mean the Content.</P>
-<P>Content includes, but is not limited to, source code, object code, 
-documentation and other files maintained in the Eclipse.org CVS repository 
-("Repository") in CVS modules ("Modules") and made available as downloadable 
-archives ("Downloads").</P>
-<P>Content may be apportioned into plug-ins ("Plug-ins"), plug-in fragments 
-("Fragments"), and features ("Features"). A Feature is a bundle of one or more 
-Plug-ins and/or Fragments and associated material. Files named "feature.xml" may 
-contain a list of the names and version numbers of the Plug-ins and/or Fragments 
-associated with a Feature. Plug-ins and Fragments are located in directories 
-named "plugins" and Features are located in directories named "features".</P>
-<P>Features may also include other Features ("Included Features"). Files named 
-"feature.xml" may contain a list of the names and version numbers of Included 
-Features.</P>
-<P>The terms and conditions governing Plug-ins and Fragments should be contained 
-in files named "about.html" ("Abouts"). The terms and conditions governing 
-Features and Included Features should be contained in files named "license.html" 
-("Feature Licenses"). Abouts and Feature Licenses may be located in any 
-directory of a Download or Module including, but not limited to the following 
-locations:</P>
-<UL>
-  <LI>The top-level (root) directory 
-  <LI>Plug-in and Fragment directories 
-  <LI>Subdirectories of the directory named "src" of certain Plug-ins 
-  <LI>Feature directories </LI></UL>
-<P>Note: if a Feature made available by the Eclipse Foundation is installed 
-using the Eclipse Update Manager, you must agree to a license ("Feature Update 
-License") during the installation process. If the Feature contains Included 
-Features, the Feature Update License should either provide you with the terms 
-and conditions governing the Included Features or inform you where you can 
-locate them. Feature Update Licenses may be found in the "license" property of 
-files named "feature.properties". Such Abouts, Feature Licenses and Feature 
-Update Licenses contain the terms and conditions (or references to such terms 
-and conditions) that govern your use of the associated Content in that 
-directory.</P>
-<P>THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL 
-OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE 
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</P>
-<UL>
-  <LI>Common Public License Version 1.0 (available at <A 
-  href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</A>) 
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
 
-  <LI>Apache Software License 1.1 (available at <A 
-  href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</A>) 
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>April 14, 2010</p>
 
-  <LI>Apache Software License 2.0 (available at <A 
-  href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</A>) 
+<h3>Usage Of Content</h3>
 
-  <LI>IBM Public License 1.0 (available at <A 
-  href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</A>) 
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
 
-  <LI>Metro Link Public License 1.00 (available at <A 
-  href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</A>) 
+<h3>Applicable Licenses</h3>
 
-  <LI>Mozilla Public License Version 1.1 (available at <A 
-  href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</A>) 
-  </LI>
-    
-  <LI>Common Development and Distribution License (CDDL) Version 1.0 (available at <A 
-  href="http://www.sun.com/cddl/cddl.html">http://www.sun.com/cddl/cddl.html)</A>
-  </LI>
-</UL>
-<P>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR 
-TO USE OF THE CONTENT. If no About, Feature License or Feature Update License is 
-provided, please contact the Eclipse Foundation to determine what terms and 
-conditions govern that particular Content.</P>
-<H3>Cryptography</H3>
-<P>Content may contain encryption software. The country in which you are 
-currently may have restrictions on the import, possession, and use, and/or 
-re-export to another country, of encryption software. BEFORE using any 
-encryption software, please check the country's laws, regulations and policies 
-concerning the import, possession, or use, and re-export of encryption software, 
-to see if this is permitted.</P></BODY></HTML>
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <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>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/features/org.eclipse.wst.common_ui.feature/feature.properties b/features/org.eclipse.wst.common_ui.feature/feature.properties
index 44d87a9..e10fba2 100644
--- a/features/org.eclipse.wst.common_ui.feature/feature.properties
+++ b/features/org.eclipse.wst.common_ui.feature/feature.properties
@@ -18,10 +18,8 @@
 featureName=WST Common UI
 
 # "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
+providerName=Eclipse Web Tools Platform
 
-# "updateSiteName" property - label for the update site
-updateSiteName=The Eclipse Web Tools Platform (WTP) Project update site
 
 # "description" property - description of the feature
 description=WST common UI functionality.
@@ -45,8 +43,8 @@
 # "license" property - text of the "Feature Update License"
 # should be plain text version of license agreement pointed to be "licenseURL"
 license=\
-ECLIPSE FOUNDATION SOFTWARE USER AGREEMENT\n\
-June 06, 2007\n\
+Eclipse Foundation Software User Agreement\n\
+April 14, 2010\n\
 \n\
 Usage Of Content\n\
 \n\
@@ -54,42 +52,38 @@
 OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
 USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
 AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
 AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
 AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
 TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
 OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
 BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
 \n\
 Applicable Licenses\n\
 \n\
-Unless otherwise indicated, all Content made available by the Eclipse Foundation\n\
-is provided to you under the terms and conditions of the Eclipse Public\n\
-License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
-Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
 For purposes of the EPL, "Program" will mean the Content.\n\
 \n\
 Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse.org CVS\n\
-repository ("Repository") in CVS modules ("Modules") and made available\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
 as downloadable archives ("Downloads").\n\
 \n\
-   - Content may be structured and packaged into modules to facilitate delivering,\n\
-     extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-     plug-in fragments ("Fragments"), and features ("Features").\n\
-   - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java? ARchive)\n\
-     in a directory named "plugins".\n\
-   - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-     Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-     Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-     numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-   - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-     named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-Features may also include other Features ("Included Features"). Files named\n\
-"feature.xml" may contain a list of the names and version numbers of\n\
-Included Features.\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
 \n\
 The terms and conditions governing Plug-ins and Fragments should be\n\
 contained in files named "about.html" ("Abouts"). The terms and\n\
@@ -98,48 +92,77 @@
 Licenses may be located in any directory of a Download or Module\n\
 including, but not limited to the following locations:\n\
 \n\
-   - The top-level (root) directory\n\
-   - Plug-in and Fragment directories\n\
-   - Inside Plug-ins and Fragments packaged as JARs\n\
-   - Sub-directories of the directory named "src" of certain Plug-ins\n\
-   - Feature directories\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
 \n\
 Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Eclipse Update Manager, you must agree to a license ("Feature Update\n\
-License") during the installation process. If the Feature contains\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
 Included Features, the Feature Update License should either provide you\n\
 with the terms and conditions governing the Included Features or inform\n\
 you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties". Such Abouts,\n\
-Feature Licenses and Feature Update Licenses contain the terms and\n\
-conditions (or references to such terms and conditions) that govern your\n\
-use of the associated Content in that directory.\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
 \n\
-THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
 TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
 SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
 \n\
-    - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-    - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-    - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-    - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
-    - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-    - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-    - Common Development and Distribution License (CDDL) Version 1.0 (available at http://www.sun.com/cddl/cddl.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
 \n\
 IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License or Feature Update License\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
 is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
 govern that particular Content.\n\
 \n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
 Cryptography\n\
 \n\
 Content may contain encryption software. The country in which you are\n\
 currently may have restrictions on the import, possession, and use,\n\
 and/or re-export to another country, of encryption software. BEFORE\n\
 using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use,\n\
-and re-export of encryption software, to see if this is permitted.\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
 \n\
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
 ########### end of license property ##########################################
diff --git a/features/org.eclipse.wst.common_ui.feature/feature.xml b/features/org.eclipse.wst.common_ui.feature/feature.xml
index 6eb2cf9..c7767e2 100644
--- a/features/org.eclipse.wst.common_ui.feature/feature.xml
+++ b/features/org.eclipse.wst.common_ui.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.wst.common_ui.feature"
       label="%featureName"
-      version="3.0.0.qualifier"
+      version="3.2.0.qualifier"
       provider-name="%providerName">
 
    <description>
@@ -17,26 +17,11 @@
       %license
    </license>
 
-   <url>
-      <update label="%updateSiteName" url="http://download.eclipse.org/webtools/updates/"/>
-   </url>
 
    <includes
          id="org.eclipse.wst.common_core.feature"
          version="0.0.0"/>
 
-   <requires>
-      <import feature="org.eclipse.gef" version="3.4.0"/>
-      <import feature="org.eclipse.platform" version="3.4.0"/>
-   </requires>
-
-   <plugin
-         id="org.eclipse.wst.command.env.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
    <plugin
          id="org.eclipse.wst.common.frameworks.ui"
          download-size="0"
@@ -52,13 +37,6 @@
          unpack="false"/>
 
    <plugin
-         id="org.eclipse.wst.common.project.facet.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
          id="org.eclipse.wst.common.snippets"
          download-size="0"
          install-size="0"
@@ -73,6 +51,13 @@
          unpack="false"/>
 
    <plugin
+         id="org.eclipse.wst.common.modulecore.ui"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
          id="org.eclipse.wst.internet.cache"
          download-size="0"
          install-size="0"
@@ -87,13 +72,6 @@
          unpack="false"/>
 
    <plugin
-         id="org.eclipse.wst.command.env.infopop"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
          id="org.eclipse.wst.validation.infopop"
          download-size="0"
          install-size="0"
diff --git a/features/org.eclipse.wst.common_ui.feature/license.html b/features/org.eclipse.wst.common_ui.feature/license.html
index 5644598..c184ca3 100644
--- a/features/org.eclipse.wst.common_ui.feature/license.html
+++ b/features/org.eclipse.wst.common_ui.feature/license.html
@@ -1,98 +1,107 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3c.org/TR/1999/REC-html401-19991224/loose.dtd">
-<!-- saved from url=(0044)http://www.eclipse.org/legal/epl/notice.html -->
-<HTML><HEAD><TITLE>Eclipse.org Software User Agreement</TITLE>
-<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<META content="MSHTML 6.00.2800.1479" name=GENERATOR></HEAD>
-<BODY lang=EN-US vLink=purple link=blue>
-<H2>Eclipse Foundation Software User Agreement</H2>
-<P>June 06, 2007</P>
-<H3>Usage Of Content</H3>
-<P>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION 
-AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT"). USE OF 
-THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE 
-TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED 
-BELOW. BY USING THE CONTENT, YOU AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED 
-BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE 
-AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE 
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS OF ANY 
-APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU 
-MAY NOT USE THE CONTENT.</P>
-<H3>Applicable Licenses</H3>
-<P>Unless otherwise indicated, all Content made available by the Eclipse 
-Foundation is provided to you under the terms and conditions of the Eclipse 
-Public License Version 1.0 ("EPL"). A copy of the EPL is provided with this 
-Content and is also available at <A 
-href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</A>. 
-For purposes of the EPL, "Program" will mean the Content.</P>
-<P>Content includes, but is not limited to, source code, object code, 
-documentation and other files maintained in the Eclipse.org CVS repository 
-("Repository") in CVS modules ("Modules") and made available as downloadable 
-archives ("Downloads").</P>
-<P>Content may be apportioned into plug-ins ("Plug-ins"), plug-in fragments 
-("Fragments"), and features ("Features"). A Feature is a bundle of one or more 
-Plug-ins and/or Fragments and associated material. Files named "feature.xml" may 
-contain a list of the names and version numbers of the Plug-ins and/or Fragments 
-associated with a Feature. Plug-ins and Fragments are located in directories 
-named "plugins" and Features are located in directories named "features".</P>
-<P>Features may also include other Features ("Included Features"). Files named 
-"feature.xml" may contain a list of the names and version numbers of Included 
-Features.</P>
-<P>The terms and conditions governing Plug-ins and Fragments should be contained 
-in files named "about.html" ("Abouts"). The terms and conditions governing 
-Features and Included Features should be contained in files named "license.html" 
-("Feature Licenses"). Abouts and Feature Licenses may be located in any 
-directory of a Download or Module including, but not limited to the following 
-locations:</P>
-<UL>
-  <LI>The top-level (root) directory 
-  <LI>Plug-in and Fragment directories 
-  <LI>Subdirectories of the directory named "src" of certain Plug-ins 
-  <LI>Feature directories </LI></UL>
-<P>Note: if a Feature made available by the Eclipse Foundation is installed 
-using the Eclipse Update Manager, you must agree to a license ("Feature Update 
-License") during the installation process. If the Feature contains Included 
-Features, the Feature Update License should either provide you with the terms 
-and conditions governing the Included Features or inform you where you can 
-locate them. Feature Update Licenses may be found in the "license" property of 
-files named "feature.properties". Such Abouts, Feature Licenses and Feature 
-Update Licenses contain the terms and conditions (or references to such terms 
-and conditions) that govern your use of the associated Content in that 
-directory.</P>
-<P>THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL 
-OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS. SOME OF THESE 
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</P>
-<UL>
-  <LI>Common Public License Version 1.0 (available at <A 
-  href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</A>) 
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
+</head>
 
-  <LI>Apache Software License 1.1 (available at <A 
-  href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</A>) 
+<body lang="EN-US">
+<h2>Eclipse Foundation Software User Agreement</h2>
+<p>April 14, 2010</p>
 
-  <LI>Apache Software License 2.0 (available at <A 
-  href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</A>) 
+<h3>Usage Of Content</h3>
 
-  <LI>IBM Public License 1.0 (available at <A 
-  href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</A>) 
+<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
+   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
+   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
+   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
+   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
+   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
 
-  <LI>Metro Link Public License 1.00 (available at <A 
-  href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</A>) 
+<h3>Applicable Licenses</h3>
 
-  <LI>Mozilla Public License Version 1.1 (available at <A 
-  href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</A>) 
-  </LI>
-    
-  <LI>Common Development and Distribution License (CDDL) Version 1.0 (available at <A 
-  href="http://www.sun.com/cddl/cddl.html">http://www.sun.com/cddl/cddl.html)</A>
-  </LI>
-</UL>
-<P>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR 
-TO USE OF THE CONTENT. If no About, Feature License or Feature Update License is 
-provided, please contact the Eclipse Foundation to determine what terms and 
-conditions govern that particular Content.</P>
-<H3>Cryptography</H3>
-<P>Content may contain encryption software. The country in which you are 
-currently may have restrictions on the import, possession, and use, and/or 
-re-export to another country, of encryption software. BEFORE using any 
-encryption software, please check the country's laws, regulations and policies 
-concerning the import, possession, or use, and re-export of encryption software, 
-to see if this is permitted.</P></BODY></HTML>
+<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
+   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <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>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
+<ul>
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+      and/or Fragments associated with that Feature.</li>
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
+<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
+Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
+including, but not limited to the following locations:</p>
+
+<ul>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
+</ul>
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
+installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
+inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
+that directory.</p>
+
+<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
+OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
+
+<ul>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
+
+<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
+contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
+
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
+<h3>Cryptography</h3>
+
+<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
+   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
+   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
+</body>
+</html>
diff --git a/features/org.eclipse.wst.common_ui.feature/sourceTemplateFeature/feature.properties b/features/org.eclipse.wst.common_ui.feature/sourceTemplateFeature/feature.properties
index c861cfb..cdd43ac 100644
--- a/features/org.eclipse.wst.common_ui.feature/sourceTemplateFeature/feature.properties
+++ b/features/org.eclipse.wst.common_ui.feature/sourceTemplateFeature/feature.properties
@@ -18,10 +18,8 @@
 featureName=WST Common UI Developer Resources
 
 # "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
+providerName=Eclipse Web Tools Platform
 
-# "updateSiteName" property - label for the update site
-updateSiteName=The Eclipse Web Tools Platform (WTP) Project update site
 
 # "description" property - description of the feature
 description=Source code zips for WST Common UI.
@@ -46,8 +44,8 @@
 # "license" property - text of the "Feature Update License"
 # should be plain text version of license agreement pointed to be "licenseURL"
 license=\
-ECLIPSE FOUNDATION SOFTWARE USER AGREEMENT\n\
-June 06, 2007\n\
+Eclipse Foundation Software User Agreement\n\
+April 14, 2010\n\
 \n\
 Usage Of Content\n\
 \n\
@@ -55,42 +53,38 @@
 OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
 USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
 AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\
+NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
 AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
 AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\
+OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
 TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
 OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
 BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
 \n\
 Applicable Licenses\n\
 \n\
-Unless otherwise indicated, all Content made available by the Eclipse Foundation\n\
-is provided to you under the terms and conditions of the Eclipse Public\n\
-License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
-Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
+Unless otherwise indicated, all Content made available by the\n\
+Eclipse Foundation is provided to you under the terms and conditions of\n\
+the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
+provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
 For purposes of the EPL, "Program" will mean the Content.\n\
 \n\
 Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse.org CVS\n\
-repository ("Repository") in CVS modules ("Modules") and made available\n\
+documentation and other files maintained in the Eclipse Foundation source code\n\
+repository ("Repository") in software modules ("Modules") and made available\n\
 as downloadable archives ("Downloads").\n\
 \n\
-   - Content may be structured and packaged into modules to facilitate delivering,\n\
-     extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-     plug-in fragments ("Fragments"), and features ("Features").\n\
-   - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java? ARchive)\n\
-     in a directory named "plugins".\n\
-   - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-     Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-     Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-     numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-   - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-     named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-Features may also include other Features ("Included Features"). Files named\n\
-"feature.xml" may contain a list of the names and version numbers of\n\
-Included Features.\n\
+       - Content may be structured and packaged into modules to facilitate delivering,\n\
+         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
+         plug-in fragments ("Fragments"), and features ("Features").\n\
+       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
+         in a directory named "plugins".\n\
+       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
+         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
+         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
+         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
+       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
+         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
 \n\
 The terms and conditions governing Plug-ins and Fragments should be\n\
 contained in files named "about.html" ("Abouts"). The terms and\n\
@@ -99,48 +93,77 @@
 Licenses may be located in any directory of a Download or Module\n\
 including, but not limited to the following locations:\n\
 \n\
-   - The top-level (root) directory\n\
-   - Plug-in and Fragment directories\n\
-   - Inside Plug-ins and Fragments packaged as JARs\n\
-   - Sub-directories of the directory named "src" of certain Plug-ins\n\
-   - Feature directories\n\
+       - The top-level (root) directory\n\
+       - Plug-in and Fragment directories\n\
+       - Inside Plug-ins and Fragments packaged as JARs\n\
+       - Sub-directories of the directory named "src" of certain Plug-ins\n\
+       - Feature directories\n\
 \n\
 Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Eclipse Update Manager, you must agree to a license ("Feature Update\n\
-License") during the installation process. If the Feature contains\n\
+Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
+Update License") during the installation process. If the Feature contains\n\
 Included Features, the Feature Update License should either provide you\n\
 with the terms and conditions governing the Included Features or inform\n\
 you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties". Such Abouts,\n\
-Feature Licenses and Feature Update Licenses contain the terms and\n\
-conditions (or references to such terms and conditions) that govern your\n\
-use of the associated Content in that directory.\n\
+the "license" property of files named "feature.properties" found within a Feature.\n\
+Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
+terms and conditions (or references to such terms and conditions) that\n\
+govern your use of the associated Content in that directory.\n\
 \n\
-THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER\n\
+THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
 TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
 SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
 \n\
-    - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-    - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-    - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-    - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
-    - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-    - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-    - Common Development and Distribution License (CDDL) Version 1.0 (available at http://www.sun.com/cddl/cddl.html)\n\
+       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
+       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
+       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
+       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
+       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
 \n\
 IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License or Feature Update License\n\
+TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
 is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
 govern that particular Content.\n\
 \n\
+\n\Use of Provisioning Technology\n\
+\n\
+The Eclipse Foundation makes available provisioning software, examples of which include,\n\
+but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
+the purpose of allowing users to install software, documentation, information and/or\n\
+other materials (collectively "Installable Software"). This capability is provided with\n\
+the intent of allowing such users to install, extend and update Eclipse-based products.\n\
+Information about packaging Installable Software is available at\n\
+http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
+\n\
+You may use Provisioning Technology to allow other parties to install Installable Software.\n\
+You shall be responsible for enabling the applicable license agreements relating to the\n\
+Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
+in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
+making it available in accordance with the Specification, you further acknowledge your\n\
+agreement to, and the acquisition of all necessary rights to permit the following:\n\
+\n\
+       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
+          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
+          extending or updating the functionality of an Eclipse-based product.\n\
+       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
+          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
+       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
+          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
+          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
+          with the Specification. Such Installable Software Agreement must inform the user of the\n\
+          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
+          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
+          indication of agreement by the user, the provisioning Technology will complete installation\n\
+          of the Installable Software.\n\
+\n\
 Cryptography\n\
 \n\
 Content may contain encryption software. The country in which you are\n\
 currently may have restrictions on the import, possession, and use,\n\
 and/or re-export to another country, of encryption software. BEFORE\n\
 using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use,\n\
-and re-export of encryption software, to see if this is permitted.\n\
+regulations and policies concerning the import, possession, or use, and\n\
+re-export of encryption software, to see if this is permitted.\n\
 \n\
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n
+Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
 ########### end of license property ##########################################
diff --git a/features/org.eclipse.wst.common_ui.feature/sourceTemplateFeature/license.html b/features/org.eclipse.wst.common_ui.feature/sourceTemplateFeature/license.html
index fec4a48..c184ca3 100644
--- a/features/org.eclipse.wst.common_ui.feature/sourceTemplateFeature/license.html
+++ b/features/org.eclipse.wst.common_ui.feature/sourceTemplateFeature/license.html
@@ -1,13 +1,14 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
-<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<title>Eclipse.org Software User Agreement</title>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
+<title>Eclipse Foundation Software User Agreement</title>
 </head>
 
-<body lang="EN-US" link=blue vlink=purple>
+<body lang="EN-US">
 <h2>Eclipse Foundation Software User Agreement</h2>
-<p>June 06, 2007</p>
+<p>April 14, 2010</p>
 
 <h3>Usage Of Content</h3>
 
@@ -17,37 +18,37 @@
    OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
    NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
    CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-   
-<h3>Applicable Licenses</h3>   
-   
+
+<h3>Applicable Licenses</h3>
+
 <p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
    (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <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>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-   
+<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
+   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
+
 <ul>
-	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
+       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
+       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
+       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
       and/or Fragments associated with that Feature.</li>
-	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>   
- 
+       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
+</ul>
+
 <p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
 Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
 including, but not limited to the following locations:</p>
 
 <ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Inside Plug-ins and Fragments packaged as JARs</li>
-	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
+       <li>The top-level (root) directory</li>
+       <li>Plug-in and Fragment directories</li>
+       <li>Inside Plug-ins and Fragments packaged as JARs</li>
+       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
+       <li>Feature directories</li>
 </ul>
-		
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
+
+<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
 installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
 inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
 Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
@@ -57,26 +58,50 @@
 OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
 
 <ul>
-	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
-	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-  <LI>Common Development and Distribution License (CDDL) Version 1.0 (available at <A 
-  href="http://www.sun.com/cddl/cddl.html">http://www.sun.com/cddl/cddl.html)</A>
-  </LI>
-</UL>
+       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
+       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
+       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
+       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
+       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
+</ul>
 
 <p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
 contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
 
+
+<h3>Use of Provisioning Technology</h3>
+
+<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
+   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
+   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
+   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
+       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
+   (&quot;Specification&quot;).</p>
+
+<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
+   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
+   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
+   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
+
+<ol>
+       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
+       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
+       product.</li>
+       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
+       accessed and copied to the Target Machine.</li>
+       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
+       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
+       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
+       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
+       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
+</ol>
+
 <h3>Cryptography</h3>
 
 <p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
    another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
    possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-   
-<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
+
+<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
 </body>
 </html>
diff --git a/plugins/org.eclipse.jem.util/.cvsignore b/plugins/org.eclipse.jem.util/.cvsignore
index e043cc4..28ebdc5 100644
--- a/plugins/org.eclipse.jem.util/.cvsignore
+++ b/plugins/org.eclipse.jem.util/.cvsignore
@@ -1,3 +1,5 @@
 bin
 build.xml
 javaCompiler...args
+@dot
+temp.folder
diff --git a/plugins/org.eclipse.jem.util/META-INF/MANIFEST.MF b/plugins/org.eclipse.jem.util/META-INF/MANIFEST.MF
index 7d851ba..fe14f71 100644
--- a/plugins/org.eclipse.jem.util/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.jem.util/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jem.util; singleton:=true
-Bundle-Version: 2.0.100.qualifier
+Bundle-Version: 2.1.0.qualifier
 Bundle-Activator: org.eclipse.jem.util.plugin.JEMUtilPlugin
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
@@ -20,7 +20,8 @@
  org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.emf.ecore;bundle-version="[2.4.0,3.0.0)",
  org.eclipse.emf.ecore.xmi;bundle-version="[2.4.0,3.0.0)",
- org.eclipse.perfmsr.core;bundle-version="1.0.0";resolution:=optional,
- com.ibm.icu;bundle-version="[3.8.1.1,4.0.0)"
+ com.ibm.icu;bundle-version="3.8.1",
+ org.eclipse.wst.common.core;bundle-version="[1.1.201,2.0.0)";visibility:=reexport
 Eclipse-LazyStart: true
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-ActivationPolicy: lazy
diff --git a/plugins/org.eclipse.jem.util/PERFMSR_README.txt b/plugins/org.eclipse.jem.util/PERFMSR_README.txt
index ea51258..990e2df 100644
--- a/plugins/org.eclipse.jem.util/PERFMSR_README.txt
+++ b/plugins/org.eclipse.jem.util/PERFMSR_README.txt
@@ -9,4 +9,16 @@
 
 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
+but it won't show up in the runtime workbench.
+
+05/13/2009 See bug 274534 "Can we remove org.eclipse.perfmsr.core"
+Note: the optional prereq, 
+ org.eclipse.perfmsr.core;bundle-version="1.0.0";resolution:=optional,
+was removed since it was confusing to build or releng teams, who want to make 
+sure they _could_ get all the bundles, optional or not, if they wanted to. 
+Whereas this jar is more for diagnosing or checking performance issues ... nothing 
+that is done any longer on this code. The code itself hasn't been changed, so should be 
+easy to resurect if ever required in the future. If this code is ever changed drastically, 
+such as refactored, I'm not sure the old performance measurement code needs to be carried 
+forward, as I think there are newer methods of doing similar things, that wouldn't require
+a "development time only" bundle as an optional pre-req.  
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
index f50bae7..c7972f0 100644
--- 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
@@ -18,6 +18,7 @@
 import java.io.PrintWriter;
 
 /**
+ * @deprecated Plugin error logging should be used instead
  * 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>
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
index 5d1e951..327fda1 100644
--- 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
@@ -15,6 +15,7 @@
 package org.eclipse.jem.util.logger.proxy;
 
 /**
+ * @deprecated Plugin error logging should be used instead
  * Basic log renderer interface. It is replaced by the extension <code>ILogRenderer2.</code>
  * 
  * @since 1.0.0
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
index f5a670f..3f7b13c 100644
--- 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
@@ -17,6 +17,7 @@
 import java.util.logging.Level;
  
 /**
+ * @deprecated Plugin error logging should be used instead
  * 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.
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
index c7c9d75..f4a396f 100644
--- 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
@@ -17,6 +17,7 @@
 import java.util.logging.Level;
 
 /**
+ * @deprecated Plugin error logging should be used instead
  * Default log renderer to use when not running under Eclipse. It logs to sysout and syserr.
  * 
  * @since 1.1.0
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
index b86ad05..779d963 100644
--- 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
@@ -20,6 +20,7 @@
 import java.util.logging.Level;
 
 /**
+ * @deprecated Plugin error logging should be used instead
  * 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,
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
index b4368d4..84abd8d 100644
--- 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
@@ -10,7 +10,7 @@
  *******************************************************************************/
 /*
  *  $$RCSfile: ProjectResourceSetImpl.java,v $$
- *  $$Revision: 1.21 $$  $$Date: 2008/04/21 14:50:16 $$ 
+ *  $$Revision: 1.30 $$  $$Date: 2010/04/29 01:44:22 $$ 
  */
 package org.eclipse.jem.internal.util.emf.workbench;
 
@@ -20,8 +20,12 @@
 import org.eclipse.core.resources.*;
 import org.eclipse.core.runtime.*;
 import org.eclipse.core.runtime.content.IContentDescription;
+import org.eclipse.core.runtime.jobs.ILock;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.emf.common.notify.Adapter;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.impl.NotificationImpl;
+import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.*;
@@ -42,10 +46,306 @@
 		public static final int MODULE_NAME_INDX = 2;
 		public static final int CONTENT_TYPE_INDX = 3;
 	}
+	
+	public class SynchronizedResourcesEList<E extends Object & Resource> extends ResourcesEList<E> implements EList<E> {
+
+		/**
+		 * 
+		 */
+		private static final long serialVersionUID = 1L;
+		private final ILock lock = Job.getJobManager().newLock();
+
+		public void move(int newPosition, E object) {
+			
+			try {
+				lock.acquire();
+				super.move(newPosition, object);
+			} finally {
+				lock.release();
+			}
+		}
+
+		public E move(int newPosition, int oldPosition) {
+
+			try {
+				lock.acquire();
+				return super.move(newPosition, oldPosition);
+			} finally {
+				lock.release();
+			}
+		}
+
+		public boolean add(E o) {
+			
+			try {
+				lock.acquire();
+				return super.add(o);
+			} finally {
+				lock.release();
+			}
+		}
+
+		public void add(int index, E element) {
+			
+			try {
+				lock.acquire();
+				super.add(index, element);
+			} finally {
+				lock.release();
+			}
+		}
+
+		public boolean addAll(Collection<? extends E> c) {
+			
+			try {
+				lock.acquire();
+				return super.addAll(c);
+			} finally {
+				lock.release();
+			}
+		}
+
+		public boolean addAll(int index, Collection<? extends E> c) {
+			
+			try {
+				lock.acquire();
+				return super.addAll(index, c);
+			} finally {
+				lock.release();
+			}
+		}
+
+		public void clear() {
+			
+			try {
+				lock.acquire();
+				super.clear();
+			} finally {
+				lock.release();
+			}
+		}
+
+		public boolean contains(Object o) {
+			
+			try {
+				lock.acquire();
+				return super.contains(o);
+			} finally {
+				lock.release();
+			}
+		}
+
+		public boolean containsAll(Collection<?> c) {
+			
+			try {
+				lock.acquire();
+				return super.containsAll(c);
+			} finally {
+				lock.release();
+			}
+		}
+
+		public boolean equals(Object o) {
+			
+			try {
+				lock.acquire();
+				return super.equals(o);
+			} finally {
+				lock.release();
+			}
+		}
+
+		public E get(int index) {
+			
+			try {
+				lock.acquire();
+				return super.get(index);
+			} finally {
+				lock.release();
+			}
+		}
+
+		public int hashCode() {
+			
+			try {
+				lock.acquire();
+				return super.hashCode();
+			} finally {
+				lock.release();
+			}
+		}
+
+		public int indexOf(Object o) {
+			
+			try {
+				lock.acquire();
+				return super.indexOf(o);
+			} finally {
+				lock.release();
+			}
+		}
+
+		public boolean isEmpty() {
+			
+			try {
+				lock.acquire();
+				return super.isEmpty();
+			} finally {
+				lock.release();
+			}
+		}
+
+		public Iterator<E> iterator() {
+			
+			try {
+				lock.acquire();
+				return super.iterator();
+			} finally {
+				lock.release();
+			}
+		}
+
+		public int lastIndexOf(Object o) {
+			
+			try {
+				lock.acquire();
+				return super.lastIndexOf(o);
+			} finally {
+				lock.release();
+			}
+		}
+
+		public ListIterator<E> listIterator() {
+			
+			try {
+				lock.acquire();
+				return super.listIterator();
+			} finally {
+				lock.release();
+			}
+		}
+
+		public ListIterator<E> listIterator(int index) {
+			
+			try {
+				lock.acquire();
+				return super.listIterator(index);
+			} finally {
+				lock.release();
+			}
+		}
+
+		public boolean remove(Object o) {
+			
+			try {
+				lock.acquire();
+				return super.remove(o);
+			} finally {
+				lock.release();
+			}
+		}
+
+		public E remove(int index) {
+			
+			try {
+				lock.acquire();
+				return super.remove(index);
+			} finally {
+				lock.release();
+			}
+		}
+
+		public boolean removeAll(Collection<?> c) {
+			
+			try {
+				lock.acquire();
+				return super.removeAll(c);
+			} finally {
+				lock.release();
+			}
+		}
+
+		public boolean retainAll(Collection<?> c) {
+			
+			try {
+				lock.acquire();
+				return super.retainAll(c);
+			} finally {
+				lock.release();
+			}
+		}
+
+		public E set(int index, E element) {
+			
+			try {
+				lock.acquire();
+				return super.set(index, element);
+			} finally {
+				lock.release();
+			}
+		}
+
+		public int size() {
+			
+			try {
+				lock.acquire();
+				return super.size();
+			} finally {
+				lock.release();
+			}
+		}
+
+		public List<E> subList(int fromIndex, int toIndex) {
+			
+			try {
+				lock.acquire();
+				return super.subList(fromIndex, toIndex);
+			} finally {
+				lock.release();
+			}
+		}
+
+		public Object[] toArray() {
+			
+			try {
+				lock.acquire();
+				return super.toArray();
+			} finally {
+				lock.release();
+			}
+		}
+
+		public <T> T[] toArray(T[] a) {
+			
+			try {
+				lock.acquire();
+				return super.toArray(a);
+			} finally {
+				lock.release();
+			}
+		}
+
+		// release lock during notifications
+		protected void dispatchNotification(Notification notification) {
+
+			int lockDepth;
+			lockDepth = lock.getDepth();
+			try {
+				for(int i=0; i<lockDepth; i++)
+                    lock.release();
+				super.dispatchNotification(notification);
+			} finally {
+				for(int i=0; i<lockDepth; i++)
+                    lock.acquire();  // Re-acquire lock after notify
+			}
+		}
+
+	}
 
 	private boolean isReleasing = false;
 	private IProject project;
 	protected List resourceHandlers = new ArrayList();
+	private Object resourcesLock = new Object();
 	protected ResourceSetWorkbenchSynchronizer synchronizer;
 	protected ProjectResourceSetImpl() {
 		setURIResourceMap(new HashMap(10));	// Tell it to cache uri->resource access.
@@ -77,16 +377,51 @@
 		//Check the map first when creating the resource and do not
 		//normalize if a value is found.
 		boolean isMapped = detectURIMapping(uri);
-		boolean hasContentType = (getContentTypeName(uri) != null);
+		String contentTypeName = getContentTypeName(uri);
+		boolean hasContentType = (contentTypeName != null);
 		URI converted = uri;
 		if (!isMapped)
 			converted = getURIConverter().normalize(uri);
 		else if (hasContentType)
 			converted = getURIConverter().normalize(uri);
 		
+		if (!hasContentType) {// Check if actual project file exists, and can determine contenttype
+			IContentDescription description = null;
+			IFile file = WorkbenchResourceHelperBase.getIFile(uri);
+			if (file != null && file.exists()) {
+				try {
+					description = file.getContentDescription();
+					if (description != null)
+						contentTypeName = description.getContentType().getId();
+				} catch (CoreException e) {
+					JEMUtilPlugin.getLogger().logError(e);
+				}
+			} else {// Now check if uri contains project, then add if needed
+				URIConverter converter = getURIConverter();
+				URI convertedUri = converter.normalize(uri);
+				if (!uri.equals(convertedUri)) {
+					file = WorkbenchResourceHelperBase.getIFile(convertedUri);
+					if (file != null && file.exists()) {
+						try {
+							description = file.getContentDescription();
+							if (description != null)
+								contentTypeName = description.getContentType().getId();
+						} catch (CoreException e) {
+							JEMUtilPlugin.getLogger().logError(e);
+						}
+					}
+				}
+			}
+		}
+			
+		
+		
 		Resource result = createResourceFromHandlers(converted);
 		if (result == null) {
-		    Resource.Factory resourceFactory = getResourceFactoryRegistry().getFactory(uri);
+			Resource.Factory resourceFactory = (contentTypeName == null) ? 
+					getResourceFactoryRegistry().getFactory(uri):
+					getResourceFactoryRegistry().getFactory(uri,contentTypeName);
+						
 		    if (resourceFactory != null)
 		    {//We got the right factory, now use the right URI
 		      result = resourceFactory.createResource(converted);
@@ -136,7 +471,9 @@
 		    {
 		      result = resourceFactory.createResource(converted);
 		      getResources().add(result);
-		      getURIResourceMap().put(uri, result);
+		      synchronized (resourcesLock) {
+		          getURIResourceMap().put(uri, result);
+		      }
 		      return result;
 		    }
 		    else
@@ -215,9 +552,12 @@
 	}
 	protected void removeAndUnloadAllResources() {
 		boolean caughtException = false;
-		if (getResources().isEmpty()) return;
-		List list = new ArrayList(getResources());
-		getResources().clear();
+		List list = null;
+		synchronized (resourcesLock) {
+			if (getResources().isEmpty()) return;
+			list = new ArrayList(getResources());	
+			getResources().clear();
+		}
 		Resource res;
 		int size = list.size();
 		for (int i = 0; i < size; i++) {
@@ -349,59 +689,35 @@
 	    URIConverter theURIConverter = getURIConverter();
 	    URI normalizedURI = theURIConverter.normalize(uri);
 	    List resourcesToRemove = new ArrayList();
-	    for (Resource resource : getResources())
-	    {
-	      if (theURIConverter.normalize(resource.getURI()).equals(normalizedURI)) {
-	    		  
-	    	if (getContentTypeName(uri) == null) { // loading from legacy archive api or non-typed resource
-		        if (loadOnDemand && !resource.isLoaded())
-		        {
-		          demandLoadHelper(resource);
-		        }
-		        
-		        if (map != null)
-		        {
-		          map.put(uri, resource);
-		        } 
-		        return resource;
-	    	} else  {// content type is known
-	    		boolean resourceExists = false;
-	    		IFile file = getPlatformFile(resource);
-	    		if (file != null)
-	    			resourceExists = file.exists();
-	    		String resourceContentTypeID = getContentTypeID(resource);
-	    		String uriContentTypeID = getContentTypeName(uri);
-	    		String existingMapKeyType = (findKey(resource) != null) ? getContentTypeName(findKey(resource)) : null;
-	    		if((!map.containsValue(resource) || ((map.get(uri) != null) && map.get(uri).equals(resource))) // existing resource  with alternate mapping doesn't exist in map
-	    			||  ((resourceContentTypeID != null && resourceContentTypeID.equals(uriContentTypeID)))) {
-						if (loadOnDemand && !resource.isLoaded()) {
-							demandLoadHelper(resource);
-						} // if embedded uri content type is different than resource content type, continue searching
-						if (resourceContentTypeID != null
-								&& uriContentTypeID != null) {
-							if ((resourceContentTypeID.equals(uriContentTypeID)) && existingMapKeyType == null) continue;
-							if ((!resourceContentTypeID.equals(uriContentTypeID)) || (existingMapKeyType != null && !existingMapKeyType
-									.equals(uriContentTypeID)))
-								continue;
-							else if (existingMapKeyType == null && !resourceExists) {
-								resourcesToRemove.add(resource);
-								continue;
+	    synchronized (resourcesLock) {
+	    	List<Resource> c = getImmutableResources();
+	        
+	        synchronized(c) {
+				for (Resource resource : c) {
+					if (theURIConverter.normalize(resource.getURI()).equals(normalizedURI)) {
+	
+						if (getContentTypeName(uri) == null) { // loading from legacy archive api or non-typed resource
+							if (loadOnDemand && !resource.isLoaded()) {
+								demandLoadHelper(resource);
 							}
-						} else if (uriContentTypeID != null && resourceContentTypeID == null && !resourceExists) {
-							resourcesToRemove.add(resource);
-							continue;
+	
+							if (map != null) {
+								map.put(uri, resource);
+							}
+							return resource;
+						} else {
+							Resource loadedRes = loadWithContentType(resource, uri, map, loadOnDemand, resourcesToRemove);
+							if (loadedRes != null)
+								return loadedRes;
 						}
-								
-						if (map != null && (map.get(uri) == null)) {
-							map.put(uri, resource);
-						}
-						return resource;
 					}
-	    	}
-	      }
-	    }
+				}
+	        }
+		}
+	    synchronized (resourcesLock) {
 	    // Cleanup invalid resources
-	    getResources().removeAll(resourcesToRemove);
+	    	getResources().removeAll(resourcesToRemove);
+	    }
 	    Resource delegatedResource = delegatedGetResource(uri, loadOnDemand);
 	    if (delegatedResource != null)
 	    {
@@ -434,6 +750,41 @@
 	    return null;
 	  
 	}
+	private Resource loadWithContentType(Resource resource, URI uri, Map<URI, Resource> map, boolean loadOnDemand, List resourcesToRemove) {
+		// content type is known
+		boolean resourceExists = false;
+		IFile file = getPlatformFile(resource);
+		if (file != null)
+			resourceExists = file.exists();
+		String resourceContentTypeID = getContentTypeID(resource);
+		String uriContentTypeID = getContentTypeName(uri);
+		String existingMapKeyType = (findKey(resource) != null) ? getContentTypeName(findKey(resource)) : null;
+		if((!map.containsValue(resource) || ((map.get(uri) != null) && map.get(uri).equals(resource))) // existing resource  with alternate mapping doesn't exist in map
+			||  ((resourceContentTypeID != null && resourceContentTypeID.equals(uriContentTypeID)))) {
+				if (loadOnDemand && !resource.isLoaded()) {
+					demandLoadHelper(resource);
+				} // if embedded uri content type is different than resource content type, continue searching
+				if (resourceContentTypeID != null
+						&& uriContentTypeID != null) {
+					if ((resourceContentTypeID.equals(uriContentTypeID)) && existingMapKeyType == null) return null;
+					if ((!resourceContentTypeID.equals(uriContentTypeID)) || (existingMapKeyType != null && !existingMapKeyType
+							.equals(uriContentTypeID)))
+						return null;
+					else if (existingMapKeyType == null && !resourceExists) {
+						resourcesToRemove.add(resource);
+						return null;
+					}
+				} else if (uriContentTypeID != null && resourceContentTypeID == null && !resourceExists) {
+					resourcesToRemove.add(resource);
+					return null;
+				}		
+				if (map != null && (map.get(uri) == null)) {
+					map.put(uri, resource);
+				}
+				return resource;
+			}
+		return null;
+	}
 	private IFile getPlatformFile(Resource res) {
 		IFile file = null;
 		file = getPlatformFile(res.getURI());
@@ -459,6 +810,7 @@
 			return desc.getContentType().getId();
 		return null;
 	}
+	
 	private URI findKey(Resource resource) {
 		Map aMap = getURIResourceMap();
 		Set keys = aMap.keySet();
@@ -508,22 +860,24 @@
 	    
 	    URIConverter theURIConverter = getURIConverter();
 	    URI normalizedURI = theURIConverter.normalize(uri);
-	    for (Resource resource : getResources())
-	    {
-	      if (theURIConverter.normalize(resource.getURI()).equals(normalizedURI))
-	      {
-	        if (loadOnDemand && !resource.isLoaded())
-	        {
-	          demandLoadHelper(resource);
-	        }
+	    synchronized (resourcesLock) {
+	    	List<Resource> c = getImmutableResources();
 	        
-	        if (map != null)
-	        {
-	          map.put(uri, resource);
-	        } 
-	        return resource;
-	      }
-	    }
+	        synchronized(c) {
+				for (Resource resource : c) {
+					if (theURIConverter.normalize(resource.getURI()).equals(normalizedURI)) {
+						if (loadOnDemand && !resource.isLoaded()) {
+							demandLoadHelper(resource);
+						}
+	
+						if (map != null) {
+							map.put(uri, resource);
+						}
+						return resource;
+					}
+				}
+	        }
+		}
 	    
 	    Resource delegatedResource = delegatedGetResource(uri, loadOnDemand);
 	    if (delegatedResource != null)
@@ -566,8 +920,31 @@
 	}
 	
 	protected Resource demandCreateResource(URI uri, Factory resourceFactory) {
-		// TODO Auto-generated method stub
 		return createResource(uri,resourceFactory);
 	}
+	
+	public EList<Resource> getResources() {
+		 if (resources == null)
+		    {
+		      resources = new SynchronizedResourcesEList<Resource>();
+		    }
+		    return resources;
+	}
+	public List<Resource> getImmutableResources() {
+		 return Collections.synchronizedList(getResources());
+	}
+	@Override
+	public void eNotify(Notification notification) {
+	    Adapter[] eAdapters = eBasicAdapterArray();
+	    if (eAdapters != null && eDeliver())
+	    {
+	      for (int i = 0, size = eAdapters.length; i < size; ++i)
+	      {
+	      	Adapter temp;
+	    	  if ((temp = eAdapters[i]) != null)
+	    		  temp.notifyChanged(notification);
+	      }
+	    }
+	  }
 
 }
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
index 37e8277..183f6ce 100644
--- 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
@@ -10,46 +10,35 @@
  *******************************************************************************/
 /*
  *  $$RCSfile: RegistryReader.java,v $$
- *  $$Revision: 1.5 $$  $$Date: 2006/05/17 20:13:45 $$ 
+ *  $$Revision: 1.7 $$  $$Date: 2009/08/11 15:30:32 $$ 
  */
 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.
  * 
+ * @deprecated Replaced by {@link org.eclipse.wst.common.core.util.RegistryReader)
  * @since 1.0.0
  */
-public abstract class RegistryReader {
+public abstract class RegistryReader extends org.eclipse.wst.common.core.util.RegistryReader {
 
-	String pluginId;
-
-	String extensionPointId;
-
-	private static Bundle systemBundle;
+	public RegistryReader(String pluginID, String extensionPoint) {
+		super(pluginID, extensionPoint);
+	}
 
 	/**
 	 * Utility method to get the plugin id of a configuation element
 	 * 
 	 * @param configurationElement
 	 * @return plugin id of configuration element
+	 * @deprecated Replaced by (@link org.eclipse.wst.common.core.util.RegistryReader.getPluginId())
 	 * @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;
+		return org.eclipse.wst.common.core.util.RegistryReader.getPluginId(configurationElement);
 	}
 
 	/**
@@ -67,78 +56,17 @@
 	}
 
 	/**
-	 * 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.
 	 * 
+	 * @deprecated Replaced by (@link org.eclipse.wst.common.core.util.RegistryReader.canCreateExecutableExtension())
 	 * @since 1.0.0
 	 */
 	public static boolean canCreateExecutableExtension(IConfigurationElement element) {
-		if (Platform.isRunning() && getSystemBundle().getState() != Bundle.STOPPING)
-			return true;
-		return false;
+		return org.eclipse.wst.common.core.util.RegistryReader.canCreateExecutableExtension(element);
 	}
 
 	/**
@@ -149,8 +77,6 @@
 	 * @since 1.0.0
 	 */
 	protected static Bundle getSystemBundle() {
-		if (systemBundle == null)
-			systemBundle = Platform.getBundle("org.eclipse.osgi"); //$NON-NLS-1$
-		return systemBundle;
+		return org.eclipse.wst.common.core.util.RegistryReader.getSystemBundle();
 	}
 }
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
index 8955882..cccd662 100644
--- 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
@@ -10,41 +10,27 @@
  *******************************************************************************/
 /*
  *  $$RCSfile: UIContextDetermination.java,v $$
- *  $$Revision: 1.5 $$  $$Date: 2007/04/10 01:09:36 $$ 
+ *  $$Revision: 1.6 $$  $$Date: 2009/07/30 22:11:23 $$ 
  */
 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.
  * 
+ * @deprecated Replaced by (@link org.eclipse.wst.common.core.util.UIContextDetermination)
  * @since 1.0.0
  */
-public class UIContextDetermination {
+public class UIContextDetermination extends org.eclipse.wst.common.core.util.UIContextDetermination {
 
-	private static final int UNKNOWN = 100;
+	public static final String HEADLESS_CONTEXT_LITERAL = org.eclipse.wst.common.core.util.UIContextDetermination.HEADLESS_CONTEXT_LITERAL;
 
-	public static final String HEADLESS_CONTEXT_LITERAL = "Headless"; //$NON-NLS-1$
+	public static final String UI_CONTEXT_LITERAL = org.eclipse.wst.common.core.util.UIContextDetermination.UI_CONTEXT_LITERAL;
 
-	public static final String UI_CONTEXT_LITERAL = "UI"; //$NON-NLS-1$
+	public static final int HEADLESS_CONTEXT = org.eclipse.wst.common.core.util.UIContextDetermination.HEADLESS_CONTEXT;
 
-	public static final int HEADLESS_CONTEXT = 102;
+	public static final int UI_CONTEXT = org.eclipse.wst.common.core.util.UIContextDetermination.UI_CONTEXT;
 
-	public static final int UI_CONTEXT = 101;
-
-	private static Map cachedExtensions = null;
-
-	private static int currentContext = UNKNOWN;
-
-	private UIContextDetermination() {
-	}
+	private UIContextDetermination(){}
 
 	/**
 	 * Returns an instance of a given class based on the UI or Headless context.
@@ -53,23 +39,10 @@
 	 * @return new class instance for the given key.
 	 * @throws IllegalArgumentException
 	 *             If the key is invalid (e.g. no extension is found for the key)
+	 * @deprecated Replaced by (@link org.eclipse.wst.common.core.util.UIContextDetermination.createInstance())
 	 */
 	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;
+		return org.eclipse.wst.common.core.util.UIContextDetermination.createInstance(key);
 	}
 
 	/**
@@ -78,113 +51,9 @@
 	 * @return current context
 	 * @see #HEADLESS_CONTEXT
 	 * @see #UI_CONTEXT
+	 * @deprecated Replaced by (@link org.eclipse.wst.common.core.util.UIContextDetermination.getCurrentContext())
 	 */
 	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 (Exception t) {
-					Logger.getLogger().log("UIContextDetermination is proceeding in HEADLESS mode"); //$NON-NLS-1$
-				}
-			}
-			return result;
-		}
+		return org.eclipse.wst.common.core.util.UIContextDetermination.getCurrentContext();
 	}
 }
\ 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
index 54517e8..cd1b235 100644
--- 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
@@ -9,23 +9,13 @@
  * 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.
- * 
+ *
+ * @deprecated Replaced by {@link org.eclipse.wst.common.core.util.UITester)
  * @since 1.0.0
  */
-public interface UITester {
+public interface UITester extends org.eclipse.wst.common.core.util.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/ResourceSetWorkbenchSynchronizer.java b/plugins/org.eclipse.jem.util/jemutil/org/eclipse/jem/util/emf/workbench/ResourceSetWorkbenchSynchronizer.java
index 1cec597..02b5054 100644
--- 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
@@ -10,13 +10,12 @@
  *******************************************************************************/
 /*
  *  $$RCSfile: ResourceSetWorkbenchSynchronizer.java,v $$
- *  $$Revision: 1.4 $$  $$Date: 2006/05/17 20:13:45 $$ 
+ *  $$Revision: 1.9 $$  $$Date: 2010/05/12 22:47:45 $$ 
  */
 
 package org.eclipse.jem.util.emf.workbench;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.*;
 
 import org.eclipse.core.resources.*;
 import org.eclipse.emf.ecore.resource.ResourceSet;
@@ -37,7 +36,109 @@
 	protected ResourceSet resourceSet;
 
 	/** Extenders that will be notified after a pre build resource change */
-	protected List extenders;
+	protected QueuingHashSet <ISynchronizerExtender> extenders;
+
+	/**
+	 * This HashSet is similar to a regular HashSet except it can be put in
+	 * queuing mode with a call to the {@link #startQueuing()} method.
+	 * While in queuing mode any adds or removes will not be committed to 
+	 * the set until a call to {@link #stopQueuing()} is made. This allows
+	 * the QueuingHasSet to be put in queuing mode prior to iterating over
+	 * the contents without needing to worry about changes coming in and
+	 * throwing ConcurrentModificationExceptions.
+	 * 
+	 * @author jsholl
+	 *
+	 * @param <E>
+	 */
+	protected class QueuingHashSet <E> extends HashSet <E> {
+
+		private static final long serialVersionUID = 6959354060950816784L;
+	
+		private Object lock = new Object();
+		
+		private boolean queuing = false;
+		private Set <E> addQueue = null;
+		private Set removeQueue = null;
+		private int initialCapacity = 3;
+		
+		public QueuingHashSet(int capacity) {
+			super(capacity);
+			addQueue = new HashSet<E>(capacity);
+			removeQueue = new HashSet(capacity);
+			initialCapacity = capacity;
+		}
+
+		public void startQueuing() {
+			synchronized(lock){
+				if(queuing){
+					throw new UnsupportedOperationException("startQueuing may only be called while not already queuing");
+				}
+				this.queuing = true;
+				addQueue.clear();
+				removeQueue.clear();
+			}
+		}
+
+		/**
+		 * Returns the set of adds which occurred while in queuing mode.
+		 * @return
+		 */
+		public Set <E> stopQueuing() {
+			synchronized(lock){
+				if(!queuing){
+					throw new UnsupportedOperationException("stopQueuing may only be called while queuing");
+				}
+				queuing = false;
+				removeAll(removeQueue);
+				addAll(addQueue);
+				if(!addQueue.isEmpty()){
+					Set <E> queue = addQueue;
+					addQueue = new HashSet<E>(initialCapacity);
+					return queue;
+				}
+				return Collections.emptySet();
+			}
+		}
+		
+		@Override
+		public boolean add(E object) {
+			synchronized (lock) {
+				if(queuing){
+					if(contains(object)){
+						return false;
+					}
+					return addQueue.add(object);
+				} else{
+					return super.add(object);
+				}
+			}
+		}
+		
+		@Override
+		public boolean remove(Object object) {
+			synchronized (lock) {
+				if(queuing){
+					if(contains(object)){
+						return removeQueue.add(object);
+					} else {
+						return false;
+					}
+				} else {
+					return super.remove(object);
+				}
+			}
+		}
+		
+		@Override
+		public boolean isEmpty() {
+			synchronized (lock) {
+				return super.isEmpty();	
+			}
+		}
+		
+	};
+	
 
 	/** The delta for this project that will be broadcast to the extenders */
 	protected IResourceDelta currentProjectDelta;
@@ -86,19 +187,37 @@
 
 
 	protected void notifyExtendersIfNecessary() {
-		if (currentEventType != IResourceChangeEvent.POST_CHANGE || extenders == null || currentProjectDelta == null)
+		if (currentEventType != IResourceChangeEvent.POST_CHANGE || currentProjectDelta == null)
 			return;
-		for (int i = 0; i < extenders.size(); i++) {
-			ISynchronizerExtender extender = (ISynchronizerExtender) extenders.get(i);
-			extender.projectChanged(currentProjectDelta);
+		if(extenders != null){
+			Set <ISynchronizerExtender> extendersToNotify = extenders;
+			while(!extendersToNotify.isEmpty()){
+				try{
+					extenders.startQueuing();
+					for (Iterator <ISynchronizerExtender> iterator = extendersToNotify.iterator(); iterator.hasNext();) {
+						ISynchronizerExtender extender = iterator.next();
+						extender.projectChanged(currentProjectDelta);
+					}
+				} finally {
+					extendersToNotify = extenders.stopQueuing();
+				}
+			}
 		}
 	}
 
 	protected void notifyExtendersOfClose() {
-		if (extenders != null && !extenders.isEmpty()) {
-			for (int i = 0; i < extenders.size(); i++) {
-				ISynchronizerExtender extender = (ISynchronizerExtender) extenders.get(i);
-				extender.projectClosed();
+		if(extenders != null){
+			Set <ISynchronizerExtender> extendersToNotify = extenders;
+			while(!extendersToNotify.isEmpty()){
+				try{
+					extenders.startQueuing();
+					for (Iterator <ISynchronizerExtender> iterator = extendersToNotify.iterator(); iterator.hasNext();) {
+						ISynchronizerExtender extender = iterator.next();
+						extender.projectClosed();
+					}
+				} finally {
+					extendersToNotify = extenders.stopQueuing();
+				}
 			}
 		}
 	}
@@ -147,8 +266,9 @@
 	 * @since 1.0.0
 	 */
 	public void addExtender(ISynchronizerExtender extender) {
-		if (extenders == null)
-			extenders = new ArrayList(3);
+		if (extenders == null){
+			extenders = new QueuingHashSet <ISynchronizerExtender>(3);
+		}
 		extenders.add(extender);
 	}
 
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
index b2c1473..15a544f 100644
--- 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
@@ -24,6 +24,7 @@
 
 
 /**
+ * @deprecated Plugin error logging should be used instead
  * Base log renderer that logs to the workbench.
  * 
  * @since 1.1.0
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
index 0810e2d..bfdcaba 100644
--- 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
@@ -21,6 +21,7 @@
 
 
 /**
+ * @deprecated Plugin error logging should be used instead
  * Log renderer to the console.
  * 
  * @since 1.0.0
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
index 0473318..c42faa6 100644
--- 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
@@ -23,6 +23,7 @@
 
 
 /**
+ * @deprecated Plugin error logging should be used instead
  * Logger that also logs to a trace file in the plugin's metadata area.
  * 
  * @since 1.0.0
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
index 8591267..85f56ca 100644
--- 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
@@ -25,6 +25,7 @@
 
  
 /**
+ * @deprecated Plugin error logging should be used instead
  * 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:
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
index 58f45d5..4ad5024 100644
--- 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
@@ -17,6 +17,7 @@
 import org.eclipse.jem.util.logger.proxy.Logger;
 
 /**
+ * @deprecated Plugin error logging should be used instead
  * Interface for a message logger.
  * 
  * @since 1.0.0
diff --git a/plugins/org.eclipse.jst.common.ui/.classpath b/plugins/org.eclipse.jst.common.ui/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.jst.common.ui/.project b/plugins/org.eclipse.jst.common.ui/.project
new file mode 100644
index 0000000..b886d27
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.ui/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.jst.common.ui</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/plugins/org.eclipse.jst.common.ui/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.jst.common.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..bf02908
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,74 @@
+#Fri Sep 11 19:24:47 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=ignore
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
+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=error
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=ignore
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
+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.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+org.eclipse.jdt.core.compiler.problem.unusedLabel=error
+org.eclipse.jdt.core.compiler.problem.unusedLocal=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=ignore
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/plugins/org.eclipse.jst.common.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.jst.common.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..b862143
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-Vendor: %provider
+Bundle-SymbolicName: org.eclipse.jst.common.ui;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Localization: plugin
+Bundle-Activator: org.eclipse.jst.common.ui.internal.JstCommonUIPlugin
+Require-Bundle: org.eclipse.ui;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.jdt.core;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.jdt.ui;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.wst.common.modulecore;bundle-version="[1.1.300,2.0.0)",
+ org.eclipse.wst.common.modulecore.ui;bundle-version="[1.0.0,2.0.0)",
+ org.eclipse.core.resources;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.jst.common.frameworks;bundle-version="1.1.400",
+ org.eclipse.wst.common.frameworks;bundle-version="1.2.0"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: org.eclipse.jst.common.ui.internal.assembly.wizard;x-internal:=true
diff --git a/plugins/org.eclipse.jst.common.ui/about.html b/plugins/org.eclipse.jst.common.ui/about.html
new file mode 100644
index 0000000..b6ed5b0
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.ui/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>August, 2009</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.jst.common.ui/build.properties b/plugins/org.eclipse.jst.common.ui/build.properties
new file mode 100644
index 0000000..4b147f0
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.ui/build.properties
@@ -0,0 +1,18 @@
+###############################################################################
+# Copyright (c) 2009 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.. = src/
+output.. = bin/
+bin.includes = plugin.xml,\
+               .,\
+               icons/,\
+               META-INF/,\
+               about.html,\
+               plugin.properties
diff --git a/plugins/org.eclipse.jst.common.ui/icons/jar_obj.gif b/plugins/org.eclipse.jst.common.ui/icons/jar_obj.gif
new file mode 100644
index 0000000..2fa1d77
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.ui/icons/jar_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.common.ui/icons/util-wiz-icon.gif b/plugins/org.eclipse.jst.common.ui/icons/util-wiz-icon.gif
new file mode 100644
index 0000000..2038b22
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.ui/icons/util-wiz-icon.gif
Binary files differ
diff --git a/plugins/org.eclipse.jst.common.ui/plugin.properties b/plugins/org.eclipse.jst.common.ui/plugin.properties
new file mode 100644
index 0000000..4b5c8ff
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.ui/plugin.properties
@@ -0,0 +1,17 @@
+###############################################################################
+# Copyright (c) 2009 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
+###############################################################################
+provider=Eclipse.org
+
+Bundle-Name.0 = Common JST UI Plug-in
+Archive=Archive
+External_Archive=External Archive
+Variable=Variable
+Classpath_Container=Classpath Container
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.common.ui/plugin.xml b/plugins/org.eclipse.jst.common.ui/plugin.xml
new file mode 100644
index 0000000..db69515
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.ui/plugin.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+
+    <extension
+          point="org.eclipse.wst.common.modulecore.ui.referenceWizardFragment">
+       <referenceFragment
+             class="org.eclipse.jst.common.ui.internal.assembly.wizard.JarReferenceWizardFragment"
+             icon="icons/jar_obj.gif"
+             id="org.eclipse.jst.common.ui.jarReference"
+             name="%Archive">
+       </referenceFragment>
+       <referenceFragment
+             class="org.eclipse.jst.common.ui.internal.assembly.wizard.ExternalJarReferenceWizardFragment"
+             icon="icons/jar_obj.gif"
+             id="org.eclipse.jst.common.ui.externalJarReference"
+             name="%External_Archive">
+       </referenceFragment>
+       <referenceFragment
+             class="org.eclipse.jst.common.ui.internal.assembly.wizard.VariableReferenceWizardFragment"
+             icon="icons/jar_obj.gif"
+             id="org.eclipse.jst.common.ui.variableReference"
+             name="%Variable">
+       </referenceFragment>
+       <referenceFragment
+             class="org.eclipse.jst.common.ui.internal.assembly.wizard.ClasspathContainerWizardFragment"
+             icon="icons/util-wiz-icon.gif"
+             id="org.eclipse.jst.common.ui.classpathContainer"
+             name="%Classpath_Container">
+       </referenceFragment>
+    </extension>
+    <extension point="org.eclipse.wst.common.modulecore.ui.virtualComponentLabelProvider">
+       <provider class="org.eclipse.jst.common.ui.internal.assembly.wizard.ClasspathContainerRefLabelProvider" weight="3"/>
+    </extension>       
+</plugin>
diff --git a/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/IJstCommonUIConstants.java b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/IJstCommonUIConstants.java
new file mode 100644
index 0000000..bb14fb7
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/IJstCommonUIConstants.java
@@ -0,0 +1,19 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.jst.common.ui.internal;
+
+
+/**
+ * @author: Aidyl Kareh
+ */
+public interface IJstCommonUIConstants {
+	public static final String DIALOGSTORE_LASTEXTARCHIVE= JstCommonUIPlugin.PLUGIN_ID + ".lastextarchive"; //$NON-NLS-1$
+}
diff --git a/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/JstCommonUIPlugin.java b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/JstCommonUIPlugin.java
new file mode 100644
index 0000000..57b9ef0
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/JstCommonUIPlugin.java
@@ -0,0 +1,60 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.jst.common.ui.internal;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class JstCommonUIPlugin extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "org.eclipse.jst.common.ui"; //$NON-NLS-1$
+
+	// The shared instance
+	private static JstCommonUIPlugin plugin;
+	
+	/**
+	 * The constructor
+	 */
+	public JstCommonUIPlugin() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static JstCommonUIPlugin getDefault() {
+		return plugin;
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/Messages.java b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/Messages.java
new file mode 100644
index 0000000..4918de3
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/Messages.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.jst.common.ui.internal;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+	private static final String BUNDLE_NAME = "org.eclipse.jst.common.ui.internal"; //$NON-NLS-1$
+	public static String ArchiveTitle;
+	public static String ArchiveDescription;
+	public static String ExternalArchiveTitle;
+	public static String ExternalArchiveDescription;
+	public static String ArchiveDialogNewTitle;
+	public static String Browse;
+	public static String VariableReferenceTitle;
+	public static String VariableReferenceDescription;
+	public static String AddManifestEntryTaskWizardTitle;
+	public static String AddManifestEntryTaskWizardDesc;
+	public static String ParentProjects;
+	public static String CustomEntryButton;
+	public static String Add;
+	public static String Remove;
+	public static String MoveUp;
+	public static String MoveDown;
+	public static String ManifestEntries;
+	public static String ManifestEntryColumn;
+	public static String ManifestEntrySourceColumn;
+	public static String ConfigureParentLink;
+	
+	static {
+		// initialize resource bundle
+		NLS.initializeMessages(BUNDLE_NAME + ".messages", Messages.class); //$NON-NLS-1$
+	}
+
+	private Messages() {
+	}
+}
diff --git a/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/AddManifestEntryTaskWizard.java b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/AddManifestEntryTaskWizard.java
new file mode 100644
index 0000000..044f74f
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/AddManifestEntryTaskWizard.java
@@ -0,0 +1,205 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ ******************************************************************************/
+package org.eclipse.jst.common.ui.internal.assembly.wizard;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.preference.PreferenceDialog;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jst.common.internal.modulecore.util.JavaModuleComponentUtility;
+import org.eclipse.jst.common.ui.internal.Messages;
+import org.eclipse.jst.common.ui.internal.assembly.wizard.ManifestModuleDependencyControl.ManifestLabelProvider;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Link;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.internal.dialogs.PropertyDialog;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.internal.impl.TaskModel;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.IWizardHandle;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.TaskWizard;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.WizardFragment;
+
+public class AddManifestEntryTaskWizard extends TaskWizard {
+	public static final String PARENT_PROJECT = "PARENT_PROJECT"; // data model key //$NON-NLS-1$
+	public static final String CHILD_PROJECT = "CHILD_PROJECT"; // data model key //$NON-NLS-1$
+	public static final String CURRENT_REFERENCES = "CURRENT_REFERENCES"; // data model key for return val //$NON-NLS-1$
+	public static final String RETURNED_REFERENCES = "RETURNED_REFERENCES"; // data model key for return val //$NON-NLS-1$
+	public AddManifestEntryTaskWizard() {
+		super(Messages.AddManifestEntryTaskWizardTitle, new ManifestRootFragment());
+	}
+	
+	public static class ManifestRootFragment extends WizardFragment {
+		private TableViewer viewer;
+		private Button addCustom;
+		private Text customEntryText;
+		protected IProject parentProject, childProject;
+		private IVirtualReference[] selected;
+		private ShowPossibleManifestEntryContentProvider contentProvider;
+		private Link parentContainerLink;
+		public boolean hasComposite() {
+			return true;
+		}
+		private void updateWidgets() throws InvocationTargetException {
+		
+			viewer.setInput(ResourcesPlugin.getWorkspace());
+			viewer.refresh();
+		}
+
+		public Composite createComposite(Composite parent, IWizardHandle handle) {
+			parentProject = (IProject)getTaskModel().getObject(PARENT_PROJECT);
+			childProject = (IProject)getTaskModel().getObject(CHILD_PROJECT);
+			handle.setTitle(Messages.AddManifestEntryTaskWizardTitle);
+			handle.setDescription(NLS.bind(Messages.AddManifestEntryTaskWizardDesc, parentProject.getName()));
+			Composite root = new Composite(parent, SWT.NONE);
+			root.setLayout(new FormLayout());
+			
+			createConfigLink(root);
+			parentContainerLink.setLayoutData(ManifestModuleDependencyControl.createFormData(0, 5, null, 5, 0, 5, 100, -5));
+			
+			Label tableLabel = new Label(root, SWT.NONE);
+			tableLabel.setText(Messages.ManifestEntries);
+			tableLabel.setLayoutData(ManifestModuleDependencyControl.createFormData(10, 5, null, 0, 0, 5, 100, -5));
+			
+			viewer = ManifestModuleDependencyControl.createManifestReferenceTableViewer(root, SWT.MULTI);
+			contentProvider = new ShowPossibleManifestEntryContentProvider(parentProject, childProject, getTaskModel());
+			viewer.setContentProvider(contentProvider);
+			viewer.setLabelProvider(new ManifestLabelProvider());
+			viewer.setInput(ResourcesPlugin.getWorkspace());
+			viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+				public void selectionChanged(SelectionChangedEvent event) {
+					viewerSelectionChanged();
+				}
+			});
+			
+			customEntryText = new Text(root, SWT.BORDER);
+			addCustom = new Button(root, SWT.PUSH);
+			addCustom.setText(Messages.CustomEntryButton);
+			addCustom.setLayoutData(ManifestModuleDependencyControl.createFormData(null, 0, 100, -5, null, 0, 100, -5));
+			addCustom.addSelectionListener(new SelectionListener() {
+				public void widgetSelected(SelectionEvent e) {
+					addCustomPressed();
+				}
+				public void widgetDefaultSelected(SelectionEvent e) {
+				}
+			});
+			
+			customEntryText.setLayoutData(ManifestModuleDependencyControl.createFormData(null, 0, 100, -5, 0, 5, addCustom, -5));			
+			viewer.getTable().setLayoutData(ManifestModuleDependencyControl.createFormData(tableLabel, 5, addCustom, 0, 0, 5, 100, -5));
+			return root;
+		}
+		
+		private void addCustomPressed() {
+			IVirtualReference ref = ManifestModuleDependencyControl.createDummyReference(
+					customEntryText.getText(), parentProject, ComponentCore.createComponent(parentProject));
+			contentProvider.addPossibleReference(ref);
+			customEntryText.setText(""); //$NON-NLS-1$
+			viewer.refresh();
+		}
+		
+		private void viewerSelectionChanged() {
+			IStructuredSelection sel = (IStructuredSelection)viewer.getSelection();
+			Object[] obj = sel.toArray();
+			IVirtualReference[] ret = new IVirtualReference[obj.length];
+			for( int i = 0; i < ret.length; i++ ) {
+				ret[i] = (IVirtualReference)obj[i];
+			}
+			selected = ret;
+		}
+		
+		private void createConfigLink(Composite aGroup){
+			parentContainerLink = new Link(aGroup,SWT.None);
+			parentContainerLink.setText("<A>"+ //$NON-NLS-1$
+					Messages.ConfigureParentLink+"</A>"); //$NON-NLS-1$
+			parentContainerLink.addSelectionListener(new SelectionListener() {
+				
+				public void doLinkActivated(Link e) {
+					IProject parentProject = ManifestRootFragment.this.parentProject;
+					PreferenceDialog dialog = PropertyDialog.createDialogOn(ManifestRootFragment.this.getPage().getControl().getShell(),
+							"org.eclipse.wst.common.componentcore.ui.DeploymentAssemblyPage", parentProject); //$NON-NLS-1$
+					if (dialog != null) {
+						dialog.open();
+					}
+					try {
+						updateWidgets();
+					} catch (InvocationTargetException ie) {
+
+					}
+				}
+
+				public void widgetDefaultSelected(SelectionEvent e) {
+					doLinkActivated((Link) e.widget);					
+				}
+
+				public void widgetSelected(SelectionEvent e) {
+					doLinkActivated((Link) e.widget);					
+				}
+			});
+			
+		}
+		
+		
+		// just return the selected refs
+		public void performFinish(IProgressMonitor monitor) throws CoreException {
+			getTaskModel().putObject(RETURNED_REFERENCES, selected);
+		}
+	}
+	
+	public static class ShowPossibleManifestEntryContentProvider extends ArrayContentProvider {
+		private IProject parent, child;
+		private TaskModel model;
+		private IVirtualReference[] possible;
+		public ShowPossibleManifestEntryContentProvider(IProject parent, IProject child, TaskModel taskModel) {
+			this.parent = parent;
+			this.child = child;
+			this.model = taskModel;
+		}
+		public Object[] getElements(Object inputElement) {
+			if( possible == null ) {
+				IVirtualReference[] current = (IVirtualReference[])model.getObject(CURRENT_REFERENCES);
+				possible = JavaModuleComponentUtility.findPossibleManifestEntries(parent, child, current);
+			}
+			return possible;
+		}
+		public void addPossibleReference(IVirtualReference ref) {
+			ArrayList<IVirtualReference> newRefs = new ArrayList<IVirtualReference>();
+			newRefs.addAll(Arrays.asList(possible));
+			newRefs.add(ref);
+			possible = newRefs.toArray(new IVirtualReference[newRefs.size()]);
+		}
+		@Override
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+			if (newInput != null) {
+				possible = null;
+				viewer.refresh();
+			}
+		}
+		
+	}
+}
diff --git a/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/ClasspathContainerRefLabelProvider.java b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/ClasspathContainerRefLabelProvider.java
new file mode 100644
index 0000000..2238a8c
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/ClasspathContainerRefLabelProvider.java
@@ -0,0 +1,58 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ ******************************************************************************/
+package org.eclipse.jst.common.ui.internal.assembly.wizard;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jst.common.internal.modulecore.ClasspathContainerVirtualComponent;
+import org.eclipse.jst.common.ui.internal.JstCommonUIPlugin;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.ui.internal.propertypage.IVirtualComponentLabelProvider;
+
+public class ClasspathContainerRefLabelProvider implements
+		IVirtualComponentLabelProvider {
+
+	public ClasspathContainerRefLabelProvider() {
+		// TODO Auto-generated constructor stub
+	}
+
+	public boolean canHandle(IVirtualComponent component) {
+		return (component instanceof ClasspathContainerVirtualComponent);
+	}
+
+	public String getSourceText(IVirtualComponent component) {
+		return ((ClasspathContainerVirtualComponent)component).getClasspathContainerPath();
+	}
+
+	private Image image;
+	public Image getSourceImage(IVirtualComponent component) {
+		if( image == null ) {
+			try {
+				URL url = new URL( JstCommonUIPlugin.getDefault().getBundle().getEntry("/"), "icons/util-wiz-icon.gif"); //$NON-NLS-1$ //$NON-NLS-2$
+				ImageDescriptor imageDescriptor = null;
+				if (url != null)
+					imageDescriptor = ImageDescriptor.createFromURL(url);
+				if( imageDescriptor != null ) 
+					image = imageDescriptor.createImage();
+			} catch( MalformedURLException murle ) {
+				// do nothing
+			}
+		}
+		return image;
+	}
+	
+	public void dispose() {
+		image.dispose();
+	}
+}
diff --git a/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/ClasspathContainerWizardFragment.java b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/ClasspathContainerWizardFragment.java
new file mode 100644
index 0000000..5576006
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/ClasspathContainerWizardFragment.java
@@ -0,0 +1,63 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ ******************************************************************************/
+package org.eclipse.jst.common.ui.internal.assembly.wizard;
+
+import java.util.ArrayList;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.internal.ui.wizards.buildpaths.ClasspathContainerWizard;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jst.common.internal.modulecore.ClasspathContainerVirtualComponent;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.common.componentcore.internal.resources.VirtualReference;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.WizardFragment;
+import org.eclipse.wst.common.componentcore.ui.propertypage.IReferenceWizardConstants;
+
+public class ClasspathContainerWizardFragment extends WizardFragment {
+	public boolean hasComposite() {
+		return false;
+	}
+	public void performFinish(IProgressMonitor monitor) throws CoreException {
+		final IProject project = (IProject)getTaskModel().getObject(IReferenceWizardConstants.PROJECT);
+		final IVirtualComponent rootComp = (IVirtualComponent)getTaskModel().getObject(IReferenceWizardConstants.ROOT_COMPONENT);
+		Display.getDefault().syncExec(new Runnable() { 
+			public void run() {
+				IJavaProject jp = JavaCore.create(project);
+				IClasspathEntry[] entries = new IClasspathEntry[]{};
+				ClasspathContainerWizard wizard = new ClasspathContainerWizard((IClasspathEntry)null, jp, entries);
+				int result = ClasspathContainerWizard.openWizard(new Shell(), wizard);
+				if( result == Window.OK ) {
+					ArrayList<IVirtualReference> references = new ArrayList<IVirtualReference>();
+					IClasspathEntry[] results = wizard.getNewEntries();
+					for( int i = 0; i < results.length; i++ ) {
+						String defaultPath = (String)getTaskModel().getObject(IReferenceWizardConstants.DEFAULT_LIBRARY_LOCATION);
+						defaultPath = defaultPath == null ? "/lib" : defaultPath;
+						IVirtualComponent childComp = new ClasspathContainerVirtualComponent(project, rootComp, results[i].getPath().toString());
+						VirtualReference ref = new VirtualReference(rootComp, childComp, new Path(defaultPath).makeAbsolute());
+						ref.setDependencyType(IVirtualReference.DEPENDENCY_TYPE_CONSUMES);
+						references.add(ref);
+					}
+					getTaskModel().putObject(IReferenceWizardConstants.FINAL_REFERENCE, 
+							references.toArray(new IVirtualReference[references.size()]));
+				}
+			}
+		});
+	}
+}
diff --git a/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/ExternalJarReferenceWizardFragment.java b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/ExternalJarReferenceWizardFragment.java
new file mode 100644
index 0000000..e434d5b
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/ExternalJarReferenceWizardFragment.java
@@ -0,0 +1,107 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ ******************************************************************************/
+package org.eclipse.jst.common.ui.internal.assembly.wizard;
+
+import java.util.ArrayList;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jst.common.ui.internal.IJstCommonUIConstants;
+import org.eclipse.jst.common.ui.internal.JstCommonUIPlugin;
+import org.eclipse.jst.common.ui.internal.Messages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent;
+import org.eclipse.wst.common.componentcore.internal.resources.VirtualReference;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.IWizardHandle;
+import org.eclipse.wst.common.componentcore.ui.propertypage.IReferenceWizardConstants;
+
+public class ExternalJarReferenceWizardFragment extends JarReferenceWizardFragment {	
+	public Composite createComposite(Composite parent, IWizardHandle handle) {
+		Composite c = super.createComposite(parent, handle);
+		handle.setTitle(Messages.ExternalArchiveTitle);
+		handle.setDescription(Messages.ExternalArchiveDescription);
+		return c;
+	}
+
+	protected void buttonPressed() {
+		selected = chooseExternalArchiveEntries(browse.getShell());
+		viewer.refresh();
+		if(selected != null && selected.length > 0) {
+			isComplete = true;			
+		} else {
+			isComplete = false;
+		}
+		handle.update();
+	}
+
+	public void performFinish(IProgressMonitor monitor) throws CoreException {
+		IVirtualComponent rootComponent = (IVirtualComponent)getTaskModel().getObject(IReferenceWizardConstants.ROOT_COMPONENT);
+		String runtimeLoc = (String)getTaskModel().getObject(IReferenceWizardConstants.DEFAULT_LIBRARY_LOCATION);
+		if (selected != null && selected.length > 0) {
+			ArrayList<IVirtualReference> refList = new ArrayList<IVirtualReference>();
+			ArrayList<String> paths = new ArrayList<String>();
+			for (int i = 0; i < selected.length; i++) {
+				// IPath fullPath = project.getFile(selected[i]).getFullPath();
+				String type = VirtualArchiveComponent.LIBARCHIVETYPE
+						+ IPath.SEPARATOR;
+				IVirtualComponent archive = ComponentCore
+						.createArchiveComponent(rootComponent.getProject(),
+								type + selected[i].toString());
+				VirtualReference ref = new VirtualReference(rootComponent, archive);
+				ref.setArchiveName(selected[i].lastSegment());
+				if (runtimeLoc != null) {
+					ref.setRuntimePath(new Path(runtimeLoc).makeAbsolute());
+				}
+				refList.add(ref);
+			}
+			IVirtualReference[] finalRefs = refList.toArray(new IVirtualReference[refList.size()]);
+			getTaskModel().putObject(IReferenceWizardConstants.FINAL_REFERENCE, finalRefs);
+		}
+	}
+	
+	private static IPath[] chooseExternalArchiveEntries(Shell shell) {
+		String lastUsedPath= JstCommonUIPlugin.getDefault().getDialogSettings().get(IJstCommonUIConstants.DIALOGSTORE_LASTEXTARCHIVE);
+		if (lastUsedPath == null) {
+			lastUsedPath= ""; //$NON-NLS-1$
+		}
+		
+		FileDialog dialog= new FileDialog(shell, SWT.MULTI);
+		dialog.setText(Messages.ArchiveDialogNewTitle);
+		String [] extensions = new String[] {"*.jar;*.war;*.rar;*.zip", "*.*"};  //$NON-NLS-1$//$NON-NLS-2$
+		dialog.setFilterExtensions(extensions);
+		dialog.setFilterPath(lastUsedPath);
+
+		String res= dialog.open();
+		if (res == null) {
+			return null;
+		}
+		String[] fileNames= dialog.getFileNames();
+		int nChosen= fileNames.length;
+
+		IPath filterPath= Path.fromOSString(dialog.getFilterPath());
+		IPath[] elems= new IPath[nChosen];
+		for (int i= 0; i < nChosen; i++) {
+			elems[i]= filterPath.append(fileNames[i]).makeAbsolute();
+		}
+		
+		JstCommonUIPlugin.getDefault().getDialogSettings().put(IJstCommonUIConstants.DIALOGSTORE_LASTEXTARCHIVE, dialog.getFilterPath());
+		
+		return elems;
+	}
+}
diff --git a/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/JarReferenceWizardFragment.java b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/JarReferenceWizardFragment.java
new file mode 100644
index 0000000..d9243e3
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/JarReferenceWizardFragment.java
@@ -0,0 +1,177 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ ******************************************************************************/
+package org.eclipse.jst.common.ui.internal.assembly.wizard;
+
+import java.util.ArrayList;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.ui.wizards.BuildPathDialogAccess;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jst.common.ui.internal.Messages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent;
+import org.eclipse.wst.common.componentcore.internal.resources.VirtualReference;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.IWizardHandle;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.WizardFragment;
+import org.eclipse.wst.common.componentcore.ui.propertypage.IReferenceWizardConstants;
+
+public class JarReferenceWizardFragment extends WizardFragment {
+	protected LabelProvider labelProvider = null;
+	protected ITreeContentProvider contentProvider = null;
+	protected TreeViewer viewer;
+	protected Button browse;
+	protected IPath[] paths;
+	protected IWizardHandle handle;
+	protected IPath[] selected = new IPath[]{};
+	boolean isComplete = false;
+
+	public boolean isComplete() {
+		return isComplete;
+	}
+	
+	public boolean hasComposite() {
+		return true;
+	}
+
+	public Composite createComposite(Composite parent, IWizardHandle handle) {
+		this.handle = handle;
+		handle.setTitle(Messages.ArchiveTitle);
+		handle.setDescription(Messages.ArchiveDescription);
+				
+		Composite c = new Composite(parent, SWT.NONE);
+		c.setLayout(new FormLayout());
+		viewer = new TreeViewer(c, SWT.SINGLE | SWT.BORDER);
+		viewer.setContentProvider(getContentProvider());
+		viewer.setLabelProvider(getLabelProvider());
+		viewer.setInput(ResourcesPlugin.getWorkspace());
+
+		browse = new Button(c, SWT.NONE);
+		browse.setText(Messages.Browse);
+		FormData fd = new FormData();
+		fd.left = new FormAttachment(0, 5);
+		fd.bottom = new FormAttachment(100, -5);
+		browse.setLayoutData(fd);
+
+		fd = new FormData();
+		fd.left = new FormAttachment(0, 5);
+		fd.top = new FormAttachment(0, 5);
+		fd.right = new FormAttachment(100, -5);
+		fd.bottom = new FormAttachment(browse, -5);
+		viewer.getTree().setLayoutData(fd);
+
+		browse.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				buttonPressed();
+			}
+
+			public void widgetDefaultSelected(SelectionEvent e) {
+				widgetSelected(e);
+			}
+		});
+		return c;
+	}
+
+	protected void buttonPressed() {
+		IProject project = (IProject)getTaskModel().getObject(IReferenceWizardConstants.PROJECT);
+		selected = BuildPathDialogAccess.chooseJAREntries(
+				browse.getShell(), 
+				project.getFullPath(), new IPath[0]);
+		viewer.refresh();
+		if(selected != null && selected.length > 0) {
+			isComplete = true;
+		} else {
+			isComplete = false;
+		}
+		handle.update();
+	}
+
+	public void performFinish(IProgressMonitor monitor) throws CoreException {
+		IVirtualComponent rootComponent = (IVirtualComponent)getTaskModel().getObject(IReferenceWizardConstants.ROOT_COMPONENT);
+		String runtimeLoc = (String)getTaskModel().getObject(IReferenceWizardConstants.DEFAULT_LIBRARY_LOCATION);
+		if (selected != null && selected.length > 0) {
+			ArrayList<IVirtualReference> refList = new ArrayList<IVirtualReference>();
+			for (int i = 0; i < selected.length; i++) {
+				// IPath fullPath = project.getFile(selected[i]).getFullPath();
+				String type = VirtualArchiveComponent.LIBARCHIVETYPE
+						+ IPath.SEPARATOR;
+				IVirtualComponent archive = ComponentCore
+						.createArchiveComponent(rootComponent.getProject(),
+								type + selected[i].makeRelative().toString());
+				VirtualReference ref = new VirtualReference(rootComponent, archive);
+				ref.setArchiveName(selected[i].lastSegment());
+				if (runtimeLoc != null) {
+					ref.setRuntimePath(new Path(runtimeLoc).makeAbsolute());
+				}
+				refList.add(ref);
+			}
+			IVirtualReference[] finalRefs = refList.toArray(new IVirtualReference[refList.size()]);
+			getTaskModel().putObject(IReferenceWizardConstants.FINAL_REFERENCE, finalRefs);
+		}
+	}
+
+	protected LabelProvider getLabelProvider() {
+		if (labelProvider == null) {
+			labelProvider = new LabelProvider() {
+				public Image getImage(Object element) {
+					return null;
+				}
+
+				public String getText(Object element) {
+					return element == null ? "" : element.toString();//$NON-NLS-1$
+				}
+			};
+		}
+		return labelProvider;
+	}
+
+	protected ITreeContentProvider getContentProvider() {
+		if (contentProvider == null) {
+			contentProvider = new ITreeContentProvider() {
+				public Object[] getElements(Object inputElement) {
+					return selected == null ? new Object[]{} : selected;
+				}
+				public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+				}
+				public void dispose() {
+				}
+				public boolean hasChildren(Object element) {
+					return false;
+				}
+				public Object getParent(Object element) {
+					return null;
+				}
+				public Object[] getChildren(Object parentElement) {
+					return null;
+				}
+			};
+		}
+		return contentProvider;
+	}
+}
diff --git a/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/ManifestModuleDependencyControl.java b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/ManifestModuleDependencyControl.java
new file mode 100644
index 0000000..6b240cf
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/ManifestModuleDependencyControl.java
@@ -0,0 +1,469 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ ******************************************************************************/
+package org.eclipse.jst.common.ui.internal.assembly.wizard;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+
+import org.eclipse.core.commands.ExecutionException;
+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.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.viewers.BaseLabelProvider;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.jst.common.internal.modulecore.util.ArchiveManifest;
+import org.eclipse.jst.common.internal.modulecore.util.JavaModuleComponentUtility;
+import org.eclipse.jst.common.internal.modulecore.util.ManifestUtilities;
+import org.eclipse.jst.common.internal.modulecore.util.UpdateManifestDataModelProperties;
+import org.eclipse.jst.common.internal.modulecore.util.UpdateManifestDataModelProvider;
+import org.eclipse.jst.common.ui.internal.Messages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.internal.resources.AbstractResourceListVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.componentcore.ui.ModuleCoreUIPlugin;
+import org.eclipse.wst.common.componentcore.ui.internal.propertypage.DependencyPageExtensionManager;
+import org.eclipse.wst.common.componentcore.ui.internal.propertypage.IVirtualComponentLabelProvider;
+import org.eclipse.wst.common.componentcore.ui.propertypage.IModuleDependenciesControl;
+import org.eclipse.wst.common.componentcore.ui.propertypage.ModuleAssemblyRootPage;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class ManifestModuleDependencyControl implements
+		IModuleDependenciesControl {
+	
+	protected IProject project;
+	protected IVirtualComponent rootComponent;
+	protected IProject parentProject;
+	protected ModuleAssemblyRootPage propPage;
+	protected Button addButton, removeButton, moveUpButton, moveDownButton;
+	protected Combo parentSelection;
+	protected TableViewer manifestEntryViewer;
+	private ArrayList<IVirtualReference> list = new ArrayList<IVirtualReference>();
+	
+	public ManifestModuleDependencyControl(final IProject project,
+			final ModuleAssemblyRootPage page) {
+		this.project = project;
+		this.propPage = page;
+		rootComponent = ComponentCore.createComponent(project);
+	}
+
+	/*
+	 * Convenience method to quickly create form datas, 
+	 * referencing either pixel counts (via autoboxing) or controls.
+	 * If the object is null, no attachment will be created for that side
+	 */
+	public static FormData createFormData(Object top, int topDif, Object bottom, int bottomDif,
+						Object left, int leftDif, Object right, int rightDif) {
+		FormData fd = new FormData();
+		if( top instanceof Control ) fd.top = new FormAttachment((Control)top, topDif);
+		else if( top != null ) fd.top = new FormAttachment(((Integer)top).intValue(), topDif);
+		
+		if( bottom instanceof Control ) fd.bottom = new FormAttachment((Control)bottom, bottomDif);
+		else if( bottom != null ) fd.bottom = new FormAttachment(((Integer)bottom).intValue(), bottomDif);
+		
+		if( left instanceof Control ) fd.left = new FormAttachment((Control)left, leftDif);
+		else if( left != null ) fd.left = new FormAttachment(((Integer)left).intValue(), leftDif);
+		
+		if( right instanceof Control ) fd.right = new FormAttachment((Control)right, rightDif);
+		else if( right != null ) fd.right = new FormAttachment(((Integer)right).intValue(), rightDif);
+		
+		return fd;
+	}
+	
+	public Composite createContents(Composite parent) {
+		Composite root = new Composite(parent, SWT.NONE);
+		root.setLayout(new FormLayout());
+		Label l = new Label(root, SWT.NONE);
+		l.setText(Messages.ParentProjects);
+		l.setLayoutData(createFormData(0,10,null,0, 0, 5, null,0));
+		parentSelection = new Combo(root, SWT.READ_ONLY);
+		parentSelection.setLayoutData(createFormData(0,5,null,0,l,5,100,-5));
+		parentSelection.setItems(getPossibleParentProjects());
+		parentSelection.addModifyListener(new ModifyListener(){
+			public void modifyText(ModifyEvent e) {
+				refreshViewerFromNewParentProject();
+			}
+		});
+		Label tableLabel = new Label(root, SWT.NONE);
+		tableLabel.setText(Messages.ManifestEntries);
+		tableLabel.setLayoutData(createFormData(parentSelection,5,null,0, 0, 5, null,0));
+		manifestEntryViewer = createManifestReferenceTableViewer(root, SWT.SINGLE);
+		
+		addButton = new Button(root, SWT.PUSH);
+		removeButton = new Button(root, SWT.PUSH);
+		moveUpButton = new Button(root, SWT.PUSH);
+		moveDownButton = new Button(root, SWT.PUSH);
+		
+		addButton.setText(Messages.Add);
+		removeButton.setText(Messages.Remove);
+		moveUpButton.setText(Messages.MoveUp);
+		moveDownButton.setText(Messages.MoveDown);
+		removeButton.setEnabled(false);
+		moveUpButton.setEnabled(false);
+		moveDownButton.setEnabled(false);
+		
+		addButton.setLayoutData(createFormData(tableLabel,5,null,0,manifestEntryViewer.getTable(),5,100,-5));
+		removeButton.setLayoutData(createFormData(addButton,5,null,0,manifestEntryViewer.getTable(),5,100,-5));
+		moveUpButton.setLayoutData(createFormData(removeButton,5,null,0,manifestEntryViewer.getTable(),5,100,-5));
+		moveDownButton.setLayoutData(createFormData(moveUpButton,5,null,0,null,0,100,-5));
+		
+		addButton.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				addPressed();
+			}
+			public void widgetDefaultSelected(SelectionEvent e) {
+			}
+		});
+		removeButton.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				removePressed();
+			}
+			public void widgetDefaultSelected(SelectionEvent e) {
+			}
+		});
+		moveUpButton.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				moveUp();
+			}
+			public void widgetDefaultSelected(SelectionEvent e) {
+			}
+		});
+		moveDownButton.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				moveDown();
+			}
+			public void widgetDefaultSelected(SelectionEvent e) {
+			}
+		});
+		
+		manifestEntryViewer.getTable().setLayoutData(createFormData(
+				tableLabel, 5, 100, -5, 0, 5, moveDownButton, -5));
+		manifestEntryViewer.setLabelProvider(new ManifestLabelProvider());
+		manifestEntryViewer.setContentProvider(new ManifestContentProvider());
+		manifestEntryViewer.setInput(ResourcesPlugin.getWorkspace());
+		parentSelection.select(0);
+		
+		manifestEntryViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				viewerSelectionChanged();
+			}
+		});
+		return root;
+	}
+	
+	protected void viewerSelectionChanged() {
+		updateButtons();
+	}
+	
+	protected void updateButtons() {
+		int index = manifestEntryViewer.getTable().getSelectionIndex();
+		int size = manifestEntryViewer.getTable().getItems().length;
+		removeButton.setEnabled(index != -1);
+		moveUpButton.setEnabled(index != -1 && index != 0);
+		moveDownButton.setEnabled(index != size-1);
+	}
+	
+	protected void moveUp() {
+		int index = manifestEntryViewer.getTable().getSelectionIndex();
+		IVirtualReference ref = list.remove(index);
+		list.add(index-1,ref);
+		refreshViewer();
+		updateButtons();
+	}
+	protected void moveDown() {
+		int index = manifestEntryViewer.getTable().getSelectionIndex();
+		IVirtualReference ref = list.remove(index);
+		list.add(index+1,ref);
+		refreshViewer();
+		updateButtons();
+	}
+	
+	protected void addPressed() {
+		AddManifestEntryTaskWizard wizard = new AddManifestEntryTaskWizard();
+		wizard.getTaskModel().putObject(AddManifestEntryTaskWizard.CHILD_PROJECT, project);
+		wizard.getTaskModel().putObject(AddManifestEntryTaskWizard.PARENT_PROJECT, parentProject);
+		wizard.getTaskModel().putObject(AddManifestEntryTaskWizard.CURRENT_REFERENCES, list.toArray(new IVirtualReference[list.size()]));
+		WizardDialog wd = new WizardDialog(addButton.getShell(), wizard);
+		if( wd.open() != Window.CANCEL) {
+			IVirtualReference[] ret = (IVirtualReference[])wizard.getTaskModel().getObject(AddManifestEntryTaskWizard.RETURNED_REFERENCES);
+			if (ret != null)
+				list.addAll(Arrays.asList(ret));
+			refreshViewer();
+			updateButtons();
+		}
+	}
+
+	protected void removePressed() {
+		IStructuredSelection sel = (IStructuredSelection)manifestEntryViewer.getSelection();
+		Iterator i = sel.iterator();
+		while(i.hasNext()) {
+			list.remove(i.next());
+		}
+		refreshViewer();
+		updateButtons();
+	}
+	
+	public static class ManifestLabelProvider extends BaseLabelProvider implements ITableLabelProvider {
+		private IVirtualComponentLabelProvider[] delegates;
+		protected void getDelegates() {
+			if( delegates == null )
+				delegates = DependencyPageExtensionManager.loadDelegates();
+		}
+		public Image getColumnImage(Object element, int columnIndex) {
+			getDelegates();
+			if( columnIndex == 1 ) {
+				if( element instanceof IVirtualReference ) {
+					for( int i = 0; i < delegates.length; i++ )
+						if( delegates[i].canHandle(((IVirtualReference)element).getReferencedComponent()))
+							return delegates[i].getSourceImage(((IVirtualReference)element).getReferencedComponent());
+				}
+			}
+			return ModuleCoreUIPlugin.getInstance().getImage("jar_obj");
+		}
+		
+		public String getColumnText(Object element, int columnIndex) {
+			if( element instanceof IVirtualReference ) {
+				IVirtualReference ref = (IVirtualReference)element;
+				if( columnIndex == 0 && ref.getArchiveName() != null)
+					return ref.getRuntimePath().append(ref.getArchiveName()).toString();
+				if( columnIndex == 1 )
+					return handleSourceText(ref.getReferencedComponent());
+			}
+			return null;
+		}
+		
+		private String handleSourceText(IVirtualComponent component) {
+			getDelegates();
+			for( int i = 0; i < delegates.length; i++ )
+				if( delegates[i].canHandle(component))
+					return delegates[i].getSourceText(component);
+
+			// default impl
+			if( component.isBinary() ) {
+				IPath p = (IPath)component.getAdapter(IPath.class);
+				return p == null ? null : p.toString();
+			}
+			return component.getProject().getName();
+		}
+	}
+	
+	
+	private class ManifestContentProvider implements IStructuredContentProvider {
+		public void dispose() {
+		}
+		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		}
+		public Object[] getElements(Object inputElement) {
+			return refsForCurrentProject == null ? new Object[]{} : refsForCurrentProject;
+		}
+	}
+	
+	public static TableViewer createManifestReferenceTableViewer(Composite parent, int style) {
+		int flags = SWT.BORDER | style;
+
+		Table table = new Table(parent, flags);
+		TableViewer viewer = new TableViewer(table);
+
+		// set up table layout
+		TableLayout tableLayout = new org.eclipse.jface.viewers.TableLayout();
+		tableLayout.addColumnData(new ColumnWeightData(200, true));
+		tableLayout.addColumnData(new ColumnWeightData(200, true));
+		table.setLayout(tableLayout);
+		table.setHeaderVisible(true);
+		table.setLinesVisible(true);
+		
+		// table columns
+		TableColumn fileNameColumn = new TableColumn(table, SWT.NONE, 0);
+		fileNameColumn.setText(Messages.ManifestEntryColumn);
+		fileNameColumn.setResizable(true);
+
+		TableColumn projectColumn = new TableColumn(table, SWT.NONE, 1);
+		projectColumn.setText(Messages.ManifestEntrySourceColumn);
+		projectColumn.setResizable(true);
+		tableLayout.layout(table, true);
+		return viewer;
+	}
+
+	private IVirtualReference[] refsForCurrentProject;
+	protected void refreshViewerFromNewParentProject() {
+		String parentString = parentSelection.getText();
+		refsForCurrentProject = new IVirtualReference[]{};
+		if( parentString != null && !"".equals(parentString)) { //$NON-NLS-1$
+			parentProject = ResourcesPlugin.getWorkspace().getRoot().getProject(parentString);
+			IVirtualReference[] current  = JavaModuleComponentUtility.findCurrentManifestEntries(parentProject, project);
+			refsForCurrentProject = addMissingDummyEntries(current);
+			for( int i = 0; i < refsForCurrentProject.length; i++ ) {
+				list.add(refsForCurrentProject[i]);
+			}
+		}
+		manifestEntryViewer.refresh();
+	}
+	
+	protected void refreshViewer() {
+		refsForCurrentProject = list.toArray(new IVirtualReference[list.size()]);
+		manifestEntryViewer.refresh();
+	}
+	
+	protected IVirtualReference[] addMissingDummyEntries(IVirtualReference[] current) {
+		IFile manifestFile = getManifestIFile(rootComponent);
+		if( manifestFile != null ) {
+			ArrayList<IVirtualReference> refs = new ArrayList<IVirtualReference>();
+			refs.addAll(Arrays.asList(current));
+			ArchiveManifest manifest = ManifestUtilities.getManifest(manifestFile);
+			String[] entries = manifest.getClassPathTokenized();
+			String[] unusedEntries = findUnusedEntries(current, entries);
+			for( int i = 0; i < unusedEntries.length; i++ ) {
+				refs.add(createDummyReference(unusedEntries[i]));
+			}
+			return refs.toArray(new IVirtualReference[refs.size()]);
+		}
+		return current;
+	}
+	
+	
+	public static class DummyVirtualComponent extends AbstractResourceListVirtualComponent {
+		private static final String DUMMY_FIRST_SEGMENT = "dummyVirtualComponent"; //$NON-NLS-1$
+		public DummyVirtualComponent(IProject p, IVirtualComponent referencingComponent) {
+			super(p, referencingComponent);
+		}
+
+		protected String getFirstIdSegment() {
+			return DUMMY_FIRST_SEGMENT;
+		}
+
+		protected IContainer[] getUnderlyingContainers() {
+			return new IContainer[]{};
+		}
+
+		protected IResource[] getLooseResources() {
+			return new IResource[]{};
+		}
+	}
+	
+	private IVirtualReference createDummyReference(String path) {
+		return createDummyReference(path, parentProject, ComponentCore.createComponent(parentProject));
+	}
+	
+	public static IVirtualReference createDummyReference(String path, IProject project, IVirtualComponent rootComponent) {
+		IVirtualComponent comp = new DummyVirtualComponent(project, rootComponent);
+		IVirtualReference ref = ComponentCore.createReference(rootComponent, comp);
+		IPath path2 = new Path(path);
+		IPath runtimePath = path2.segmentCount() > 1 ? path2.removeLastSegments(1) : new Path("/"); //$NON-NLS-1$
+		runtimePath = runtimePath.makeRelative();
+		ref.setRuntimePath(runtimePath);
+		ref.setArchiveName(path2.lastSegment());
+		return ref;
+	}
+	
+	private String[] findUnusedEntries(IVirtualReference[] current, String[] entries) {
+		ArrayList<String> list = new ArrayList<String>();
+		list.addAll(Arrays.asList(entries));
+		for( int i = 0; i < current.length; i++ ) {
+			String currentEntry = current[i].getRuntimePath().append(current[i].getArchiveName()).toString();
+			list.remove(currentEntry);
+		}
+		return list.toArray(new String[list.size()]);
+	}
+	
+	/**
+	 * Clients who find this unacceptable should override
+	 * @param root
+	 * @return
+	 */
+	public IFile getManifestIFile(IVirtualComponent root) {
+		IVirtualFolder rootFolder = root.getRootFolder();
+		IVirtualFile vf = rootFolder.getFile(new Path("META-INF/MANIFEST.MF"));
+		if( vf.exists() )
+			return vf.getUnderlyingFile();
+		return null;
+	}
+	
+	protected String[] getPossibleParentProjects() {
+		IProject[] projects = JavaModuleComponentUtility.findParentProjects(project);
+		String[] strings = new String[projects.length];
+		for( int i = 0; i < projects.length; i++ ) {
+			strings[i] = projects[i].getName();
+		}
+		return strings;
+	}
+
+
+	public boolean performOk() {
+		IDataModel updateManifestDataModel = DataModelFactory.createDataModel(new UpdateManifestDataModelProvider());
+		updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.PROJECT_NAME, project.getName());
+		updateManifestDataModel.setBooleanProperty(UpdateManifestDataModelProperties.MERGE, false);
+		updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.MANIFEST_FILE, getManifestIFile(rootComponent));
+		ArrayList<String> asStrings = new ArrayList<String>();
+		Iterator<IVirtualReference> i = list.iterator();
+		IVirtualReference tmp;
+		while(i.hasNext()) {
+			tmp = i.next();
+			asStrings.add(tmp.getRuntimePath().append(tmp.getArchiveName()).toString());
+		}
+		updateManifestDataModel.setProperty(UpdateManifestDataModelProperties.JAR_LIST, asStrings);
+		try {
+			updateManifestDataModel.getDefaultOperation().execute(new NullProgressMonitor(), null );
+		} catch (ExecutionException e) {
+			// TODO log J2EEUIPlugin.logError(e);
+		}
+
+		return true;
+	}
+
+	public void performDefaults() {
+	}
+
+	public boolean performCancel() {
+		return false;
+	}
+
+	public void setVisible(boolean visible) {
+	}
+
+	public void dispose() {
+	}
+
+}
diff --git a/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/VariableReferenceWizardFragment.java b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/VariableReferenceWizardFragment.java
new file mode 100644
index 0000000..05003b1
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/assembly/wizard/VariableReferenceWizardFragment.java
@@ -0,0 +1,252 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ ******************************************************************************/
+package org.eclipse.jst.common.ui.internal.assembly.wizard;
+
+import java.util.ArrayList;
+
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.internal.ui.wizards.buildpaths.CPVariableElement;
+import org.eclipse.jdt.internal.ui.wizards.buildpaths.CPVariableElementLabelProvider;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jst.common.ui.internal.Messages;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.FormAttachment;
+import org.eclipse.swt.layout.FormData;
+import org.eclipse.swt.layout.FormLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent;
+import org.eclipse.wst.common.componentcore.internal.resources.VirtualReference;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.IWizardHandle;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.WizardFragment;
+import org.eclipse.wst.common.componentcore.ui.propertypage.IReferenceWizardConstants;
+
+public class VariableReferenceWizardFragment extends WizardFragment {
+	protected LabelProvider labelProvider = null;
+	protected ITreeContentProvider contentProvider = null;
+	protected TreeViewer viewer;
+	protected IPath[] paths;
+	protected IWizardHandle handle;
+	protected Object selected = null;
+	boolean isComplete = false;
+
+	public boolean isComplete() {
+		return isComplete;
+	}
+	
+	public boolean hasComposite() {
+		return true;
+	}
+
+	@Override
+	public Composite createComposite(Composite parent, IWizardHandle handle) {
+		this.handle = handle;
+		handle.setTitle(Messages.VariableReferenceTitle);
+		handle.setDescription(Messages.VariableReferenceDescription);
+				
+		Composite c = new Composite(parent, SWT.NONE);
+		c.setLayout(new FormLayout());
+		viewer = new TreeViewer(c, SWT.SINGLE | SWT.BORDER);
+		viewer.setContentProvider(getContentProvider());
+		viewer.setLabelProvider(getLabelProvider());
+		viewer.setInput(ResourcesPlugin.getWorkspace());
+		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				handleNewSelection();
+			}
+		});
+		FormData fd = new FormData();
+		fd.width = 390;
+		fd.height = 185;
+		fd.left = new FormAttachment(0, 5);
+		fd.top = new FormAttachment(0, 5);
+		fd.right = new FormAttachment(100, -5);
+		fd.bottom = new FormAttachment(100, -5);
+		viewer.getTree().setLayoutData(fd);
+		return c;
+	}
+	
+	protected void handleNewSelection() {
+		isComplete = true;
+		IStructuredSelection sel = (IStructuredSelection)viewer.getSelection();
+		Object o = sel.getFirstElement();
+		if( o == null ) {
+			isComplete = false;
+			selected = null;
+		} else {
+			selected = o;
+			IPath p = null;
+			if( o instanceof CPVariableElement) {
+				p = ((CPVariableElement)o).getPath();
+			} else if( o instanceof ExtendedVariable) {
+				p = ((ExtendedVariable)o).element.getPath().append(((ExtendedVariable)o).pathAfterElement);
+			}
+			if(p == null || p.isEmpty() || p.toFile().isDirectory()) {
+				isComplete = false;
+			}
+		}
+		handle.update();
+	}
+	
+	protected LabelProvider getLabelProvider() {
+		if (labelProvider == null) {
+			labelProvider= new VariablesLabelProvider();
+		}
+		return labelProvider;
+	}
+	
+	public static class VariablesLabelProvider extends LabelProvider {
+		private CPVariableElementLabelProvider delegate = new CPVariableElementLabelProvider(false);
+		public Image getImage(Object element) {
+			if( element instanceof CPVariableElement)
+				return delegate.getImage(element);
+			if( element instanceof ExtendedVariable) {
+				if(((ExtendedVariable)element).isFolder()) 
+					return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
+				return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FILE);
+			}
+			return null;
+		}
+		public String getText(Object element) {
+			if( element instanceof CPVariableElement)
+				return delegate.getText(element);
+			if( element instanceof ExtendedVariable) 
+				return ((ExtendedVariable)element).pathAfterElement.lastSegment();
+			return element == null ? "" : element.toString();//$NON-NLS-1$
+		}	
+	}
+	
+	public static class ExtendedVariable {
+		public CPVariableElement element;
+		public IPath pathAfterElement;
+		public ExtendedVariable(CPVariableElement e, IPath p) {
+			element = e;
+			pathAfterElement = p;
+		}
+		public boolean isFolder() {
+			return element.getPath().append(pathAfterElement).toFile().isDirectory();
+		}
+	}
+	
+	private CPVariableElement[] elements;
+	private CPVariableElement[] initializeElements() {
+		String[] entries= JavaCore.getClasspathVariableNames();
+		ArrayList elements= new ArrayList(entries.length);
+		for (int i= 0; i < entries.length; i++) {
+			String name= entries[i];
+			IPath entryPath= JavaCore.getClasspathVariable(name);
+			if (entryPath != null) {
+				elements.add(new CPVariableElement(name, entryPath));
+			}
+		}
+		return (CPVariableElement[]) elements.toArray(new CPVariableElement[elements.size()]);
+	}
+
+	
+	protected ITreeContentProvider getContentProvider() {
+		if (contentProvider == null) {
+			contentProvider = new ITreeContentProvider() {
+				public Object[] getElements(Object inputElement) {
+					if( elements == null )
+						elements = initializeElements();
+					return elements;
+				}
+				public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+				}
+				public void dispose() {
+				}
+				public boolean hasChildren(Object element) {
+					return getChildren(element).length > 0;
+				}
+				public Object getParent(Object element) {
+					return null;
+				}
+				public Object[] getChildren(Object parentElement) {
+					if( parentElement instanceof CPVariableElement) {
+						if(((CPVariableElement)parentElement).getPath().toFile().isDirectory()) {
+							String[] names = ((CPVariableElement)parentElement).getPath().toFile().list();
+							ExtendedVariable[] extensions = new ExtendedVariable[names.length];
+							for( int i = 0; i < extensions.length; i++ )
+								extensions[i] = new ExtendedVariable((CPVariableElement)parentElement, new Path(names[i]));
+							return extensions;
+						}
+					}
+					if( parentElement instanceof ExtendedVariable) {
+						ExtendedVariable p1 = (ExtendedVariable)parentElement;
+						IPath parentLoc = p1.element.getPath();
+						parentLoc = parentLoc.append(p1.pathAfterElement);
+						String[] names = parentLoc.toFile().list();
+						if( names != null ) {
+							ExtendedVariable[] extensions = new ExtendedVariable[names.length];
+							for( int i = 0; i < extensions.length; i++ )
+								extensions[i] = new ExtendedVariable(p1.element, p1.pathAfterElement.append(names[i]));
+							return extensions;
+						}
+					}
+					return new Object[]{};
+				}
+			};
+		}
+		return contentProvider;
+	}
+
+	public void performFinish(IProgressMonitor monitor) throws CoreException {
+		IVirtualComponent rootComponent = (IVirtualComponent)getTaskModel().getObject(IReferenceWizardConstants.ROOT_COMPONENT);
+		String runtimeLoc = (String)getTaskModel().getObject(IReferenceWizardConstants.DEFAULT_LIBRARY_LOCATION);
+		if (selected != null ) {
+			ArrayList<IVirtualReference> refList = new ArrayList<IVirtualReference>();
+//			for (int i = 0; i < selected.length; i++) {
+				IPath variablePath = getVariablePath(selected);
+				IPath resolvedPath = JavaCore.getResolvedVariablePath(variablePath);
+				java.io.File file = new java.io.File(resolvedPath.toOSString());
+				if (file.isFile() && file.exists()) {
+					String type = VirtualArchiveComponent.VARARCHIVETYPE
+							+ IPath.SEPARATOR;
+					IVirtualComponent archive = ComponentCore
+							.createArchiveComponent(rootComponent.getProject(),
+									type + variablePath.toString());
+					VirtualReference ref = new VirtualReference(rootComponent, archive);
+					ref.setArchiveName(resolvedPath.lastSegment());
+					if (runtimeLoc != null) {
+						ref.setRuntimePath(new Path(runtimeLoc).makeAbsolute());
+					}
+					refList.add(ref);
+				}
+//			}
+			IVirtualReference[] finalRefs = refList.toArray(new IVirtualReference[refList.size()]);
+			getTaskModel().putObject(IReferenceWizardConstants.FINAL_REFERENCE, finalRefs);
+		}
+	}
+	
+	private IPath getVariablePath(Object selected) {
+		if( selected instanceof ExtendedVariable) {
+			ExtendedVariable s1 = (ExtendedVariable)selected;
+			return new Path(s1.element.getName()).append(s1.pathAfterElement);
+		}
+		return new Path(((CPVariableElement)selected).getName());
+	}
+}
diff --git a/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/messages.properties b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/messages.properties
new file mode 100644
index 0000000..34c541e
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.ui/src/org/eclipse/jst/common/ui/internal/messages.properties
@@ -0,0 +1,20 @@
+ArchiveTitle=Add an Archive Reference
+ArchiveDescription=Here you can reference a workspace archive\nThis is not a suggested use-case, but is here for backwards compatability.
+ArchiveDialogNewTitle=Archive Selection
+ExternalArchiveTitle=Add an External Archive Reference
+ExternalArchiveDescription=Here you can reference a filesystem archive\nThis is not a suggested use-case, but is here for backwards compatability.
+Browse=Br&owse...
+VariableReferenceTitle=Add a Variable Reference
+VariableReferenceDescription=Here you can reference a variable which maps to a single jar.\nThis is not a suggested use-case, but is here for backwards compatability.
+AddManifestEntryTaskWizardTitle=Add Manifest Entry
+AddManifestEntryTaskWizardDesc=To add manifest entries that should be accessible at runtime,\nselect one or more desired entries and press "Finish"
+ParentProjects=&Parent Projects: 
+CustomEntryButton=&Add Custom Entry
+Add=&Add...
+Remove=&Remove
+MoveUp=Move &Up
+MoveDown=Move &Down
+ManifestEntries=&Manifest Entries:
+ManifestEntryColumn=Manifest Entry
+ManifestEntrySourceColumn=Source
+ConfigureParentLink=Configure Available Manifest Entries
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.core/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.common.core/META-INF/MANIFEST.MF
index 34db84c..a1e6e2f 100644
--- a/plugins/org.eclipse.wst.common.core/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.wst.common.core/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.wst.common.core; singleton:=true
-Bundle-Version: 1.1.201.qualifier
+Bundle-Version: 1.2.0.qualifier
 Bundle-Activator: org.eclipse.wst.common.core.search.SearchPlugin
 Bundle-Localization: plugin
 Export-Package: org.eclipse.wst.common.core.search,
@@ -10,7 +10,8 @@
  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
+ org.eclipse.wst.common.core.search.util,
+ org.eclipse.wst.common.core.util
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)"
diff --git a/plugins/org.eclipse.wst.common.core/plugin.xml b/plugins/org.eclipse.wst.common.core/plugin.xml
index c82f6a0..5d2a621 100644
--- a/plugins/org.eclipse.wst.common.core/plugin.xml
+++ b/plugins/org.eclipse.wst.common.core/plugin.xml
@@ -1,7 +1,9 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?eclipse version="3.0"?>
 <plugin>
-   <extension-point id="searchParticipants" name="%searchParticipants" />      
+   <extension-point id="searchParticipants" name="%searchParticipants" />
+   <extension-point id="uiTester" name="UI Tester" schema="schema/uiTester.exsd"/>
+   <extension-point id="uiContextSensitiveClass" name="UI Context Sensitive Class" schema="schema/uiContextSensitiveClass.exsd"/>
 </plugin>
 
 
diff --git a/plugins/org.eclipse.wst.common.core/schema/uiContextSensitiveClass.exsd b/plugins/org.eclipse.wst.common.core/schema/uiContextSensitiveClass.exsd
new file mode 100644
index 0000000..c18cf1a
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/schema/uiContextSensitiveClass.exsd
@@ -0,0 +1,165 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.wst.common.core" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appinfo>
+         <meta.schema plugin="org.eclipse.wst.common.core" 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.wst.common.core.uiContextSensitiveClass extension point provided by the WST 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">
+      <annotation>
+         <appinfo>
+            <meta.element />
+         </appinfo>
+      </annotation>
+      <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="apiInfo"/>
+      </appinfo>
+      <documentation>
+         See &lt;code&gt;org.eclipse.wst.common.core.util.UIContextDetermination&lt;/code&gt;
+      </documentation>
+   </annotation>
+
+   <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.wst.common.core.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.wst.common.core.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="copyright"/>
+      </appinfo>
+      <documentation>
+         Copyright (c) IBM 2003.
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/plugins/org.eclipse.wst.common.core/schema/uiTester.exsd b/plugins/org.eclipse.wst.common.core/schema/uiTester.exsd
new file mode 100644
index 0000000..df8bb48
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/schema/uiTester.exsd
@@ -0,0 +1,133 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.wst.common.core" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appinfo>
+         <meta.schema plugin="org.eclipse.wst.common.core" id="uiTester" name="UI Tester"/>
+      </appinfo>
+      <documentation>
+         This is used to tell WST 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 WST 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">
+      <annotation>
+         <appinfo>
+            <meta.element />
+         </appinfo>
+      </annotation>
+      <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.wst.common.core.util.UITester&lt;/samp&gt;.
+               </documentation>
+               <appinfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.wst.common.core.util.UITester"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <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.wst.common.core.util.UITester&lt;/samp&gt; interface for the tester.
+      </documentation>
+   </annotation>
+
+   <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.wst.common.core.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="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/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
index cf7a9fc..5d8c303 100644
--- 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
@@ -13,7 +13,11 @@
 
 import java.util.Map;
 
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Plugin;
+import org.eclipse.core.runtime.Status;
 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;
@@ -30,6 +34,21 @@
  */
 public class SearchPlugin extends Plugin implements ISearchOptions
 {
+	//the ID for this plugin (added automatically by logging quickfix)
+	public static final String PLUGIN_ID = "org.eclipse.wst.common.core"; //$NON-NLS-1$
+
+	/**
+	 * 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$
 
 	private SearchParticipantRegistry searchParticipantRegistry;
 
@@ -100,4 +119,31 @@
 		return getSearchParticipantRegistry().getParticipants(pattern, searchOptions);
 	}
 
+	public static IStatus createStatus(int severity, String message, Throwable exception) {
+		return new Status(severity, PLUGIN_ID, message, exception);
+	}
+
+	public static IStatus createStatus(int severity, String message) {
+		return createStatus(severity, message, null);
+	}
+
+	public static void logError(Throwable exception) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( createStatus(IStatus.ERROR, exception.getMessage(), exception));
+	}
+
+	public static void logError(CoreException exception) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( exception.getStatus() );
+	}
+
+	public static void logWarning(String message) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log(createStatus(IStatus.WARNING, message));
+	}
+
+	public static void logWarning(Throwable exception) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( createStatus(IStatus.WARNING, exception.getMessage(), exception));
+	}
+
+	public static void logError(String message) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( createStatus(IStatus.ERROR, message));
+	}
 }
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/util/RegistryReader.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/util/RegistryReader.java
new file mode 100644
index 0000000..abf3e2b
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/util/RegistryReader.java
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * 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.util;
+import org.eclipse.core.runtime.*;
+import org.eclipse.wst.common.core.search.SearchPlugin;
+import org.osgi.framework.Bundle;
+
+
+/**
+ * Class to read a registry. It is meant to be subclassed to provide specific function.
+ * 
+ * @since 1.0.0
+ */
+public abstract class RegistryReader {
+
+	private static final String JEM_PLUGIN_ID = "org.eclipse.jem.util"; //$NON-NLS-1$
+	
+	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$
+		SearchPlugin.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)
+		{
+			IConfigurationElement[] elements = point.getConfigurationElements();
+			for (int i = 0; i < elements.length; i++) {
+				internalReadElement(elements[i]);
+			}
+		}
+		// the following code is to handle the contributions to the deprecated org.eclipse.jem.util extensions
+		if (!JEM_PLUGIN_ID.equals(pluginId))
+		{
+			point = Platform.getExtensionRegistry().getExtensionPoint(JEM_PLUGIN_ID, extensionPointId);
+			if (point != null)
+			{
+				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.wst.common.core/src-search/org/eclipse/wst/common/core/util/UIContextDetermination.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/util/UIContextDetermination.java
new file mode 100644
index 0000000..69c0bbc
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/util/UIContextDetermination.java
@@ -0,0 +1,201 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+package org.eclipse.wst.common.core.util;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.runtime.*;
+import org.eclipse.wst.common.core.search.SearchPlugin;
+
+
+/**
+ * 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;
+
+	/**
+	 * Do not use- this class should not be instantiated, but should be accessed via its static methods only.
+	 */
+	protected 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) {
+			SearchPlugin.logError("Problem loading extension not found for key \"" + key + "\"."); //$NON-NLS-1$ //$NON-NLS-2$
+			SearchPlugin.logError(e);
+		}
+		if (result == null)
+			SearchPlugin.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(SearchPlugin.PLUGIN_ID, SearchPlugin.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(SearchPlugin.PLUGIN_ID, SearchPlugin.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 (Exception t) {
+					SearchPlugin.logWarning("UIContextDetermination is proceeding in HEADLESS mode"); //$NON-NLS-1$
+				}
+			}
+			return result;
+		}
+
+		public void readRegistry() {
+			super.readRegistry();
+			IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint("org.eclipse.jem.util", extensionPointId);
+			if (point == null)
+				return;
+			IConfigurationElement[] elements = point.getConfigurationElements();
+			for (int i = 0; i < elements.length; i++) {
+				boolean recognized = this.readElement(elements[i]);
+				if (!recognized) {
+					logError(elements[i], "Error processing extension: " + elements[i]); //$NON-NLS-1$
+				}
+			}
+		}
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/util/UITester.java b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/util/UITester.java
new file mode 100644
index 0000000..768ed10
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.core/src-search/org/eclipse/wst/common/core/util/UITester.java
@@ -0,0 +1,28 @@
+package org.eclipse.wst.common.core.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
+ *******************************************************************************/
+
+/**
+ * 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();
+}
diff --git a/plugins/org.eclipse.wst.common.emf/.classpath b/plugins/org.eclipse.wst.common.emf/.classpath
index 96202d8..302a786 100644
--- a/plugins/org.eclipse.wst.common.emf/.classpath
+++ b/plugins/org.eclipse.wst.common.emf/.classpath
@@ -2,7 +2,7 @@
 <classpath>
 	<classpathentry kind="src" path="wtpemf/"/>
 	<classpathentry kind="src" path="workbench/"/>
-	<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.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
 		<accessrules>
 			<accessrule kind="accessible" pattern="org/eclipse/wst/common/**"/>
diff --git a/plugins/org.eclipse.wst.common.emf/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.wst.common.emf/.settings/org.eclipse.jdt.core.prefs
index 6c7418f..c296c08 100644
--- a/plugins/org.eclipse.wst.common.emf/.settings/org.eclipse.jdt.core.prefs
+++ b/plugins/org.eclipse.wst.common.emf/.settings/org.eclipse.jdt.core.prefs
@@ -1,63 +1,95 @@
-#Sat Mar 24 02:06:02 EDT 2007
-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=ignore
-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=error
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
-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=error
-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=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=ignore
-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=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+#Wed Jun 24 10:13:16 EDT 2009
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
+org.eclipse.jdt.core.compiler.problem.unusedLocal=error
+org.eclipse.jdt.core.compiler.problem.emptyStatement=error
+org.eclipse.jdt.core.compiler.problem.unusedLabel=error
+org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=enabled
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=error
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=error
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=error
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=error
+eclipse.preferences.version=1
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
+org.eclipse.jdt.core.compiler.problem.deadCode=error
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeUncheckedExceptions=disabled
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=warning
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=ignore
-org.eclipse.jdt.core.compiler.source=1.3
+org.eclipse.jdt.core.compiler.problem.autoboxing=warning
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=error
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
diff --git a/plugins/org.eclipse.wst.common.emf/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.common.emf/META-INF/MANIFEST.MF
index 182aee8..54de84f 100644
--- a/plugins/org.eclipse.wst.common.emf/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.wst.common.emf/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.wst.common.emf; singleton:=true
-Bundle-Version: 1.1.201.qualifier
+Bundle-Version: 1.2.0.qualifier
 Bundle-Activator: org.eclipse.wst.common.internal.emf.plugin.EcoreUtilitiesPlugin
 Bundle-Vendor: %pluginProvider
 Bundle-Localization: plugin
@@ -13,7 +13,7 @@
  org.eclipse.wst.common.frameworks;bundle-version="[1.1.200,2.0.0)",
  org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.jem.util;bundle-version="[2.0.100,3.0.0)"
+ org.eclipse.wst.common.core;bundle-version="[1.1.201,2.0.0)"
 Eclipse-LazyStart: true
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-ActivationPolicy: lazy
diff --git a/plugins/org.eclipse.wst.common.emf/plugin.xml b/plugins/org.eclipse.wst.common.emf/plugin.xml
index dde6ad8..5dc13a6 100644
--- a/plugins/org.eclipse.wst.common.emf/plugin.xml
+++ b/plugins/org.eclipse.wst.common.emf/plugin.xml
@@ -24,7 +24,7 @@
    </extension>
    
       <extension
-         point="org.eclipse.jem.util.uiContextSensitiveClass">
+         point="org.eclipse.wst.common.core.uiContextSensitiveClass">
       <uiContextSensitiveClass
             context="Headless"
             key="rendererFactory"
diff --git a/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/ResourceSynchronizedIsLoadingAdapter.java b/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/ResourceSynchronizedIsLoadingAdapter.java
index 5034c7a..f7c6919 100644
--- a/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/ResourceSynchronizedIsLoadingAdapter.java
+++ b/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/ResourceSynchronizedIsLoadingAdapter.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * Copyright (c) 2005, 2009 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
@@ -10,18 +10,16 @@
  *******************************************************************************/
 /*
  * Created on Oct 26, 2004
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
  */
 package org.eclipse.wst.common.internal.emf;
 
-import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.jobs.ILock;
+import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.Notifier;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.wst.common.internal.emf.utilities.ResourceIsLoadingAdapter;
+import org.eclipse.wst.common.internal.emf.plugin.EcoreUtilitiesPlugin;
 
 
 
@@ -44,13 +42,13 @@
 	 * The delay is default to 5 minutes. This is the upward threshhold. The
 	 * lock will wait up to DELAY milliseconds to acquire the lock, and bail
 	 * if not. It does not mean that it will wait DELAY milliseconds always.
-	 * In general, the wait should be almost instanteous -- just as long as
+	 * In general, the wait should be almost instantaneous -- just as long as
 	 * document loading remains speedy.
 	 */
 	private static final long DELAY = 300000;
 
 	public ResourceSynchronizedIsLoadingAdapter() {
-		loadingLock = Platform.getJobManager().newLock();
+		loadingLock = Job.getJobManager().newLock();
 		if (loadingLock != null)
 			loadingLock.acquire();
 	}
@@ -61,6 +59,7 @@
 	 * 
 	 * @see com.ibm.wtp.internal.emf.utilities.ResourceIsLoadingAdapter#waitForResourceToLoad()
 	 */
+	@Override
 	public void waitForResourceToLoad() {
 
 		if (loadingLock == null)
@@ -90,9 +89,8 @@
 		Notifier target = getTarget();
 		if (target == null || !(target instanceof Resource)) {
 			Resource resource = (Resource) target;
-			System.err.println("[WARNING] Could not acquire Semaphore Lock for Resource: \"" + resource.getURI() + "\" in " + getClass());
+			EcoreUtilitiesPlugin.logError("[WARNING] Could not acquire Semaphore Lock for Resource: \"" + resource.getURI() + "\" in " + getClass());  //$NON-NLS-1$//$NON-NLS-2$
 		}
-
 	}
 
 
@@ -101,6 +99,7 @@
 	 * 
 	 * @see com.ibm.wtp.internal.emf.utilities.ResourceIsLoadingAdapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
 	 */
+	@Override
 	public void notifyChanged(Notification notification) {
 
 		if (notification.getNotifier() != null) {
@@ -119,6 +118,7 @@
 	 * 
 	 * @see com.ibm.wtp.internal.emf.utilities.ResourceIsLoadingAdapter#forceRelease()
 	 */
+	@Override
 	public void forceRelease() {
 		if (loadingLock != null && loadingLock.getDepth() > 0)
 			loadingLock.release();
diff --git a/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/ResourceSynchronizedIsLoadingAdapterFactory.java b/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/ResourceSynchronizedIsLoadingAdapterFactory.java
index 1990e8a..901b3b6 100644
--- a/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/ResourceSynchronizedIsLoadingAdapterFactory.java
+++ b/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/ResourceSynchronizedIsLoadingAdapterFactory.java
@@ -10,9 +10,6 @@
  *******************************************************************************/
 /*
  * Created on Oct 26, 2004
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
  */
 package org.eclipse.wst.common.internal.emf;
 
@@ -22,9 +19,6 @@
 
 /**
  * @author mdelder
- *
- * TODO To change the template for this generated type comment go to
- * Window - Preferences - Java - Code Style - Code Templates
  */
 public class ResourceSynchronizedIsLoadingAdapterFactory extends ResourceIsLoadingAdapterFactory {
 
@@ -32,7 +26,8 @@
     /* (non-Javadoc)
      * @see com.ibm.wtp.internal.emf.utilities.ResourceIsLoadingAdapterFactory#createResourceIsLoadingAdapter()
      */
-    public ResourceIsLoadingAdapter createResourceIsLoadingAdapter() { 
+    @Override
+	public ResourceIsLoadingAdapter createResourceIsLoadingAdapter() { 
         return new ResourceSynchronizedIsLoadingAdapter();
     }
 }
diff --git a/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/plugin/EcoreUtilitiesPlugin.java b/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/plugin/EcoreUtilitiesPlugin.java
index 1c24c05..1f19437 100644
--- a/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/plugin/EcoreUtilitiesPlugin.java
+++ b/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/plugin/EcoreUtilitiesPlugin.java
@@ -21,6 +21,11 @@
 import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
 import org.eclipse.wst.common.internal.emf.utilities.ResourceIsLoadingAdapterFactory;
 import org.osgi.framework.BundleContext;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
+import java.lang.Throwable;
+import org.eclipse.core.runtime.CoreException;
 
 /**
  * @author DABERG
@@ -29,6 +34,8 @@
  * Generation>Code and Comments
  */
 public class EcoreUtilitiesPlugin extends Plugin {
+	//the ID for this plugin (added automatically by logging quickfix)
+	public static final String PLUGIN_ID = "org.eclipse.wst.common.emf"; //$NON-NLS-1$
 	public static final String ID = "org.eclipse.wst.common.emf"; //$NON-NLS-1$
 	public static final String TRANSLATOR_EXTENSTION_POINT = "translatorExtension"; //$NON-NLS-1$
 
@@ -44,6 +51,7 @@
 	 * 
 	 * @see org.eclipse.core.runtime.Plugin#startup()
 	 */
+	@Override
 	public void start(BundleContext context) throws Exception {
 		super.start(context);
 		RendererFactory.setDefaultHandler(PluginRendererFactoryDefaultHandler.INSTANCE);
@@ -52,4 +60,33 @@
 		//use a synchronized loading adapter factory
 		ResourceIsLoadingAdapterFactory.INSTANCE = new ResourceSynchronizedIsLoadingAdapterFactory();
 	}
+
+	public static IStatus createStatus(int severity, String message, Throwable exception) {
+		return new Status(severity, PLUGIN_ID, message, exception);
+	}
+
+	public static IStatus createStatus(int severity, String message) {
+		return createStatus(severity, message, null);
+	}
+
+	public static void logError(Throwable exception) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( createStatus(IStatus.ERROR, exception.getMessage(), exception));
+	}
+
+	public static void logError(CoreException exception) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( exception.getStatus() );
+	}
+
+	public static void logError(String message) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( createStatus(IStatus.ERROR, message));
+	}
+
+	public static void logWarning(String message) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log(createStatus(IStatus.WARNING, message));
+	}
+	
+	public static void logWarning(Throwable exception) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( createStatus(IStatus.WARNING, exception.getMessage(), exception));
+	}
+
 }
diff --git a/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/plugin/PluginRendererFactoryDefaultHandler.java b/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/plugin/PluginRendererFactoryDefaultHandler.java
index ee80757..4ad9dc9 100644
--- a/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/plugin/PluginRendererFactoryDefaultHandler.java
+++ b/plugins/org.eclipse.wst.common.emf/workbench/org/eclipse/wst/common/internal/emf/plugin/PluginRendererFactoryDefaultHandler.java
@@ -8,24 +8,12 @@
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
-/*
- * Created on Dec 1, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
 package org.eclipse.wst.common.internal.emf.plugin;
 
-import org.eclipse.jem.util.UIContextDetermination;
+import org.eclipse.wst.common.core.util.UIContextDetermination;
 import org.eclipse.wst.common.internal.emf.resource.EMF2DOMRendererFactoryDefaultHandler;
 import org.eclipse.wst.common.internal.emf.resource.RendererFactory;
 
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
 public class PluginRendererFactoryDefaultHandler extends EMF2DOMRendererFactoryDefaultHandler {
 
 	static final PluginRendererFactoryDefaultHandler INSTANCE = new PluginRendererFactoryDefaultHandler();
@@ -43,6 +31,7 @@
 	 * 
 	 * @see com.ibm.etools.emf2xml.EMF2DOMRendererFactoryDefaultHandler#getDefaultRendererFactory()
 	 */
+	@Override
 	public RendererFactory getDefaultRendererFactory() {
 		RendererFactory aFactory = (RendererFactory) UIContextDetermination.createInstance(EXT_POINT_NAME);
 		return aFactory == null ? super.getDefaultRendererFactory() : aFactory;
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/AbstractRendererImpl.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/AbstractRendererImpl.java
index cff83b7..7a9545b 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/AbstractRendererImpl.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/AbstractRendererImpl.java
@@ -151,4 +151,8 @@
 	public boolean isBatchMode() {
 		return false;
 	}
+
+	public boolean isReverting() {
+		return false;
+	}
 }
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/AttributeTranslatorFilter.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/AttributeTranslatorFilter.java
index b0d0869..32debc9 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/AttributeTranslatorFilter.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/AttributeTranslatorFilter.java
@@ -23,6 +23,7 @@
 		super(trans, version);
 	}
 
+	@Override
 	public final int scanNextTranslator(Translator[] children, int start) {
 		int found = start + 1;
 		for (; found < children.length; ++found) {
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CacheEventNode.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CacheEventNode.java
index e575833..18aebcd 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CacheEventNode.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CacheEventNode.java
@@ -315,6 +315,7 @@
 		return result;
 	}
 
+	@Override
 	public String toString() {
 		StringBuffer output = new StringBuffer("CacheEventNode[");//$NON-NLS-1$
 		output.append("nodeName=");//$NON-NLS-1$
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CacheEventStack.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CacheEventStack.java
index 03f4198..0ce8c85 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CacheEventStack.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CacheEventStack.java
@@ -27,6 +27,11 @@
 
 	/**
 	 * 
+	 */
+	private static final long serialVersionUID = 1208895320149054103L;
+
+	/**
+	 * 
 	 * @return the top of the stack without removing it
 	 */
 	public CacheEventNode peek() {
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityResourceFactory.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityResourceFactory.java
index f824de3..6ac4bba 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityResourceFactory.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityResourceFactory.java
@@ -53,6 +53,7 @@
 	 * 
 	 * @see org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl#createResource(org.eclipse.emf.common.util.URI)
 	 */
+	@Override
 	public Resource createResource(URI uri) {
 		return new CompatibilityXMIResourceImpl(uri);
 	}
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilitySAXXMIHandler.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilitySAXXMIHandler.java
index ee6ff3e..f26ca8e 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilitySAXXMIHandler.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilitySAXXMIHandler.java
@@ -45,6 +45,7 @@
 	 * 
 	 * @see org.eclipse.emf.ecore.xmi.impl.XMLHandler#isNull()
 	 */
+	@Override
 	protected boolean isNull() {
 		boolean isnull = super.isNull();
 		if (!isnull)
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMILoadImpl.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMILoadImpl.java
index 5f17a46..26ebff7 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMILoadImpl.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMILoadImpl.java
@@ -41,6 +41,7 @@
 	 * 
 	 * @see org.eclipse.emf.ecore.xmi.impl.XMLLoadImpl#makeDefaultHandler()
 	 */
+	@Override
 	protected DefaultHandler makeDefaultHandler() {
 		return new SAXWrapper(new CompatibilitySAXXMIHandler(resource, helper, options));
 	}
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMIResourceImpl.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMIResourceImpl.java
index 1b34804..bb95f96 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMIResourceImpl.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMIResourceImpl.java
@@ -54,6 +54,7 @@
 	/**
 	 * @see org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl#createXMLHelper()
 	 */
+	@Override
 	protected final XMLHelper createXMLHelper() {
 		MappedXMIHelper helper = doCreateXMLHelper();
 		helper.setPackageURIsToPrefixes(getPackageURIsToPrefixes());
@@ -104,6 +105,7 @@
 	/**
 	 * @see org.eclipse.emf.ecore.resource.Resource#getURIFragment(EObject)
 	 */
+	@Override
 	public String getURIFragment(EObject eObject) {
 		if (usesDefaultFormat())
 			return super.getURIFragment(eObject);
@@ -117,6 +119,7 @@
 	/**
 	 * @see org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl#createXMLSave()
 	 */
+	@Override
 	protected XMLSave createXMLSave() {
 		if (usesDefaultFormat())
 			return super.createXMLSave();
@@ -126,6 +129,7 @@
 	/**
 	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#doSave(OutputStream, Map)
 	 */
+	@Override
 	public void doSave(OutputStream outputStream, Map options) throws IOException {
 		super.doSave(outputStream, options);
 	}
@@ -142,9 +146,10 @@
 	/**
 	 * @see org.eclipse.emf.ecore.resource.impl.ResourceImpl#getEObjectByID(String)
 	 */
+	@Override
 	protected EObject getEObjectByID(String id) {
 		if (idToEObjectMap != null) {
-			EObject eObject = (EObject) idToEObjectMap.get(id);
+			EObject eObject = idToEObjectMap.get(id);
 			if (eObject != null) {
 				return eObject;
 			}
@@ -157,6 +162,7 @@
 	 * {@link InternalEObject#eSetProxyURI sets}the object to be a proxy and clears the
 	 * {@link #eAdapters adapters}.
 	 */
+	@Override
 	protected void unloaded(InternalEObject internalEObject) {
 		//overridden from the super class; call super.getURIFragment instead of the implementation
 		//at this level, to avoid ID generation during unload
@@ -171,6 +177,7 @@
 	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#doLoad(java.io.InputStream,
 	 *      java.util.Map)
 	 */
+	@Override
 	public final void doLoad(InputStream inputStream, Map options) throws IOException {
 		basicDoLoad(inputStream, options);
 	}
@@ -187,11 +194,13 @@
 	 * 
 	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#init()
 	 */
+	@Override
 	protected void init() {
 		super.init();
 		setEncoding(DEFAULT_ENCODING);
 	}
 
+	@Override
 	protected XMLLoad createXMLLoad() {
 		return new CompatibilityXMILoadImpl(createXMLHelper());
 	}
@@ -226,6 +235,7 @@
 	 * 
 	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#detachedHelper(org.eclipse.emf.ecore.EObject)
 	 */
+	@Override
 	protected void detachedHelper(EObject eObject) {
 		if (modificationTrackingAdapter != null) {
 			eObject.eAdapters().remove(modificationTrackingAdapter);
@@ -240,6 +250,7 @@
 		}
 	}
 	
+	@Override
 	public void load(Map options) throws IOException {
 
         ResourceIsLoadingAdapter adapter = null;
@@ -271,13 +282,47 @@
             }
         }
     }
+	public void loadExisting(Map options) throws IOException {
+
+		
+        ResourceIsLoadingAdapter adapter = null;
+        if (isLoaded) {
+            adapter = ResourceIsLoadingAdapter.findAdapter(this);
+            if (adapter != null) 
+                adapter.waitForResourceToLoad();
+            return;
+        }
+        synchronized (this) {            
+            adapter = ResourceIsLoadingAdapter.findAdapter(this);
+            if (adapter == null && !isLoaded) 
+                addSynchronizationLoadingAdapter();
+        }
+        if(adapter != null)
+            adapter.waitForResourceToLoad();
+        else {
+            try {
+                load((InputStream) null, options);
+            } catch(IOException ioe) {
+                removeLoadingSynchronizationAdapter();
+                throw ioe;
+            } catch(RuntimeException re) {
+                removeLoadingSynchronizationAdapter();
+                throw re;
+            } catch(Error e) {
+                removeLoadingSynchronizationAdapter();
+                throw e;
+            }
+        }
+    }
 	
 	  /**
      * 
      */
     protected void addSynchronizationLoadingAdapter() {
+    	synchronized (eAdapters()) {
         if (ResourceIsLoadingAdapter.findAdapter(this) == null)
             eAdapters().add(ResourceIsLoadingAdapterFactory.INSTANCE.createResourceIsLoadingAdapter());
+    	}
     }
 
     /**
@@ -312,7 +357,8 @@
      * 
      * @see org.eclipse.emf.ecore.resource.Resource#getContents()
      */
-    public EList getContents() {
+    @Override
+	public EList getContents() {
         waitForResourceToLoadIfNecessary();
         return super.getContents();
     }
@@ -322,7 +368,8 @@
      * 
      * @see org.eclipse.emf.ecore.resource.impl.ResourceImpl#isLoaded()
      */
-    public boolean isLoaded() {
+    @Override
+	public boolean isLoaded() {
         waitForResourceToLoadIfNecessary();
         return super.isLoaded();
     }
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMISaveImpl.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMISaveImpl.java
index c1a7bf2..2af74c3 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMISaveImpl.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/CompatibilityXMISaveImpl.java
@@ -47,6 +47,7 @@
 	/**
 	 * @see org.eclipse.emf.ecore.xmi.impl.XMISaveImpl#init(XMLResource, Map)
 	 */
+	@Override
 	protected void init(XMLResource resource, Map options) {
 		super.init(resource, options);
 		xmiType = true;
@@ -55,6 +56,7 @@
 	/**
 	 * @see org.eclipse.emf.ecore.xmi.impl.XMISaveImpl#addNamespaceDeclarations()
 	 */
+	@Override
 	public void addNamespaceDeclarations() {
 		doc.addAttribute(XMI_VER_NS, XMIResource.VERSION_VALUE);
 		doc.addAttribute(XMI_XMLNS, XMIResource.XMI_URI);
@@ -105,6 +107,7 @@
 		}
 	}
 
+	@Override
 	protected void saveHref(EObject remote, EStructuralFeature f) {
 		String name = helper.getQName(f);
 		String href = helper.getHREF(remote);
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ConstantAttributeTranslator.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ConstantAttributeTranslator.java
index 356f102..ceaa9f8 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ConstantAttributeTranslator.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ConstantAttributeTranslator.java
@@ -37,6 +37,7 @@
 	 * 
 	 * @see com.ibm.etools.emf2xml.impl.Translator#getMOFValue(org.eclipse.emf.ecore.EObject)
 	 */
+	@Override
 	public Object getMOFValue(EObject mofObject) {
 		return attributeValue;
 	}
@@ -46,6 +47,7 @@
 	 * 
 	 * @see com.ibm.etools.emf2xml.impl.Translator#isSetMOFValue(org.eclipse.emf.ecore.EObject)
 	 */
+	@Override
 	public boolean isSetMOFValue(EObject emfObject) {
 		return true;
 	}
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/DependencyTranslator.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/DependencyTranslator.java
index c7d1c62..3f48221 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/DependencyTranslator.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/DependencyTranslator.java
@@ -48,45 +48,55 @@
 		return child;
 	}
 
+	@Override
 	public List getMOFChildren(EObject mofObject) {
 		//return super.getMOFChildren(getChild(mofObject));
 		return super.getMOFChildren(mofObject);
 	}
 
+	@Override
 	public Object getMOFValue(EObject mofObject) {
 		return super.getMOFValue(getChild(mofObject));
 	}
 
+	@Override
 	public void setMOFValue(EObject emfObject, Object value) {
 		//super.setMOFValue(getChild(emfObject), value);
 		super.setMOFValue(getChild(emfObject), value, -1);
 	}
 
+	@Override
 	public void setMOFValue(Notifier owner, Object value, int newIndex) {
 		super.setMOFValue(getChild((EObject) owner), value, newIndex);
 	}
 
+	@Override
 	public void removeMOFValue(Notifier owner, Object value) {
 		super.removeMOFValue(getChild((EObject) owner), value);
 	}
 
+	@Override
 	public boolean isSetMOFValue(EObject emfObject) {
 		return super.isSetMOFValue(getChild(emfObject));
 	}
 
+	@Override
 	public void unSetMOFValue(EObject emfObject) {
 		super.unSetMOFValue(getChild(emfObject));
 	}
 
 
+	@Override
 	public boolean isDependencyChild() {
 		return true;
 	}
 
+	@Override
 	public boolean featureExists(EObject emfObject) {
 		return super.featureExists(getChild(emfObject));
 	}
 
+	@Override
 	public void clearList(EObject mofObject) {
 		super.clearList(getChild(mofObject));
 	}
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMAdapterImpl.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMAdapterImpl.java
index e0144f8..8b6dcc1 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMAdapterImpl.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMAdapterImpl.java
@@ -30,6 +30,7 @@
 import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.wst.common.internal.emf.plugin.EcoreUtilitiesPlugin;
 import org.eclipse.wst.common.internal.emf.utilities.Assert;
 import org.eclipse.wst.common.internal.emf.utilities.DOMUtilities;
 import org.eclipse.wst.common.internal.emf.utilities.EtoolsCopySession;
@@ -72,6 +73,7 @@
 
 		static final String KEY = "EMF2DOMDependencyAdapter"; //$NON-NLS-1$
 
+		@Override
 		public void notifyChanged(Notification msg) {
 			EMF2DOMAdapterImpl.this.notifyChanged(msg);
 		}
@@ -79,6 +81,7 @@
 		/**
 		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#isAdapterForType(Object)
 		 */
+		@Override
 		public boolean isAdapterForType(Object type) {
 			return KEY.equals(type);
 		}
@@ -136,8 +139,8 @@
 		try {
 			// If the Platform class can be found, then continue to check if the OSGI platform is running
 			Class clazz = Class.forName(PLATFORM);
-			Method m = clazz.getMethod(ISRUNNING, null);
-			isRunning = ((Boolean)m.invoke(clazz, null)).booleanValue();
+			Method m = clazz.getMethod(ISRUNNING);
+			isRunning = ((Boolean)m.invoke(clazz)).booleanValue();
 		} catch (ClassNotFoundException e) {
 		     // Ignore because this must be in a non_OSGI environment
 		} catch (SecurityException e) {
@@ -203,6 +206,7 @@
 		fNotificationEnabled = isEnabled;
 	}
 
+	@Override
 	public boolean isAdapterForType(Object type) {
 		return EMF2DOMAdapter.ADAPTER_CLASS == type;
 	}
@@ -211,6 +215,7 @@
 		target.eAdapters().add(this);
 	}
 
+	@Override
 	public String toString() {
 		StringBuffer sb = new StringBuffer();
 		sb.append(shortClassName(this));
@@ -262,11 +267,11 @@
 					break;
 			}
 
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("MOF Change: " + notifType); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tnotifier      : " + msg.getNotifier()); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tchangedFeature: " + msg.getFeature()); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\toldValue      : " + msg.getOldValue()); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tnewValue      : " + msg.getNewValue()); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("MOF Change: " + notifType); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("\tnotifier      : " + msg.getNotifier()); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("\tchangedFeature: " + msg.getFeature()); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("\toldValue      : " + msg.getOldValue()); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("\tnewValue      : " + msg.getNewValue()); //$NON-NLS-1$
 		}
 	}
 
@@ -287,6 +292,52 @@
 		}
 		return null;
 	}
+	
+	/**
+	 * Checks to ensure that only one MOF node has been removed and will remove the dom equivalent.
+	 * If multiple differences are found, will return the index of the first difference.
+	 * 
+	 * @param parent
+	 * @param mofChildren
+	 * @param domChildren
+	 * @return
+	 */
+	private int updateDOMSingleRemove(Node parent, List mofChildren, List domChildren){
+		int domIndex = 0;
+		int firstDifference = -1;
+		for (Object mofChild : mofChildren){
+			if (mofChild instanceof EObject)
+			{
+				EMF2DOMAdapter adapter = getExistingAdapter((EObject)mofChild);
+				if(adapter.getNode() != domChildren.get(domIndex)){
+					if(firstDifference != -1){
+						//second difference; return
+						return firstDifference;
+					}
+					//we found something that is different
+					firstDifference = domIndex;
+					//skip over one index and check against next
+					domIndex ++;
+					if(adapter.getNode() != domChildren.get(domIndex)){
+						//if these are different then there are multiple changes
+						return firstDifference;
+					}
+				}
+				domIndex++;
+			}
+		}
+		if(firstDifference != -1){
+			removeDOMChild(parent, (Element) domChildren.get(firstDifference));
+			//if we are here, and firstDifference is not -1, that means we have iterated
+			//through the entire mof list, and all elements have been processed. Return
+			//domchildren.size, so that no more processing is done in calling method.
+			return domChildren.size();
+		}
+		//if we are here, then firstDifference was -1. Our algo has failed. Let original algo run.
+		return 0;
+	}
+
+	
 
 	/**
 	 * Update all the children of the target MOF object in the relationship described by
@@ -299,18 +350,23 @@
 	 */
 	protected void primUpdateDOMMultiFeature(Translator map, Node node, List mofChildren, List domChildren, Notifier owner) {
 
+		int i = 0;
+		Node parent = findDOMPath(node, map, false);
+		if(domChildren.size() - mofChildren.size() == 1){
+			//an emf object has been deleted. Remove it from the dom as well
+			i = updateDOMSingleRemove(parent, mofChildren, domChildren);
+		}
 		//Used for inserting primitives
 		List inorderDOMChildren = null;
-		if (!map.isObjectMap() || map.isManagedByParent()) {
-			inorderDOMChildren = new ArrayList();
-			inorderDOMChildren.addAll(domChildren);
+		if(i < mofChildren.size()){
+			if (!map.isObjectMap() || map.isManagedByParent()) {
+				inorderDOMChildren = new ArrayList();
+				inorderDOMChildren.addAll(domChildren);
+			}
 		}
-		Node parent = findDOMPath(node, map, false);
-
 		// Go though the MOF children checking to see if the corresponding
 		// MOF Adapter children exists. If not, create the adapter.
 		// Also handles reordering children that have moved.
-		int i = 0;
 		for (; i < mofChildren.size(); i++) {
 			Object child = mofChildren.get(i);
 			EObject mofChild = null;
@@ -365,7 +421,9 @@
 					indent(newNode, map);
 					addDOMAdapter(newNode); // Hook up listeners
 					domChildren.add(i, newNode);
-					inorderDOMChildren.add(newNode);
+					if(inorderDOMChildren != null){
+						inorderDOMChildren.add(newNode);
+					}
 					Text newText = parent.getOwnerDocument().createTextNode(map.convertValueToString(child, (EObject) owner));
 					DOMUtilities.insertBeforeNode(newNode, newText, null);
 				}
@@ -641,8 +699,8 @@
 				removeDOMAdapter(childNode, attrAdapter);
 
 				if (fDebug) {
-					org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tCHILD: Adding DOM adapter: " + this); //$NON-NLS-1$
-					org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\t\tto: " + childNode); //$NON-NLS-1$
+					EcoreUtilitiesPlugin.logError("\tCHILD: Adding DOM adapter: " + this); //$NON-NLS-1$
+					EcoreUtilitiesPlugin.logError("\t\tto: " + childNode); //$NON-NLS-1$
 				}
 				primAddDOMAdapter(childNode, this);
 			}
@@ -657,7 +715,7 @@
 			removeDOMChild(parentNode, childNode, false);
 			parentNode.insertBefore(childNode, insertBeforeNode);
 		} catch (Exception e) {
-			e.printStackTrace();
+			EcoreUtilitiesPlugin.logError(e);
 		}
 	}
 
@@ -694,7 +752,7 @@
 				removeAdapters(childNode);
 			parentNode.removeChild(childNode);
 		} catch (Exception e) { 
-			e.printStackTrace();
+			EcoreUtilitiesPlugin.logError(e);
 		}
 	}
 
@@ -702,12 +760,6 @@
 	 * Remove the DOM adapters from the node AND all its child nodes, recursively.
 	 */
 	public void removeAdapters(Node node) {
-		NodeList nl = node.getChildNodes();
-		for (int i = 0; i < nl.getLength(); i++) {
-			Node n = nl.item(i);
-			removeAdapters(n);
-		}
-		
 		EMF2DOMAdapter adapter = primGetExistingAdapter(node);
 		if (adapter != null) {
 			// Remove the adapter from both the DOM node and the MOF Object.
@@ -718,6 +770,11 @@
 					localTarget.eAdapters().remove(adapter);
 			}
 		}
+		NodeList nl = node.getChildNodes();
+		for (int i = 0; i < nl.getLength(); i++) {
+			Node n = nl.item(i);
+			removeAdapters(n);
+		}
 	}
 
 	/**
@@ -984,9 +1041,9 @@
 		if (resource != null) {
 			publicId = resource.getPublicId();
 			systemId = resource.getSystemId();
+			if (!(StringUtil.stringsEqual(publicId, oldPublicId) && StringUtil.stringsEqual(systemId, oldSystemId)))
+				fRenderer.replaceDocumentType(resource.getDoctype(), publicId, systemId);
 		}
-		if (!(StringUtil.stringsEqual(publicId, oldPublicId) && StringUtil.stringsEqual(systemId, oldSystemId)))
-			fRenderer.replaceDocumentType(resource.getDoctype(), publicId, systemId);
 	}
 
 	protected void updateDOMDocumentType(Notification msg) {
@@ -1012,6 +1069,7 @@
 			resource.setDoctypeValues(publicId, systemId);
 	}
 
+	@Override
 	public void notifyChanged(Notification msg) {
 
 		if (isRoot) {
@@ -1078,8 +1136,8 @@
 
 		primAddDOMAdapter(fNode, this);
 		if (fDebug) {
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("Adding DOM adapter: " + this); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tto: " + fNode); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("Adding DOM adapter: " + this); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("\tto: " + fNode); //$NON-NLS-1$
 		}
 
 		// Go through the maps. All of the DOM nodes that are not listened
@@ -1154,7 +1212,6 @@
 		try {
 			return map.convertStringToValue(trimmedValue, emfObject);
 		} catch (FeatureValueConversionException ex) {
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError(ex);
 			handleFeatureValueConversionException(ex);
 			return null;
 		}
@@ -1203,7 +1260,7 @@
 					handleInvalidMultiNodes(nodeName);
 				node = (Node) nodes.get(0);
 				if (node != null) {
-					if (addAdapters && (map != null || map.isManagedByParent()))
+					if (addAdapters)
 						addDOMAdapter(curNode);
 					break;
 				}
@@ -1375,7 +1432,13 @@
 			Attr domAttr = (Attr) child.getAttributes().getNamedItem(map.getDOMName(mofObject));
 			if (domAttr != null) {
 				domValue = domAttr.getValue();
-				domValue = map.convertStringToValue((String) domValue, mofObject);
+				try {
+					domValue = map.convertStringToValue((String) domValue, mofObject);
+				} catch (FeatureValueConversionException e) {
+					handleFeatureValueConversionException(e);
+					domValue = null;
+				}
+
 			} else
 				isUnset = true;
 		} else {
@@ -1441,7 +1504,7 @@
 					// enum
 					// features
 
-					if (updateMOFAttAdapter)
+					if (updateMOFAttAdapter && attrAdapter != null)
 						attrAdapter.updateMOF();
 				}
 			}
@@ -1545,9 +1608,9 @@
 			}
 
 			if (fDebug) {
-				org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("Updating DOM Node: " + node); //$NON-NLS-1$
-				org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tfrom: " + mofObject); //$NON-NLS-1$
-				org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tmap : " + map); //$NON-NLS-1$
+				EcoreUtilitiesPlugin.logError("Updating DOM Node: " + node); //$NON-NLS-1$
+				EcoreUtilitiesPlugin.logError("\tfrom: " + mofObject); //$NON-NLS-1$
+				EcoreUtilitiesPlugin.logError("\tmap : " + map); //$NON-NLS-1$
 			}
 			boolean notificationFlag = isNotificationEnabled();
 			try {
@@ -1576,9 +1639,9 @@
 	 */
 	final protected void updateDOMLinkFeature(Translator map, Node node, EObject mofObject) {
 		if (fDebug) {
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("Updating DOM Node (link): " + node); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tfrom: " + mofObject); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tmap : " + map); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("Updating DOM Node (link): " + node); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("\tfrom: " + mofObject); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("\tmap : " + map); //$NON-NLS-1$
 		}
 		primUpdateDOMLinkFeature(map, node, mofObject);
 	}
@@ -1594,9 +1657,9 @@
 	 */
 	final protected void updateDOMMultiFeature(Translator map, Node node, EObject mofObject) {
 		if (fDebug) {
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("Updating DOM Node (multi): " + node); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tfrom: " + mofObject); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tmap : " + map); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("Updating DOM Node (multi): " + node); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("\tfrom: " + mofObject); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("\tmap : " + map); //$NON-NLS-1$
 		}
 		boolean notificationFlag = isNotificationEnabled();
 		try {
@@ -1612,15 +1675,15 @@
 	 * updated.
 	 */
 	protected void updateDOMSubtree(Translator map, Node node, EObject mofObject, Object attrValue) {
-
+		Object innerAttrValue = attrValue;
 		if (map.featureExists(mofObject)) {
 			if ((map.isEnumFeature() || map.isBooleanFeature()) && (map.isUnsettable() && !map.isSetMOFValue(mofObject)))
-				attrValue = null;
+				innerAttrValue = null;
 		} else
-			attrValue = map.extractStringValue(mofObject);
+			innerAttrValue = map.extractStringValue(mofObject);
 
 		// Create and/or update the DOM subtree
-		if (attrValue != null) {
+		if (innerAttrValue != null) {
 			Node parent = createDOMPath(node, map);
 			if (map.isManagedByParent()) {
 				// Handle the case where the mof value is not another
@@ -1630,10 +1693,10 @@
 
 				Element child = map.isDOMTextValue() ? (Element) parent : findOrCreateNode(parent, map, map.getDOMName(mofObject));
 
-				findOrCreateTextNode(child, map, map.convertValueToString(attrValue, mofObject));
+				findOrCreateTextNode(child, map, map.convertValueToString(innerAttrValue, mofObject));
 			} else {
 				// Handle the case were the mof value is a mof object.
-				EObject mofValue = (EObject) attrValue;
+				EObject mofValue = (EObject) innerAttrValue;
 				EMF2DOMAdapter valueAdapter = (EMF2DOMAdapter) EcoreUtil.getExistingAdapter(mofValue, EMF2DOMAdapter.ADAPTER_CLASS);
 				if (valueAdapter != null)
 					valueAdapter.updateDOM();
@@ -1670,9 +1733,9 @@
 	 */
 	final protected void updateMOFLinkFeature(Translator map, Node node, EObject mofObject) {
 		if (fDebug) {
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("Updating MOFObject (link): " + mofObject); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tfrom: " + node); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tmap : " + map); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("Updating MOFObject (link): " + mofObject); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("\tfrom: " + node); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("\tmap : " + map); //$NON-NLS-1$
 		}
 		boolean notificationFlag = isNotificationEnabled();
 		try {
@@ -1694,9 +1757,9 @@
 	 */
 	final protected void updateMOFMultiFeature(Translator map, Node node, EObject mofObject) {
 		if (fDebug) {
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("Updating MOFObject (multi): " + mofObject); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tfrom: " + node); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tmap : " + map); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("Updating MOFObject (multi): " + mofObject); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("\tfrom: " + node); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("\tmap : " + map); //$NON-NLS-1$
 		}
 		boolean notificationFlag = isNotificationEnabled();
 		try {
@@ -1727,7 +1790,7 @@
 				if(map.getFeature() != null && map.getFeature().isUnique() && mofObject.eGet(map.getFeature()) != null && mofObject.eGet(map.getFeature()) instanceof List && ((List) mofObject.eGet(map.getFeature())).contains(attributeValue)){
 					advanceAddIndex = false;
 					String domName = map.domNameAndPath != null ? map.domNameAndPath : "attribute"; //$NON-NLS-1$
-					org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError(new IllegalArgumentException("The 'no duplicates' constraint is violated by "+domName+" = "+attributeValue));
+					EcoreUtilitiesPlugin.logError(new IllegalArgumentException("The 'no duplicates' constraint is violated by "+domName+" = "+attributeValue)); //$NON-NLS-1$ //$NON-NLS-2$
 					handleInvalidMultiNodes(child.getNodeName());
 				} else {
 					map.setMOFValue(mofObject, attributeValue, addIndex);
@@ -1766,9 +1829,9 @@
 		// TODO MDE Add a map.isComment() and updateMOFCommentFeature(map, node, mofObject);
 
 		if (fDebug) {
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("Updating MOFObject: " + mofObject); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tfrom: " + node); //$NON-NLS-1$
-			org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError("\tmap : " + map); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("Updating MOFObject: " + mofObject); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("\tfrom: " + node); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("\tmap : " + map); //$NON-NLS-1$
 		}
 		boolean notificationFlag = isNotificationEnabled();
 		boolean hasChanged = false;
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMRenderer.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMRenderer.java
index 53fbdc7..d07e3c4 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMRenderer.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMRenderer.java
@@ -28,7 +28,7 @@
 
 import org.eclipse.emf.common.util.WrappedException;
 import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.wst.common.internal.emf.plugin.EcoreUtilitiesPlugin;
 import org.eclipse.wst.common.internal.emf.utilities.DOMLoadOptions;
 import org.eclipse.wst.common.internal.emf.utilities.DOMUtilities;
 import org.eclipse.wst.common.internal.emf.utilities.Revisit;
@@ -39,7 +39,7 @@
 
 
 
-public class EMF2DOMRenderer extends AbstractRendererImpl implements Renderer {
+public class EMF2DOMRenderer extends AbstractRendererImpl {
 
 	protected Map domAdapterRegistry;
 	protected boolean needsToCreateDOM = true;
@@ -191,11 +191,11 @@
 			/* source.setSystemId(getResource().getSystemId()); */
 			transformer.transform(source, new StreamResult(out));
 		} catch (TransformerConfigurationException e) {
-			Logger.getLogger().logError(e);
+			EcoreUtilitiesPlugin.logError(e);
 		} catch (TransformerFactoryConfigurationError e) {
-			Logger.getLogger().logError(e);
+			EcoreUtilitiesPlugin.logError(e);
 		} catch (TransformerException e) {
-			Logger.getLogger().logError(e);
+			EcoreUtilitiesPlugin.logError(e);
 		} finally {
 		}
 	}
@@ -241,6 +241,7 @@
 		}
 	}
 
+	@Override
 	public void preUnload() {
 		EMF2DOMAdapter adapter = (EMF2DOMAdapter) EcoreUtil.getAdapter(resource.eAdapters(), EMF2DOMAdapter.ADAPTER_CLASS);
 		if (adapter != null) {
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMRendererFactory.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMRendererFactory.java
index fce5603..ff4fbbb 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMRendererFactory.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2DOMRendererFactory.java
@@ -20,6 +20,7 @@
 	/**
 	 * @see com.ibm.etools.emf2xml.RendererFactory#createRenderer()
 	 */
+	@Override
 	public Renderer createRenderer() {
 		EMF2DOMRenderer renderer = new EMF2DOMRenderer();
 		renderer.setValidating(isValidating());
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXDocumentHandler.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXDocumentHandler.java
index a25bb63..540c2af 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXDocumentHandler.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXDocumentHandler.java
@@ -13,7 +13,7 @@
 
 import java.io.IOException;
 
-import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.wst.common.internal.emf.plugin.EcoreUtilitiesPlugin;
 import org.xml.sax.Attributes;
 import org.xml.sax.EntityResolver;
 import org.xml.sax.InputSource;
@@ -44,6 +44,7 @@
 	/**
 	 * @see org.xml.sax.helpers.DefaultHandler#resolveEntity(java.lang.String, java.lang.String)
 	 */
+	@Override
 	public InputSource resolveEntity(String publicId, String systemId) throws SAXException {
 		InputSource result = null;
 		this.resource.setDoctypeValues(publicId, systemId);
@@ -65,6 +66,7 @@
 	/**
 	 * @see org.xml.sax.ContentHandler#startDocument()
 	 */
+	@Override
 	public void startDocument() throws SAXException {
 		/*
 		 * The endDocument() method should have frozen the pool, or it may not be warmed yet. In
@@ -82,6 +84,7 @@
 	 * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String,
 	 *      java.lang.String, org.xml.sax.Attributes)
 	 */
+	@Override
 	public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
 		addToStack(qName, attributes);
 	}
@@ -89,6 +92,7 @@
 	/**
 	 * @see org.xml.sax.ContentHandler#characters(char[], int, int)
 	 */
+	@Override
 	public void characters(char[] data, int start, int length) throws SAXException {
 
 		CacheEventNode currentRecord = getCurrentRecord();
@@ -101,6 +105,7 @@
 	 * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String,
 	 *      java.lang.String)
 	 */
+	@Override
 	public void endElement(String uri, String localName, String qName) throws SAXException {
 
 		CacheEventNode currentRecord = null;
@@ -120,6 +125,7 @@
 	/**
 	 * @see org.xml.sax.ContentHandler#endDocument()
 	 */
+	@Override
 	public void endDocument() throws SAXException {
 		CacheEventNode lastRecord = this.removeCurrentRecord();
 		lastRecord.commit();
@@ -129,6 +135,7 @@
 	/**
 	 * @see org.xml.sax.ErrorHandler#error(org.xml.sax.SAXParseException)
 	 */
+	@Override
 	public void error(SAXParseException ex) throws SAXException {
 		throw ex;
 	}
@@ -136,6 +143,7 @@
 	/**
 	 * @see org.xml.sax.ErrorHandler#fatalError(org.xml.sax.SAXParseException)
 	 */
+	@Override
 	public void fatalError(SAXParseException ex) throws SAXException {
 		throw ex;
 	}
@@ -143,8 +151,9 @@
 	/**
 	 * @see org.xml.sax.ErrorHandler#warning(org.xml.sax.SAXParseException)
 	 */
+	@Override
 	public void warning(SAXParseException ex) throws SAXException {
-		Logger.getLogger().logWarning(ex);
+		EcoreUtilitiesPlugin.logWarning(ex);
 	}
 
 	/**
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXRenderer.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXRenderer.java
index 86f721f..21064f7 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXRenderer.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXRenderer.java
@@ -27,7 +27,7 @@
 import javax.xml.transform.stream.StreamResult;
 
 import org.eclipse.emf.common.util.WrappedException;
-import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.wst.common.internal.emf.plugin.EcoreUtilitiesPlugin;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 import org.xml.sax.SAXNotRecognizedException;
@@ -74,12 +74,12 @@
 				reader.setFeature("http://apache.org/xml/features/validation/schema", isValidating()); //$NON-NLS-1$
 			} catch (SAXNotRecognizedException e) {
 				reader.setFeature("http://xml.org/sax/features/validation", false); //$NON-NLS-1$
-				Logger.getLogger().log("Warning: Parser does not support \"http://apache.org/xml/features/validation/schema\". Validation will be disabled."); //$NON-NLS-1$
+				EcoreUtilitiesPlugin.logWarning("Warning: Parser does not support \"http://apache.org/xml/features/validation/schema\". Validation will be disabled."); //$NON-NLS-1$
 			}
 			try {
 				reader.setFeature("http://apache.org/xml/features/allow-java-encodings", true); //$NON-NLS-1$
 			} catch (SAXNotRecognizedException e) {
-				Logger.getLogger().log("Warning: Parser does not support \"http://apache.org/xml/features/allow-java-encodings\"."); //$NON-NLS-1$
+				EcoreUtilitiesPlugin.logWarning("Warning: Parser does not support \"http://apache.org/xml/features/allow-java-encodings\"."); //$NON-NLS-1$
 			}
 			/*
 			 * try { reader.setProperty("http://xml.org/sax/properties/lexical-handler", handler); }
@@ -133,12 +133,12 @@
 					transformer.setOutputProperty(OutputKeys.DOCTYPE_SYSTEM, getResource().getSystemId());
 
 			} catch (TransformerConfigurationException e) {
-				Logger.getLogger().logError(e);
+				EcoreUtilitiesPlugin.logError(e);
 			} catch (TransformerFactoryConfigurationError e) {
-				Logger.getLogger().logError(e);
+				EcoreUtilitiesPlugin.logError(e);
 			}
 			if (handler == null) {
-				Logger.getLogger("SAX Writer is null"); //$NON-NLS-1$
+				EcoreUtilitiesPlugin.logError("SAX Writer is null"); //$NON-NLS-1$
 				return;
 			}
 			EMF2SAXWriter writer = new EMF2SAXWriter();
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXRendererFactory.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXRendererFactory.java
index d3fd5d9..a2544d6 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXRendererFactory.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/EMF2SAXRendererFactory.java
@@ -33,6 +33,7 @@
 	 * 
 	 * @see com.ibm.etools.emf2xml.RendererFactory#createRenderer()
 	 */
+	@Override
 	public Renderer createRenderer() {
 		EMF2SAXRenderer renderer = new EMF2SAXRenderer();
 		renderer.setValidating(isValidating());
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/FileNameResourceFactoryRegistry.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/FileNameResourceFactoryRegistry.java
index 41b3dab..ff7b3a2 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/FileNameResourceFactoryRegistry.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/FileNameResourceFactoryRegistry.java
@@ -46,10 +46,12 @@
 		
 	}
 
+	@Override
 	public synchronized Resource.Factory getFactory(URI uri) {
 		return getFactory(uri, null);
 	}
 
+	@Override
 	public Resource.Factory getFactory(URI uri, String contentType)
 	{
 		Resource.Factory resourceFactory = null;
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/GenericTranslator.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/GenericTranslator.java
index eafe09f..c714f23 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/GenericTranslator.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/GenericTranslator.java
@@ -79,6 +79,7 @@
 	/**
 	 * @return Translator[]
 	 */
+	@Override
 	public Translator[] getChildren() {
 		return children;
 	}
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/IDTranslator.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/IDTranslator.java
index 64bf6a0..520f7f0 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/IDTranslator.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/IDTranslator.java
@@ -25,6 +25,11 @@
 public class IDTranslator extends Translator {
 	public class NoResourceException extends RuntimeException {
 
+		/**
+		 * 
+		 */
+		private static final long serialVersionUID = 8633201291288237530L;
+
 		public NoResourceException() {
 			super();
 		}
@@ -41,6 +46,7 @@
 		super("id", ID_FEATURE, DOM_ATTRIBUTE); //$NON-NLS-1$
 	}
 
+	@Override
 	public void setMOFValue(EObject emfObject, Object value) {
 		XMIResource res = (XMIResource) emfObject.eResource();
 		if (res == null)
@@ -52,6 +58,7 @@
 			res.setID(emfObject, (String) value);
 	}
 
+	@Override
 	public Object getMOFValue(EObject emfObject) {
 		if (emfObject == null)
 			throw new NoResourceException();
@@ -62,10 +69,12 @@
 	}
 
 
+	@Override
 	public boolean featureExists(EObject emfObject) {
 		return true;
 	}
 
+	@Override
 	public boolean isIDMap() {
 		return true;
 	}
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/MappedXMIHelper.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/MappedXMIHelper.java
index f0939a2..f146af1 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/MappedXMIHelper.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/MappedXMIHelper.java
@@ -57,6 +57,7 @@
 
 	}
 
+	@Override
 	public URI resolve(URI relative, URI base) {
 		URI resolved = null;
 		boolean isMapped = false;
@@ -87,6 +88,7 @@
 		return ((CompatibilityXMIResource) resource).getFormat() == CompatibilityXMIResource.FORMAT_MOF5 || usingMaps;
 	}
 
+	@Override
 	public void addPrefix(String prefix, String uri) {
 		/*
 		 * problem - the incoming key value pair is ejbbnd->ejbbnd.xmi; however, the map already has
@@ -95,7 +97,7 @@
 		if (uri.endsWith(".ecore")) { //$NON-NLS-1$
 			usingMaps = false;
 		}
-		String existing = (String) prefixesToURIs.get(prefix);
+		String existing = prefixesToURIs.get(prefix);
 		if (existing == null) {
 			prefixesToURIs.put(prefix, uri);
 			namespaceSupport.declarePrefix(prefix, uri);
@@ -112,6 +114,7 @@
 	/**
 	 * @see org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl#getHREF(EObject)
 	 */
+	@Override
 	public String getHREF(EObject obj) {
 		if (!getCompatibilityResource().usesDefaultFormat()) {
 			URIConverter conv = getURIConverter();
@@ -158,13 +161,14 @@
 	}
 
 	protected URI makeRelative(URI objectURI, CompatibilityURIConverter conv) {
-		String fragment = objectURI.fragment();
-		objectURI = objectURI.trimFragment();
-		URI relative = (URI) getCachedRelativeURIs().get(objectURI);
+		URI innerObjectURI = objectURI;
+		String fragment = innerObjectURI.fragment();
+		innerObjectURI = innerObjectURI.trimFragment();
+		URI relative = (URI) getCachedRelativeURIs().get(innerObjectURI);
 		if (relative == null) {
-			relative = conv.deNormalize(objectURI);
+			relative = conv.deNormalize(innerObjectURI);
 			if (relative.isRelative())
-				cachedRelativeURIs.put(objectURI, relative);
+				cachedRelativeURIs.put(innerObjectURI, relative);
 		}
 		return relative.appendFragment(fragment);
 	}
@@ -185,6 +189,7 @@
 	/**
 	 * @see org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl#getID(EObject)
 	 */
+	@Override
 	public String getID(EObject obj) {
 		if (getCompatibilityResource().usesDefaultFormat())
 			return super.getID(obj);
@@ -230,6 +235,7 @@
 		this.packageURIsToPrefixes = packageURIsToPrefixes;
 	}
 
+	@Override
 	public String getQName(EClass c) {
 		String name = getName(c);
 
@@ -257,6 +263,7 @@
 	 * @see org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl#setValue(EObject, EStructuralFeature,
 	 *      Object, int)
 	 */
+	@Override
 	public void setValue(EObject object, EStructuralFeature feature, Object value, int position) {
 		if (feature == NULL_FEATURE)
 			return;
@@ -278,6 +285,7 @@
 	 * @see org.eclipse.emf.ecore.xmi.XMLHelper#getFeature(org.eclipse.emf.ecore.EClass,
 	 *      java.lang.String, java.lang.String, boolean)
 	 */
+	@Override
 	public EStructuralFeature getFeature(EClass eClass, String namespaceURI, String name, boolean isElement) {
 		if (UnsupportedFeature.isUnsupported(eClass, name))
 			return NULL_FEATURE;
@@ -289,6 +297,7 @@
 	 * 
 	 * @see org.eclipse.emf.ecore.xmi.XMLHelper#getFeatureKind(org.eclipse.emf.ecore.EStructuralFeature)
 	 */
+	@Override
 	public int getFeatureKind(EStructuralFeature feature) {
 		if (feature == NULL_FEATURE)
 			return XMLHelper.DATATYPE_SINGLE;
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/MultiObjectTranslator.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/MultiObjectTranslator.java
index 91ed5bc..79226f6 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/MultiObjectTranslator.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/MultiObjectTranslator.java
@@ -45,6 +45,7 @@
 	 * @see com.ibm.etools.emf2xml.impl.Translator#createEMFObject(java.lang.String,
 	 *      java.lang.String)
 	 */
+	@Override
 	public EObject createEMFObject(String nodeName, String readAheadName) {
 		return getDelegateFor(nodeName, readAheadName).createEMFObject(nodeName, readAheadName);
 	}
@@ -54,6 +55,7 @@
 	 * 
 	 * @see com.ibm.etools.emf2xml.impl.Translator#getChildren(java.lang.Object)
 	 */
+	@Override
 	public Translator[] getChildren(Object o, int version) {
 		if (o == null)
 			return EMPTY_TRANSLATORS;
@@ -65,6 +67,7 @@
 	 * 
 	 * @see com.ibm.etools.emf2xml.impl.Translator#getDOMName(java.lang.Object)
 	 */
+	@Override
 	public String getDOMName(Object value) {
 		return getDelegateFor((EObject) value).getDOMName(value);
 	}
@@ -75,10 +78,12 @@
 	 * 
 	 * @see com.ibm.etools.emf2xml.impl.Translator#isManagedByParent()
 	 */
+	@Override
 	public boolean isManagedByParent() {
 		return false;
 	}
 
+	@Override
 	public boolean shouldIndentEndTag(Node node) {
 		if (node.getNodeName().equals(getDOMPath())) {
 			return super.shouldIndentEndTag(node);
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/NamespaceTranslator.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/NamespaceTranslator.java
index 3c23ed4..ea4cc38 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/NamespaceTranslator.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/NamespaceTranslator.java
@@ -46,6 +46,7 @@
 	 * @see com.ibm.etools.emf2xml.impl.Translator#setMOFValue(org.eclipse.emf.ecore.EObject,
 	 *      java.lang.Object)
 	 */
+	@Override
 	public void setMOFValue(EObject emfObject, Object value) {
 		NamespaceAdapter.addNamespace(prefix, (String) value, emfObject);
 	}
@@ -55,6 +56,7 @@
 	 * 
 	 * @see com.ibm.etools.emf2xml.impl.Translator#isSetMOFValue(org.eclipse.emf.ecore.EObject)
 	 */
+	@Override
 	public boolean isSetMOFValue(EObject emfObject) {
 		return getMOFValue(emfObject) != null;
 	}
@@ -64,6 +66,7 @@
 	 * 
 	 * @see com.ibm.etools.emf2xml.impl.Translator#getMOFValue(org.eclipse.emf.ecore.EObject)
 	 */
+	@Override
 	public Object getMOFValue(EObject mofObject) {
 		return NamespaceAdapter.getNamespaceURIAtThisLevel(prefix, mofObject);
 	}
@@ -73,6 +76,7 @@
 	 * 
 	 * @see com.ibm.etools.emf2xml.impl.Translator#unSetMOFValue(org.eclipse.emf.ecore.EObject)
 	 */
+	@Override
 	public void unSetMOFValue(EObject emfObject) {
 		NamespaceAdapter.removeNamespace(prefix, emfObject);
 	}
@@ -82,6 +86,7 @@
 	 * 
 	 * @see com.ibm.etools.emf2xml.impl.Translator#featureExists(org.eclipse.emf.ecore.EObject)
 	 */
+	@Override
 	public boolean featureExists(EObject emfObject) {
 		return true;
 	}
@@ -91,6 +96,7 @@
 	 * 
 	 * @see com.ibm.etools.emf2xml.impl.Translator#isDataType()
 	 */
+	@Override
 	public boolean isDataType() {
 		return true;
 	}
@@ -101,6 +107,7 @@
 	 * @see com.ibm.etools.emf2xml.impl.Translator#isMapFor(java.lang.Object, java.lang.Object,
 	 *      java.lang.Object)
 	 */
+	@Override
 	public boolean isMapFor(Object aFeature, Object oldValue, Object newValue) {
 		if (aFeature == feature) {
 			Namespace namespace = (Namespace) (oldValue == null ? newValue : oldValue);
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ObjectTranslatorFilter.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ObjectTranslatorFilter.java
index 918b9ce..3e479f5 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ObjectTranslatorFilter.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ObjectTranslatorFilter.java
@@ -23,6 +23,7 @@
 		super(trans, version);
 	}
 
+	@Override
 	public final int scanNextTranslator(Translator[] children, int start) {
 		int found = start + 1;
 		for (; found < children.length; ++found) {
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedResource.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedResource.java
index 45faf2b..0a4818a 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedResource.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedResource.java
@@ -12,9 +12,8 @@
 
 
 
-import org.eclipse.emf.ecore.resource.Resource;
 
-public interface ReferencedResource extends Resource, CompatibilityXMIResource {
+public interface ReferencedResource extends CompatibilityXMIResource {
 	//TODO - rename packaged
 
 	public static final String DELETED_ERROR_MSG = "This resource has been deleted and can no longer be used."; //$NON-NLS-1$
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIFactoryImpl.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIFactoryImpl.java
index d891c2c..2a9fe76 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIFactoryImpl.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIFactoryImpl.java
@@ -42,6 +42,7 @@
 	/**
 	 * @see org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl#createResource(URI)
 	 */
+	@Override
 	public final Resource createResource(URI uri) {
 		Resource res = doCreateResource(uri);
 		adaptNew(res);
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIResourceImpl.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIResourceImpl.java
index 57cd396..33de28d 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIResourceImpl.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ReferencedXMIResourceImpl.java
@@ -26,7 +26,7 @@
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.wst.common.internal.emf.plugin.EcoreUtilitiesPlugin;
 import org.eclipse.wst.common.internal.emf.utilities.IDUtil;
 
 public class ReferencedXMIResourceImpl extends CompatibilityXMIResourceImpl implements ReferencedResource {
@@ -43,57 +43,72 @@
 	  public static class ESynchronizedAdapterList extends EAdapterList
 	  {
 
-	    public ESynchronizedAdapterList(Notifier notifier) {
+	    /**
+		 * 
+		 */
+		private static final long serialVersionUID = 7855438339187540718L;
+
+		public ESynchronizedAdapterList(Notifier notifier) {
 			super(notifier);
 		}
 
+		@Override
 		public synchronized boolean add(Object object)
 	    {
 	    return super.add(object);
 	    }
 
-	    public synchronized void add(int index, Object object)
+	    @Override
+		public synchronized void add(int index, Object object)
 	    {
 	    super.add(index, object);
 	    }
 
-	    public synchronized boolean addAll(Collection collection)
+	    @Override
+		public synchronized boolean addAll(Collection collection)
 	    {
 	    return super.addAll(collection);
 	    }
 
-	    public synchronized boolean remove(Object object)
+	    @Override
+		public synchronized boolean remove(Object object)
 	    {
 	    return super.remove(object);
 	    }
 
-	    public synchronized Object remove(int index)
+	    @Override
+		public synchronized Object remove(int index)
 	    {
 	    return super.remove(index);
 	    }
 
-	    public synchronized boolean removeAll(Collection collection)
+	    @Override
+		public synchronized boolean removeAll(Collection collection)
 	    {
 	    return super.removeAll(collection);
 	    }
 
-	    public synchronized void clear()
+	    @Override
+		public synchronized void clear()
 	    {
 	     super.clear();
 	    }
 
 
-	    public synchronized Object set(int index, Object object)
+	    @Override
+		public synchronized Object set(int index, Object object)
 	    {
 	    return super.set(index, object);
 	    }
 
-	    public synchronized void move(int newPosition, Object object)
+	    @Override
+		public synchronized void move(int newPosition, Object object)
 	    {
 	    super.move(newPosition, object);
 	    }
 
-	    public synchronized Object move(int newPosition, int oldPosition)
+	    @Override
+		public synchronized Object move(int newPosition, int oldPosition)
 	    {
 	    return super.move(newPosition, oldPosition);
 	    }
@@ -272,6 +287,7 @@
 			save(Collections.EMPTY_MAP);
 	}
 
+	@Override
 	public String toString() {
 		return TO_STRING + getURI().toString() + READ_COUNT_TO_STRING + new Integer(readReferenceCount) + WRITE_COUNT_TO_STRING + new Integer(editReferenceCount);
 	}
@@ -298,6 +314,7 @@
 		return forceRefresh;
 	}
 
+	@Override
 	protected void basicDoLoad(InputStream arg0, Map arg1) throws IOException {
 		boolean isTrackingMods = isTrackingModification();
 		try {
@@ -313,6 +330,7 @@
 	/**
 	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#doUnload()
 	 */
+	@Override
 	protected void doUnload() {
 		
 		try {
@@ -327,7 +345,7 @@
 			setForceRefresh(false);
 			setModified(false); //dcb - this is required to ensure that resources without files are
 			// marked as not modified.
-			if (readReferenceCount == 0 && editReferenceCount == 0) {
+			if (readReferenceCount == 0 && editReferenceCount == 0 && getResourceSet() != null) {
 				getResourceSet().getResources().remove(this);
 			}
 		
@@ -352,6 +370,7 @@
 	/**
 	 * @see org.eclipse.emf.ecore.resource.Resource#save(Object)
 	 */
+	@Override
 	public void save(Map options) throws IOException {
 		notifyAboutToSave();
         try {
@@ -360,8 +379,7 @@
             notifySaveFailed();
             if (e instanceof IOException)
                 throw (IOException) e;
-            else
-                Logger.getLogger().write(e);
+            EcoreUtilitiesPlugin.logError(e);
         }
         notifySaved();
 	}
@@ -383,11 +401,13 @@
 		  Notification notification =
 			new NotificationImpl(eventType, this, this)
 			{
-			  public Object getNotifier()
+			  @Override
+			public Object getNotifier()
 			  {
 				return ReferencedXMIResourceImpl.this;
 			  }
-			  public int getFeatureID(Class expectedClass)
+			  @Override
+			public int getFeatureID(Class expectedClass)
 			  {
 				return eventType;
 			  }
@@ -403,6 +423,7 @@
 		return false;
 	}
 	
+	@Override
 	public EList eAdapters()
 	  {
 	    if (eAdapters == null)
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/RendererFactory.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/RendererFactory.java
index 9f294d3..356c05f 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/RendererFactory.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/RendererFactory.java
@@ -8,10 +8,9 @@
  **************************************************************************************************/
 package org.eclipse.wst.common.internal.emf.resource;
 
-import java.lang.ref.WeakReference;
-import java.util.ArrayList;
-import java.util.Collection;
 import java.util.Iterator;
+import java.util.Map;
+import java.util.WeakHashMap;
 
 
 public abstract class RendererFactory {
@@ -48,6 +47,7 @@
 		defaultRendererFactory = factory;
 	}
 
+	@Override
 	public String toString() {
 		return "RendererFactory instance: " + getClass().getName(); //$NON-NLS-1$
 	}
@@ -56,7 +56,8 @@
 
 		private static final Notifier INSTANCE = new Notifier();
 
-		private final Collection resourceFactoryListeners = new ArrayList();
+		// use a WeakHashMap for a weak HashSet
+		private final Map resourceFactoryListeners = new WeakHashMap();
 
 		private Notifier() {
 		}
@@ -72,17 +73,11 @@
 				 * work
 				 */
 				if (rendererFactory != RendererFactory.getDefaultRendererFactory()) {
-					WeakReference wref = null;
-					Listener listener = null;
 					synchronized (resourceFactoryListeners) {
-						for (Iterator i = resourceFactoryListeners.iterator(); i.hasNext();) {
-							wref = (WeakReference) i.next();
-							listener = (Listener) wref.get();
+						for (Iterator i = resourceFactoryListeners.keySet().iterator(); i.hasNext();) {
+							Listener listener = (Listener) i.next();
 							//System.out.println("Notifying Listener: " + listener);
-							if (listener != null)
-								listener.updateRendererFactory(rendererFactory);
-							else
-								i.remove();
+							listener.updateRendererFactory(rendererFactory);
 						}
 					}
 				}
@@ -92,29 +87,13 @@
 		public void addListener(Listener l) {
 			//System.out.println("Adding listener: " + l);
 			synchronized (resourceFactoryListeners) {
-				resourceFactoryListeners.add(new WeakReference(l));
+				resourceFactoryListeners.put(l, null);
 			}
 		}
 
 		public void removeListener(Listener listenerToRemove) {
-			final int length = resourceFactoryListeners.size();
-			if (length > 0) {
-				WeakReference wref = null;
-				Listener listener = null;
-				synchronized (resourceFactoryListeners) {
-					for (Iterator i = resourceFactoryListeners.iterator(); i.hasNext();) {
-						wref = (WeakReference) i.next();
-						listener = (Listener) wref.get();
-						if (listener != null) {
-							if (listener == listenerToRemove) {
-								i.remove();
-								break;
-							}
-						} else {
-							i.remove();
-						}
-					}
-				}
+			synchronized (resourceFactoryListeners) {
+				resourceFactoryListeners.remove(listenerToRemove);
 			}
 		}
 
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ResourceFactoryDescriptor.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ResourceFactoryDescriptor.java
index 77984c3..697b516 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ResourceFactoryDescriptor.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/ResourceFactoryDescriptor.java
@@ -56,7 +56,8 @@
 	 * instead of comparing the short segments when searching for an
 	 * applicable descriptor from a set.  
 	 * 
-	 * <p><b>Subclasses may NOT return null.</b></p>
+	 * <p><b>Subclasses may NOT return null unless they also override
+	 * {@link #hashCode()} and {@link #equals(Object)}.</b></p>
 	 *  
 	 * @return The short segment that this descriptor is applicable to.
 	 */
@@ -73,10 +74,12 @@
 	 */
 	public abstract Resource.Factory createFactory();
 	
+	@Override
 	public int hashCode() {
 		return getShortSegment().hashCode();
 	}
 	
+	@Override
 	public boolean equals(Object o) {
 		if(o instanceof ResourceFactoryDescriptor)
 			return getShortSegment().equals(((ResourceFactoryDescriptor)o).getShortSegment());
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/RootTranslator.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/RootTranslator.java
index f5640e9..bbba2f3 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/RootTranslator.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/RootTranslator.java
@@ -30,6 +30,7 @@
 	/**
 	 * @see com.ibm.etools.emf2xml.impl.Translator#setMOFValue(Notifier, Object, int)
 	 */
+	@Override
 	public void setMOFValue(Notifier owner, Object value, int newIndex) {
 		((Resource) owner).getContents().add(newIndex, (EObject)value);
 	}
@@ -37,6 +38,7 @@
 	/**
 	 * @see com.ibm.etools.emf2xml.impl.Translator#removeMOFValue(Notifier, Object)
 	 */
+	@Override
 	public void removeMOFValue(Notifier owner, Object value) {
 		((Resource) owner).getContents().remove(value);
 	}
@@ -47,6 +49,7 @@
 	 * @see com.ibm.etools.emf2xml.impl.Translator#setMOFValue(org.eclipse.emf.ecore.EObject,
 	 *      java.lang.Object)
 	 */
+	@Override
 	public void setMOFValue(Resource res, Object value) {
 		if (res != null && value != null)
 			res.getContents().add((EObject)value);
@@ -57,6 +60,7 @@
 	 * 
 	 * @see com.ibm.etools.emf2xml.impl.Translator#isMultiValued()
 	 */
+	@Override
 	public boolean isMultiValued() {
 		return true;
 	}
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/SourceLinkTranslator.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/SourceLinkTranslator.java
index d5d697b..371e0d8 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/SourceLinkTranslator.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/SourceLinkTranslator.java
@@ -51,6 +51,7 @@
 		super(domNameAndPath, aFeature, style);
 	}
 
+	@Override
 	public Object convertStringToValue(String strValue, EObject owner) {
 
 		Object value = null;
@@ -62,6 +63,7 @@
 		return value;
 	}
 
+	@Override
 	public String convertValueToString(Object value, EObject owner) {
 		TranslatorPath path = fTranslatorPaths[0];
 		Object attrValue = path.getLastMap().getMOFValue((EObject) value);
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/StaticResourceFactoryDescriptor.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/StaticResourceFactoryDescriptor.java
index 8caf4ea..e2f46fc 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/StaticResourceFactoryDescriptor.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/StaticResourceFactoryDescriptor.java
@@ -34,6 +34,7 @@
 		this.factory = factory;
 	}  
 
+	@Override
 	public boolean isEnabledFor(URI fileURI) {
 		/* shortSegment must be non-null for the descriptor to be created, 
 		 * a validation check in init() verifies this requirement */
@@ -42,10 +43,12 @@
 		return false;
 	} 
 	
+	@Override
 	public Resource.Factory createFactory() {
 		 return factory;			
 	}
 
+	@Override
 	public String getShortSegment() {
 		return shortSegment;
 	}  
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/Translator.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/Translator.java
index ab28074..0cee91f 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/Translator.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/Translator.java
@@ -380,6 +380,7 @@
 		return (String[]) results.toArray(new String[results.size()]);
 	}
 
+	@Override
 	public String toString() {
 		StringBuffer sb = new StringBuffer();
 		String cn = getClass().getName();
@@ -410,12 +411,18 @@
 	/*
 	 * @see Object#equals(Object)
 	 */
+	@Override
 	public boolean equals(Object object) {
 		if (!(object instanceof Translator))
 			return false;
 		Translator mapInfo = (Translator) object;
 		return fDOMNames.equals(mapInfo.getDOMNames()) && (feature == null && mapInfo.getFeature() == null || feature.equals(mapInfo.getFeature()));
 	}
+	
+	@Override
+	public int hashCode() {
+		return super.hashCode() +fDOMNames.hashCode();
+	}
 
 	/**
 	 * Returns the isManagedByParent.
@@ -510,20 +517,21 @@
 	public Object convertStringToValue(String strValue, EObject owner) {
 		if (feature == null)
 			return strValue;
-		if (strValue != null) {
+		String innerStrValue = strValue;
+		if (innerStrValue != null) {
 			if (isEnumWithHyphens())
-				strValue = strValue.replace('-', '_');
+				innerStrValue = innerStrValue.replace('-', '_');
 			if (!isCDATAContent()) {
-				strValue = strValue.trim();
+				innerStrValue = innerStrValue.trim();
 			}
 		}
-		Object value = FeatureValueConverter.DEFAULT.convertValue(strValue, feature);
+		Object value = FeatureValueConverter.DEFAULT.convertValue(innerStrValue, feature);
 		if (value == null) {
 			if (isEmptyTag() && !isDOMAttribute() && !isDOMTextValue() && isBooleanFeature())
 				return Boolean.TRUE;
 			EObject convertToType = feature.getEType();
 			if (convertToType == null)
-				value = strValue;
+				value = innerStrValue;
 			else if (convertToType.equals(getEcorePackage().getEString())) {
 				value = ""; //$NON-NLS-1$
 			}
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorFilter.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorFilter.java
index b12067d..a38b83b 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorFilter.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorFilter.java
@@ -104,6 +104,7 @@
 				 * update the mode to VARIABLE_TRANSLATORS so we can skip to it directly next time
 				 */
 				this.mode = VARIABLE_TRANSLATORS_MODE;
+			//$FALL-THROUGH$
 			case VARIABLE_TRANSLATORS_MODE :
 				children = this.translator.getVariableChildren(target, this.version);
 				found = scanNextTranslator(children, this.index);
@@ -154,14 +155,15 @@
 	public static final Translator getNextChild(Translator translator, int startHint, int[] hints, EObject target, int version, TranslatorFilter translatorFilter) {
 
 		Translator result = null;
-
-		int index = startHint;
+		
+		int innerStartHint = startHint;
+		int index = innerStartHint;
 		Translator children[] = null;
 
 		switch (hints[MODE_HINT_INDX]) {
 			case STANDARD_TRANSLATORS_MODE :
 				children = translator.getChildren(target, version);
-				if (children != null && startHint < children.length) {
+				if (children != null && innerStartHint < children.length) {
 
 					/* Look for the next Attribute Translator */
 					index = translatorFilter.scanNextTranslator(children, index);
@@ -179,17 +181,18 @@
 					 * DO NOT BREAK we will default to VARIABLE TRANSLATORS MODE so we must reset
 					 * the startHint appropriately
 					 */
-					startHint = -1;
+					innerStartHint = -1;
 				}
 
+			//$FALL-THROUGH$
 			case VARIABLE_TRANSLATORS_MODE :
 				hints[MODE_HINT_INDX] = VARIABLE_TRANSLATORS_MODE;
 				/*
 				 * Reset the index.
 				 */
-				index = startHint;
+				index = innerStartHint;
 				children = translator.getVariableChildren(target, version);
-				if (children != null && children.length > 0 && startHint < children.length) {
+				if (children != null && children.length > 0 && innerStartHint < children.length) {
 					index = translatorFilter.scanNextTranslator(children, index);
 					result = (index >= 0) ? children[index] : null;
 				}
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorPath.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorPath.java
index a2d843e..6678b51 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorPath.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorPath.java
@@ -75,6 +75,7 @@
 	 * 
 	 * @see java.lang.Object#toString()
 	 */
+	@Override
 	public String toString() {
 		StringBuffer sb = new StringBuffer();
 		String cn = getClass().getName();
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceFactory.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceFactory.java
index 20a450b..9427fb7 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceFactory.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceFactory.java
@@ -48,6 +48,7 @@
 		return this.listeningForUpdates;
 	}
 
+	@Override
 	public Resource doCreateResource(URI uri) {
 		Renderer aRenderer = rendererFactory.createRenderer();
 		return createResource(uri, aRenderer);
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceImpl.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceImpl.java
index d925245..78fbce0 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceImpl.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/TranslatorResourceImpl.java
@@ -16,6 +16,7 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.eclipse.emf.common.notify.Adapter;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.impl.NotificationImpl;
 import org.eclipse.emf.common.util.EList;
@@ -26,7 +27,7 @@
 import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.impl.ENotificationImpl;
 import org.eclipse.emf.ecore.resource.impl.ResourceImpl;
-import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.wst.common.internal.emf.plugin.EcoreUtilitiesPlugin;
 import org.eclipse.wst.common.internal.emf.utilities.StringUtil;
 import org.xml.sax.EntityResolver;
 
@@ -74,12 +75,14 @@
 		setRenderer(aRenderer);
 	}
 
+	@Override
 	public java.lang.String getEncoding() {
 		if (super.getEncoding() == null)
 			setEncoding(DEFAULT_ENCODING);
 		return super.getEncoding();
 	}
 
+	@Override
 	public String getPublicId() {
 		return publicId;
 	}
@@ -93,6 +96,7 @@
 		return (EObject) getContents().get(0);
 	}
 
+	@Override
 	public String getSystemId() {
 		return systemId;
 	}
@@ -103,10 +107,12 @@
 		systemId = aSystemId;
 		if (changed) {
 			eNotify(new NotificationImpl(Notification.SET, null, null) {
+				@Override
 				public Object getFeature() {
 					return DOC_TYPE_FEATURE;
 				}
 
+				@Override
 				public Object getNotifier() {
 					return TranslatorResourceImpl.this;
 				}
@@ -119,6 +125,7 @@
 	 * 
 	 * @return String
 	 */
+	@Override
 	public String getXMLVersion() {
 		if (xmlVersion == null)
 			xmlVersion = DEFAULT_VERSION;
@@ -131,10 +138,12 @@
 	 * @param xmlVersion
 	 *            The xmlVersion to set
 	 */
+	@Override
 	public void setXMLVersion(String xmlVersion) {
 		this.xmlVersion = xmlVersion;
 	}
 
+	@Override
 	protected void basicDoLoad(InputStream inputStream, Map options) throws IOException {
 		// long start = System.currentTimeMillis();
 		boolean isTrackingMods = isTrackingModification();
@@ -151,6 +160,7 @@
 		// recordTime("Load", start, end);
 	}
 
+	@Override
 	public void save(Map options) throws IOException {
         if (renderer.useStreamsForIO()) {
             super.save(options);
@@ -163,8 +173,7 @@
                  notifySaveFailed();
                 if (e instanceof IOException)
                     throw (IOException) e;
-                else
-                    Logger.getLogger().write(e);
+                EcoreUtilitiesPlugin.logError(e);
             }
             notifySaved();
         }
@@ -175,6 +184,7 @@
 	 * @see com.ibm.etools.xmi.helpers.CompatibilityXMIResourceImpl#doSave(OutputStream,
 	 *      Map)
 	 */
+	@Override
 	public void doSave(OutputStream outputStream, Map options) throws IOException {
 		// long start = System.currentTimeMillis();
 		renderer.doSave(outputStream, options);
@@ -194,11 +204,13 @@
 	/**
 	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#doUnload()
 	 */
+	@Override
 	protected void doUnload() {
 		renderer.preUnload();
 		super.doUnload();
 	}
 
+	@Override
 	public String toString() {
 		return getClass().getName() + getURI().toString();
 	}
@@ -234,6 +246,7 @@
 		return super.getContents();
 	}
 
+	@Override
 	public EList getContents() {
 		waitForResourceToLoadIfNecessary();
 		if (contents == null) {
@@ -244,11 +257,18 @@
 
 	protected void initializeContents() {
 		contents = new ResourceImpl.ContentsEList() {
+			/**
+			 * 
+			 */
+			private static final long serialVersionUID = 1L;
+
+			@Override
 			public boolean add(Object object) {
 				renderer.prepareToAddContents();
 				return super.add(object);
 			}
 
+			@Override
 			public boolean addAll(Collection collection) {
 				renderer.prepareToAddContents();
 				return super.addAll(collection);
@@ -267,6 +287,7 @@
 	/**
 	 * @see org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl#init()
 	 */
+	@Override
 	protected void init() {
 		super.init();
 		setEncoding(DEFAULT_ENCODING);
@@ -316,6 +337,7 @@
 	 * 
 	 * @see org.eclipse.emf.ecore.xmi.XMLResource#setID(EObject, String)
 	 */
+	@Override
 	public void setID(EObject eObject, String id) {
 		String oldId = getID(eObject);
 		super.setID(eObject, id);
@@ -328,15 +350,20 @@
 	 * 
 	 * @return boolean
 	 */
+	@Override
 	public boolean isModified() {
 		return super.isModified() || renderer.isModified();
 	}
+	public boolean isReverting() {
+		return ((AbstractRendererImpl)renderer).isReverting();
+	}
 
 	/*
 	 * Overriden to give the renderer a hook
 	 * 
 	 * @see org.eclipse.wst.common.internal.emf.resource.ReferencedResource#accessForWrite()
 	 */
+	@Override
 	public void accessForWrite() {
 		renderer.accessForWrite();
 		super.accessForWrite();
@@ -347,16 +374,19 @@
 	 * 
 	 * @see org.eclipse.wst.common.internal.emf.resource.ReferencedResource#accessForRead()
 	 */
+	@Override
 	public void accessForRead() {
 		renderer.accessForRead();
 		super.accessForRead();
 	}
 
+	@Override
 	public void releaseFromRead() {
 		renderer.releaseFromRead();
 		super.releaseFromRead();
 	}
 
+	@Override
 	public void releaseFromWrite() {
 		renderer.releaseFromWrite();
 		super.releaseFromWrite();
@@ -367,32 +397,48 @@
 	 * 
 	 * @see com.ibm.etools.emf.workbench.ReferencedXMIResourceImpl#preDelete()
 	 */
+	@Override
 	public void preDelete() {
 		super.preDelete();
 		renderer.preDelete();
 	}
 
+	@Override
 	public boolean isShared() {
 		return super.isShared() || renderer.isShared();
 	}
 
+	@Override
 	public boolean isSharedForWrite() {
 		return super.isSharedForWrite() || renderer.isSharedForWrite();
 	}
 
+	@Override
 	public void load(Map options) throws IOException {
-		synchronized (this) {
-			if (isLoaded)
+		
+			if (isLoaded())
 				return;
-			// System.out.println(Thread.currentThread() + "
-			// TranslatorResource.load(): " + this);
+			
 			if (renderer.useStreamsForIO()) {
 				super.load(options);
 			}
-			else if (!isLoaded) {
-				load((InputStream) null, options);
+			else if (!isLoaded()) {
+				isShared();
+				loadExisting(options);
 			}
-		}
-
 	}
+
+	@Override
+	public void eNotify(Notification notification) {
+	    Adapter[] eAdapters = eBasicAdapterArray();
+	    if (eAdapters != null && eDeliver())
+	    {
+	      for (int i = 0, size = eAdapters.length; i < size; ++i)
+	      {
+	      	Adapter temp;
+	    	  if ((temp = eAdapters[i]) != null)
+	    		  temp.notifyChanged(notification);
+	      }
+	    }
+	  }
 }
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/UnsupportedFeature.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/UnsupportedFeature.java
index 43c5864..424241c 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/UnsupportedFeature.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/resource/UnsupportedFeature.java
@@ -10,9 +10,6 @@
  *******************************************************************************/
 /*
  * Created on Apr 13, 2004
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Generation - Code and Comments
  */
 package org.eclipse.wst.common.internal.emf.resource;
 
@@ -21,9 +18,6 @@
 
 /**
  * @author cbridgha
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Generation - Code and Comments
  */
 public class UnsupportedFeature extends EAttributeImpl {
 	/**
@@ -38,6 +32,5 @@
 
 	public UnsupportedFeature() {
 		super();
-		// TODO Auto-generated constructor stub
 	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/Assert.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/Assert.java
index 3a44751..f6635a7 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/Assert.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/Assert.java
@@ -10,7 +10,7 @@
  *******************************************************************************/
 package org.eclipse.wst.common.internal.emf.utilities;
 
-import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.wst.common.internal.emf.plugin.EcoreUtilitiesPlugin;
 
 
 
@@ -93,7 +93,7 @@
 	 */
 	public static void isNotNull(Object object, String message) {
 		if (object == null) {
-			Logger.getLogger().logError("null_argument: " + message);//$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("null_argument: " + message);//$NON-NLS-1$
 			throw new AssertionFailedException();
 		}
 	}
@@ -123,7 +123,7 @@
 	 */
 	public static boolean isTrue(boolean expression, String message) {
 		if (!expression) {
-			Logger.getLogger().logError("assertion failed: " + message);//$NON-NLS-1$
+			EcoreUtilitiesPlugin.logError("assertion failed: " + message);//$NON-NLS-1$
 			throw new AssertionFailedException();
 		}
 		return expression;
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/AssertionFailedException.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/AssertionFailedException.java
index 044c60d..5de492e 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/AssertionFailedException.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/AssertionFailedException.java
@@ -25,6 +25,11 @@
 // on other packages and internal APIs.
 class AssertionFailedException extends RuntimeException {
 	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 3408284008342683621L;
+
+	/**
 	 * Constructs a new exception.
 	 */
 	public AssertionFailedException() {
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DOMUtilities.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DOMUtilities.java
index 44f9669..4d4225d 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DOMUtilities.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DOMUtilities.java
@@ -26,7 +26,7 @@
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
-import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.wst.common.internal.emf.plugin.EcoreUtilitiesPlugin;
 import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
@@ -494,13 +494,18 @@
 		try {
 			dbf.setAttribute("http://apache.org/xml/features/allow-java-encodings", new Boolean(options.isAllowJavaEncodings())); //$NON-NLS-1$	        
 		} catch (IllegalArgumentException ignore) {
-			Logger.getLogger().log("Warning: Parser does not support \"http://apache.org/xml/features/allow-java-encodings\"."); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logWarning("Warning: Parser does not support \"http://apache.org/xml/features/allow-java-encodings\"."); //$NON-NLS-1$
 		}
 		try {
 			dbf.setAttribute("http://apache.org/xml/features/validation/schema", new Boolean(options.isValidate())); //$NON-NLS-1$
 		} catch (IllegalArgumentException ignore) {
 			dbf.setValidating(false);
-			Logger.getLogger().log("Warning: Parser does not support \"http://apache.org/xml/features/validation/schema\". Validation will be disabled."); //$NON-NLS-1$
+			EcoreUtilitiesPlugin.logWarning("Warning: Parser does not support \"http://apache.org/xml/features/validation/schema\". Validation will be disabled."); //$NON-NLS-1$
+		}
+		try {
+			dbf.setAttribute("http://apache.org/xml/features/dom/defer-node-expansion", Boolean.FALSE); //$NON-NLS-1$
+		} catch (IllegalArgumentException ignore) {
+			EcoreUtilitiesPlugin.logWarning("Warning: Parser does not support \"http://apache.org/xml/features/dom/defer-node-expansion\"."); //$NON-NLS-1$
 		}
 		dbf.setExpandEntityReferences(options.isExpandEntityRefererences());
 		DocumentBuilder result = dbf.newDocumentBuilder();
@@ -524,7 +529,7 @@
 			}
 
 			public void warning(SAXParseException arg0) throws SAXException {
-				Logger.getLogger().logWarning(arg0);
+				EcoreUtilitiesPlugin.logWarning(arg0);
 			}
 
 		});
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DanglingHREFException.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DanglingHREFException.java
index debd006..9207710 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DanglingHREFException.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DanglingHREFException.java
@@ -20,6 +20,11 @@
 public class DanglingHREFException extends Exception {
 
 
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -3369128742899263327L;
+
 	public DanglingHREFException() {
 		super();
 	}
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DefaultFeatureValueConverter.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DefaultFeatureValueConverter.java
index ea56697..76e5962 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DefaultFeatureValueConverter.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DefaultFeatureValueConverter.java
@@ -348,7 +348,7 @@
 	 * @aValue.
 	 */
 	protected Object failedToConvert(Object aValue, String aString) {
-		String errorString = java.text.MessageFormat.format(FAILED_CONVERSION_PATTERN, new String[]{aValue.toString(), aString});
+		String errorString = java.text.MessageFormat.format(FAILED_CONVERSION_PATTERN, new Object[]{aValue.toString(), aString});
 		throw new FeatureValueConversionException(errorString);
 	}
 }
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DefaultOverridableResourceFactoryRegistry.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DefaultOverridableResourceFactoryRegistry.java
index 927c0a4..456edb5 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DefaultOverridableResourceFactoryRegistry.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/DefaultOverridableResourceFactoryRegistry.java
@@ -36,31 +36,31 @@
 		super();
 	}
 
+	@Override
 	public Resource.Factory getFactory(URI uri) {
 		return getFactory(uri, null);
 	}
 
+	@Override
 	public Resource.Factory getFactory(URI uri, String contentType)
 	{
 		Object resourceFactory = null;
+		String protocol = uri.scheme();
+		resourceFactory = protocolToFactoryMap.get(protocol);
 		if (resourceFactory == null) {
-			String protocol = uri.scheme();
-			resourceFactory = protocolToFactoryMap.get(protocol);
+			String extension = uri.fileExtension();
+			resourceFactory = extensionToFactoryMap.get(extension);
 			if (resourceFactory == null) {
-				String extension = uri.fileExtension();
-				resourceFactory = extensionToFactoryMap.get(extension);
-				if (resourceFactory == null) {
-					resourceFactory = delegatedGetFactory(uri);
-					if (resourceFactory == GLOBAL_FACTORY) {
-						resourceFactory = extensionToFactoryMap.get(Resource.Factory.Registry.DEFAULT_EXTENSION);
-						if (resourceFactory == null)
-							resourceFactory = GLOBAL_FACTORY;
-					}
-
+				resourceFactory = delegatedGetFactory(uri);
+				if (resourceFactory == GLOBAL_FACTORY) {
+					resourceFactory = extensionToFactoryMap.get(Resource.Factory.Registry.DEFAULT_EXTENSION);
+					if (resourceFactory == null)
+						resourceFactory = GLOBAL_FACTORY;
 				}
+
 			}
 		}
-
+		
 		return resourceFactory instanceof Resource.Factory.Descriptor ? ((Resource.Factory.Descriptor) resourceFactory).createFactory() : (Resource.Factory) resourceFactory;
 	}
 
@@ -69,6 +69,7 @@
 	 * 
 	 * @see org.eclipse.emf.ecore.resource.impl.ResourceFactoryRegistryImpl#delegatedGetFactory(org.eclipse.emf.common.util.URI)
 	 */
+	@Override
 	protected Factory delegatedGetFactory(URI uri) {
 		return Resource.Factory.Registry.INSTANCE.getFactory(uri);
 	}
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/EtoolsCopySession.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/EtoolsCopySession.java
index 0308041..1de9513 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/EtoolsCopySession.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/EtoolsCopySession.java
@@ -46,6 +46,7 @@
 	 * 
 	 * Copy Resources first and then copy RefObjects.
 	 */
+	@Override
 	public void copy(CopyGroup aGroup) {
 		if (aGroup != null) {
 			copyResources(aGroup);
@@ -60,6 +61,7 @@
 	 * This method should be used if you are only going to copy <code>aRefObject</code> in this
 	 * copy execution.
 	 */
+	@Override
 	public EObject copy(EObject aRefObject, String idSuffix) {
 		EObject copied = containmentCopy(aRefObject, idSuffix);
 		executeDeferredCopyActions();
@@ -70,6 +72,7 @@
 	 * This method should be used if you are only going to copy <code>aRefObject</code> in this
 	 * copy execution. This method only copies <code>aRefObject</code> attributes.
 	 */
+	@Override
 	public EObject copyObject(EObject aRefObject, String idSuffix) {
 		EObject copied = containmentCopyObject(aRefObject, idSuffix);
 		executeDeferredCopyActions();
@@ -80,6 +83,7 @@
 	 * This method should be used if you are only going to copy <code>aResource</code> in this
 	 * copy execution. The copied Resource will have a URI equal to <code>newUri</code>.
 	 */
+	@Override
 	public Resource copy(Resource aResource, String newUri) {
 		Resource copied = containmentCopy(aResource, newUri);
 		executeDeferredCopyActions();
@@ -103,6 +107,7 @@
 	 * @see com.ibm.etools.emf.ecore.utilities.copy.EtoolsCopyUtility#primCopyObject(EObject,
 	 *      String)
 	 */
+	@Override
 	protected EObject primCopyObject(EObject aRefObject, String idSuffix) {
 		EObject copy = super.primCopyObject(aRefObject, idSuffix);
 		copyIdIfNecessary(aRefObject, copy, idSuffix);
@@ -140,6 +145,7 @@
 	/**
 	 * Return a cached copy.
 	 */
+	@Override
 	public EObject getCopy(EObject anObject) {
 		EObject copied = super.getCopy(anObject);
 		if (copied == null)
@@ -159,6 +165,7 @@
 	/**
 	 * Return an instance of EObject that is the same type as <code>aRefObject</code>.
 	 */
+	@Override
 	public EObject newInstance(EObject aRefObject) {
 		EObject newType = super.newInstance(aRefObject);
 		newType.eSetDeliver(false);
@@ -168,6 +175,7 @@
 	/**
 	 * @see com.ibm.etools.emf.ecore.utilities.copy.EtoolsCopyUtility#newInstance(Resource, String)
 	 */
+	@Override
 	public Resource newInstance(Resource aResource, String newUri) {
 		Resource copy = super.newInstance(aResource, newUri);
 		if (aResource instanceof XMLResource) {
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/EtoolsCopyUtility.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/EtoolsCopyUtility.java
index 22d91e0..a89a7c7 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/EtoolsCopyUtility.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/EtoolsCopyUtility.java
@@ -51,6 +51,7 @@
 			super(aReference, aValue, aSuffix, aCopyContainer);
 		}
 
+		@Override
 		public void performAction() {
 			EObject value = (EObject) getReferenceValue();
 			getCopyContainer().eSet(getReference(), getCopyIfFound(value));
@@ -62,6 +63,7 @@
 			super(aReference, aValue, aSuffix, aCopyContainer);
 		}
 
+		@Override
 		public void performAction() {
 			List copyList = (List) getCopyContainer().eGet(getReference());
 			Iterator it = ((List) getReferenceValue()).iterator();
@@ -529,9 +531,10 @@
 	public Resource newInstance(Resource aResource, String newUri) {
 		if (aResource == null)
 			return null;
+		String innerNewUri = newUri;
 		Resource newResource;
 		String originalUri = aResource.getURI().toString();
-		newUri = newUri == null ? originalUri : newUri;
+		innerNewUri = innerNewUri == null ? originalUri : innerNewUri;
 
 		Resource.Factory factory = null;
 		if (aResource.getResourceSet() == null)
@@ -540,7 +543,7 @@
 			factory = aResource.getResourceSet().getResourceFactoryRegistry().getFactory(URI.createURI(originalUri));
 
 
-		newResource = factory.createResource(URI.createURI(newUri));
+		newResource = factory.createResource(URI.createURI(innerNewUri));
 		return newResource;
 	}
 
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ExtendedEcoreUtil.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ExtendedEcoreUtil.java
index e9cf914..823f191 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ExtendedEcoreUtil.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ExtendedEcoreUtil.java
@@ -11,10 +11,12 @@
 package org.eclipse.wst.common.internal.emf.utilities;
 
 import java.io.FileNotFoundException;
+import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 
 import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notifier;
 import org.eclipse.emf.common.notify.impl.BasicNotifierImpl.EAdapterList;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.common.util.WrappedException;
@@ -34,7 +36,80 @@
 	private static FileNotFoundDetector FILE_NOT_FOUND_DETECTOR;
 	private static String NAME_ATTRIBUTE_STRING = "name"; //$NON-NLS-1$
 
+	public static class ESynchronizedAdapterList extends EAdapterList
+	  {
 
+	    /**
+		 * 
+		 */
+		private static final long serialVersionUID = 7855438339187540718L;
+
+		public ESynchronizedAdapterList(Notifier notifier) {
+			super(notifier);
+		}
+
+		@Override
+		public synchronized boolean add(Object object)
+	    {
+	    return super.add(object);
+	    }
+
+	    @Override
+		public synchronized void add(int index, Object object)
+	    {
+	    super.add(index, object);
+	    }
+
+	    @Override
+		public synchronized boolean addAll(Collection collection)
+	    {
+	    return super.addAll(collection);
+	    }
+
+	    @Override
+		public synchronized boolean remove(Object object)
+	    {
+	    return super.remove(object);
+	    }
+
+	    @Override
+		public synchronized Object remove(int index)
+	    {
+	    return super.remove(index);
+	    }
+
+	    @Override
+		public synchronized boolean removeAll(Collection collection)
+	    {
+	    return super.removeAll(collection);
+	    }
+
+	    @Override
+		public synchronized void clear()
+	    {
+	     super.clear();
+	    }
+
+
+	    @Override
+		public synchronized Object set(int index, Object object)
+	    {
+	    return super.set(index, object);
+	    }
+
+	    @Override
+		public synchronized void move(int newPosition, Object object)
+	    {
+	    super.move(newPosition, object);
+	    }
+
+	    @Override
+		public synchronized Object move(int newPosition, int oldPosition)
+	    {
+	    return super.move(newPosition, oldPosition);
+	    }
+	  }
+	
 	public interface FileNotFoundDetector {
 		boolean isFileNotFound(WrappedException wrappedEx);
 	}
@@ -71,10 +146,11 @@
 
 	public static void eSetOrAdd(EObject obj, EStructuralFeature feature, Object value, int newIndex) {
 		if (feature.isMany() && value != null) {
-			if (newIndex >= 0)
-				((List) obj.eGet(feature)).add(newIndex, value);
+			List featureList = ((List) obj.eGet(feature));
+			if (newIndex >= 0 && newIndex < featureList.size())
+				featureList.add(newIndex, value);
 			else
-				((List) obj.eGet(feature)).add(value);
+				featureList.add(value);
 		} else {
 			obj.eSet(feature, value);
 		}
@@ -194,7 +270,7 @@
 		Resource res = root.eResource();
 		EObject container = root.eContainer();
 		/* Making sure the proxy is created first before unloading */
-		if (root != null && res != null)
+		if (res != null)
 			becomeProxy(root, res);
 		if (container == null)
 			if (res != null)
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/FeatureValueConversionException.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/FeatureValueConversionException.java
index 0525a1f..38c24d1 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/FeatureValueConversionException.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/FeatureValueConversionException.java
@@ -11,6 +11,11 @@
 public class FeatureValueConversionException extends RuntimeException {
 
 	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 8190891648333814201L;
+
+	/**
 	 * Constructor for FeatureValueConversionException.
 	 */
 	public FeatureValueConversionException() {
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/IDUtil.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/IDUtil.java
index 388986c..2aa022c 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/IDUtil.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/IDUtil.java
@@ -52,14 +52,15 @@
 	}
 
 	protected static String ensureUniqueID(XMLResource aResource, String baseIDName) {
-		baseIDName += "_"; //$NON-NLS-1$
+		String innerBaseIDName = baseIDName;
+		innerBaseIDName += "_"; //$NON-NLS-1$
 		//Change to use the current time instead of incremental numbers to help
 		//support team development.
 		long currentTime = System.currentTimeMillis();
-		String id = baseIDName + currentTime;
+		String id = innerBaseIDName + currentTime;
 		while (aResource.getEObject(id) != null) {
 			++currentTime;
-			id = baseIDName + currentTime;
+			id = innerBaseIDName + currentTime;
 		}
 		return id;
 	}
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/InvalidPasswordCipherException.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/InvalidPasswordCipherException.java
index 5ff513b..18b8d14 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/InvalidPasswordCipherException.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/InvalidPasswordCipherException.java
@@ -12,5 +12,10 @@
 import org.omg.CORBA.UserException;
 
 public class InvalidPasswordCipherException extends UserException {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -1878574401021590545L;
 }
 
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/InvalidPasswordDecodingException.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/InvalidPasswordDecodingException.java
index 2e16808..161c069 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/InvalidPasswordDecodingException.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/InvalidPasswordDecodingException.java
@@ -12,5 +12,10 @@
 import org.omg.CORBA.UserException;
 
 public class InvalidPasswordDecodingException extends UserException {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 6211942853796823840L;
 }
 
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/InvalidPasswordEncodingException.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/InvalidPasswordEncodingException.java
index dd882d7..a03e653 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/InvalidPasswordEncodingException.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/InvalidPasswordEncodingException.java
@@ -12,5 +12,10 @@
 import org.omg.CORBA.UserException;
 
 public class InvalidPasswordEncodingException extends UserException {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -1320759752706898095L;
 }
 
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/IsLoadingProxyAdapter.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/IsLoadingProxyAdapter.java
index a75b865..b52fe8a 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/IsLoadingProxyAdapter.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/IsLoadingProxyAdapter.java
@@ -43,6 +43,7 @@
 	 * 
 	 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
 	 */
+	@Override
 	public void notifyChanged(Notification msg) {
 		if (resource != null) {
 			//listen for the remove of the loading adapter
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/NamespaceAdapter.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/NamespaceAdapter.java
index 0bdac76..78892fa 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/NamespaceAdapter.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/NamespaceAdapter.java
@@ -57,6 +57,7 @@
 		 * 
 		 * @see org.eclipse.emf.common.notify.impl.NotificationImpl#getFeature()
 		 */
+		@Override
 		public Object getFeature() {
 			return NOTIFICATION_FEATURE;
 		}
@@ -169,6 +170,7 @@
 	 * 
 	 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#isAdapterForType(java.lang.Object)
 	 */
+	@Override
 	public boolean isAdapterForType(Object type) {
 		return ADAPTER_TYPE.equals(type);
 	}
@@ -191,6 +193,7 @@
 	 * 
 	 * @see com.ibm.etools.emf.ecore.utilities.CloneablePublic#clone()
 	 */
+	@Override
 	public Object clone() {
 		NamespaceAdapter result = new NamespaceAdapter();
 		if (hasNamespaces()) {
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PassthruEncoderDecoder.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PassthruEncoderDecoder.java
index e684059..d8677eb 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PassthruEncoderDecoder.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PassthruEncoderDecoder.java
@@ -14,7 +14,7 @@
 /**
  * A passthru EncoderDecoder implementation
  */
-public class PassthruEncoderDecoder extends EncoderDecoderAdapter implements EncoderDecoder {
+public class PassthruEncoderDecoder extends EncoderDecoderAdapter {
 	public static final PassthruEncoderDecoder INSTANCE = new PassthruEncoderDecoder();
 	public static final String KEY = PassthruEncoderDecoder.class.getName();
 
@@ -28,6 +28,7 @@
 	/**
 	 * Returns a decoded version of the value.
 	 */
+	@Override
 	public String decode(String value) {
 		return value;
 	}
@@ -35,6 +36,7 @@
 	/**
 	 * Returns an encoded version of the value.
 	 */
+	@Override
 	public String encode(String value) {
 		return value;
 	}
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PasswordEncoderDecoder.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PasswordEncoderDecoder.java
index 2c82ced..1334efb 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PasswordEncoderDecoder.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PasswordEncoderDecoder.java
@@ -8,16 +8,18 @@
  **************************************************************************************************/
 package org.eclipse.wst.common.internal.emf.utilities;
 
-public class PasswordEncoderDecoder extends EncoderDecoderAdapter implements EncoderDecoder {
+public class PasswordEncoderDecoder extends EncoderDecoderAdapter {
 	public static final String KEY = "password-security-coder"; //$NON-NLS-1$
 
 	public PasswordEncoderDecoder() {
 	}
 
+	@Override
 	public String decode(String s) {
 		return PasswordUtil.passwordDecode(s);
 	}
 
+	@Override
 	public String encode(String s) {
 		return PasswordUtil.passwordEncode(s);
 	}
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PasswordUtil.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PasswordUtil.java
index 012f2c2..a46a97c 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PasswordUtil.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PasswordUtil.java
@@ -60,15 +60,16 @@
 
 	public static String getCryptoAlgorithm(String s) {
 		String s1 = null;
-		if (s != null) {
-			s = s.trim();
-			if (s.length() >= 2) {
-				int i = s.indexOf("{"); //$NON-NLS-1$
+		String innerS = s;
+		if (innerS != null) {
+			innerS = innerS.trim();
+			if (innerS.length() >= 2) {
+				int i = innerS.indexOf("{"); //$NON-NLS-1$
 				if (i == 0) {
-					int j = s.indexOf("}", ++i); //$NON-NLS-1$
+					int j = innerS.indexOf("}", ++i); //$NON-NLS-1$
 					if (j > 0)
 						if (i < j)
-							s1 = s.substring(i, j).trim();
+							s1 = innerS.substring(i, j).trim();
 						else
 							s1 = EMPTY_STRING;
 				}
@@ -91,12 +92,13 @@
 	}
 
 	public static boolean isValidCryptoAlgorithm(String s) {
-		if (s != null) {
-			s = s.trim();
-			if (s.length() == 0)
+		String innerS = s;
+		if (innerS != null) {
+			innerS = innerS.trim();
+			if (innerS.length() == 0)
 				return true;
 			for (int i = 0; i < SUPPORTED_CRYPTO_ALGORITHMS.length; i++)
-				if (s.equalsIgnoreCase(SUPPORTED_CRYPTO_ALGORITHMS[i]))
+				if (innerS.equalsIgnoreCase(SUPPORTED_CRYPTO_ALGORITHMS[i]))
 					return true;
 		}
 		return false;
@@ -137,15 +139,16 @@
 
 	public static String removeCryptoAlgorithmTag(String s) {
 		String s1 = null;
-		if (s != null) {
-			s = s.trim();
-			if (s.length() >= 2) {
-				int i = s.indexOf("{"); //$NON-NLS-1$
+		String innerS = s;
+		if (innerS != null) {
+			innerS = innerS.trim();
+			if (innerS.length() >= 2) {
+				int i = innerS.indexOf("{"); //$NON-NLS-1$
 				if (i == 0) {
-					int j = s.indexOf("}", ++i); //$NON-NLS-1$
+					int j = innerS.indexOf("}", ++i); //$NON-NLS-1$
 					if (j > 0)
-						if (++j < s.length())
-							s1 = s.substring(j).trim();
+						if (++j < innerS.length())
+							s1 = innerS.substring(j).trim();
 						else
 							s1 = EMPTY_STRING;
 				}
@@ -163,7 +166,7 @@
 				try {
 					abyte0 = s.getBytes(STRING_CONVERSION_CODE);
 				} catch (UnsupportedEncodingException unsupportedencodingexception) {
-					abyte0 = null;
+					//do nothing
 				}
 		return abyte0;
 	}
@@ -177,7 +180,7 @@
 				try {
 					s = new String(abyte0, STRING_CONVERSION_CODE);
 				} catch (UnsupportedEncodingException unsupportedencodingexception) {
-					s = null;
+					//do nothing
 				}
 		return s;
 	}
@@ -198,7 +201,9 @@
 
 	private static byte[] base64Decode(byte abyte0[]) {
 		int i;
-		for (i = abyte0.length; abyte0[--i] == 61;);
+		for (i = abyte0.length; abyte0[--i] == 61;){
+			//do nothing just finding index of 61
+		}
 		byte abyte1[] = new byte[(i + 1) - abyte0.length / 4];
 		for (int j = 0; j < abyte0.length; j++)
 			abyte0[j] = BASE64_DECODE_MAP[abyte0[j]];
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PleaseMigrateYourCodeError.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PleaseMigrateYourCodeError.java
index 5a548d6..bd4776e 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PleaseMigrateYourCodeError.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/PleaseMigrateYourCodeError.java
@@ -18,6 +18,11 @@
  */
 public class PleaseMigrateYourCodeError extends Error {
 
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 1137010999400298839L;
+
 	//TODO Delete me
 	public PleaseMigrateYourCodeError() {
 		super(WFTUtilsResourceHandler.PleaseMigrateYourCodeError_ERROR_0);
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceDependencyRegister.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceDependencyRegister.java
index 34ff643..79c8046 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceDependencyRegister.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceDependencyRegister.java
@@ -38,6 +38,7 @@
 		 * 
 		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#isAdapterForType(java.lang.Object)
 		 */
+		@Override
 		public boolean isAdapterForType(Object type) {
 			return RESOURCE_DEPENDENCY_TYPE.equals(type);
 		}
@@ -47,6 +48,7 @@
 		 * 
 		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
 		 */
+		@Override
 		public void notifyChanged(Notification msg) {
 			//Listen for unloads and removes
 			switch (msg.getFeatureID(null)) {
@@ -75,6 +77,7 @@
 		 * 
 		 * @see org.eclipse.emf.common.notify.impl.AdapterImpl#notifyChanged(org.eclipse.emf.common.notify.Notification)
 		 */
+		@Override
 		public void notifyChanged(Notification msg) {
 			if (msg.getEventType() == Notification.ADD)
 				proccessAddedResource((ResourceSet) msg.getNotifier(), (Resource) msg.getNewValue());
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceIsLoadingAdapter.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceIsLoadingAdapter.java
index 35f1f33..a5d96ea 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceIsLoadingAdapter.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceIsLoadingAdapter.java
@@ -10,22 +10,20 @@
  *******************************************************************************/
 /*
  * Created on Oct 26, 2004
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
  */
 package org.eclipse.wst.common.internal.emf.utilities;
 
+import java.util.List;
+
 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.ecore.resource.Resource;
-import org.eclipse.emf.ecore.util.EcoreUtil;
 
 /**
  * @author mdelder
  */
-public class ResourceIsLoadingAdapter extends AdapterImpl implements Adapter {
+public class ResourceIsLoadingAdapter extends AdapterImpl {
 
     private static final Class RESOURCE_IS_LOADING_ADAPTER_CLASS = ResourceIsLoadingAdapter.class;
 
@@ -42,9 +40,10 @@
          * removeIsLoadingSupport() will coordinate with this 
          * synchronization.
          */
-        synchronized (aResource) {
-            adapter = (ResourceIsLoadingAdapter) EcoreUtil.getAdapter(aResource.eAdapters(), ResourceIsLoadingAdapter.class);
+        synchronized(aResource.eAdapters()) {
+        	adapter = (ResourceIsLoadingAdapter) getAdapter(aResource.eAdapters(), ResourceIsLoadingAdapter.class);
         }
+        
         return adapter;
     }
 
@@ -53,7 +52,8 @@
      * 
      * @see org.eclipse.emf.common.notify.Adapter#notifyChanged(org.eclipse.emf.common.notify.Notification)
      */
-    public void notifyChanged(Notification notification) {
+    @Override
+	public void notifyChanged(Notification notification) {
 
         if (notification.getNotifier() != null) {
 
@@ -68,6 +68,18 @@
     public void waitForResourceToLoad() {
 
     }
+    public static Adapter getAdapter(List<Adapter> adapters, Object type)
+    {
+      for (int i = 0, size = adapters.size(); i < size; ++i)
+      {
+        Adapter adapter = adapters.get(i);
+        if (adapter != null && adapter.isAdapterForType(type))
+        {
+          return adapter;
+        }
+      }
+      return null;
+    }
 
     /**
      * @param notification
@@ -88,7 +100,7 @@
          */
         if (getTarget() != null) {
             //System.out.println("ResourceIsLoadingAdapter Synchronizing on " + getTarget());
-            synchronized (getTarget()) {
+            synchronized (getTarget().eAdapters()) {
                 getTarget().eAdapters().remove(this);
             }
         }
@@ -99,7 +111,8 @@
      * 
      * @see org.eclipse.emf.common.notify.Adapter#isAdapterForType(java.lang.Object)
      */
-    public boolean isAdapterForType(Object type) {
+    @Override
+	public boolean isAdapterForType(Object type) {
         return type == RESOURCE_IS_LOADING_ADAPTER_CLASS;
     }
 
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceIsLoadingAdapterFactory.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceIsLoadingAdapterFactory.java
index 5899f5d..6e30496 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceIsLoadingAdapterFactory.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/ResourceIsLoadingAdapterFactory.java
@@ -10,9 +10,6 @@
  *******************************************************************************/
 /*
  * Created on Oct 26, 2004
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
  */
 package org.eclipse.wst.common.internal.emf.utilities;
 
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/TranslatorManager.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/TranslatorManager.java
index 79ee8b8..975db26 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/TranslatorManager.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/TranslatorManager.java
@@ -16,8 +16,7 @@
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.wst.common.core.util.RegistryReader;
 import org.eclipse.wst.common.internal.emf.plugin.EcoreUtilitiesPlugin;
 import org.eclipse.wst.common.internal.emf.resource.Translator;
 
@@ -77,6 +76,7 @@
 		/**
 		 * Add the configuration element if it matchs the expected translator element name
 		 */
+		@Override
 		public boolean readElement(IConfigurationElement element) {
 			boolean result = false;
 			if (TRANSLATOR.equals(element.getName())) {
@@ -134,7 +134,7 @@
 			try {
 				instance = (Translator) configElement.createExecutableExtension(CLASSNAME);
 			} catch (CoreException e) {
-				Logger.getLogger().logError(e);
+				EcoreUtilitiesPlugin.logError(e);
 			}
 			return instance;
 		}
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/UnsupportedCryptoAlgorithmException.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/UnsupportedCryptoAlgorithmException.java
index f71c66d..58459bf 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/UnsupportedCryptoAlgorithmException.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/UnsupportedCryptoAlgorithmException.java
@@ -12,5 +12,10 @@
 import org.omg.CORBA.UserException;
 
 public class UnsupportedCryptoAlgorithmException extends UserException {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -3510453767624155991L;
 }
 
diff --git a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/XMLValueEncoderDecoder.java b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/XMLValueEncoderDecoder.java
index d9a1d2c..7503523 100644
--- a/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/XMLValueEncoderDecoder.java
+++ b/plugins/org.eclipse.wst.common.emf/wtpemf/org/eclipse/wst/common/internal/emf/utilities/XMLValueEncoderDecoder.java
@@ -14,7 +14,7 @@
 /**
  * An XML value escaping EncoderDecoder implementation
  */
-public class XMLValueEncoderDecoder extends EncoderDecoderAdapter implements EncoderDecoder {
+public class XMLValueEncoderDecoder extends EncoderDecoderAdapter {
 	/**
 	 * Identifies the last printable character in the Unicode range that is supported by the
 	 * encoding used with this serializer. For 8-bit encodings this will be either 0x7E or 0xFF. For
@@ -34,6 +34,7 @@
 	/**
 	 * Returns a decoded version of the value.
 	 */
+	@Override
 	public String decode(String value) {
 		// NOT_IMPLEMENTED
 		return value;
@@ -47,6 +48,7 @@
 	 * @param source
 	 *            The string to escape
 	 */
+	@Override
 	public String encode(String value) {
 		StringBuffer sbuf = new StringBuffer(value.length());
 		String charRef = null;
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/.classpath b/plugins/org.eclipse.wst.common.emfworkbench.integration/.classpath
index fe45152..44b3dda 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/.classpath
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/.classpath
@@ -2,7 +2,7 @@
 <classpath>
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="src" path="property_file"/>
-	<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.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins">
 		<accessrules>
 			<accessrule kind="accessible" pattern="org/eclipse/wst/common/**"/>
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.wst.common.emfworkbench.integration/.settings/org.eclipse.jdt.core.prefs
index 46468f9..037a4e5 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/.settings/org.eclipse.jdt.core.prefs
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/.settings/org.eclipse.jdt.core.prefs
@@ -1,62 +1,95 @@
-#Sat Mar 24 02:06:45 EDT 2007
-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=ignore
-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.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
-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=error
-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=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=ignore
-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=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+#Mon Jun 08 15:35:45 EDT 2009
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
+org.eclipse.jdt.core.compiler.problem.unusedLocal=error
+org.eclipse.jdt.core.compiler.problem.emptyStatement=error
+org.eclipse.jdt.core.compiler.problem.unusedLabel=error
+org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=enabled
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=error
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=error
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=error
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.compiler.problem.fieldHiding=error
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=error
+eclipse.preferences.version=1
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
+org.eclipse.jdt.core.compiler.problem.deadCode=error
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeUncheckedExceptions=disabled
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=ignore
-org.eclipse.jdt.core.compiler.source=1.3
+org.eclipse.jdt.core.compiler.problem.autoboxing=warning
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=error
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.common.emfworkbench.integration/META-INF/MANIFEST.MF
index bf1be29..b97fa45 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.wst.common.emfworkbench.integration; singleton:=true
-Bundle-Version: 1.1.201.qualifier
+Bundle-Version: 1.2.0.qualifier
 Bundle-Activator: org.eclipse.wst.common.internal.emfworkbench.integration.EMFWorkbenchEditPlugin
 Bundle-Vendor: %pluginVendor
 Bundle-Localization: plugin
@@ -21,6 +21,5 @@
  org.eclipse.wst.common.project.facet.core;bundle-version="[1.3.0,2.0.0)",
  org.eclipse.core.expressions;bundle-version="[3.4.0,4.0.0)"
 Eclipse-LazyStart: true
-Bundle-RequiredExecutionEnvironment: J2SE-1.4,
- J2SE-1.5
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
 Bundle-ActivationPolicy: lazy
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/plugin.properties b/plugins/org.eclipse.wst.common.emfworkbench.integration/plugin.properties
index cdc1ce7..a7b84f1 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/plugin.properties
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/plugin.properties
@@ -13,4 +13,4 @@
 Adapter_Factory_Extension=Adapter Factory Extension
 ModifierHelperFactory=ModifierHelperFactory
 pluginName=EMF Workbench Edit Plug-in
-pluginVendor=Eclipse.org
+pluginVendor=Eclipse Web Tools Platform
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EMFWorkbenchContext.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EMFWorkbenchContext.java
index 66c6b35..2161f94 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EMFWorkbenchContext.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EMFWorkbenchContext.java
@@ -35,11 +35,11 @@
 import org.eclipse.jem.util.emf.workbench.ISynchronizerExtender;
 import org.eclipse.jem.util.emf.workbench.ProjectResourceSet;
 import org.eclipse.jem.util.emf.workbench.WorkbenchURIConverter;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.wst.common.internal.emf.resource.CompatibilityXMIResource;
 import org.eclipse.wst.common.internal.emf.resource.ReferencedXMIFactoryImpl;
 import org.eclipse.wst.common.internal.emf.utilities.DefaultOverridableResourceFactoryRegistry;
 import org.eclipse.wst.common.internal.emfworkbench.edit.EditModelRegistry;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EMFWorkbenchEditPlugin;
 import org.eclipse.wst.common.internal.emfworkbench.integration.EditModel;
 import org.eclipse.wst.common.internal.emfworkbench.integration.EditModelEvent;
 import org.eclipse.wst.common.internal.emfworkbench.integration.ProjectResourceSetEditImpl;
@@ -72,6 +72,7 @@
 	 * 
 	 * @see org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext#initializeResourceSet(org.eclipse.wst.common.internal.emfworkbench.ProjectResourceSet)
 	 */
+	@Override
 	protected void initializeResourceSet(ProjectResourceSet aResourceSet) {
 		super.initializeResourceSet(aResourceSet);
 		Resource.Factory.Registry reg = new DefaultOverridableResourceFactoryRegistry();
@@ -276,7 +277,7 @@
 			try {
 				editModel.resourceChanged(anEvent);
 			} catch (Exception e) {
-				Logger.getLogger().logError(e);
+				EMFWorkbenchEditPlugin.logError(e);
 			}
 		}
 	}
@@ -301,6 +302,7 @@
 		 * @see Adapter#notifyChanged(new ENotificationImpl((InternalEObject)Notifier,
 		 *      int,(EStructuralFeature) EObject, Object, Object, int))
 		 */
+		@Override
 		public void notifyChanged(Notification notification) {
 			switch (notification.getEventType()) {
 				case Notification.ADD :
@@ -380,10 +382,12 @@
 	 * 
 	 * @see org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContextBase#createURIConverter(org.eclipse.wst.common.internal.emfworkbench.ProjectResourceSet)
 	 */
+	@Override
 	protected WorkbenchURIConverter createURIConverter(ProjectResourceSet aResourceSet) {
 		return new CompatibilityWorkbenchURIConverterImpl(getProject(), aResourceSet.getSynchronizer());
 	}
 
+	@Override
 	protected ProjectResourceSet createResourceSet() {
 		if (project == null)
 			throw new IllegalStateException("Attempt to create resource set with null project"); //$NON-NLS-1$
@@ -395,11 +399,12 @@
 	 * 
 	 * @see org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContextBase#deleteFile(org.eclipse.emf.ecore.resource.Resource)
 	 */
+	@Override
 	public void deleteFile(Resource resource) {
 		try {
 			WorkbenchResourceHelper.deleteResource(resource);
 		} catch (CoreException ex) {
-			Logger.getLogger().logError(ex);
+			EMFWorkbenchEditPlugin.logError(ex);
 		}
 
 	}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EMFWorkbenchEditResourceHandler.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EMFWorkbenchEditResourceHandler.java
index 8bd1073..5c054be 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EMFWorkbenchEditResourceHandler.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/EMFWorkbenchEditResourceHandler.java
@@ -10,9 +10,6 @@
  *******************************************************************************/
 /*
  * Created on May 25, 2004
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
  */
 package org.eclipse.wst.common.internal.emfworkbench;
 
@@ -20,9 +17,6 @@
 
 /**
  * @author vijayb
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Style - Code Templates
  */
 public class EMFWorkbenchEditResourceHandler extends NLS {
 	private static final String BUNDLE_NAME = "emfworkbenchedit";//$NON-NLS-1$
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/PassthruResourceSet.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/PassthruResourceSet.java
index d1b36ea..1c04b70 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/PassthruResourceSet.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/PassthruResourceSet.java
@@ -42,6 +42,13 @@
 	protected boolean isIsolated = false;
 
 	public class PassthruResourcesEList extends ResourceSetImpl.ResourcesEList {
+		/**
+		 * 
+		 */
+		private static final long serialVersionUID = 2504207070244627980L;
+
+
+		@Override
 		public boolean add(Object object) {
 			if (object == null)
 				return false;
@@ -53,6 +60,7 @@
 		}
 
 
+		@Override
 		public boolean addAll(Collection collection) {
 			if (collection.isEmpty())
 				return false;
@@ -84,6 +92,7 @@
 		return isIsolated;
 	}
 
+	@Override
 	public Resource createResource(URI uri) {
 		Resource result = WorkbenchResourceHelperBase.getExistingOrCreateResource(uri);
 		if (result == null)
@@ -94,6 +103,7 @@
 	/**
 	 * @see org.eclipse.emf.ecore.resource.impl.ResourceSetImpl#demandCreateResource(URI)
 	 */
+	@Override
 	protected Resource demandCreateResource(URI uri) {
 		Resource result = WorkbenchResourceHelperBase.createResource(uri);
 		if (result == null)
@@ -105,6 +115,7 @@
 	/*
 	 * Javadoc copied from interface.
 	 */
+	@Override
 	public EList getResources() {
 		if (isIsolated)
 			return super.getResources();
@@ -117,6 +128,7 @@
 	/**
 	 * @see org.eclipse.jem.internal.util.emf.workbench.ProjectResourceSetImpl#createResourceFromHandlers(URI)
 	 */
+	@Override
 	protected Resource createResourceFromHandlers(URI uri) {
 		if (!isIsolated)
 			return super.createResourceFromHandlers(uri);
@@ -126,6 +138,7 @@
 	/**
 	 * @see org.eclipse.jem.internal.util.emf.workbench.ProjectResourceSetImpl#getResourceFromHandlers(URI)
 	 */
+	@Override
 	protected Resource getResourceFromHandlers(URI uri) {
 		if (!isIsolated)
 			return super.getResourceFromHandlers(uri);
@@ -135,6 +148,7 @@
 	/**
 	 * @see com.ibm.etools.emf.workbench.ProjectResourceSetImpl#getEObjectFromHandlers(URI, boolean)
 	 */
+	@Override
 	protected EObject getEObjectFromHandlers(URI uri, boolean loadOnDemand) {
 		if (!isIsolated)
 			return super.getEObjectFromHandlers(uri, loadOnDemand);
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/WorkbenchResourceHelper.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/WorkbenchResourceHelper.java
index 6296984..a74af9a 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/WorkbenchResourceHelper.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/WorkbenchResourceHelper.java
@@ -40,11 +40,11 @@
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
 import org.eclipse.jem.util.emf.workbench.WorkbenchURIConverter;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.jem.util.plugin.JEMUtilPlugin;
 import org.eclipse.wst.common.internal.emf.resource.ReferencedResource;
 import org.eclipse.wst.common.internal.emf.resource.ReferencedXMIFactoryImpl;
 import org.eclipse.wst.common.internal.emf.utilities.ExtendedEcoreUtil;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EMFWorkbenchEditPlugin;
 
 /**
  * @author schacher
@@ -58,6 +58,7 @@
 
 	private static class FileAdapterFactory extends AdapterFactoryImpl {
 
+		@Override
 		public Adapter adaptNew(Notifier target, Object type) {
 			FileAdapter adapter = new FileAdapter();
 			adapter.setTarget(target);
@@ -80,6 +81,7 @@
 		public static final int FILE_NOT_LOADED = 0;
 		public static final int FILE_INACCESSIBLE = -1;
 
+		@Override
 		public boolean isAdapterForType(Object type) {
 			return ADAPTER_KEY.equals(type);
 		}
@@ -87,6 +89,7 @@
 		/*
 		 * Update the synchronization stamp where appropriate
 		 */
+		@Override
 		public void notifyChanged(Notification msg) {
 			switch (msg.getFeatureID(null)) {
 				case Resource.RESOURCE__IS_LOADED :
@@ -192,13 +195,6 @@
 		}
 
 		/**
-		 * @param file
-		 */
-		public void setFile(IFile file) {
-			this.file = file;
-		}
-
-		/**
 		 * @param l
 		 */
 		public void setSynchronizationStamp(long l) {
@@ -216,7 +212,7 @@
             try {
                 hasLocked = aquireSaveLock(delay);
             } catch (InterruptedException e) {
-                Logger.getLogger().write(e);
+            	EMFWorkbenchEditPlugin.logError(e);
             }
             boolean result = false;
             try {
@@ -231,7 +227,7 @@
                     }
                 }
             } catch (Exception e) {
-                Logger.getLogger().write(e);
+            	EMFWorkbenchEditPlugin.logError(e);
             } finally {
                 if (hasLocked)
                     releaseSaveLock();
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/AdapterFactoryDescriptor.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/AdapterFactoryDescriptor.java
index e72153d..0069b4c 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/AdapterFactoryDescriptor.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/AdapterFactoryDescriptor.java
@@ -23,10 +23,10 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.jem.util.plugin.JEMUtilPlugin;
 import org.eclipse.wst.common.frameworks.internal.AbstractRegistryDescriptor;
 import org.eclipse.wst.common.internal.emf.utilities.Assert;
 import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchEditResourceHandler;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EMFWorkbenchEditPlugin;
 
 
 public class AdapterFactoryDescriptor extends AbstractRegistryDescriptor implements Comparable {
@@ -54,6 +54,7 @@
 	 * 
 	 * @see java.lang.Object#toString()
 	 */
+	@Override
 	public String toString() {
 		StringBuffer sb = new StringBuffer();
 		sb.append("AdapterFactoryDescriptor"); //$NON-NLS-1$
@@ -98,8 +99,7 @@
 		try {
 			factory = (AdapterFactory) element.createExecutableExtension(AdapterFactoryRegistry.CLASS_NAME);
 		} catch (CoreException e) {
-			JEMUtilPlugin.getLogger().logError(e);
-			factory = null;
+			EMFWorkbenchEditPlugin.logError(e);
 		}
 		return factory;
 	}
@@ -148,6 +148,7 @@
 	 * 
 	 * @see org.eclipse.wst.common.frameworks.internal.AbstractRegistryDescriptor#getID()
 	 */
+	@Override
 	public String getID() {
 		return id;
 	}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/AdapterFactoryRegistry.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/AdapterFactoryRegistry.java
index e986962..fce4ba2 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/AdapterFactoryRegistry.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/AdapterFactoryRegistry.java
@@ -22,7 +22,6 @@
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.wst.common.internal.emfworkbench.integration.EMFWorkbenchEditPlugin;
 
 /**
@@ -79,6 +78,7 @@
 	 * 
 	 * @see org.eclipse.wst.common.frameworks.internal.RegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
 	 */
+	@Override
 	public boolean readElement(IConfigurationElement element) {
 		try {
 			if (element.getName().equals(ADAPTER_FACTORY)) {
@@ -87,7 +87,7 @@
 				return true;
 			}
 		} catch (RuntimeException re) {
-			Logger.getLogger().logError(re);
+			EMFWorkbenchEditPlugin.logError(re);
 		}
 		return false;
 	}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ChildCommand.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ChildCommand.java
index 6dec40e..75e23b2 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ChildCommand.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ChildCommand.java
@@ -32,6 +32,7 @@
 		modelRetriever = retriever;
 	}
 
+	@Override
 	public boolean canExecute() {
 		return true;
 	}
@@ -43,6 +44,7 @@
 		//does nothing
 	}
 
+	@Override
 	protected void executeInModel(AbstractEditModelCommand cmd) {
 		EditModel model = modelRetriever.getEditModelForWrite(this);
 		try {
@@ -86,6 +88,7 @@
 		}
 	}
 
+	@Override
 	public void undo() {
 		undoInModel();
 		getParent().undoFrom(this);
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ClientAccessRegistry.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ClientAccessRegistry.java
index 5f0f82d..264bc17 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ClientAccessRegistry.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ClientAccessRegistry.java
@@ -87,6 +87,7 @@
 		throw new ClientAccessRegistryException(EMFWorkbenchResourceHandler.getString("ClientAccessRegistry_ERROR_1"), accessorKey); //$NON-NLS-1$
 	}
 
+	@Override
 	public String toString() {
 		StringBuffer result = new StringBuffer("ClientAccessRegistry: ["); //$NON-NLS-1$
 		result.append((isStable()) ? "STABLE" : "OUT OF SYNC"); //$NON-NLS-1$ //$NON-NLS-2$
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ClientAccessRegistryException.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ClientAccessRegistryException.java
index a5aa1cb..c1742a6 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ClientAccessRegistryException.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ClientAccessRegistryException.java
@@ -33,6 +33,10 @@
  */
 public class ClientAccessRegistryException extends RuntimeException {
 
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -9016827022289377292L;
 	public static final int UNKNOWN = 0;
 	public static final int DANGLING_REFERENCE = 1;
 	public static final int INVALID_ACCESS_KEY = 2;
@@ -58,6 +62,7 @@
 	 * 
 	 * @see java.lang.Throwable#printStackTrace(java.io.PrintStream)
 	 */
+	@Override
 	public void printStackTrace(PrintStream s) {
 
 		s.println(toString());
@@ -90,6 +95,7 @@
 	 * 
 	 * @see java.lang.Throwable#printStackTrace(java.io.PrintWriter)
 	 */
+	@Override
 	public void printStackTrace(PrintWriter s) {
 
 		s.println(toString());
@@ -127,6 +133,7 @@
 		}
 	}
 
+	@Override
 	public String toString() {
 		StringBuffer result = new StringBuffer(super.toString()).append("\r\n"); //$NON-NLS-1$
 		result.append(EMFWorkbenchEditResourceHandler.getString(EMFWorkbenchEditResourceHandler.ClientAccessRegistryException_UI_1, new Object[]{getType()}));
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EMFWorkbenchEditContextFactory.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EMFWorkbenchEditContextFactory.java
index 6d74981..a853a30 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EMFWorkbenchEditContextFactory.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EMFWorkbenchEditContextFactory.java
@@ -19,9 +19,9 @@
 import java.util.Hashtable;
 import java.util.Map;
 
+import org.eclipse.core.internal.jobs.LockManager;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.jobs.ILock;
-import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.jem.internal.util.emf.workbench.EMFWorkbenchContextFactory;
 import org.eclipse.jem.util.emf.workbench.EMFWorkbenchContextBase;
@@ -46,14 +46,17 @@
 		super();
 	}
 
+	@Override
 	protected EMFWorkbenchContextBase primCreateEMFContext(IProject aProject) {
 		return new EMFWorkbenchContext(aProject);
 	}
 
+	@Override
 	public ResourceSetWorkbenchSynchronizer createSynchronizer(ResourceSet aResourceSet, IProject aProject) {
 		return new ResourceSetWorkbenchEditSynchronizer(aResourceSet, aProject);
 	}
 	
+	protected static LockManager lockManager = new LockManager();
 	protected static Map projectLocks = new Hashtable();
 
 	public static ILock getProjectLockObject(IProject aProject){
@@ -64,13 +67,14 @@
 		synchronized (projectLocks) {
 			ILock lock = (ILock)projectLocks.get(hashCode);
 			if(lock == null){
-				lock = Job.getJobManager().newLock();
+				lock = lockManager.newLock();
 				projectLocks.put(hashCode, lock);
 			}
 			return lock;
 		}
 	}
 	
+	@Override
 	public EMFWorkbenchContextBase createEMFContext(IProject aProject, IEMFContextContributor contributor) {
 		ILock lock = getProjectLockObject(aProject);
 		try{
@@ -85,6 +89,7 @@
 		}
 	}
 	
+	@Override
 	protected EMFWorkbenchContextBase getCachedEMFContext(IProject aProject) {
 		ILock lock = getProjectLockObject(aProject);
 		try{
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelExtension.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelExtension.java
index 6041def..ddb0856 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelExtension.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelExtension.java
@@ -20,8 +20,8 @@
 import java.util.Collection;
 
 import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.wst.common.frameworks.internal.ConfigurationElementWrapper;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EMFWorkbenchEditPlugin;
 
 
 public class EditModelExtension extends ConfigurationElementWrapper {
@@ -40,7 +40,7 @@
 	private void init() {
 		id = element.getAttribute(ID_ATTR);
 		if (id == null) {
-			Logger.getLogger().logError("Incorrect usage of editModelExtension extension point.  Element must contain id attribute.  Plugin: " + getPluginId()); //$NON-NLS-1$
+			EMFWorkbenchEditPlugin.logError("Incorrect usage of editModelExtension extension point.  Element must contain id attribute.  Plugin: " + getPluginId()); //$NON-NLS-1$
 			return;
 		}
 
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelExtensionRegistry.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelExtensionRegistry.java
index 47bc51b..152fbc4 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelExtensionRegistry.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelExtensionRegistry.java
@@ -53,6 +53,7 @@
 	 * 
 	 * @see org.eclipse.wst.common.frameworks.internal.RegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
 	 */
+	@Override
 	public boolean readElement(IConfigurationElement element) {
 
 		boolean result = false;
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelRegistry.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelRegistry.java
index facd9cb..977ffa4 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelRegistry.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelRegistry.java
@@ -24,7 +24,6 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchContext;
 import org.eclipse.wst.common.internal.emfworkbench.EMFWorkbenchEditResourceHandler;
 import org.eclipse.wst.common.internal.emfworkbench.integration.EMFWorkbenchEditPlugin;
@@ -77,6 +76,7 @@
 	 * 
 	 * @see org.eclipse.wst.common.frameworks.internal.RegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
 	 */
+	@Override
 	public boolean readElement(IConfigurationElement element) {
 		/*
 		 * The EditModel Extension Point defines Configuration elements named "editModel" with
@@ -139,9 +139,7 @@
 		while(nextEditModelInfo != null && (parentModelID = nextEditModelInfo.getParentModelID()) != null) {
 			if(visitedEditModels.containsKey(parentModelID)) 
 				throw new IllegalStateException(EMFWorkbenchEditResourceHandler.getString(EMFWorkbenchEditResourceHandler.EditModelRegistry_ERROR_0,new Object [] {editModelID})); 
-			else 
-				visitedEditModels.put(parentModelID, null);
-			
+			visitedEditModels.put(parentModelID, null);
 			extensions.addAll(getAllEditModelExtensions(parentModelID));
 			nextEditModelInfo = getEditModelInfoById(parentModelID);
 		}
@@ -293,10 +291,10 @@
 							this.factory.setLoadKnownResourcesAsReadOnly(value.booleanValue());
 							discardConfigurationElementIfNecessary();
 						} catch (CoreException e) {
-							Logger.getLogger(EMFWorkbenchEditPlugin.ID).logError(e);
+							EMFWorkbenchEditPlugin.logError(e);
 						}
 					} else {
-						Logger.getLogger().logError(EMFWorkbenchEditResourceHandler.EditModelRegistry_ERROR_1);
+						EMFWorkbenchEditPlugin.logError(EMFWorkbenchEditResourceHandler.EditModelRegistry_ERROR_1);
 					}
 			      }
 			    }
@@ -339,6 +337,7 @@
 				this.configurationElement = null;
 		}
 
+		@Override
 		public String toString() {
 			if (tostringCache == null)
 				tostringCache = "EditModelID: {" + this.editModelID + "}, Parent Model ID {" + this.parentModelID + "}, Configuration Element: [" + this.configurationElement + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$//$NON-NLS-4$
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelResource.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelResource.java
index b5543ac..6299bd5 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelResource.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/EditModelResource.java
@@ -68,6 +68,7 @@
 	 * 
 	 * @see org.eclipse.wst.common.frameworks.internal.AbstractRegistryDescriptor#getID()
 	 */
+	@Override
 	public String getID() {
 		return extensionID;
 	}
@@ -77,6 +78,7 @@
 	 * 
 	 * @see org.eclipse.wst.common.frameworks.internal.AbstractRegistryDescriptor#getPriority()
 	 */
+	@Override
 	public int getPriority() {
 		if (isCore)
 			return 0;
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ExtendedComposedAdapterFactory.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ExtendedComposedAdapterFactory.java
index 8f26cf3..8339198 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ExtendedComposedAdapterFactory.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ExtendedComposedAdapterFactory.java
@@ -27,7 +27,7 @@
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EMFWorkbenchEditPlugin;
 
 /**
  * @author schacher
@@ -65,6 +65,7 @@
 	 * @see org.eclipse.emf.common.notify.AdapterFactory#adapt(org.eclipse.emf.common.notify.Notifier,
 	 *      java.lang.Object)
 	 */
+	@Override
 	public Adapter adapt(Notifier target, Object type) {
 		Adapter result = null;
 
@@ -87,7 +88,7 @@
 						try {
 							result = delegateAdapterFactory.adapt(target, type);
 						} catch (RuntimeException re) {
-							Logger.getLogger().logError(re);
+							EMFWorkbenchEditPlugin.logError(re);
 							adapterFactories.remove(delegateAdapterFactory);
 							attemptAdaptAgain = true;
 						}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/InvertedCommand.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/InvertedCommand.java
index 2bbcb11..eb25a7a 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/InvertedCommand.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/InvertedCommand.java
@@ -26,10 +26,12 @@
 		super(targetCommand);
 	}
 
+	@Override
 	public boolean canExecute() {
 		return getTarget().canUndo();
 	}
 
+	@Override
 	public boolean canUndo() {
 		return getTarget().canExecute();
 	}
@@ -44,6 +46,7 @@
 	/**
 	 * getEditModelCommand method comment.
 	 */
+	@Override
 	public EditModelCommand getEditModelCommand() {
 		return ((AbstractEditModelCommand) getTarget()).getEditModelCommand();
 	}
@@ -62,6 +65,7 @@
 		getTarget().undo();
 	}
 
+	@Override
 	public void undo() {
 		getTarget().redo();
 	}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ParentCommand.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ParentCommand.java
index 9c7dc90..1a88cbf 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ParentCommand.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ParentCommand.java
@@ -42,6 +42,7 @@
 		children = new ArrayList(1);
 	}
 
+	@Override
 	public boolean canExecute() {
 		return getTarget().canExecute();
 	}
@@ -92,6 +93,7 @@
 		pushChildrenForExecute();
 	}
 
+	@Override
 	protected void executeInModel(AbstractEditModelCommand cmd) {
 		getEditModel().getCommandStack().execute(cmd);
 	}
@@ -145,6 +147,7 @@
 		invertFrom(child);
 	}
 
+	@Override
 	public void undo() {
 		getTarget().undo();
 		invertChildren();
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ReadOnlyClientAccessRegistry.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ReadOnlyClientAccessRegistry.java
index e845428..e2fc767 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ReadOnlyClientAccessRegistry.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/ReadOnlyClientAccessRegistry.java
@@ -25,6 +25,7 @@
 		super();
 	}
 
+	@Override
 	public synchronized void access(Object accessorKey) {
 		if (!registry.containsKey(accessorKey)) {
 			this.registry.put(accessorKey, null);
@@ -32,6 +33,7 @@
 			throw new ClientAccessRegistryException(EMFWorkbenchEditResourceHandler.ClientAccessRegistry_ERROR_0, accessorKey);
 	}
 
+	@Override
 	public synchronized void release(Object accessorKey) {
 
 		/*
@@ -43,6 +45,7 @@
 			complain(accessorKey);
 	}
 
+	@Override
 	public void complain(Object accessorKey) {
 
 		throw new ClientAccessRegistryException(EMFWorkbenchResourceHandler.getString("ClientAccessRegistry_ERROR_1"), accessorKey); //$NON-NLS-1$
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/Snapshot.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/Snapshot.java
index a2b64b4..6681a3d 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/Snapshot.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/Snapshot.java
@@ -27,6 +27,11 @@
  */
 public class Snapshot extends RuntimeException {
 
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -6041488000642757347L;
+
 	public Snapshot() {
 		super(EMFWorkbenchEditResourceHandler.Snapshot_ERROR_0);
 	}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/WrappingCommandStack.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/WrappingCommandStack.java
index bf15371..7a58d62 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/WrappingCommandStack.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/edit/WrappingCommandStack.java
@@ -32,6 +32,7 @@
 		editModel = anEditModel;
 	}
 
+	@Override
 	public void execute(Command command) {
 		ParentCommand parent = new ParentCommand(command, editModel);
 		super.execute(parent);
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ComposedAccessorKey.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ComposedAccessorKey.java
index 70cac1e..40c98ef 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ComposedAccessorKey.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ComposedAccessorKey.java
@@ -35,6 +35,7 @@
 		this.addonKey = addonKey;
 	}
 
+	@Override
 	public boolean equals(Object other) {
 		if (other == null || !(other instanceof ComposedAccessorKey))
 			return false;
@@ -48,6 +49,7 @@
 	 * 
 	 * @see java.lang.Object#hashCode()
 	 */
+	@Override
 	public int hashCode() {
 		return accessorKey.hashCode() ^ addonKey.hashCode();
 	}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ComposedEditModel.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ComposedEditModel.java
index e46fa9a..f3b4ed4 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ComposedEditModel.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ComposedEditModel.java
@@ -109,6 +109,7 @@
 	/**
 	 * Return the CommandStack.
 	 */
+	@Override
 	protected BasicCommandStack createCommandStack() {
 		return new WrappingCommandStack(this);
 	}
@@ -121,6 +122,7 @@
 			notifyListeners(anEvent);
 	}
 
+	@Override
 	public Set getAffectedFiles() {
 		Set aSet = new HashSet();
 		List models = getChildren();
@@ -146,6 +148,7 @@
 	/**
 	 * Pass along to children.
 	 */
+	@Override
 	protected void handleSaveIfNecessaryDidNotSave(IProgressMonitor monitor) {
 		List list = getChildren();
 		EditModel editModel;
@@ -158,6 +161,7 @@
 	/**
 	 * Return whether a save is needed on the CommandStack
 	 */
+	@Override
 	public boolean isDirty() {
 		Iterator editModels = getChildren().iterator();
 		while (editModels.hasNext()) {
@@ -168,6 +172,7 @@
 		return false;
 	}
 
+	@Override
 	public boolean isReadOnly() {
 		return false;
 	}
@@ -175,6 +180,7 @@
 	/**
 	 * Return whether a save is needed on the CommandStack
 	 */
+	@Override
 	public boolean isInterrestedInResource(Resource aResource) {
 		Iterator editModels = getChildren().iterator();
 		while (editModels.hasNext()) {
@@ -185,6 +191,7 @@
 		return false;
 	}
 
+	@Override
 	public void primSave(IProgressMonitor monitor) {
 		List list = getChildren();
 		for (int i = 0; i < list.size(); i++)
@@ -195,6 +202,7 @@
 	 * This only increments the reference count of the children and should only be called if you
 	 * know what you are doing.
 	 */
+	@Override
 	public void access(Object accessorKey) {
 		ComposedAccessorKey composedAccessorKey = ComposedAccessorKey.getComposedAccessorKey(accessorKey, this);
 		if (getChildren().size() == 0) {
@@ -216,6 +224,7 @@
 	 * This method should be called from each client when they are finished working with the
 	 * EditModel.
 	 */
+	@Override
 	public void releaseAccess(Object accessorKey) {
 		List tempchildren = getChildren();
 		ComposedAccessorKey composedAccessorKey = ComposedAccessorKey.getComposedAccessorKey(accessorKey, this);
@@ -235,6 +244,7 @@
 	/**
 	 * If one should save, they all should save.
 	 */
+	@Override
 	protected boolean shouldSave() {
 		List list = getChildren();
 		EditModel editModel;
@@ -249,6 +259,7 @@
 	/**
 	 * If one should save, they all should save.
 	 */
+	@Override
 	protected boolean shouldSave(IOperationHandler operationHandler) {
 		List list = getChildren();
 		EditModel editModel;
@@ -263,6 +274,7 @@
 	/**
 	 * @see com.ibm.etools.j2ee.workbench.EditModel#getNonResourceFiles()
 	 */
+	@Override
 	public List getNonResourceFiles() {
 		List list = getChildren();
 		List result = new ArrayList();
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/DynamicAdapterFactory.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/DynamicAdapterFactory.java
index 37571ee..565050c 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/DynamicAdapterFactory.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/DynamicAdapterFactory.java
@@ -41,7 +41,6 @@
 import org.eclipse.emf.edit.provider.INotifyChangedListener;
 import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
 import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.wst.common.frameworks.internal.enablement.EnablementIdentifier;
 import org.eclipse.wst.common.frameworks.internal.enablement.EnablementIdentifierEvent;
 import org.eclipse.wst.common.frameworks.internal.enablement.EnablementManager;
@@ -211,7 +210,7 @@
 				else
 					addAdapterFactory(aProject, aPackage, factory);
 			} catch (RuntimeException re) {
-				Logger.getLogger().logError(re);
+				EMFWorkbenchEditPlugin.logError(re);
 			}
 		}
 		return factory;
@@ -409,7 +408,7 @@
 					try {
 						result = delegateAdapterFactory.adapt(target, type);
 					} catch (RuntimeException re) {
-						Logger.getLogger().logError(re);
+						EMFWorkbenchEditPlugin.logError(re);
 						removeFactoryForTypes(p, types);
 						attemptAdaptAgain = true;
 					}
@@ -620,6 +619,7 @@
 					 * 
 					 * @see org.eclipse.emf.common.notify.impl.NotificationImpl#getNotifier()
 					 */
+					@Override
 					public Object getNotifier() {
 						return null; // notifier;
 					}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EMFWorkbenchEditPlugin.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EMFWorkbenchEditPlugin.java
index e409b3b..c5ab373 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EMFWorkbenchEditPlugin.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EMFWorkbenchEditPlugin.java
@@ -13,7 +13,11 @@
 import java.io.FileNotFoundException;
 
 import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Plugin;
+import org.eclipse.core.runtime.Status;
 import org.eclipse.emf.common.util.WrappedException;
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
@@ -21,11 +25,15 @@
 import org.eclipse.wst.common.internal.emfworkbench.PassthruResourceSet;
 import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
 import org.osgi.framework.BundleContext;
+import java.lang.Throwable;
 
 /**
  * The main plugin class to be used in the desktop.
  */
 public class EMFWorkbenchEditPlugin extends Plugin {
+	//the ID for this plugin (added automatically by logging quickfix)
+	public static final String PLUGIN_ID = "org.eclipse.wst.common.emfworkbench.integration"; //$NON-NLS-1$
+
 	public static final String ID = "org.eclipse.wst.common.emfworkbench.integration"; //$NON-NLS-1$
 
 	public static final String EDIT_MODEL_FACTORIES_EXTENSION_POINT = "editModel"; //$NON-NLS-1$
@@ -56,6 +64,7 @@
 	 * 
 	 * @see org.eclipse.core.runtime.Plugin#startup()
 	 */
+	@Override
 	public void start(BundleContext context) throws Exception {
 		super.start(context);
 		ExtendedEcoreUtil.setFileNotFoundDetector(new ExtendedEcoreUtil.FileNotFoundDetector() {
@@ -74,5 +83,33 @@
 		return new PassthruResourceSet();
 	}
 
+	public static IStatus createStatus(int severity, String message, Throwable exception) {
+		return new Status(severity, PLUGIN_ID, message, exception);
+	}
+
+	public static IStatus createStatus(int severity, String message) {
+		return createStatus(severity, message, null);
+	}
+
+	public static void logError(Throwable exception) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( createStatus(IStatus.ERROR, exception.getMessage(), exception));
+	}
+
+	public static void logError(CoreException exception) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( exception.getStatus() );
+	}
+
+	public static void logWarning(String message) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log(createStatus(IStatus.WARNING, message));
+	}
+
+	public static void logWarning(Throwable exception) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( createStatus(IStatus.WARNING, exception.getMessage(), exception));
+	}
+
+	public static void logError(String message) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( createStatus(IStatus.ERROR, message));
+	}
+
 
 }
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModel.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModel.java
index d22d645..1d5a248 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModel.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModel.java
@@ -48,7 +48,6 @@
 import org.eclipse.jem.internal.util.emf.workbench.nls.EMFWorkbenchResourceHandler;
 import org.eclipse.jem.util.emf.workbench.ResourceSetWorkbenchSynchronizer;
 import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.wst.common.frameworks.internal.ISaveHandler;
 import org.eclipse.wst.common.frameworks.internal.SaveFailedException;
 import org.eclipse.wst.common.frameworks.internal.SaveHandlerHeadless;
@@ -73,6 +72,7 @@
 import org.eclipse.wst.common.internal.emfworkbench.validateedit.ResourceStateValidator;
 import org.eclipse.wst.common.internal.emfworkbench.validateedit.ResourceStateValidatorImpl;
 import org.eclipse.wst.common.internal.emfworkbench.validateedit.ResourceStateValidatorPresenter;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EMFWorkbenchEditPlugin;
 
 
 public class EditModel implements CommandStackListener, ResourceStateInputProvider, ResourceStateValidator, IEnablementIdentifierListener {
@@ -110,6 +110,7 @@
 	private List resourcesTargetedForTermination;
 
 	protected class ResourceAdapter extends AdapterImpl {
+		@Override
 		public void notifyChanged(Notification notification) {
 			if (!isDisposing() && notification.getEventType() == Notification.SET && notification.getFeatureID(null) == Resource.RESOURCE__IS_LOADED) {
 				resourceIsLoadedChanged((Resource) notification.getNotifier(), notification.getOldBooleanValue(), notification.getNewBooleanValue());
@@ -174,7 +175,7 @@
 			releaseIdentifiers();
 			doDispose();
 		} catch (RuntimeException re) {
-			Logger.getLogger().logError(re);
+			EMFWorkbenchEditPlugin.logError(re);
 		} finally {
 			emfContext = null;
 			resources = null;
@@ -376,7 +377,7 @@
 		} catch (SaveFailedException ex) {
 			getSaveHandler().handleSaveFailed(ex, monitor);
 		} catch (Exception ex) {
-			ex.printStackTrace();
+			EMFWorkbenchEditPlugin.logError(ex);
 		} finally {
 			getSaveHandler().release();
 		}
@@ -534,7 +535,7 @@
 				enabled = identifier.isEnabled();
 			}
 		} catch (RuntimeException re) {
-			Logger.getLogger().logWarning(re);
+			EMFWorkbenchEditPlugin.logWarning(re);
 		}
 		if (enabled) {
 			URI uri = res.getURI();
@@ -1230,7 +1231,7 @@
 	 * @aResource.
 	 */
 	protected void primHandleSaveFailed(Resource aResource, Exception e) {
-		org.eclipse.jem.util.logger.proxy.Logger.getLogger().logError(e);
+		EMFWorkbenchEditPlugin.logError(e);
 		Exception nested = null;
 		if (e instanceof IWFTWrappedException)
 			nested = ((IWFTWrappedException) e).getNestedException();
@@ -1412,6 +1413,7 @@
 		accessAsReadForUnKnownURIs = b;
 	}
 
+	@Override
 	public String toString() {
 		StringBuffer buffer = new StringBuffer(getClass().getName());
 		buffer.append(": "); //$NON-NLS-1$
@@ -1460,6 +1462,7 @@
 		 * 
 		 * @see java.lang.Object#toString()
 		 */
+		@Override
 		public String toString() {
 			if (tostring == null) {
 				StringBuffer result = new StringBuffer("EditModel.Reference ["); //$NON-NLS-1$
@@ -1478,6 +1481,7 @@
 		 * 
 		 * @see java.lang.Object#hashCode()
 		 */
+		@Override
 		public int hashCode() {
 			return toString().hashCode();
 		}
@@ -1493,7 +1497,7 @@
 		Resource res = getPrimaryResource();
 		if (res == null || res.getContents().isEmpty())
 			return null;
-		return (EObject) res.getContents().get(0);
+		return res.getContents().get(0);
 	}
 
 	/**
@@ -1608,5 +1612,5 @@
 				listener.editModelChanged(event); 
 		}
 		
-	};
+	}
 }
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModelCommand.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModelCommand.java
index 00eed90..7476636 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModelCommand.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/EditModelCommand.java
@@ -28,16 +28,19 @@
 		super(targetCommand);
 	}
 
+	@Override
 	public boolean canUndo() {
 		return getTarget().canUndo();
 	}
 
 	protected abstract void executeInModel(AbstractEditModelCommand cmd);
 
+	@Override
 	public EditModelCommand getEditModelCommand() {
 		return this;
 	}
 
+	@Override
 	public String getLabel() {
 		return getTarget().getLabel();
 	}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModelModifier.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModelModifier.java
index c0ed86a..f0b9b72 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModelModifier.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModelModifier.java
@@ -258,6 +258,7 @@
 	}
 
 	protected Command createCommand(Command chainedCommand, List helpersArg) {
+		Command innerChainedCommand = chainedCommand;
 		if (null == extendedHelpers) {
 			extendedHelpers = new ArrayList();
 		}
@@ -267,33 +268,34 @@
 			Command nextCommand = null;
 			while (it.hasNext()) {
 				nextCommand = createCommand((ModifierHelper) it.next());
-				if (chainedCommand == null)
-					chainedCommand = nextCommand;
+				if (innerChainedCommand == null)
+					innerChainedCommand = nextCommand;
 				else if (nextCommand != null)
-					chainedCommand = chainedCommand.chain(nextCommand);
+					innerChainedCommand = innerChainedCommand.chain(nextCommand);
 			}
 		}
 		if (!extendedHelpers.isEmpty()) {
 			List copy = new ArrayList();
 			copy.addAll(extendedHelpers);
 			extendedHelpers.clear();
-			chainedCommand = createCommand(chainedCommand, copy);
+			innerChainedCommand = createCommand(innerChainedCommand, copy);
 		}
-		return chainedCommand;
+		return innerChainedCommand;
 	}
 
 	protected Command appendAdditionalCommands(Command chainedCommand) {
+		Command innerChainedCommand = chainedCommand;
 		if (additionalCommands != null && !additionalCommands.isEmpty()) {
 			Command command;
 			for (int i = 0; i < additionalCommands.size(); i++) {
 				command = (Command) additionalCommands.get(i);
-				if (chainedCommand == null)
-					chainedCommand = command;
+				if (innerChainedCommand == null)
+					innerChainedCommand = command;
 				else
-					chainedCommand = chainedCommand.chain(command);
+					innerChainedCommand = innerChainedCommand.chain(command);
 			}
 		}
-		return chainedCommand;
+		return innerChainedCommand;
 	}
 
 	/**
@@ -321,7 +323,7 @@
 
 	protected String createCommandLabel(String aPattern, EStructuralFeature feature) {
 		String replacement = feature == null ? DEFAULT_COMMAND_LABEL : feature.getName();
-		return java.text.MessageFormat.format(aPattern, new String[]{replacement});
+		return java.text.MessageFormat.format(aPattern, new Object[]{replacement});
 	}
 
 	/**
@@ -354,6 +356,7 @@
 			this.resource = eObject.eResource();
 		}
 
+		@Override
 		public boolean canExecute() {
 			return baseCommand.canExecute();
 		}
@@ -363,10 +366,12 @@
 			baseCommand.execute();
 		}
 
+		@Override
 		public boolean canUndo() {
 			return baseCommand.canUndo();
 		}
 
+		@Override
 		public void undo() {
 			baseCommand.undo();
 			ExtendedEcoreUtil.removeProxy(eObject, resource);
@@ -377,22 +382,27 @@
 			baseCommand.redo();
 		}
 
+		@Override
 		public Collection getResult() {
 			return baseCommand.getResult();
 		}
 
+		@Override
 		public Collection getAffectedObjects() {
 			return baseCommand.getAffectedObjects();
 		}
 
+		@Override
 		public String getLabel() {
 			return baseCommand.getLabel();
 		}
 
+		@Override
 		public String getDescription() {
 			return baseCommand.getDescription();
 		}
 
+		@Override
 		public void dispose() {
 			super.dispose();
 			baseCommand.dispose();
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModifierHelper.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModifierHelper.java
index ad949b3..5eabc81 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModifierHelper.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModifierHelper.java
@@ -19,7 +19,6 @@
 import org.eclipse.emf.ecore.EStructuralFeature;
 import org.eclipse.emf.ecore.impl.EClassImpl;
 import org.eclipse.emf.edit.command.SetCommand;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.wst.common.internal.emf.utilities.FeatureValueConversionException;
 import org.eclipse.wst.common.internal.emf.utilities.FeatureValueConverter;
 
@@ -320,7 +319,7 @@
 		try {
 			primSetValue(convertValue(newValue));
 		} catch (FeatureValueConversionException featureException) {
-			Logger.getLogger().logError(featureException);
+			EMFWorkbenchEditPlugin.logError(featureException);
 			primSetValue(null);
 		}
 	}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModifierHelperRegistry.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModifierHelperRegistry.java
index b1da8ad..cad78b7 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModifierHelperRegistry.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ModifierHelperRegistry.java
@@ -31,7 +31,6 @@
 import org.eclipse.emf.ecore.EClassifier;
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.jem.util.logger.proxy.Logger;
 
 /**
  * @author jsholl
@@ -73,7 +72,7 @@
 						factory = (ModifierHelperFactory) element.createExecutableExtension(FACTORY_CLASS);
 						factoryHash.put(hashKey, factory);
 					} catch (CoreException e) {
-						Logger.getLogger().logError(e);
+						EMFWorkbenchEditPlugin.logError(e);
 					}
 				}
 				return factory;
@@ -81,6 +80,7 @@
 			return null;
 		}
 
+		@Override
 		public boolean equals(Object obj) {
 			if (super.equals(obj)) {
 				return true;
@@ -88,6 +88,11 @@
 			FactoryHolder holder = (FactoryHolder) obj;
 			return getFactoryHash(element).equals(getFactoryHash(holder.element));
 		}
+		
+		@Override
+		public int hashCode() {
+			return super.hashCode() + getFactoryHash(element).hashCode();
+		}
 	}
 
 	private ModifierHelperRegistry() {
@@ -218,7 +223,7 @@
 		StringBuffer buf = new StringBuffer();
 		buf.append("Plugin " + extension.getNamespace() + ", extension " + extension.getExtensionPointUniqueIdentifier()); //$NON-NLS-1$ //$NON-NLS-2$
 		buf.append("\n" + text); //$NON-NLS-1$
-		Logger.getLogger().logError(buf.toString());
+		EMFWorkbenchEditPlugin.logError(buf.toString());
 	}
 
 	public static ModifierHelperRegistry getInstance() {
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ProjectResourceSetEditImpl.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ProjectResourceSetEditImpl.java
index 07a326e..31c7832 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ProjectResourceSetEditImpl.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ProjectResourceSetEditImpl.java
@@ -44,6 +44,7 @@
 	 * 
 	 * @see org.eclipse.jem.internal.util.emf.workbench.ProjectResourceSetImpl#createResource(org.eclipse.emf.common.util.URI)
 	 */
+	@Override
 	public Resource createResource(URI uri, String contentType) {
 		Resource result = super.createResource(uri, contentType);
 		if (result != null && WorkbenchResourceHelper.isReferencedResource(result))
@@ -51,6 +52,7 @@
 		return result;
 	}
 
+	@Override
 	public Resource createResource(URI uri) {
 		return createResource(uri, ContentHandler.UNSPECIFIED_CONTENT_TYPE);
 	}
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ResourceSetWorkbenchEditSynchronizer.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ResourceSetWorkbenchEditSynchronizer.java
index d728798..32cf6a8 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ResourceSetWorkbenchEditSynchronizer.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/integration/ResourceSetWorkbenchEditSynchronizer.java
@@ -16,6 +16,7 @@
  */
 package org.eclipse.wst.common.internal.emfworkbench.integration;
 
+import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -46,10 +47,10 @@
 import org.eclipse.jem.internal.util.emf.workbench.EMFWorkbenchContextFactory;
 import org.eclipse.jem.util.emf.workbench.ProjectResourceSet;
 import org.eclipse.jem.util.emf.workbench.ResourceSetWorkbenchSynchronizer;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.jem.util.plugin.JEMUtilPlugin;
 import org.eclipse.wst.common.internal.emf.resource.ReferencedResource;
 import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
+import org.eclipse.wst.common.internal.emfworkbench.integration.EMFWorkbenchEditPlugin;
 
 /**
  * @author schacher
@@ -64,33 +65,26 @@
 	private Set recentlySavedFiles = new HashSet();
 	private Map ignoredFilesCache = new HashMap();
 	private class SavedFileKey {
-		private Resource res;
+		private WeakReference res;
 		private IFile savedFile;
 		public SavedFileKey(Resource res, IFile savedFile) {
 			super();
-			this.res = res;
+			this.res = new WeakReference(res);
 			this.savedFile = savedFile;
 		}
 		public Resource getRes() {
-			return res;
+			return this.res == null ? null : (Resource)res.get();
 		}
-		public void setRes(Resource res) {
-			this.res = res;
-		}
-		public IFile getSavedFile() {
-			return savedFile;
-		}
-		public void setSavedFile(IFile savedFile) {
-			this.savedFile = savedFile;
-		}
+		@Override
 		public int hashCode() {
 			final int prime = 31;
 			int result = 1;
 			result = prime * result + getOuterType().hashCode();
-			result = prime * result + ((res == null) ? 0 : res.hashCode());
+			result = prime * result + ((getRes() == null) ? 0 : getRes().hashCode());
 			result = prime * result + ((savedFile == null) ? 0 : savedFile.hashCode());
 			return result;
 		}
+		@Override
 		public boolean equals(Object obj) {
 			if (this == obj)
 				return true;
@@ -101,10 +95,10 @@
 			SavedFileKey other = (SavedFileKey) obj;
 			if (!getOuterType().equals(other.getOuterType()))
 				return false;
-			if (res == null) {
-				if (other.res != null)
+			if (getRes() == null) {
+				if (other.getRes() != null)
 					return false;
-			} else if (!res.equals(other.res))
+			} else if (!getRes().equals(other.getRes()))
 				return false;
 			if (savedFile == null) {
 				if (other.savedFile != null)
@@ -134,12 +128,13 @@
 	public ResourceSetWorkbenchEditSynchronizer(ResourceSet aResourceSet, IProject aProject) {
 		super(aResourceSet, aProject);
 	}
-
+		
 	/*
 	 * (non-Javadoc)
 	 * 
 	 * @see org.eclipse.wst.common.internal.emfworkbench.ResourceSetWorkbenchSynchronizer#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent)
 	 */
+	@Override
 	public void resourceChanged(IResourceChangeEvent event) {
 		super.resourceChanged(event);
 		try {
@@ -147,7 +142,7 @@
 			notifyExtendersIfNecessary();
 			processDeferredResources();
 		} catch (Exception e) {
-			e.printStackTrace();
+			EMFWorkbenchEditPlugin.logError(e);
 		} finally {
 			deferredRemoveResources.clear();
 			deferredUnloadResources.clear();
@@ -179,7 +174,7 @@
 			try {
 				resourceSet.getResource(uri, true);
 			} catch (WrappedException ex) {
-				Logger.getLogger().logError(ex);
+				EMFWorkbenchEditPlugin.logError(ex);
 			}
 
 		}
@@ -207,7 +202,7 @@
 		try {
 			hasLocked = aquireLock();
 		} catch (InterruptedException e) {
-			Logger.getLogger().write(e);
+			EMFWorkbenchEditPlugin.logError(e);
 		}		
 		
 		try{
@@ -225,8 +220,7 @@
 				try {
 					ResourcesPlugin.getWorkspace().run(runnable, project, IWorkspace.AVOID_UPDATE, null);
 				} catch (CoreException e) {
-					// TODO Auto-generated catch block
-					e.printStackTrace();
+					EMFWorkbenchEditPlugin.logError(e);
 				}
 			}
 		}finally{
@@ -241,7 +235,7 @@
 				currentProjectDelta = null;
 				delta.accept(ResourceSetWorkbenchEditSynchronizer.this);
 			} catch (Exception e) {
-				Logger.getLogger().logError(e);
+				EMFWorkbenchEditPlugin.logError(e);
 			}
 		}
 	}
@@ -250,6 +244,7 @@
 	 * The project is going away so we need to cleanup ourself and the ResourceSet. TODO Need to
 	 * push up this code to ResourceSetWorkbenchSynchronizer in next release.
 	 */
+	@Override
 	protected void release() {
 		if (JEMUtilPlugin.isActivated()) {
 			try {
@@ -319,22 +314,26 @@
 	 * @post Return true if a <code>Resource</code> was queued up to be reloaded.
 	 */
 	protected boolean addedResource(IFile aFile) {
-        boolean didProcess = false;
-        List resources = getResources(aFile);
-        for (Iterator iterator = resources.iterator(); iterator.hasNext();) {
+		boolean didProcess = false;
+		List resources = getResources(aFile);
+		for (Iterator iterator = resources.iterator(); iterator.hasNext();) {
 			Resource resource = (Resource) iterator.next();
 
-			if ((resource != null) || (recentlySavedFilesContains(resource))) {
-				/*
-				 * The IFile was just added to the workspace but we have a
-				 * resource in memory. Need to decide if it should be unloaded.
-				 */
-				if (resource.isModified()) {
-					if (WorkbenchResourceHelper.isReferencedResource(resource)) {
-						ReferencedResource refRes = (ReferencedResource) resource;
-						if (refRes.shouldForceRefresh()) {
-							deferredUnloadResources.add(resource);
-							didProcess = true;
+			if (resource != null) {
+				if (recentlySavedFilesContains(resource)) {
+
+					/*
+					 * The IFile was just added to the workspace but we have a
+					 * changed resource in memory. Need to decide if it should
+					 * be unloaded.
+					 */
+					if (resource.isModified()) {
+						if (WorkbenchResourceHelper.isReferencedResource(resource)) {
+							ReferencedResource refRes = (ReferencedResource) resource;
+							if (refRes.shouldForceRefresh()) {
+								deferredUnloadResources.add(resource);
+								didProcess = true;
+							}
 						}
 					}
 				} else {
@@ -349,24 +348,24 @@
 							deferredUnloadResources.add(resource);
 							didProcess = true;
 						}
+					} else {
+						/* Process autoload resources on added file */
+						URI uri = URI.createPlatformResourceURI(aFile.getFullPath().toString());
+						if ((autoloadResourcesURIs.contains(uri)) || (autoloadResourcesExts.contains(aFile.getFileExtension()))) {
+							deferredLoadResources.add(uri);
+							didProcess = true;
+						}
 					}
 				}
-			} else {
-				// Process resource as a refresh.
-				URI uri = URI.createPlatformResourceURI(aFile.getFullPath().toString());
-				if ((autoloadResourcesURIs.contains(uri)) || (autoloadResourcesExts.contains(aFile.getFileExtension()))) {
-					deferredLoadResources.add(uri);
-					didProcess = true;
-				}
 			}
 		}
-        return didProcess;
-}
+		return didProcess;
+	}
 
 	private synchronized boolean recentlySavedFilesContains(Resource resource) {
 		for (Iterator iterator = recentlySavedFiles.iterator(); iterator.hasNext();) {
 			SavedFileKey key = (SavedFileKey) iterator.next();
-			if (key.res.equals(resource)) 
+			if (key.getRes() != null && (key.getRes().getURI().equals(resource.getURI()) && key.getRes().getClass().equals(resource.getClass())))
 				return true;
 			}
 		return false;
@@ -376,16 +375,17 @@
 		List resources = getResources(aFile);
         for (Iterator iterator = resources.iterator(); iterator.hasNext();) {
 			Resource resource = (Resource) iterator.next();
-			if ((resource != null) || (recentlySavedFilesContains(resource))) {
-				if (resource.isModified()) {
-					if (WorkbenchResourceHelper.isReferencedResource(resource)) {
-						ReferencedResource refRes = (ReferencedResource) resource;
-						if (!refRes.shouldForceRefresh())
-							continue; // Do not do anything
-					} else
-						continue;
+			if ((resource != null)) {
+				if (recentlySavedFilesContains(resource)) {
+					if (resource.isModified()) {
+						if (WorkbenchResourceHelper.isReferencedResource(resource)) {
+							ReferencedResource refRes = (ReferencedResource) resource;
+							if (!refRes.shouldForceRefresh())
+								continue; // Do not do anything
+						} else
+							continue;
+					}
 				}
-
 				if (isRemove)
 					deferredRemoveResources.add(resource);
 				else if (resource.isLoaded()) {
@@ -427,19 +427,22 @@
 	}
 	
 	protected List getResources(IFile aFile) {
-		
+
 		List resources = new ArrayList();
 		List allResources = resourceSet.getResources();
 		for (Iterator iterator = allResources.iterator(); iterator.hasNext();) {
 			Resource res = (Resource) iterator.next();
 			URI resURI = res.getURI();
-			IPath resURIPath;
-			if (WorkbenchResourceHelper.isPlatformResourceURI(resURI)) 
-				resURIPath = new Path(URI.decode(resURI.path())).removeFirstSegments(2);
-			else 
-				resURIPath = new Path(URI.decode(resURI.path())).removeFirstSegments(1);
-			String resURIString = resURIPath.toString();
-			if (!resURIString.equals("") && aFile.getFullPath().toString().indexOf(resURIString) != -1)
+			String resURIString = ""; //$NON-NLS-1$
+			if (resURI.path() != null) {
+				IPath resURIPath;
+				if (WorkbenchResourceHelper.isPlatformResourceURI(resURI))
+					resURIPath = new Path(URI.decode(resURI.path())).removeFirstSegments(2);
+				else
+					resURIPath = new Path(URI.decode(resURI.path())).removeFirstSegments(1);
+				resURIString = resURIPath.toString();
+			}
+			if (!resURIString.equals("") && aFile.getFullPath().toString().indexOf(resURIString) != -1) //$NON-NLS-1$
 				resources.add(res);
 		}
 		return resources;
@@ -449,6 +452,7 @@
 	/**
 	 * This method should be called prior to writing to an IFile from a MOF resource.
 	 */
+	@Override
 	public void preSave(IFile aFile) {
 		if (aFile != null) {
 			recentlySavedFilesAdd(aFile,null);
@@ -487,10 +491,9 @@
 			SavedFileKey key = (SavedFileKey) iterator.next();
 			if (key.savedFile != null && key.savedFile.equals(file)) {
 				List resources = getResources(file);
-				if (key.res == null || resources.contains(key.res) ) {
+				if (key.getRes() == null || resources.contains(key.getRes()) ) {
 					iterator.remove();
 					removedFromList = true;
-					break;
 				}
 			}
 		}
@@ -580,6 +583,7 @@
 	 * 
 	 * @see org.eclipse.wst.common.internal.emfworkbench.ResourceSetWorkbenchSynchronizer#initialize()
 	 */
+	@Override
 	protected void initialize() {
 		getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.PRE_CLOSE | IResourceChangeEvent.PRE_DELETE | IResourceChangeEvent.POST_CHANGE);
 	}
@@ -591,6 +595,7 @@
 		autoloadResourcesExts.remove(extension);
 	}
 
+	@Override
 	public void dispose() {
 		super.dispose();
 		currentProjectDelta = null;
diff --git a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/ValidateEditHeadlessContext.java b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/ValidateEditHeadlessContext.java
index 11efe03..5ec8ed9 100644
--- a/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/ValidateEditHeadlessContext.java
+++ b/plugins/org.eclipse.wst.common.emfworkbench.integration/src/org/eclipse/wst/common/internal/emfworkbench/validateedit/ValidateEditHeadlessContext.java
@@ -45,7 +45,6 @@
 	 * @see org.eclipse.wst.common.internal.emfworkbench.validateedit.ResourceStateValidatorPresenter#getValidateEditContext()
 	 */
 	public Object getValidateEditContext() {
-		// TODO Auto-generated method stub
 		return null;
 	}
 
@@ -55,7 +54,6 @@
 	 * @see org.eclipse.wst.common.internal.emfworkbench.validateedit.ResourceStateValidatorPresenter#promptForInconsistentFileOverwrite(java.util.List)
 	 */
 	public boolean promptForInconsistentFileOverwrite(List inconsistentFiles) {
-		// TODO Auto-generated method stub
 		return false;
 	}
 
@@ -65,7 +63,6 @@
 	 * @see org.eclipse.wst.common.internal.emfworkbench.validateedit.ResourceStateValidatorPresenter#promptForInconsistentFileRefresh(java.util.List)
 	 */
 	public boolean promptForInconsistentFileRefresh(List inconsistentFiles) {
-		// TODO Auto-generated method stub
 		return false;
 	}
 
diff --git a/plugins/org.eclipse.wst.common.environment/.classpath b/plugins/org.eclipse.wst.common.environment/.classpath
index ce73933..304e861 100644
--- a/plugins/org.eclipse.wst.common.environment/.classpath
+++ b/plugins/org.eclipse.wst.common.environment/.classpath
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <classpath>
 	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/plugins/org.eclipse.wst.common.environment/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.wst.common.environment/.settings/org.eclipse.jdt.core.prefs
index f5f5f93..037a4e5 100644
--- a/plugins/org.eclipse.wst.common.environment/.settings/org.eclipse.jdt.core.prefs
+++ b/plugins/org.eclipse.wst.common.environment/.settings/org.eclipse.jdt.core.prefs
@@ -1,57 +1,95 @@
-#Wed Jul 09 16:32:16 EDT 2008
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=ignore
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.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.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+#Mon Jun 08 15:35:45 EDT 2009
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
+org.eclipse.jdt.core.compiler.problem.unusedLocal=error
+org.eclipse.jdt.core.compiler.problem.emptyStatement=error
+org.eclipse.jdt.core.compiler.problem.unusedLabel=error
+org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=enabled
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
 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.problem.missingSynchronizedOnInheritedMethod=error
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=error
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=error
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
 org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.compiler.problem.fieldHiding=error
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=error
+eclipse.preferences.version=1
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
+org.eclipse.jdt.core.compiler.problem.deadCode=error
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeUncheckedExceptions=disabled
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=warning
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=error
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
diff --git a/plugins/org.eclipse.wst.common.environment/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.common.environment/META-INF/MANIFEST.MF
index d527f18..a5697c6 100644
--- a/plugins/org.eclipse.wst.common.environment/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.wst.common.environment/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.wst.common.environment
-Bundle-Version: 1.0.202.qualifier
+Bundle-Version: 1.0.400.qualifier
 Bundle-Activator: org.eclipse.wst.common.internal.environment.plugin.EnvironmentPlugin
 Bundle-Localization: plugin
 Export-Package: org.eclipse.wst.common.environment,
diff --git a/plugins/org.eclipse.wst.common.environment/plugin.properties b/plugins/org.eclipse.wst.common.environment/plugin.properties
index c41575f..1e01ac9 100644
--- a/plugins/org.eclipse.wst.common.environment/plugin.properties
+++ b/plugins/org.eclipse.wst.common.environment/plugin.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2006 IBM Corporation and others.
+# Copyright (c) 2006, 2009 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
@@ -9,5 +9,5 @@
 #     IBM Corporation - initial API and implementation
 ###############################################################################
 
-pluginName=Enviornment Plug-in
+pluginName=Environment Plug-in
 providerName=Eclipse.org
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/EnvironmentService.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/EnvironmentService.java
index 5663fec..53cae74 100644
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/EnvironmentService.java
+++ b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/EnvironmentService.java
@@ -58,7 +58,7 @@
     
     try
     {
-      scheme = environment.getURIFactory().newURIScheme( "platform" );
+      scheme = environment.getURIFactory().newURIScheme( "platform" ); //$NON-NLS-1$
     }
     catch( URIException exc )
     {    
@@ -78,7 +78,7 @@
     
     try
     {
-      scheme = environment.getURIFactory().newURIScheme( "file" );
+      scheme = environment.getURIFactory().newURIScheme( "file" ); //$NON-NLS-1$
     }
     catch( URIException exc )
     {    
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/SimpleURIFactory.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/SimpleURIFactory.java
index bccb2e0..3f33c65 100644
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/SimpleURIFactory.java
+++ b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/environment/uri/SimpleURIFactory.java
@@ -86,8 +86,8 @@
     if( schemeOrURI == null )
     {
       throw new URIException( 
-              new Status( IStatus.ERROR, "id", 0, 
-                 NLS.bind( Messages.MSG_NULL_ARG_SPECIFIED, "newURIScheme"), null ) );
+              new Status( IStatus.ERROR, "id", 0, //$NON-NLS-1$ 
+                 NLS.bind( Messages.MSG_NULL_ARG_SPECIFIED, "newURIScheme"), null ) ); //$NON-NLS-1$
     }
     
     int colon    = schemeOrURI.indexOf(':');
@@ -108,15 +108,15 @@
       if( newScheme == null )
       {
         throw new URIException( 
-            new Status( IStatus.ERROR, "id", 0, 
+            new Status( IStatus.ERROR, "id", 0, //$NON-NLS-1$ 
                 NLS.bind( Messages.MSG_SCHEME_NOT_FOUND, schemeOrURI ), null ) );
                 
       }
     }
-    else if( schemeOrURI.startsWith( "/") )
+    else if( schemeOrURI.startsWith( "/") ) //$NON-NLS-1$
     {
       throw new URIException( 
-          new Status( IStatus.ERROR, "id", 0,
+          new Status( IStatus.ERROR, "id", 0, //$NON-NLS-1$
               NLS.bind( Messages.MSG_ABSOLUTE_PATH_WITHOUT_SCHEME, schemeOrURI ), null ) );
       
     }
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/ConsoleEclipseEnvironment.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/ConsoleEclipseEnvironment.java
index 0c9c95e..b02f303 100644
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/ConsoleEclipseEnvironment.java
+++ b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/ConsoleEclipseEnvironment.java
@@ -37,8 +37,8 @@
 	  uriFactory_      = new SimpleURIFactory();
 	  statusHandler_   = statusHandler;
 	    
-	  uriFactory_.registerScheme( "platform", new EclipseScheme( this ) );
-	  uriFactory_.registerScheme( "file", new FileScheme() );
+	  uriFactory_.registerScheme( "platform", new EclipseScheme( this ) ); //$NON-NLS-1$
+	  uriFactory_.registerScheme( "file", new FileScheme() ); //$NON-NLS-1$
 	}
 			
 	/* (non-Javadoc)
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/EclipseLog.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/EclipseLog.java
index e1d75e6..e586f53 100644
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/EclipseLog.java
+++ b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/EclipseLog.java
@@ -43,7 +43,7 @@
 	 * @see org.eclipse.wst.common.Environment.ILog#isEnabled(java.lang.String)
 	 */
 	public boolean isEnabled(String option) {
-		return "true".equals(Platform.getDebugOption("org.eclipse.wst.common.environment/trace/"
+		return "true".equals(Platform.getDebugOption("org.eclipse.wst.common.environment/trace/" //$NON-NLS-1$ //$NON-NLS-2$
 				+ option));
 	}
 	
@@ -58,10 +58,10 @@
 			switch (severity) {
 				case ILog.ERROR :
 				{
-					if (isEnabled("error"))
+					if (isEnabled("error")) //$NON-NLS-1$
 					{
-						String message = getMessageNumString(messageNum) + "E "
-							+ caller + "::" + method + ": object="
+						String message = getMessageNumString(messageNum) + "E " //$NON-NLS-1$
+							+ caller + "::" + method + ": object=" //$NON-NLS-1$ //$NON-NLS-2$
 							+ object;
 						log( severity, message, null );
 					}
@@ -70,11 +70,11 @@
 				
 				case ILog.WARNING :
 				{
-					if (isEnabled("warning"))
+					if (isEnabled("warning")) //$NON-NLS-1$
 					{
 						String message = getMessageNumString(messageNum)
-								+ "W " + caller + "::" + method
-								+ ": object=" + object;
+								+ "W " + caller + "::" + method //$NON-NLS-1$ //$NON-NLS-2$
+								+ ": object=" + object; //$NON-NLS-1$
 						log( severity, message, null );
 					}
 					break;
@@ -82,10 +82,10 @@
 				
 				case ILog.INFO :
 				{
-					if (isEnabled("info"))
+					if (isEnabled("info")) //$NON-NLS-1$
 					{
-						String message = getMessageNumString(messageNum) + "I "
-								+ caller + "::" + method + ": object="
+						String message = getMessageNumString(messageNum) + "I " //$NON-NLS-1$
+								+ caller + "::" + method + ": object=" //$NON-NLS-1$ //$NON-NLS-2$
 								+ object;
 						log( severity, message, null );
 					}
@@ -120,8 +120,8 @@
 	{
 		if (isEnabled(option))
 		{
-			String message = getMessageNumString(messageNum) + "I " + caller
-					+ "::" + method + ": object=" + object;
+			String message = getMessageNumString(messageNum) + "I " + caller //$NON-NLS-1$
+					+ "::" + method + ": object=" + object; //$NON-NLS-1$ //$NON-NLS-2$
 			log(severity, message, null );
 		}	
 	}
@@ -134,8 +134,8 @@
 	{
 		if (isEnabled(option)) 
 		{
-			String message = getMessageNumString(messageNum) + "I " + caller
-					+ "::" + method;
+			String message = getMessageNumString(messageNum) + "I " + caller //$NON-NLS-1$
+					+ "::" + method; //$NON-NLS-1$
 			log( severity, message, throwable );
 		}
 	}
@@ -149,17 +149,18 @@
 		logger.log( status );
 	}
 	
-	private String getMessageNumString(int messageNum) {
-		String messageNumString = "IWAB";
-		if (messageNum > 9999 || messageNum < 0)
-			messageNum = 9999; //default message number
-		messageNumString += (new Integer(messageNum)).toString();
+	private String getMessageNumString(final int messageNum) {
+		String messageNumString = "IWAB"; //$NON-NLS-1$
+		int innerMessageNum = messageNum;
+		if (innerMessageNum > 9999 || innerMessageNum < 0)
+			innerMessageNum = 9999; //default message number
+		messageNumString += (new Integer(innerMessageNum)).toString();
 		return messageNumString;
 	}
 	
 	private void log( int severity, String message, Throwable exc )
 	{
-		Status status = new Status( severity, "id", 0, message, exc );
+		Status status = new Status( severity, "id", 0, message, exc ); //$NON-NLS-1$
 		logger.log( status );
 	}
 }
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/EclipseScheme.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/EclipseScheme.java
index 0042c4d..41b65c2 100644
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/EclipseScheme.java
+++ b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/EclipseScheme.java
@@ -32,9 +32,10 @@
     environment_ = environment;
   }
   
-  public String toString()
+  @Override
+public String toString()
   {
-    return "platform";  
+    return "platform"; //$NON-NLS-1$
   }
   
   /**
@@ -56,7 +57,7 @@
     {
       IURIScheme scheme = uri.getURIScheme();
       
-      if( scheme.toString().equals( "relative") ) return scheme.isValid( uri );
+      if( scheme.toString().equals( "relative") ) return scheme.isValid( uri ); //$NON-NLS-1$
         
       getPathFromPlatformURI( uri.toString() );
     }
@@ -74,33 +75,30 @@
   {
     String newURI = null;
     
-    if( uri != null && uri.startsWith( "platform:") )
+    if( uri != null && uri.startsWith( "platform:") ) //$NON-NLS-1$
     {
       // The platform has been specified so keep it as is.
       newURI = uri;
     }
-    else if( uri == null || uri.indexOf( ":") != -1 )
+    else if( uri == null || uri.indexOf( ":") != -1 ) //$NON-NLS-1$
     {
       // The platform uri is not allowed to contain some other protocol. 
       throw new URIException(
-          new Status( IStatus.ERROR, "id", 0,
+          new Status( IStatus.ERROR, "id", 0, //$NON-NLS-1$
               NLS.bind( Messages.MSG_INVALID_PLATFORM_URL,uri), null ) );
               
     }
-    else if( uri.startsWith( "/") )
+    else if( uri.startsWith( "/") ) //$NON-NLS-1$
     {
       // The platform scheme has not been specified so we will add it.
-      newURI = "platform:/resource" + uri;
+      newURI = "platform:/resource" + uri; //$NON-NLS-1$
     }
     
     if( newURI == null )
     {
       return new RelativeURI( uri );
     }
-    else
-    {
-      return new EclipseURI( newURI, environment_ );
-    }
+    return new EclipseURI( newURI, environment_ );
   }
 
   /**
@@ -127,7 +125,7 @@
     {
       IURIScheme scheme = uri.getURIScheme();
       
-      if( scheme.toString().equals( "relative") ) return scheme.validate( uri );
+      if( scheme.toString().equals( "relative") ) return scheme.validate( uri ); //$NON-NLS-1$
       
       getPathFromPlatformURI( uri.toString() );
       status = Status.OK_STATUS;
@@ -156,21 +154,15 @@
     catch( MalformedURLException exc )
     { 
       throw new URIException(
-          new Status( IStatus.ERROR, "id", 0,
+          new Status( IStatus.ERROR, "id", 0, //$NON-NLS-1$
               NLS.bind( Messages.MSG_INVALID_PLATFORM_URL, uri ), exc ) );
     }
     
-    if( url == null )
-    {
-      throw new URIException(
-          new Status( IStatus.ERROR, "id", 0,
-              NLS.bind( Messages.MSG_INVALID_PLATFORM_URL, uri ), null ) );
-    }
-    if( url.getProtocol().equals("platform") ) 
+    if( url.getProtocol().equals("platform") )  //$NON-NLS-1$
     {
       String resourceURL = url.getFile();
       
-      if (resourceURL.startsWith("/resource")) 
+      if (resourceURL.startsWith("/resource"))  //$NON-NLS-1$
       {
         resourceFile = resourceURL.substring(10);   // omit the "/resource" portion
       }
@@ -178,7 +170,7 @@
     else 
     {
       throw new URIException(
-          new Status( IStatus.ERROR, "id", 0,
+          new Status( IStatus.ERROR, "id", 0, //$NON-NLS-1$
                       NLS.bind( Messages.MSG_INVALID_PLATFORM_URL,url.getFile() ), null ) );
     }
     
@@ -192,6 +184,6 @@
    */
   public String getURLFromPath( IPath absolutePath )
   {
-    return "platform:/resource" + absolutePath;
+    return "platform:/resource" + absolutePath; //$NON-NLS-1$
   }
 }
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/EclipseURI.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/EclipseURI.java
index d062a53..320f9b1 100644
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/EclipseURI.java
+++ b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/EclipseURI.java
@@ -50,7 +50,8 @@
     file_         = getFile();
   }
   
-  public String toString()
+  @Override
+public String toString()
   {
     return uri_;
   }
@@ -58,7 +59,8 @@
   /**
    * @see org.eclipse.env.uri.IURI#erase()
    */
-  public void erase() throws URIException
+  @Override
+public void erase() throws URIException
   {
     try 
     {
@@ -81,14 +83,15 @@
     }
     catch( Exception exc ) 
     {      
-      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this );
+      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this ); //$NON-NLS-1$
     }
   }
 
   /**
    * @see org.eclipse.env.uri.IURI#getInputStream()
    */
-  public InputStream getInputStream() throws URIException
+  @Override
+public InputStream getInputStream() throws URIException
   {
     try 
     {
@@ -104,7 +107,7 @@
     }
     catch( Throwable exc ) 
     {
-      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this );
+      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this ); //$NON-NLS-1$
     }
     
     return null;
@@ -113,7 +116,8 @@
   /**
    * @see org.eclipse.env.uri.IURI#getOutputStream()
    */
-  public OutputStream getOutputStream() throws URIException
+  @Override
+public OutputStream getOutputStream() throws URIException
   {
     // Ensure that the parent folder exists.
     IURI parent = parent();
@@ -129,7 +133,8 @@
   /**
    * @see org.eclipse.env.uri.IURI#getURIScheme()
    */
-  public IURIScheme getURIScheme()
+  @Override
+public IURIScheme getURIScheme()
   {
     return scheme_;
   }
@@ -137,7 +142,8 @@
   /**
    * @see org.eclipse.env.uri.IURI#isLeaf()
    */
-  public boolean isLeaf()
+  @Override
+public boolean isLeaf()
   {
     boolean result = false;
   
@@ -164,7 +170,8 @@
   /**
    * @see org.eclipse.env.uri.IURI#isPresent()
    */
-  public boolean isPresent()
+  @Override
+public boolean isPresent()
   {
     boolean result = false;
     
@@ -189,7 +196,8 @@
   /**
    * @see org.eclipse.env.uri.IURI#isReadable()
    */
-  public boolean isReadable()
+  @Override
+public boolean isReadable()
   {
     boolean result = false;
     
@@ -214,7 +222,8 @@
   /**
    * @see org.eclipse.env.uri.IURI#isRelative()
    */
-  public boolean isRelative()
+  @Override
+public boolean isRelative()
   { 
     return false;
   }
@@ -222,7 +231,8 @@
   /**
    * @see org.eclipse.env.uri.IURI#isWritable()
    */
-  public boolean isWritable()
+  @Override
+public boolean isWritable()
   {
     boolean result = false;
     
@@ -249,7 +259,8 @@
   /**
    * @see org.eclipse.env.uri.IURI#list()
    */
-  public IURI[] list() throws URIException
+  @Override
+public IURI[] list() throws URIException
   {
     IResource resource    = getResource();
     IURI[]     uriChildren = new IURI[0];
@@ -281,7 +292,8 @@
   /**
    * @see org.eclipse.env.uri.IURI#list(org.eclipse.env.uri.IURIFilter)
    */
-  public IURI[] list(IURIFilter uriFilter) throws URIException
+  @Override
+public IURI[] list(IURIFilter uriFilter) throws URIException
   {
     IResource resource = getResource();
     IURI[]     result   = new IURI[0];
@@ -319,7 +331,8 @@
   /**
    * @see org.eclipse.env.uri.IURI#rename(org.eclipse.env.uri.IURI)
    */
-  public void rename(IURI newURI ) throws URIException
+  @Override
+public void rename(IURI newURI ) throws URIException
   {
     if( newURI == null || !(newURI instanceof EclipseURI) ) return;
     
@@ -337,14 +350,15 @@
     catch( CoreException exc )
     {
       exc.printStackTrace();
-      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ) );
+      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ) ); //$NON-NLS-1$
     }
   }
 
   /**
    * @see org.eclipse.env.uri.IURI#touchFolder()
    */
-  public void touchFolder() throws URIException
+  @Override
+public void touchFolder() throws URIException
   {
     IResource resource = getResource();
     
@@ -359,7 +373,7 @@
           if( folder.members().length > 0 )
           {
             throw new URIException( 
-                new Status( IStatus.ERROR, "id", 0, 
+                new Status( IStatus.ERROR, "id", 0,  //$NON-NLS-1$
                     NLS.bind( Messages.MSG_ERROR_FOLDER_HAS_CHILDREN, folder.toString() ), null ),
                 this );
 								
@@ -367,7 +381,7 @@
         }
         catch( CoreException exc )
         {        
-          throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this );
+          throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this ); //$NON-NLS-1$
         }
       }
       else
@@ -386,7 +400,7 @@
       }
       catch( CoreException exc )
       {
-        throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this );
+        throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this ); //$NON-NLS-1$
       }
     }
   }
@@ -394,7 +408,8 @@
   /**
    * @see org.eclipse.env.uri.IURI#touchLeaf()
    */
-  public void touchLeaf() throws URIException
+  @Override
+public void touchLeaf() throws URIException
   {
     IResource resource = getResource();
     
@@ -420,7 +435,7 @@
       }
       catch( IOException exc )
       {
-        throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this );
+        throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this ); //$NON-NLS-1$
       }
     }
 
@@ -453,7 +468,8 @@
    * will fail and throw an exception. It should be used only
    * in cases where URIs are known to be backed by physical files.
    */
-  public File asFile ()
+  @Override
+public File asFile ()
   {
   	return file_;
   }
@@ -461,7 +477,8 @@
   /* (non-Javadoc)
    * @see org.eclipse.wst.common.environment.uri.IURI#isAvailableAsFile()
    */
-  public boolean isAvailableAsFile() 
+  @Override
+public boolean isAvailableAsFile() 
   {
   	return file_ != null;
   }
@@ -469,7 +486,8 @@
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URI#asURL()
    */
-  public URL asURL() throws URIException
+  @Override
+public URL asURL() throws URIException
   {
     URL url = null;
     
@@ -479,7 +497,7 @@
     }
     catch( MalformedURLException exc )
     {
-      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this ); 
+      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this );  //$NON-NLS-1$
     }
     
     return url;
@@ -488,7 +506,8 @@
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URI#isAvailableAsURL()
    */
-  public boolean isAvailableAsURL()
+  @Override
+public boolean isAvailableAsURL()
   {
     URL theURL = null;
     
@@ -505,7 +524,7 @@
 
   private File getFile()
   {
-    String platformRes = "platform:/resource";
+    String platformRes = "platform:/resource"; //$NON-NLS-1$
     File   result      = null;
     
     if (uri_.startsWith(platformRes))
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/FileResourceOutputStream.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/FileResourceOutputStream.java
index 8cfebb5..4f350f7 100644
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/FileResourceOutputStream.java
+++ b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/FileResourceOutputStream.java
@@ -67,7 +67,8 @@
   * and a file of the same name already exists, then an IOException will
   * be thrown either now or during an earlier {@link #write write}.
   */
-  public void close ()
+  @Override
+public void close ()
   throws IOException
   {
     if (!fOpen) return;
@@ -93,7 +94,8 @@
   * same name already exists, then an IOException may be thrown at
   * this point.
   */
-  public void flush ()
+  @Override
+public void flush ()
   throws IOException
   {
     fByteArrayOutputStream.flush();
@@ -107,7 +109,8 @@
   * same name already exists, then an IOException may be thrown at
   * this point.
   */
-  public void write ( byte[] b )
+  @Override
+public void write ( byte[] b )
   throws IOException
   {
     fByteArrayOutputStream.write(b);
@@ -124,7 +127,8 @@
   * same name already exists, then an IOException may be thrown at
   * this point.
   */
-  public void write ( byte[] b, int off, int len )
+  @Override
+public void write ( byte[] b, int off, int len )
   {
     fByteArrayOutputStream.write(b,off,len);
   }
@@ -137,7 +141,8 @@
   * same name already exists, then an IOException may be thrown at
   * this point.
   */
-  public void write ( int b )
+  @Override
+public void write ( int b )
   {
     fByteArrayOutputStream.write(b);
   }
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/FileResourceUtils.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/FileResourceUtils.java
index 8d6a2cd..abb6b21 100644
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/FileResourceUtils.java
+++ b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/FileResourceUtils.java
@@ -278,8 +278,7 @@
        folder.delete(true, true, null);
        return true;
      }
-     else
-       return false;
+     return false;
    }
 
   /**
@@ -308,15 +307,15 @@
   {    
     if (!absolutePath.isAbsolute())
     {
-      throw new CoreException(new Status(IStatus.ERROR, "ResourceUtils",0, NLS.bind( Messages.MSG_ERROR_PATH_NOT_ABSOLUTE, absolutePath.toString() ),null));
+      throw new CoreException(new Status(IStatus.ERROR, "ResourceUtils",0, NLS.bind( Messages.MSG_ERROR_PATH_NOT_ABSOLUTE, absolutePath.toString() ),null)); //$NON-NLS-1$
     }
     if (absolutePath.segmentCount() < 1)
     {
-      throw new CoreException(new Status(IStatus.ERROR,"ResourceUtils",0,NLS.bind( Messages.MSG_ERROR_PATH_EMPTY, absolutePath.toString() ),null));
+      throw new CoreException(new Status(IStatus.ERROR,"ResourceUtils",0,NLS.bind( Messages.MSG_ERROR_PATH_EMPTY, absolutePath.toString() ),null)); //$NON-NLS-1$
     }
     if (absolutePath.segmentCount() < 2)
     {
-      throw new CoreException(new Status(IStatus.ERROR,"ResourceUtils",0,NLS.bind( Messages.MSG_ERROR_PATH_NOT_FOLDER, absolutePath.toString() ),null));
+      throw new CoreException(new Status(IStatus.ERROR,"ResourceUtils",0,NLS.bind( Messages.MSG_ERROR_PATH_NOT_FOLDER, absolutePath.toString() ),null)); //$NON-NLS-1$
     }
     IContainer parent   = makeFolderPath(absolutePath.removeLastSegments(1), statusHandler);
     String     fileName = absolutePath.lastSegment();
@@ -448,13 +447,10 @@
     {
       return getWorkspaceRoot().getProject(absolutePath.segment(0));
     }
-    else
-    {
       IContainer parent = makeFolderPath(absolutePath.removeLastSegments(1), statusHandler );
       String folderName = absolutePath.lastSegment();
       
       return makeFolder(parent,folderName, statusHandler );
-    }
   }
   //
   // Creates a folder under a container.
@@ -483,7 +479,7 @@
     {
       throw new CoreException(
         new Status( IStatus.ERROR, 
-                    "ResourceUtils",
+                    "ResourceUtils", //$NON-NLS-1$
                     0, 
 					NLS.bind( Messages.MSG_ERROR_RESOURCE_NOT_FOLDER, parent.getFullPath().append(folderName).toString()),
 			null ) );
@@ -502,7 +498,8 @@
 
  throws CoreException
  {
-	 IFile file = parent.getFile( new Path(fileName) );
+	 String innerFileName = fileName;
+	 IFile file = parent.getFile( new Path(innerFileName) );
 
 	 // create the file if it doesn't exist
 	 if (!file.exists()) {
@@ -515,11 +512,11 @@
 				 boolean foundIgnoringCase = false;
 
 				 for (IResource resource : parent.members()) {
-					 if (resource.getName().equalsIgnoreCase(fileName)) {
+					 if (resource.getName().equalsIgnoreCase(innerFileName)) {
 						 // found the file
 						 foundIgnoringCase = true;
-						 fileName = resource.getName();
-						 file = parent.getFile( new Path(fileName));
+						 innerFileName = resource.getName();
+						 file = parent.getFile( new Path(innerFileName));
 						 break;
 					 }
 				 }
@@ -561,14 +558,11 @@
 		 return file;
 
 	 }
-	 else
-	 {
-		 throw new CoreException( 
-				 new Status( IStatus.ERROR,
-						 "ResourceUtils",
-						 0, 
-						 NLS.bind( Messages.MSG_ERROR_RESOURCE_NOT_FILE, parent.getFullPath().append(fileName)),
-						 null ) );
-	 }
+	 throw new CoreException( 
+			 new Status( IStatus.ERROR,
+					 "ResourceUtils", //$NON-NLS-1$
+					 0, 
+					 NLS.bind( Messages.MSG_ERROR_RESOURCE_NOT_FILE, parent.getFullPath().append(innerFileName)),
+					 null ) );
  }
 }
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/Messages.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/Messages.java
index 4c08ea1..638a3e0 100644
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/Messages.java
+++ b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/eclipse/Messages.java
@@ -12,7 +12,7 @@
 
 public class Messages extends NLS
 {
-  private static final String BUNDLE_NAME = "org.eclipse.wst.common.internal.environment.eclipse.environment";
+  private static final String BUNDLE_NAME = "org.eclipse.wst.common.internal.environment.eclipse.environment"; //$NON-NLS-1$
   
   public static String MSG_NULL_ARG_SPECIFIED;
   public static String MSG_SCHEME_NOT_FOUND;
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/relative/RelativeScheme.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/relative/RelativeScheme.java
index bb60c0e..3fb9872 100644
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/relative/RelativeScheme.java
+++ b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/relative/RelativeScheme.java
@@ -21,9 +21,10 @@
 public class RelativeScheme implements IURIScheme
 {
 
-  public String toString()
+  @Override
+public String toString()
   {
-    return "relative";  
+    return "relative"; //$NON-NLS-1$  
   }
   
   /* (non-Javadoc)
@@ -39,7 +40,7 @@
    */
   public boolean isValid(IURI uri)
   {
-    return !uri.toString().startsWith( "/" );
+    return !uri.toString().startsWith( "/" ); //$NON-NLS-1$
   }
 
   /* (non-Javadoc)
@@ -79,7 +80,7 @@
     }
     else
     {
-      result = new Status( IStatus.ERROR, "id", 0, "",null );      
+      result = new Status( IStatus.ERROR, "id", 0, "",null ); //$NON-NLS-1$ //$NON-NLS-2$     
     }
     
     return result;
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/relative/RelativeURI.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/relative/RelativeURI.java
index 59f3d36..0877405 100644
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/relative/RelativeURI.java
+++ b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/relative/RelativeURI.java
@@ -42,12 +42,12 @@
     if( !relativeURI.isRelative()) 
      {      
       throw new URIException( 
-          new Status( IStatus.ERROR, "id", 0,
+          new Status( IStatus.ERROR, "id", 0, //$NON-NLS-1$
               NLS.bind( Messages.MSG_URI_NOT_RELATIVE, relativeURI.toString() ), null ) );
       
     }
     
-    String newURI = uri_ + "/" + relativeURI.toString();
+    String newURI = uri_ + "/" + relativeURI.toString(); //$NON-NLS-1$
     
     return getURIScheme().newURI( newURI );
   }
@@ -71,7 +71,8 @@
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URI#toString()
    */
-  public String toString()
+  @Override
+public String toString()
   {
     return uri_;
   }
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/uri/file/FileScheme.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/uri/file/FileScheme.java
index 3dd4f89..cb332ba 100644
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/uri/file/FileScheme.java
+++ b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/uri/file/FileScheme.java
@@ -24,15 +24,17 @@
 
 public class FileScheme extends RelativeScheme
 {
-  public String toString()
+  @Override
+public String toString()
   {
-    return "file";  
+    return "file"; //$NON-NLS-1$
   }
   
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URIScheme#isValid(org.eclipse.env.uri.URI)
    */
-  public boolean isValid(IURI uri)
+  @Override
+public boolean isValid(IURI uri)
   { 
     boolean result = false;
     
@@ -40,11 +42,11 @@
     
     IURIScheme scheme = uri.getURIScheme();
       
-    if( scheme.toString().equals( "relative") ) return scheme.isValid( uri );
+    if( scheme.toString().equals( "relative") ) return scheme.isValid( uri ); //$NON-NLS-1$
         
     String uriString = uri.toString();
       
-    if( uriString != null && uriString.startsWith( "file:" ) )
+    if( uriString != null && uriString.startsWith( "file:" ) ) //$NON-NLS-1$
     {
       result = true;
     }  
@@ -55,43 +57,42 @@
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URIScheme#newURI(java.lang.String)
    */
-  public IURI newURI(String uri) throws URIException
+  @Override
+public IURI newURI(String uri) throws URIException
   {
     String newURI = null;
     
-    if( uri != null && uri.startsWith( "file:") )
+    if( uri != null && uri.startsWith( "file:") ) //$NON-NLS-1$
     {
       // The file protocol has been specified so keep it as is.
       newURI = uri;
     }
-    else if( uri == null || uri.indexOf( ":") != -1 )
+    else if( uri == null || uri.indexOf( ":") != -1 ) //$NON-NLS-1$
     {
       // The file uri is not allowed to contain some other protocol. 
       throw new URIException(
-          new Status( IStatus.ERROR, "id", 0,
+          new Status( IStatus.ERROR, "id", 0, //$NON-NLS-1$
               NLS.bind( Messages.MSG_INVALID_FILE_URL,uri), null ) );
               
     }
-    else if( uri.startsWith( "/") )
+    else if( uri.startsWith( "/") ) //$NON-NLS-1$
     {
       // The file scheme has not been specified so we will add it.
-      newURI = "file:" + uri;
+      newURI = "file:" + uri; //$NON-NLS-1$
     }
     
     if( newURI == null )
     {
       return new RelativeURI( uri );
     }
-    else
-    {
-      return new FileURI( newURI );
-    }
+    return new FileURI( newURI );
   }
 
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URIScheme#newURI(org.eclipse.env.uri.URI)
    */
-  public IURI newURI(IURI uri) throws URIException
+  @Override
+public IURI newURI(IURI uri) throws URIException
   {
     return newURI( uri == null ? null : uri.toString() );
   }
@@ -99,7 +100,8 @@
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URIScheme#newURI(java.net.URL)
    */
-  public IURI newURI(URL url) throws URIException
+  @Override
+public IURI newURI(URL url) throws URIException
   {
     return newURI( url == null ? null : url.toString() );
   }
diff --git a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/uri/file/FileURI.java b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/uri/file/FileURI.java
index ecc1664..65b3d04 100644
--- a/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/uri/file/FileURI.java
+++ b/plugins/org.eclipse.wst.common.environment/src/org/eclipse/wst/common/internal/environment/uri/file/FileURI.java
@@ -45,7 +45,8 @@
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URI#asFile()
    */
-  public File asFile() 
+  @Override
+public File asFile() 
   {
     return file_;
   }
@@ -53,7 +54,8 @@
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URI#erase()
    */
-  public void erase() throws URIException
+  @Override
+public void erase() throws URIException
   {
     deleteFile( file_ );
   }
@@ -85,7 +87,8 @@
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URI#getInputStream()
    */
-  public InputStream getInputStream() throws URIException
+  @Override
+public InputStream getInputStream() throws URIException
   {
     FileInputStream stream = null;
     
@@ -98,7 +101,7 @@
     }
     catch( IOException exc )
     {
-      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this );
+      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this ); //$NON-NLS-1$
     }
     
     return stream;
@@ -107,7 +110,8 @@
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URI#getOutputStream()
    */
-  public OutputStream getOutputStream() throws URIException
+  @Override
+public OutputStream getOutputStream() throws URIException
   {
     FileOutputStream stream = null;
     
@@ -120,7 +124,7 @@
     }
     catch( IOException exc )
     {
-      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this );
+      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this ); //$NON-NLS-1$
     }
     
     return stream;
@@ -129,7 +133,8 @@
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URI#getURIScheme()
    */
-  public IURIScheme getURIScheme()
+  @Override
+public IURIScheme getURIScheme()
   {
     return new FileScheme();
   }
@@ -137,7 +142,8 @@
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URI#isAvailableAsFile()
    */
-  public boolean isAvailableAsFile()
+  @Override
+public boolean isAvailableAsFile()
   {
     return file_ != null;
   }
@@ -145,7 +151,8 @@
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URI#isAvailableAsURL()
    */
-  public boolean isAvailableAsURL()
+  @Override
+public boolean isAvailableAsURL()
   {
     return file_ != null;
   }
@@ -153,7 +160,8 @@
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URI#asURL()
    */
-  public URL asURL() throws URIException
+  @Override
+public URL asURL() throws URIException
   {
     URL url = null;
     
@@ -163,7 +171,7 @@
     }
     catch( MalformedURLException exc )
     {
-      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this );      
+      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this ); //$NON-NLS-1$      
     }
     
     return url;
@@ -172,7 +180,8 @@
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URI#isLeaf()
    */
-  public boolean isLeaf()
+  @Override
+public boolean isLeaf()
   {
     return file_.isFile();
   }
@@ -180,7 +189,8 @@
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URI#isPresent()
    */
-  public boolean isPresent()
+  @Override
+public boolean isPresent()
   {
     return file_.exists();
   }
@@ -188,7 +198,8 @@
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URI#isReadable()
    */
-  public boolean isReadable()
+  @Override
+public boolean isReadable()
   {
     return file_.canRead();
   }
@@ -196,7 +207,8 @@
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URI#isWritable()
    */
-  public boolean isWritable()
+  @Override
+public boolean isWritable()
   {
     return file_.canWrite();
   }
@@ -204,7 +216,8 @@
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URI#list()
    */
-  public IURI[] list() throws URIException
+  @Override
+public IURI[] list() throws URIException
   {
     File[] children = file_.listFiles();
     IURI[]  URIs     = new IURI[0];
@@ -217,7 +230,7 @@
     
       for( int index = 0; index < length; index++ )
       {
-        URIs[index] = new FileURI( "file:" + children[index].getAbsolutePath() );
+        URIs[index] = new FileURI( "file:" + children[index].getAbsolutePath() ); //$NON-NLS-1$
       }
     }
     
@@ -227,29 +240,32 @@
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URI#list(org.eclipse.env.uri.URIFilter)
    */
-  public IURI[] list(IURIFilter uriFilter) throws URIException
+  @Override
+public IURI[] list(IURIFilter uriFilter) throws URIException
   {
     File[]   children = file_.listFiles();
     int      length   = children == null ? 0 : children.length;
     Vector   URIs     = new Vector();
     
-    for( int index = 0; index < length; index++ )
-    {
-      IURI newURI = new FileURI( "file:" + children[index].getAbsolutePath() );
-      
-      if( uriFilter.accepts( newURI) )
-      {
-        URIs.add( newURI );
-      } 
+    if(children != null){
+	    for( int index = 0; index < length; index++ )
+	    {
+	      IURI newURI = new FileURI( "file:" + children[index].getAbsolutePath() ); //$NON-NLS-1$
+	      
+	      if( uriFilter.accepts( newURI) )
+	      {
+	        URIs.add( newURI );
+	      } 
+	    }
     }
-    
     return (IURI[])URIs.toArray( new IURI[0] );
   }
 
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URI#rename(org.eclipse.env.uri.URI)
    */
-  public void rename(IURI newURI) throws URIException
+  @Override
+public void rename(IURI newURI) throws URIException
   {
     try
     {
@@ -259,14 +275,15 @@
     }
     catch( MalformedURLException exc )
     {
-      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this );      
+      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this ); //$NON-NLS-1$      
     }
   }
 
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URI#touchFolder()
    */
-  public void touchFolder() throws URIException
+  @Override
+public void touchFolder() throws URIException
   {
     file_.mkdirs();
   }
@@ -274,7 +291,8 @@
   /* (non-Javadoc)
    * @see org.eclipse.env.uri.URI#touchLeaf()
    */
-  public void touchLeaf() throws URIException
+  @Override
+public void touchLeaf() throws URIException
   {
     try
     {
@@ -286,11 +304,12 @@
     }
     catch( IOException exc )
     {
-      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this );      
+      throw new URIException( new Status( IStatus.ERROR, "id", 0, exc.getMessage(), exc ), this ); //$NON-NLS-1$      
     }
   }
 
-  public boolean isRelative()
+  @Override
+public boolean isRelative()
   {
     return false;
   }    
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/.classpath b/plugins/org.eclipse.wst.common.frameworks.ui/.classpath
index 0ea0610..fe40552 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/.classpath
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/.classpath
@@ -2,7 +2,7 @@
 <classpath>
 	<classpathentry kind="src" path="wtp_ui/"/>
 	<classpathentry kind="src" path="property_files"/>
-	<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.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.wst.common.frameworks.ui/.settings/org.eclipse.jdt.core.prefs
index 341713a..037a4e5 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/.settings/org.eclipse.jdt.core.prefs
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/.settings/org.eclipse.jdt.core.prefs
@@ -1,62 +1,95 @@
-#Sat Mar 31 16:58:45 EDT 2007
-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=ignore
-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.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
-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=error
-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=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=ignore
-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=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+#Mon Jun 08 15:35:45 EDT 2009
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
+org.eclipse.jdt.core.compiler.problem.unusedLocal=error
+org.eclipse.jdt.core.compiler.problem.emptyStatement=error
+org.eclipse.jdt.core.compiler.problem.unusedLabel=error
+org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=enabled
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=error
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=error
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=error
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.compiler.problem.fieldHiding=error
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=error
+eclipse.preferences.version=1
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
+org.eclipse.jdt.core.compiler.problem.deadCode=error
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeUncheckedExceptions=disabled
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=ignore
-org.eclipse.jdt.core.compiler.source=1.3
+org.eclipse.jdt.core.compiler.problem.autoboxing=warning
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=error
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.common.frameworks.ui/META-INF/MANIFEST.MF
index 5857635..4a9fe89 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
 Bundle-SymbolicName: org.eclipse.wst.common.frameworks.ui; singleton:=true
-Bundle-Version: 1.1.200.qualifier
+Bundle-Version: 1.2.0.qualifier
 Bundle-Activator: org.eclipse.wst.common.frameworks.internal.ui.WTPUIPlugin
 Bundle-Localization: plugin
 Export-Package: org.eclipse.wst.common.frameworks.internal.datamodel.ui;x-internal:=true,
@@ -16,7 +16,8 @@
  org.eclipse.ui;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.wst.common.frameworks;bundle-version="[1.1.200,2.0.0)";visibility:=reexport,
  org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.jem.util;bundle-version="[2.0.100,3.0.0)",
- org.eclipse.wst.common.environment;bundle-version="[1.0.200,2.0.0)"
+ org.eclipse.wst.common.environment;bundle-version="[1.0.200,2.0.0)",
+ org.eclipse.wst.common.core;bundle-version="[1.2.0,2.0.0)",
+ org.eclipse.core.expressions;bundle-version="[3.4.100,4.0.0)"
 Eclipse-LazyStart: true
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/build.properties b/plugins/org.eclipse.wst.common.frameworks.ui/build.properties
index feb73fb..4d7ef95 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/build.properties
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/build.properties
@@ -16,5 +16,4 @@
                about.html
 source.. = wtp_ui/,\
                     property_files/
-src.includes = schema/,\
-               plugin.properties
+src.includes = schema/
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/plugin.xml b/plugins/org.eclipse.wst.common.frameworks.ui/plugin.xml
index f1e3ab7..5f4d1bd 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/plugin.xml
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/plugin.xml
@@ -7,10 +7,24 @@
    <extension-point id="extendableWizard" name="%Extendable_Wizard" schema="schema/extendableWizard.exsd"/>
    <extension-point id="wizardPageGroup" name="%Extendable_Wizard_Page" schema="schema/extendableWizardPage.exsd"/>
    <extension-point id="DataModelWizardExtension" name="%DataModelWizard" schema="schema/DataModelWizardExtension.exsd"/>
-
+	 	 
+	<extension-point id="MenuEnabler" 
+	 name="MenuEnabler"
+	 schema="schema/menuEnabler.exsd"/>
+	 
+   <extension point="org.eclipse.core.expressions.propertyTesters">
+    <propertyTester
+          class="org.eclipse.wst.common.frameworks.internal.ui.MenuEnablementPropertyTester"
+          id="org.eclipse.wst.common.frameworks.internal.ui.MenuEnablementPropertyTester"
+          namespace="org.eclipse.wst.common.frameworks.actions"
+          properties="show"
+          type="org.eclipse.core.resources.IResource">
+    </propertyTester>
+  </extension>
+  	 
    <extension
          id="UITester"
-         point="org.eclipse.jem.util.uiTester">
+         point="org.eclipse.wst.common.core.uiTester">
       <uiTester
             className="org.eclipse.wst.common.frameworks.internal.ui.UITesterImpl">
       </uiTester>
@@ -18,7 +32,7 @@
    <extension
          id="context.Sensitive.Class.saveHandler"
          name="Save Handler - Headless Context Class"
-         point="org.eclipse.jem.util.uiContextSensitiveClass">
+         point="org.eclipse.wst.common.core.uiContextSensitiveClass">
       <uiContextSensitiveClass
             key="saveHandler"
             context="UI"
@@ -28,7 +42,7 @@
    <extension
          id="org.eclipse.wst.common.frameworks.internal.ui.EnablementDetermination"
          name="UI Enablement Determination"
-         point="org.eclipse.jem.util.uiContextSensitiveClass">
+         point="org.eclipse.wst.common.core.uiContextSensitiveClass">
       <uiContextSensitiveClass
             key="org.eclipse.wst.common.frameworks.internal.EnablementDetermination"
             context="UI"
@@ -50,7 +64,7 @@
    </extension>
    -->
    <extension 
-       point="org.eclipse.jem.util.uiContextSensitiveClass">
+       point="org.eclipse.wst.common.core.uiContextSensitiveClass">
        <uiContextSensitiveClass
           key="ISimpleValidateEditContext"
           className="org.eclipse.wst.common.frameworks.internal.ui.SimpleValidateEditContextUI"
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/property_files/messages.properties b/plugins/org.eclipse.wst.common.frameworks.ui/property_files/messages.properties
index fbdef12..e14128d 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/property_files/messages.properties
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/property_files/messages.properties
@@ -8,6 +8,6 @@
 # Contributors:
 #     IBM Corporation - initial API and implementation
 ###############################################################################
-WizardNewProjectCreationPage_projectContentsLabel = Project contents:
-WizardNewProjectCreationPage_useDefaultLabel = Use &default
-WizardNewProjectCreationPage_locationLabel = Director&y:
\ No newline at end of file
+WizardNewProjectCreationPage_projectContentsLabel = Project location
+WizardNewProjectCreationPage_useDefaultLabel = Use &default location
+WizardNewProjectCreationPage_locationLabel = &Location:
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/property_files/wtpcommonui.properties b/plugins/org.eclipse.wst.common.frameworks.ui/property_files/wtpcommonui.properties
index dc661b8..d35ea00 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/property_files/wtpcommonui.properties
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/property_files/wtpcommonui.properties
@@ -31,7 +31,8 @@
 WizardPageExtensionManager_UI_3=Editor does not allow page insertions
 WizardPageExtensionManager_UI_4=Parent Class Not Found Error: {0} \r\n for attribute: {1} in plugin {2} \r\nPage not created
 Delete_UI_0=Delete
-Name_=Project name:
-Browse_=Browse...
+Name_=Project na&me:
+Browse_=Brow&se...
 Project_location_=Project Location:
 MULTIPLE_MODULE_PREF_TEXT=Allow Multiple modules per project
+DefDirDialogLabel_=Select the location directory.
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/schema/menuEnabler.exsd b/plugins/org.eclipse.wst.common.frameworks.ui/schema/menuEnabler.exsd
new file mode 100644
index 0000000..332f105
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/schema/menuEnabler.exsd
@@ -0,0 +1,106 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.wst.common.frameworks.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.wst.common.frameworks.ui" id="MenuEnabler" name="MenuEnabler"/>
+      </appInfo>
+      <documentation>
+         Defines extension point for setting enablement condition for a menu item. This extension point is used in
+org.eclipse.wst.common.frameworks.internal.ui.MenuEnablementPropertyTester.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appInfo>
+            <meta.element />
+         </appInfo>
+      </annotation>
+      <complexType>
+         <sequence>
+            <element ref="menuenabler"/>
+         </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>
+                  Optional name for the extension point
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="menuenabler">
+      <complexType>
+         <attribute name="className" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The className is an implementation of interface IPropertyTester
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         3.2 M6
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         &lt;extension
+    point=&quot;org.eclipse.wst.common.frameworks.ui.MenuEnabler&quot;&gt;
+     &lt;menuenabler
+         className=&quot;org.eclipse.foo.BarPropertyTester&quot;&gt;
+     &lt;/menuenabler&gt;
+&lt;/extension&gt;
+
+The class specified in className should implement IPropertyTester interface
+      </documentation>
+   </annotation>
+
+
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2010 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
+      </documentation>
+   </annotation>
+
+</schema>
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelSynchHelper.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelSynchHelper.java
index a0ed277..4f18abb 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelSynchHelper.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelSynchHelper.java
@@ -546,6 +546,7 @@
 					setTextProperty(propertyName, (Text) w);
 				}
 			}) {
+				@Override
 				public void modifyText(ModifyEvent e) {
 					if (ignoreModifyEvent)
 						return;
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelWizard.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelWizard.java
index 1a6cbf3..7bdbbe0 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelWizard.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelWizard.java
@@ -19,7 +19,6 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.jface.wizard.IWizardPage;
 import org.eclipse.jface.wizard.Wizard;
@@ -78,6 +77,7 @@
 	 * This is finalized to handle the adding of extended pages. Clients should override
 	 * doAddPages() to add their pages.
 	 */
+	@Override
 	public final void addPages() {
 		init();
 		doAddPages();
@@ -90,6 +90,7 @@
 	}
 
 	// TODO make this final
+	@Override
 	public IWizardPage getStartingPage() {
 		pageGroupManager.reset();
 		return getNextPage(null);
@@ -103,6 +104,7 @@
 	 * @link #getPreviousPage(String, String)
 	 */
 	// TODO make this final
+	@Override
 	public IWizardPage getNextPage(IWizardPage page) {
 
 		IWizardPage currentPage = pageGroupManager.getCurrentPage();
@@ -132,6 +134,7 @@
 	 * @link #getPreviousPage(String, String)
 	 */
 	// TODO make this final
+	@Override
 	public IWizardPage getPreviousPage(IWizardPage page) {
 		return page != null ? page.getPreviousPage() : null;
 	}
@@ -140,6 +143,7 @@
 		return expectedPreviousPageName;
 	}
 
+	@Override
 	public boolean canFinish() {
 		if (!super.canFinish() || !getDataModel().isValid()) {
 			return false;
@@ -177,6 +181,7 @@
 	 * 
 	 * @see org.eclipse.jface.wizard.IWizard#performFinish()
 	 */
+	@Override
 	public final boolean performFinish() {
 		try {
 			executing = true;
@@ -187,7 +192,8 @@
 
 				if (st.getSeverity() == IStatus.ERROR) {
 					WTPUIPlugin.log(st);
-					ErrorDialog.openError(getShell(), WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WTPWizard_UI_0, new Object[]{getWindowTitle()}), WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WTPWizard_UI_1, new Object[]{getWindowTitle()}), new CoreException(st), 0, false);
+					Throwable t = st.getException() == null ? new CoreException(st) : st.getException();
+					ErrorDialog.openError(getShell(), WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WTPWizard_UI_0, new Object[]{getWindowTitle()}), WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WTPWizard_UI_1, new Object[]{getWindowTitle()}), t, 0, false);
 				} else if(st.getSeverity() == IStatus.WARNING){
 					WarningDialog.openWarning(getShell(), WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WTPWizard_UI_2, new Object[]{getWindowTitle()}), st.getMessage(), st, IStatus.WARNING);
 				}
@@ -230,13 +236,14 @@
 			runnable.caught = e;
 		}
 		if (runnable.caught != null) {
-			Logger.getLogger().logError(runnable.caught);
+			WTPUIPlugin.logError(runnable.caught);
 			status[0] = new Status(IStatus.ERROR, "id", 0, runnable.caught.getMessage(), runnable.caught); //$NON-NLS-1$
 			ErrorDialog.openError(getShell(), WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WTPWizard_UI_0, new Object[]{getWindowTitle()}), WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WTPWizard_UI_1, new Object[]{getWindowTitle()}), runnable.caught, 0, false);
 		}
 		return status[0];
 	}
 
+	@Override
 	public boolean performCancel() {
 		pageGroupManager.undoAllCurrentOperations();
 
@@ -314,6 +321,7 @@
 		return dataModel;
 	}
 
+	@Override
 	public void dispose() {
 		super.dispose();
 		if (null != rootPageGroup) {
@@ -355,6 +363,7 @@
 		return new EclipseEnvironment();
 	}
 
+	@Override
 	public void addPage(IWizardPage page) {
 		rootPageGroup.addPage(page);
 	}
@@ -380,6 +389,7 @@
 		return false;
 	}
 
+	@Override
 	public boolean needsPreviousAndNextButtons() {
 		return super.needsPreviousAndNextButtons() || getPageGroupManager().hasMultiplePages();
 	}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelWizardPage.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelWizardPage.java
index 577bf5d..626d75c 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelWizardPage.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/DataModelWizardPage.java
@@ -128,6 +128,7 @@
 		}
 	}
 
+	@Override
 	public boolean canFlipToNextPage() {
 		// TODO why is that last getNextPage() call here???
 		return isPageComplete() && ((null != wizard && wizard.getPageGroupManager().hasNextPage() || null != getNextPage()));
@@ -136,6 +137,7 @@
 	/*
 	 * (non-Javadoc) Method declared on IWizardPage.
 	 */
+	@Override
 	public void setWizard(IWizard newWizard) {
 		super.setWizard(newWizard);
 		if (newWizard instanceof DataModelWizard) {
@@ -143,10 +145,12 @@
 		}
 	}
 
+	@Override
 	public IWizardPage getPreviousPage() {
 		return previousPage;
 	}
 
+	@Override
 	public void setPreviousPage(IWizardPage page) {
 		super.setPreviousPage(page);
 		previousPage = page;
@@ -301,6 +305,7 @@
 	 * the control to the given visibility state. Subclasses may extend.
 	 */
 
+	@Override
 	public void setVisible(boolean visible) {
 		super.setVisible(visible);
 		if (visible) {
@@ -468,8 +473,12 @@
 		return model;
 	}
 
+	@Override
 	public void dispose() {
 		super.dispose();
+		if (model != null) {
+			model.removeListener(this);
+		}
 		if (synchHelper != null) {
 			synchHelper.dispose();
 			synchHelper = null;
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/PageExtensionManager.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/PageExtensionManager.java
index ff2ea8c..8042119 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/PageExtensionManager.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/datamodel/ui/PageExtensionManager.java
@@ -87,7 +87,7 @@
 		IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(CommonUIPluginConstants.PLUGIN_ID, POINT_WIZARD_PAGE_GROUP);
 		IConfigurationElement[] allElements = point.getConfigurationElements();
 		for (int i = 0; i < allElements.length; i++) {
-			IConfigurationElement element = (IConfigurationElement) allElements[i];
+			IConfigurationElement element = allElements[i];
 			if (ELEMENT_WIZARD_PAGE.equals(element.getName())) {
 				result.add(new DMWizardPageElement(element));
 			}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/ErrorDialog.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/ErrorDialog.java
index 620d136..d186f96 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/ErrorDialog.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/ErrorDialog.java
@@ -67,7 +67,8 @@
   /*
    * (non-Javadoc) This should also be overwritten Method declared on Dialog.
    */
-  protected void createButtonsForButtonBar(Composite parent)
+  @Override
+protected void createButtonsForButtonBar(Composite parent)
   {
     // create OK and Details buttons
     createButton(
@@ -90,7 +91,8 @@
    * This is one of the few methods that needs to be overwritten by the
    * subclasses. The image names can be found in the Dialog class
    */
-  protected Image getDialogImage()
+  @Override
+protected Image getDialogImage()
   {
     // create image
     return PlatformUI.getWorkbench().getDisplay().getSystemImage(SWT.ICON_ERROR);
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/InfoDialog.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/InfoDialog.java
index cfc565a..af189c0 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/InfoDialog.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/InfoDialog.java
@@ -66,7 +66,8 @@
   /*
    * (non-Javadoc) This should also be overwritten Method declared on Dialog.
    */
-  protected void createButtonsForButtonBar(Composite parent)
+  @Override
+protected void createButtonsForButtonBar(Composite parent)
   {
     // create OK and Details buttons
     createButton(
@@ -89,7 +90,8 @@
    * This is one of the few methods that needs to be overwritten by the
    * subclasses. The image names can be found in the Dialog class
    */
-  protected Image getDialogImage()
+  @Override
+protected Image getDialogImage()
   {
     // create image
     return PlatformUI.getWorkbench().getDisplay().getSystemImage(SWT.ICON_INFORMATION);
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/MessageDialog.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/MessageDialog.java
index 8d48622..946aeab 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/MessageDialog.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/MessageDialog.java
@@ -145,7 +145,8 @@
    * of the error details area. Note that the Details button will only be
    * visible if the error being displayed specifies child details.
    */
-  protected void buttonPressed(int id)
+  @Override
+protected void buttonPressed(int id)
   {
     if (id == StatusDialogConstants.DETAILS_ID)
     { // was the details button pressed?
@@ -159,7 +160,8 @@
   /*
    * (non-Javadoc) Method declared in Window.
    */
-  protected void configureShell(Shell shell)
+  @Override
+protected void configureShell(Shell shell)
   {
     super.configureShell(shell);
     shell.setText(title);
@@ -167,7 +169,8 @@
   /*
    * (non-Javadoc) This should also be overwritten Method declared on Dialog.
    */
-  protected void createButtonsForButtonBar(Composite parent)
+  @Override
+protected void createButtonsForButtonBar(Composite parent)
   {
     // create OK and Details buttons
     createButton(
@@ -202,7 +205,8 @@
    * (non-Javadoc) Method declared on Dialog. Creates and returns the contents
    * of the upper part of the dialog (above the button bar).
    */
-  protected Control createDialogArea(Composite parent)
+  @Override
+protected Control createDialogArea(Composite parent)
   {
     this.parent = parent;
 
@@ -295,7 +299,8 @@
    * children, the error dialog will only be displayed if there is at least one
    * child status matching the mask.
    */
-  public int open()
+  @Override
+public int open()
   {
     if (shouldDisplay(status, displayMask))
     {
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/OptionsDialog.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/OptionsDialog.java
index 21869b2..13af9c3 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/OptionsDialog.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/OptionsDialog.java
@@ -47,7 +47,8 @@
   /*
    * (non-Javadoc) This should also be overwritten Method declared on Dialog.
    */
-  protected void createButtonsForButtonBar(Composite parent)
+  @Override
+protected void createButtonsForButtonBar(Composite parent)
   {
     // create a button for each options
     for (int i = 0; i < choices.length; i++)
@@ -65,7 +66,8 @@
     }
   }
 
-  protected void buttonPressed(int id)
+  @Override
+protected void buttonPressed(int id)
   {
     if (id == StatusDialogConstants.DETAILS_ID)
       // was the Details button pressed?
@@ -77,12 +79,14 @@
     }
   }
 
-  protected void setReturnCode(int id)
+  @Override
+protected void setReturnCode(int id)
   {
     returnCode_ = id;
   }
 
-  public int getReturnCode()
+  @Override
+public int getReturnCode()
   {
     return returnCode_;
   }
@@ -90,7 +94,8 @@
    * This is one of the few methods that needs to be overwritten by the
    * subclasses. The image names can be found in the Dialog class
    */
-  protected Image getDialogImage()
+  @Override
+protected Image getDialogImage()
   {
     // create image
     switch (status.getSeverity())
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/WarningDialog.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/WarningDialog.java
index 6c66d82..f2bda20 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/WarningDialog.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/dialog/ui/WarningDialog.java
@@ -66,7 +66,8 @@
   /*
    * (non-Javadoc) This should also be overwritten Method declared on Dialog.
    */
-  protected void createButtonsForButtonBar(Composite parent)
+  @Override
+protected void createButtonsForButtonBar(Composite parent)
   {
     // create OK, Cancel and Details buttons
     createButton(
@@ -94,7 +95,8 @@
    * This is one of the few methods that needs to be overwritten by the
    * subclasses. The image names can be found in the Dialog class
    */
-  protected Image getDialogImage()
+  @Override
+protected Image getDialogImage()
   {
     // create image
     return PlatformUI.getWorkbench().getDisplay().getSystemImage(SWT.ICON_WARNING);
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/eclipse/ui/EclipseEnvironment.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/eclipse/ui/EclipseEnvironment.java
index 26bff48..78a9120 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/eclipse/ui/EclipseEnvironment.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/eclipse/ui/EclipseEnvironment.java
@@ -56,7 +56,7 @@
 	  if( logger_ == null )
     {  
       logger_ = EnvironmentService.getEclipseLog(); 
-    };
+    }
 	
     return logger_;
   }
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageElement.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageElement.java
index 7070caf..6aeac6d 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageElement.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageElement.java
@@ -63,10 +63,11 @@
 	/**
 	 * @see Identifiable#getID()
 	 */
+	@Override
 	public String getID() {
 		String id = wizardID;
 		if (factoryElement != null) {
-			id = id + "@" + factoryElement.className;
+			id = id + "@" + factoryElement.className; //$NON-NLS-1$
 		}
 		return id; 
 	}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageExtensionManager.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageExtensionManager.java
index 70f90ae..d147d5e 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageExtensionManager.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageExtensionManager.java
@@ -22,10 +22,10 @@
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IExtensionPoint;
 import org.eclipse.core.runtime.Platform;
-import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.wst.common.core.util.RegistryReader;
 import org.eclipse.wst.common.frameworks.internal.enablement.EnablementManager;
 import org.eclipse.wst.common.frameworks.internal.ui.WTPCommonUIResourceHandler;
+import org.eclipse.wst.common.frameworks.internal.ui.WTPUIPlugin;
 
 public class DMWizardPageExtensionManager {
 
@@ -84,6 +84,7 @@
 			super(CommonUIPluginConstants.PLUGIN_ID, DMWizardPageGroupElement.ELEMENT_PAGE_GROUP);
 		}
 
+		@Override
 		public boolean readElement(IConfigurationElement element) {
 			if (!DMWizardPageGroupElement.ELEMENT_PAGE_GROUP.equals(element.getName()))
 				return false;
@@ -121,8 +122,8 @@
 				return;
 			}
 			if (!parentElement.allowsExtendedPagesAfter()) {
-				Logger.getLogger().logError(WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WizardPageExtensionManager_UI_0, new Object[]{parentElement.getPageID()}));
-				Logger.getLogger().logError(WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WizardPageExtensionManager_UI_1, new Object[]{newElement.getPageID()}));
+				WTPUIPlugin.logError(WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WizardPageExtensionManager_UI_0, new Object[]{parentElement.getPageID()}));
+				WTPUIPlugin.logError(WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WizardPageExtensionManager_UI_1, new Object[]{newElement.getPageID()}));
 				return;
 			}
 			TreeSet set = (TreeSet) pageMap.get(parentElement);
@@ -197,7 +198,7 @@
 		for (Iterator iter = treeSet.iterator(); iter.hasNext();) {
 			DMWizardPageGroupElement element = (DMWizardPageGroupElement) iter.next();
 			if (alreadyVistedList.contains(element)) {
-				Logger.getLogger().logError(WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WizardPageExtensionManager_UI_2, new Object[]{element.getPageID(), DMWizardPageGroupElement.ATT_PAGE_INSERTION_ID})); 
+				WTPUIPlugin.logError(WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WizardPageExtensionManager_UI_2, new Object[]{element.getPageID(), DMWizardPageGroupElement.ATT_PAGE_INSERTION_ID})); 
 				return;
 			}
 			if (allPageElementsList.contains(element)) {
@@ -250,17 +251,15 @@
 			}
 		}
 		if (insertNotFound) {
-			Logger logger = Logger.getLogger();
-			logger.logError(WTPCommonUIResourceHandler.WizardPageExtensionManager_UI_3);
+			WTPUIPlugin.logError(WTPCommonUIResourceHandler.WizardPageExtensionManager_UI_3);
 		}
 
 	}
 
 	private void logMissingClassError() {
-		Logger logger = Logger.getLogger();
 		for (int i = 0; i < nonSyncedPageElementList.size(); i++) {
 			DMWizardPageGroupElement element = (DMWizardPageGroupElement) nonSyncedPageElementList.get(i);
-			logger.logError(WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WizardPageExtensionManager_UI_4, new Object[]{element.pageInsertionID, element.getPageID(), element.pluginID}));
+			WTPUIPlugin.logError(WTPCommonUIResourceHandler.getString(WTPCommonUIResourceHandler.WizardPageExtensionManager_UI_4, new Object[]{element.pageInsertionID, element.getPageID(), element.pluginID}));
 		}
 		nonSyncedPageElementList.clear();
 
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageFactoryElement.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageFactoryElement.java
index 4b09a8b..1f0d47e 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageFactoryElement.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageFactoryElement.java
@@ -12,10 +12,10 @@
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
 import org.eclipse.wst.common.frameworks.internal.ConfigurationElementWrapper;
+import org.eclipse.wst.common.frameworks.internal.ui.WTPUIPlugin;
 
 /**
  * This class provides convenient methods for accessing the semantics of the
@@ -86,8 +86,8 @@
 		try {
 			wizardPageFactory = (DMWizardPageExtensionFactory) element.createExecutableExtension(ATT_CLASS_NAME);
 		} catch (CoreException e) {
-			Logger.getLogger().logError("Error getting page factory: " + className); //$NON-NLS-1$ 
-			Logger.getLogger().logError(e);
+			WTPUIPlugin.logError("Error getting page factory: " + className); //$NON-NLS-1$ 
+			WTPUIPlugin.logError(e);
 		} finally {
 			isPageFactoryInitialized = true;
 		}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageGroupElement.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageGroupElement.java
index 8c7aa7e..e95f435 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageGroupElement.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageGroupElement.java
@@ -13,14 +13,15 @@
 
 import java.util.HashSet;
 import java.util.Set;
+
 import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
 import org.eclipse.wst.common.frameworks.internal.AbstractRegistryDescriptor;
 import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
 import org.eclipse.wst.common.frameworks.internal.datamodel.ui.IDMPageGroupHandler;
 import org.eclipse.wst.common.frameworks.internal.datamodel.ui.IDMPageHandler;
 import org.eclipse.wst.common.frameworks.internal.enablement.IdentifiableComparator;
+import org.eclipse.wst.common.frameworks.internal.ui.WTPUIPlugin;
 
 public class DMWizardPageGroupElement extends AbstractRegistryDescriptor implements Comparable {
 	static final String ELEMENT_PAGE_GROUP = "wizardPageGroup"; //$NON-NLS-1$
@@ -81,7 +82,7 @@
   
 	private void validateSettings() {
 		if (wizardID == null || wizardPageFactoryElement == null) {
-			Logger.getLogger().logError("Incomplete page extension specification."); //$NON-NLS-1$
+			WTPUIPlugin.logError("Incomplete page extension specification."); //$NON-NLS-1$
 		}
 	}
 
@@ -264,6 +265,7 @@
 	 * 
 	 * @see org.eclipse.wst.common.frameworks.internal.AbstractRegistryDescriptor#getID()
 	 */
+	@Override
 	public String getID() {
 		return getPageID();
 	}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageGroupFactoryElement.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageGroupFactoryElement.java
index f04ba22..12da463 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageGroupFactoryElement.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DMWizardPageGroupFactoryElement.java
@@ -20,12 +20,12 @@
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
 import org.eclipse.wst.common.frameworks.internal.ConfigurationElementWrapper;
 import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
 import org.eclipse.wst.common.frameworks.internal.datamodel.ui.IDMPageGroupHandler;
 import org.eclipse.wst.common.frameworks.internal.datamodel.ui.IDMPageHandler;
+import org.eclipse.wst.common.frameworks.internal.ui.WTPUIPlugin;
 
 /**
  * @author schacher
@@ -86,8 +86,8 @@
 		try {
 			wizardPageGroupFactory = (DMWizardExtensionFactory) element.createExecutableExtension(ATT_CLASS_NAME);
 		} catch (CoreException e) {
-			Logger.getLogger().logError("Error getting page factory: " + className); //$NON-NLS-1$ 
-			Logger.getLogger().logError(e);
+			WTPUIPlugin.logError("Error getting page factory: " + className); //$NON-NLS-1$ 
+			WTPUIPlugin.logError(e);
 		} finally {
 			isPageGroupFactoryInitialized = true;
 		}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DataModelWizardExtensionReader.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DataModelWizardExtensionReader.java
index 5ce7b73..cc5c041 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DataModelWizardExtensionReader.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/DataModelWizardExtensionReader.java
@@ -14,8 +14,7 @@
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.wst.common.core.util.RegistryReader;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
 import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizard;
 import org.eclipse.wst.common.frameworks.internal.ui.WTPUIPlugin;
@@ -33,16 +32,17 @@
 		super(WTPUIPlugin.PLUGIN_ID, EXTENSION);
 	}
 
+	@Override
 	public boolean readElement(IConfigurationElement element) {
 		if (!element.getName().equals(ELEMENT))
 			return false;
 		String id = element.getAttribute(ATTRIBUTE_ID);
 		if (null == id || id.trim().length() == 0) {
-			Logger.getLogger().logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + ELEMENT + " is missing " + ATTRIBUTE_ID)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			WTPUIPlugin.logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + ELEMENT + " is missing " + ATTRIBUTE_ID)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		}
 		String className = element.getAttribute(ATTRIBUTE_CLASS);
 		if (null == className || className.trim().length() == 0) {
-			Logger.getLogger().logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + ELEMENT + " is missing " + ATTRIBUTE_CLASS)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			WTPUIPlugin.logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + ELEMENT + " is missing " + ATTRIBUTE_CLASS)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		}
 		addExtension(id, element);
 		return true;
@@ -50,7 +50,7 @@
 
 	private void addExtension(String id, IConfigurationElement element) {
 		if (extensions.containsKey(id)) {
-			Logger.getLogger().logError(new RuntimeException("Duplicate " + ELEMENT + " " + ATTRIBUTE_ID + " " + id)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			WTPUIPlugin.logError(new RuntimeException("Duplicate " + ELEMENT + " " + ATTRIBUTE_ID + " " + id)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		}
 		extensions.put(id, element);
 	}
@@ -75,8 +75,7 @@
 			wizard = (DataModelWizard) element.createExecutableExtension(ATTRIBUTE_CLASS);
 			wizard.setDataModel(dataModel);
 		} catch (CoreException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
+			WTPUIPlugin.logError(e);
 		}
 
 		return wizard;
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/ExtensibleViewRegistry.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/ExtensibleViewRegistry.java
index c6aee2c..d89752a 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/ExtensibleViewRegistry.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/ExtensibleViewRegistry.java
@@ -15,13 +15,9 @@
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.RegistryReader;
+import org.eclipse.wst.common.core.util.RegistryReader;
 import org.eclipse.wst.common.frameworks.internal.ui.WTPUIPlugin;
 
-
-/**
- * @author mdelder
- */
 public class ExtensibleViewRegistry extends RegistryReader {
 
 	private static ExtensibleViewRegistry INSTANCE = null;
@@ -62,6 +58,7 @@
 	 * 
 	 * @see org.eclipse.ui.internal.registry.RegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
 	 */
+	@Override
 	public boolean readElement(IConfigurationElement element) {
 		if (element.getName().equals(Elements.EXTENDED_VIEWER)) {
 			Descriptor descriptor = new Descriptor(element);
@@ -120,7 +117,7 @@
 			try {
 				factoryInstance = (IExtensibleViewFactory) this.element.createExecutableExtension(getFactoryClass());
 			} catch (CoreException e) {
-				WTPUIPlugin.getLogger().logError(e);
+				WTPUIPlugin.logError(e);
 			}
 			return factoryInstance;
 		}
@@ -167,6 +164,7 @@
 			return viewerID;
 		}
 
+		@Override
 		public String toString() {
 			if (toStringCache == null)
 				toStringCache = "ExtensibleViewRegistry.Info [viewerID=\"" + getViewerID() + "\",parentViewerID=\"" + getParentViewerID() + "\",factoryClass=" + getFactoryClass() + "\",functionGroupID=\"" + getFunctionGroupID() + "\"]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/IOperationNode.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/IOperationNode.java
index 747b5ca..79eea7b 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/IOperationNode.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/operation/extensionui/IOperationNode.java
@@ -10,17 +10,11 @@
  *******************************************************************************/
 /*
  * Created on May 5, 2004
- * 
- * TODO To change the template for this generated file go to Window -
- * Preferences - Java - Code Generation - Code and Comments
  */
 package org.eclipse.wst.common.frameworks.internal.operation.extensionui;
 
 /**
  * @author mdelder
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Generation - Code and Comments
  */
 public interface IOperationNode {
 
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/AbstractWTPUIPlugin.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/AbstractWTPUIPlugin.java
index 583f298..de7035d 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/AbstractWTPUIPlugin.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/AbstractWTPUIPlugin.java
@@ -18,14 +18,10 @@
 
 import java.util.ResourceBundle;
 
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jem.util.logger.proxyrender.DefaultPluginTraceRenderer;
-import org.eclipse.jem.util.logger.proxyrender.IMsgLogger;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.osgi.framework.BundleContext;
 
-public abstract class AbstractWTPUIPlugin extends AbstractUIPlugin implements IMsgLogger {
-	protected static Logger logger = null;
+public abstract class AbstractWTPUIPlugin extends AbstractUIPlugin {
 	public ResourceBundle resourceBundle;
 	protected static AbstractWTPUIPlugin instance = null; 
 
@@ -37,29 +33,14 @@
 		instance = this;
 	}
 
-	public Logger getMsgLogger() {
-		if (logger == null) {
-			logger = Logger.getLogger(getPluginID());
-			setRenderer(logger);
-		}
-		return logger;
-	}
-
 	public abstract String getPluginID();
 
-	/**
-	 * @param aLogger
-	 */
-	protected void setRenderer(Logger aLogger) {
-		new DefaultPluginTraceRenderer(aLogger);
-	}
-	
-
 	/*
 	 * (non-Javadoc)
 	 * 
 	 * @see org.eclipse.core.runtime.Plugin#startup()
 	 */
+	@Override
 	public void start(BundleContext context) throws Exception  {
 		super.start(context);
 	}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/DisplayUtility.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/DisplayUtility.java
index 647f58e..daca40e 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/DisplayUtility.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/DisplayUtility.java
@@ -10,9 +10,6 @@
  *******************************************************************************/
 /*
  * Created on Apr 19, 2004
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Generation - Code and Comments
  */
 package org.eclipse.wst.common.frameworks.internal.ui;
 
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ErrorDialog.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ErrorDialog.java
index 6c24426..a4fa24e 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ErrorDialog.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ErrorDialog.java
@@ -62,6 +62,7 @@
 
 	//Workaround. SWT does not seem to set rigth the default button if
 	//there is not control with focus. Bug: 14668
+	@Override
 	public int open() {
 		create();
 		Button b = getButton(defaultButtonIndex);
@@ -80,6 +81,7 @@
 	/*
 	 * (non-Javadoc) Method declared on Dialog.
 	 */
+	@Override
 	protected void buttonPressed(int buttonId) {
 		if (buttonId == detailButtonID) {
 			toggleDetailsArea();
@@ -157,6 +159,7 @@
 		return dialog.open() == 0;
 	}
 
+	@Override
 	protected Control createDialogArea(Composite parent) {
 		// create a composite with standard margins and spacing
 		Composite composite = new Composite(parent, SWT.NONE);
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ListMessageDialog.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ListMessageDialog.java
index aed38af..4c11cad 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ListMessageDialog.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/ListMessageDialog.java
@@ -10,9 +10,6 @@
  *******************************************************************************/
 /*
  * Created on Aug 5, 2004
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Generation - Code and Comments
  */
 package org.eclipse.wst.common.frameworks.internal.ui;
 
@@ -28,9 +25,6 @@
 
 /**
  * @author dfholt
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Generation - Code and Comments
  */
 public class ListMessageDialog extends MessageDialog {
 	protected String[] listItems;
@@ -93,6 +87,7 @@
 	 *            parent composite to contain the custom area
 	 * @return the custom area control, or <code>null</code>
 	 */
+	@Override
 	protected Control createCustomArea(Composite parent) {
 
 		Composite composite = new Composite(parent, 0);
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/MenuEnablementPropertyTester.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/MenuEnablementPropertyTester.java
new file mode 100644
index 0000000..dc1afbf
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/MenuEnablementPropertyTester.java
@@ -0,0 +1,36 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.frameworks.internal.ui;
+
+import java.util.List;
+
+import org.eclipse.core.expressions.IPropertyTester;
+import org.eclipse.core.expressions.PropertyTester;
+
+public class MenuEnablementPropertyTester extends PropertyTester{
+
+	static private List<MenuEnablerExtension>  list = MenuEnablerExtensionReader.getInstance().getMenuEnabler();	
+	public boolean test(Object receiver, String property, Object[] args,
+			Object expectedValue) {
+
+		if( list != null && list.size() > 0 ){
+			MenuEnablerExtension menuEnablerExtension = list.get( 0 );
+			IPropertyTester tester =  menuEnablerExtension.getInstance();
+			if( tester != null ){
+				return tester.test( receiver, property, args, expectedValue );
+			}
+			return true;
+		}
+		return true;
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/MenuEnablerExtension.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/MenuEnablerExtension.java
new file mode 100644
index 0000000..2c1dbbd
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/MenuEnablerExtension.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.frameworks.internal.ui;
+
+import org.eclipse.core.expressions.IPropertyTester;
+import org.eclipse.core.runtime.IConfigurationElement;
+
+
+public class MenuEnablerExtension {
+
+	public static final String ATT_ID = "id"; //$NON-NLS-1$
+	public static final String MENU_ENABLER_EXTENSION = "menuenabler"; //$NON-NLS-1$
+	
+	private String id = null;
+	private IConfigurationElement element;
+	//private IMenuEnabler instance;
+	private IPropertyTester instance;
+	private boolean errorCondition = false;
+	
+	public MenuEnablerExtension(){
+		super();
+	}
+	
+	private void init() {
+		id = element.getAttribute(ATT_ID);
+	}
+
+	/**
+	 * @return Returns the id.
+	 */
+	public String getId() {
+		return id;
+	}
+
+	/**
+	 * @param id
+	 *            The id to set.
+	 */
+	public void setId(String id) {
+		this.id = id;
+	}
+	
+	public MenuEnablerExtension(IConfigurationElement element) {
+		this.element = element;
+		init();
+	}
+	
+	public IPropertyTester getInstance() {
+		try {
+			if (instance == null && !errorCondition)
+				instance = (IPropertyTester) element.createExecutableExtension("className"); //$NON-NLS-1$
+		} catch (Throwable e) {
+			errorCondition = true;
+		}
+		return instance;
+	}	
+}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/MenuEnablerExtensionReader.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/MenuEnablerExtensionReader.java
new file mode 100644
index 0000000..684b964
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/MenuEnablerExtensionReader.java
@@ -0,0 +1,59 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.frameworks.internal.ui;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.wst.common.core.util.RegistryReader;
+
+
+
+public class MenuEnablerExtensionReader extends RegistryReader {
+
+	private static MenuEnablerExtensionReader instance = null;
+	private List<MenuEnablerExtension> pageExtenders = null;
+	
+	public MenuEnablerExtensionReader(){
+		super("org.eclipse.wst.common.frameworks.ui", "MenuEnabler"); //$NON-NLS-1$ //$NON-NLS-2$ 
+	}
+	
+
+	public static MenuEnablerExtensionReader getInstance() {
+		if (instance == null) {
+			instance = new MenuEnablerExtensionReader();
+			instance.readRegistry();
+		}
+		return instance;
+	}
+	
+	@Override
+	public boolean readElement(IConfigurationElement element) {
+		if (MenuEnablerExtension.MENU_ENABLER_EXTENSION.equals(element.getName())) {
+			addExtension(element);
+			return true;
+		}
+		return false;
+	}
+	
+	protected void addExtension(IConfigurationElement newExtension) {
+		getMenuEnabler().add(new MenuEnablerExtension(newExtension));
+	}
+	
+	public List<MenuEnablerExtension> getMenuEnabler() {
+		if (pageExtenders == null)
+			pageExtenders = new ArrayList<MenuEnablerExtension>();
+		return pageExtenders;
+	}	
+
+}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/NewProjectGroup.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/NewProjectGroup.java
index 6bb33f6..15067f1 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/NewProjectGroup.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/NewProjectGroup.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
+ * Copyright (c) 2003, 2009 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
@@ -13,6 +13,7 @@
 import java.io.File;
 
 import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.layout.GridDataFactory;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
@@ -44,7 +45,7 @@
 	// default values
 	private String defProjectNameLabel = WTPCommonUIResourceHandler.Name_;
 	private String defBrowseButtonLabel = WTPCommonUIResourceHandler.Browse_;
-	private static final String defDirDialogLabel = "Directory"; //$NON-NLS-1$
+	private String defDirDialogLabel = WTPCommonUIResourceHandler.DefDirDialogLabel_;
 
 	private DataModelSynchHelper synchHelper;
 
@@ -105,14 +106,11 @@
 		projectGroup.setText(InternalCommonWorkbenchMessages.WizardNewProjectCreationPage_projectContentsLabel);
 
 		final Button useDefaultsButton = new Button(projectGroup, SWT.CHECK | SWT.RIGHT);
+		GridDataFactory.defaultsFor(useDefaultsButton).span(3,1).applyTo(useDefaultsButton);
 		useDefaultsButton.setText(InternalCommonWorkbenchMessages.WizardNewProjectCreationPage_useDefaultLabel);
 		useDefaultsButton.setFont(font);
 		synchHelper.synchCheckbox(useDefaultsButton, USE_DEFAULT_LOCATION, null);
 
-		GridData buttonData = new GridData();
-		buttonData.horizontalSpan = 3;
-		useDefaultsButton.setLayoutData(buttonData);
-
 		createUserSpecifiedProjectLocationGroup(projectGroup);
 	}
 
@@ -132,9 +130,11 @@
 
 		// browse button
 		browseButton = new Button(projectGroup, SWT.PUSH);
+		GridDataFactory.defaultsFor(browseButton).applyTo(browseButton);
 		browseButton.setFont(font);
 		browseButton.setText(defBrowseButtonLabel);
 		browseButton.addSelectionListener(new SelectionAdapter() {
+			@Override
 			public void widgetSelected(SelectionEvent event) {
 				handleLocationBrowseButtonPressed();
 			}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/OverlayIcon.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/OverlayIcon.java
index 8ff7b0a..f623ed4 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/OverlayIcon.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/OverlayIcon.java
@@ -68,6 +68,7 @@
 		}
 	}
 
+	@Override
 	protected void drawCompositeImage(int width, int height) {
 		ImageData bg = fBase.getImageData();
 		drawImage(bg, 0, 0);
@@ -115,6 +116,7 @@
 		}
 	}
 
+	@Override
 	protected Point getSize() {
 		return fSize;
 	}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/PageGroupManager.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/PageGroupManager.java
index 9917589..c3fd902 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/PageGroupManager.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/PageGroupManager.java
@@ -24,7 +24,6 @@
 import org.eclipse.core.runtime.IExtensionPoint;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Platform;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.jface.wizard.IWizardPage;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
 import org.eclipse.wst.common.frameworks.internal.datamodel.IDataModelPausibleOperation;
@@ -117,12 +116,12 @@
 		try {
 			pageFound = findNextPage(true);
 		} catch (Exception exc) {
-			Logger.getLogger().logError(exc);
+			WTPUIPlugin.logError(exc);
 			if (rootOperation != null) {
 				try {
 					rootOperation.rollBack(null, null);
 				} catch (ExecutionException e) {
-					Logger.getLogger().logError(e);
+					WTPUIPlugin.logError(e);
 				}
 			}
 			pageFound = false;
@@ -155,7 +154,7 @@
 					try {
 						rootOperation.rollBack(null, null);
 					} catch (ExecutionException e) {
-						Logger.getLogger().logError(e);
+						WTPUIPlugin.logError(e);
 					}
 				}
 			}
@@ -229,7 +228,7 @@
 		IExtensionPoint point = Platform.getExtensionRegistry().getExtensionPoint(CommonUIPluginConstants.PLUGIN_ID, ELEMENT_PAGE_GROUP);
 		IConfigurationElement[] allElements = point.getConfigurationElements();
 		for (int i = 0; i < allElements.length; i++) {
-			IConfigurationElement element = (IConfigurationElement) allElements[i];
+			IConfigurationElement element = allElements[i];
 			if (ELEMENT_PAGE_GROUP.equals(element.getName())) {
 				result.add(element);
 			}
@@ -274,12 +273,14 @@
 					try {
 						status = rootOperation.resume(null, null);
 					} catch (ExecutionException e) {
-						Logger.getLogger().logError(e);
+						WTPUIPlugin.logError(e);
 					}
 					nextStackEntry.ranOperations = true;
-
-					if (status.getSeverity() == IStatus.ERROR) {
-						// TODO need a better error feedback mechanism here.
+					
+					// TODO need a better error feedback mechanism here.
+					if(status == null){
+						throw new IllegalArgumentException();
+					} else if (status.getSeverity() == IStatus.ERROR) {
 						throw new IllegalArgumentException(status.getMessage());
 					}
 				}
@@ -409,7 +410,7 @@
 				try {
 					newPageId = pageGroupEntry.getPageHandler().getNextPage(pageId, expectedId);
 				} catch (Exception exc) {
-					Logger.getLogger().logError(exc);
+					WTPUIPlugin.logError(exc);
 				}
 
 				if (newPageId != null && newPageId.equals(IDMPageHandler.SKIP_PAGE) && pageIndex >= 0 && pageIndex < pages.size() - 2) {
@@ -430,7 +431,7 @@
 			try {
 				nextGroupID = pageGroupEntry.getPageGroupHandler().getNextPageGroup(afterId, groupIDList);
 			} catch (Exception exc) {
-				Logger.getLogger().logError(exc);
+				WTPUIPlugin.logError(exc);
 			}
 
 			if (nextGroupID != null) {
@@ -497,19 +498,12 @@
 			return pageGroup.getPages(dataModel);
 		}
 
-		public PageGroupEntry(PageGroupEntry originalEntry) {
-			pageGroup = originalEntry.pageGroup;
-			groupsThatFollow = originalEntry.groupsThatFollow;
-			pageHandler = originalEntry.pageHandler;
-			pageGroupHandler = originalEntry.pageGroupHandler;
-		}
-
 		private void init() {
 			try {
 				pageHandler = pageGroup.getPageHandler(dataModel);
 				pageGroupHandler = pageGroup.getPageGroupHandler(dataModel);
 			} catch (Exception exc) {
-				Logger.getLogger().logError(exc);
+				WTPUIPlugin.logError(exc);
 			}
 
 			if (pageHandler == null)
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/SimplePageGroupHandler.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/SimplePageGroupHandler.java
index c68ee57..22ad059 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/SimplePageGroupHandler.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/SimplePageGroupHandler.java
@@ -26,10 +26,7 @@
 				// array if there is one.
 				if (index + 1 < pageGroupIDs.length) {
 					result = pageGroupIDs[index + 1];
-				} else {
-					result = null;
 				}
-
 				break;
 			}
 		}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/SimpleValidateEditContextUI.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/SimpleValidateEditContextUI.java
index e9bb587..be99af0 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/SimpleValidateEditContextUI.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/SimpleValidateEditContextUI.java
@@ -14,11 +14,11 @@
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.swt.widgets.Display;
-import org.eclipse.wst.common.frameworks.internal.ISimpleValidateEditContext;
 import org.eclipse.wst.common.frameworks.internal.SimpleValidateEditContextHeadless;
 
-public class SimpleValidateEditContextUI extends SimpleValidateEditContextHeadless implements ISimpleValidateEditContext {
+public class SimpleValidateEditContextUI extends SimpleValidateEditContextHeadless {
 
+	@Override
 	protected IStatus validateEditImpl(final IFile[] filesToValidate) {
 		final IStatus [] status = new IStatus[1];
 		Display.getDefault().syncExec(new Runnable() {
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimedKeyListener.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimedKeyListener.java
index 7f3c7b4..7eee181 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimedKeyListener.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimedKeyListener.java
@@ -119,6 +119,7 @@
 	 * 
 	 * @see org.eclipse.wst.common.frameworks.internal.ui.util.Timer#getSource()
 	 */
+	@Override
 	protected Object getSource() {
 		return monitoringTarget;
 	}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimedModifyListener.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimedModifyListener.java
index 98045fe..c540c4e 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimedModifyListener.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimedModifyListener.java
@@ -19,10 +19,9 @@
  */
 import java.awt.event.ActionListener;
 
-import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.widgets.Widget;
 
-public class TimedModifyListener extends TimedKeyListener implements ModifyListener {
+public class TimedModifyListener extends TimedKeyListener {
 	/**
 	 * J2EETimedModefyListener constructor comment.
 	 * 
@@ -48,6 +47,7 @@
 	/*
 	 * Re/Start the timer
 	 */
+	@Override
 	public void modifyText(org.eclipse.swt.events.ModifyEvent e) {
 		monitoringTarget = (Widget) e.getSource();
 		restart();
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimerQueue.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimerQueue.java
index 62442f4..a86a0d8 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimerQueue.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/TimerQueue.java
@@ -209,6 +209,7 @@
 		notify();
 	}
 
+	@Override
 	public synchronized String toString() {
 		StringBuffer buf;
 		Timer nextTimer;
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UIEnablementIdentifier.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UIEnablementIdentifier.java
index 8c7e54e..1d999f6 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UIEnablementIdentifier.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UIEnablementIdentifier.java
@@ -69,12 +69,12 @@
 	 * 
 	 * @see org.eclispe.wst.common.frameworks.internal.enablement.EnablementIdentifier#getNewEnabled()
 	 */
+	@Override
 	protected boolean getNewEnabled() {
 		IIdentifier identifier = getActivityIdentifier();
 		if (identifier != null)
 			return identifier.isEnabled() && super.getNewEnabled();
-		else
-			return false;
+		return false;
 	}
 
 	
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UIEnablementManager.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UIEnablementManager.java
index f427422..7a3f93b 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UIEnablementManager.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UIEnablementManager.java
@@ -38,8 +38,7 @@
 	protected IActivityManager getActivityManager() {
 		if (getActivitySupport() != null)
 			return getActivitySupport().getActivityManager();
-		else
-			return null;
+		return null;
 	}
 
 	/**
@@ -67,6 +66,7 @@
 	 * @see org.eclipse.wst.common.frameworks.internal.enablement.EnablementManager#createIdentifier(java.lang.String,
 	 *      org.eclipse.core.resources.IProject)
 	 */
+	@Override
 	protected EnablementIdentifier createIdentifier(String identifierId, IProject project) {
 		return new UIEnablementIdentifier(identifierId, project);
 	}
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UIOperationHandler.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UIOperationHandler.java
index 53ccd53..34206c9 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UIOperationHandler.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UIOperationHandler.java
@@ -10,9 +10,6 @@
  *******************************************************************************/
 /*
  * Created on Aug 5, 2004
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Generation - Code and Comments
  */
 package org.eclipse.wst.common.frameworks.internal.ui;
 
@@ -24,9 +21,6 @@
 
 /**
  * @author dfholt
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Generation - Code and Comments
  */
 public class UIOperationHandler implements IOperationHandler {
 	protected Shell parentShell;
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UITesterImpl.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UITesterImpl.java
index db7ba7a..c82a6cc 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UITesterImpl.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/UITesterImpl.java
@@ -8,24 +8,11 @@
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
-/*
- * Created on Oct 27, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
 package org.eclipse.wst.common.frameworks.internal.ui;
 
-import org.eclipse.jem.util.UITester;
 import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.common.core.util.UITester;
 
-
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
 public class UITesterImpl implements UITester {
 
 	/**
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPCommonUIResourceHandler.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPCommonUIResourceHandler.java
index 3805719..171513c 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPCommonUIResourceHandler.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPCommonUIResourceHandler.java
@@ -10,9 +10,6 @@
  *******************************************************************************/
 /*
  * Created on May 23, 2004
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
  */
 package org.eclipse.wst.common.frameworks.internal.ui;
 
@@ -20,9 +17,6 @@
 
 /**
  * @author vijayb
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Style - Code Templates
  */
 public class WTPCommonUIResourceHandler extends NLS {
 	private static final String BUNDLE_NAME = "wtpcommonui";//$NON-NLS-1$
@@ -58,6 +52,7 @@
 	public static String WizardPageExtensionManager_UI_1;
 	public static String WizardPageExtensionManager_UI_0;
 	public static String Delete_UI_0;
+	public static String DefDirDialogLabel_;
 
 	static {
 		NLS.initializeMessages(BUNDLE_NAME, WTPCommonUIResourceHandler.class);
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPGenericActionIds.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPGenericActionIds.java
index faaa453..dc1b8e4 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPGenericActionIds.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPGenericActionIds.java
@@ -10,17 +10,11 @@
  *******************************************************************************/
 /*
  * Created on Jun 16, 2004
- *
- * TODO To change the template for this generated file go to
- * Window - Preferences - Java - Code Style - Code Templates
  */
 package org.eclipse.wst.common.frameworks.internal.ui;
 
 /**
  * @author mdelder
- * 
- * TODO To change the template for this generated type comment go to Window - Preferences - Java -
- * Code Style - Code Templates
  */
 public interface WTPGenericActionIds {
 
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPUIPlugin.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPUIPlugin.java
index 3f27cb9..05169a1 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPUIPlugin.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WTPUIPlugin.java
@@ -18,11 +18,13 @@
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.jface.operation.IRunnableWithProgress;
 import org.eclipse.ui.IWorkbench;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
 import org.eclipse.wst.common.frameworks.internal.operations.IHeadlessRunnableWithProgress;
+import org.eclipse.core.runtime.Platform;
+import java.lang.Throwable;
+import org.eclipse.core.runtime.CoreException;
 
 /**
  * The main plugin class to be used in the desktop.
@@ -72,10 +74,6 @@
 		return plugin;
 	}
 
-	public static Logger getLogger() {
-		return Logger.getLogger(PLUGIN_ID);
-	}
-
 	/**
 	 * Returns the workspace instance.
 	 */
@@ -136,5 +134,25 @@
     {
         log( new Status( IStatus.ERROR, PLUGIN_ID, IStatus.OK, msg, null ) );
     }
+
+	public static IStatus createStatus(int severity, String message, Throwable exception) {
+		return new Status(severity, PLUGIN_ID, message, exception);
+	}
+
+	public static IStatus createStatus(int severity, String message) {
+		return createStatus(severity, message, null);
+	}
+
+	public static void logError(Throwable exception) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( createStatus(IStatus.ERROR, exception.getMessage(), exception));
+	}
+
+	public static void logError(CoreException exception) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( exception.getStatus() );
+	}
+
+	public static void logError(String message) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( createStatus(IStatus.ERROR, message));
+	}
     
 }
diff --git a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WorkspaceModifyComposedOperation.java b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WorkspaceModifyComposedOperation.java
index 58c8419..f47b6b2 100644
--- a/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WorkspaceModifyComposedOperation.java
+++ b/plugins/org.eclipse.wst.common.frameworks.ui/wtp_ui/org/eclipse/wst/common/frameworks/internal/ui/WorkspaceModifyComposedOperation.java
@@ -65,6 +65,7 @@
 		return getRunnables().add(nestedOp);
 	}
 
+	@Override
 	protected void execute(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
 		try{
 			List runnables = getRunnables();
diff --git a/plugins/org.eclipse.wst.common.frameworks/.classpath b/plugins/org.eclipse.wst.common.frameworks/.classpath
index b9e915c..f34d912 100644
--- a/plugins/org.eclipse.wst.common.frameworks/.classpath
+++ b/plugins/org.eclipse.wst.common.frameworks/.classpath
@@ -2,7 +2,7 @@
 <classpath>
 	<classpathentry kind="src" path="src/"/>
 	<classpathentry kind="src" path="src-non_workbench/"/>
-	<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.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/plugins/org.eclipse.wst.common.frameworks/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.wst.common.frameworks/.settings/org.eclipse.jdt.core.prefs
index b290b5f..037a4e5 100644
--- a/plugins/org.eclipse.wst.common.frameworks/.settings/org.eclipse.jdt.core.prefs
+++ b/plugins/org.eclipse.wst.common.frameworks/.settings/org.eclipse.jdt.core.prefs
@@ -1,62 +1,95 @@
-#Sat Mar 24 02:07:18 EDT 2007
-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=ignore
-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.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
-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=error
-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=error
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=ignore
-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=error
-org.eclipse.jdt.core.compiler.problem.unusedLocal=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+#Mon Jun 08 15:35:45 EDT 2009
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
+org.eclipse.jdt.core.compiler.problem.unnecessaryElse=error
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=error
+org.eclipse.jdt.core.compiler.problem.unusedLocal=error
+org.eclipse.jdt.core.compiler.problem.emptyStatement=error
+org.eclipse.jdt.core.compiler.problem.unusedLabel=error
+org.eclipse.jdt.core.compiler.problem.unusedParameter=warning
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
+org.eclipse.jdt.core.incompatibleJDKLevel=ignore
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
+org.eclipse.jdt.core.builder.cleanOutputFolder=clean
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=enabled
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
 org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=error
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=enabled
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=error
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+org.eclipse.jdt.core.builder.recreateModifiedClassFileInOutputFolder=ignore
+org.eclipse.jdt.core.builder.resourceCopyExclusionFilter=*.launch
+org.eclipse.jdt.core.classpath.multipleOutputLocations=enabled
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error
+org.eclipse.jdt.core.builder.invalidClasspath=abort
+org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=error
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=error
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=error
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=error
+org.eclipse.jdt.core.compiler.problem.nullReference=error
+org.eclipse.jdt.core.compiler.source=1.5
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.builder.duplicateResourceTask=warning
+org.eclipse.jdt.core.compiler.problem.fieldHiding=error
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=warning
+org.eclipse.jdt.core.classpath.exclusionPatterns=enabled
+org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=error
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
+org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=error
+eclipse.preferences.version=1
+org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=error
+org.eclipse.jdt.core.compiler.problem.deadCode=error
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=enabled
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=error
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeUncheckedExceptions=disabled
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=warning
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
 org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=ignore
-org.eclipse.jdt.core.compiler.source=1.3
+org.eclipse.jdt.core.compiler.problem.autoboxing=warning
+org.eclipse.jdt.core.circularClasspath=error
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=error
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=error
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.maxProblemPerUnit=100
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=error
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
+instance/org.eclipse.core.net/org.eclipse.core.net.hasMigrated=true
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
diff --git a/plugins/org.eclipse.wst.common.frameworks/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.common.frameworks/META-INF/MANIFEST.MF
index 24494b1..6a25ad7 100644
--- a/plugins/org.eclipse.wst.common.frameworks/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.wst.common.frameworks/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.wst.common.frameworks; singleton:=true
-Bundle-Version: 1.1.200.qualifier
+Bundle-Version: 1.2.0.qualifier
 Bundle-Activator: org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin
 Bundle-Vendor: %provider
 Bundle-Localization: plugin
@@ -18,8 +18,8 @@
 Require-Bundle: org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.core.commands;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.jem.util;bundle-version="[2.0.100,3.0.0)",
  org.eclipse.wst.common.environment;bundle-version="[1.0.200,2.0.0)";visibility:=reexport,
- org.eclipse.emf.ecore;bundle-version="[2.4.0,3.0.0)"
+ org.eclipse.emf.ecore;bundle-version="[2.4.0,3.0.0)",
+ org.eclipse.wst.common.core;bundle-version="[1.2.0,2.0.0)"
 Eclipse-LazyStart: true
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/plugins/org.eclipse.wst.common.frameworks/plugin.xml b/plugins/org.eclipse.wst.common.frameworks/plugin.xml
index 0ac2055..b817e73 100644
--- a/plugins/org.eclipse.wst.common.frameworks/plugin.xml
+++ b/plugins/org.eclipse.wst.common.frameworks/plugin.xml
@@ -10,7 +10,7 @@
    <extension
          id="context.Sensitive.Class.saveHandler"
          name="Save Handler - Headless Context Class"
-         point="org.eclipse.jem.util.uiContextSensitiveClass">
+         point="org.eclipse.wst.common.core.uiContextSensitiveClass">
       <uiContextSensitiveClass
             key="saveHandler"
             context="Headless"
@@ -19,7 +19,7 @@
    </extension>
    <extension
          id="org.eclipse.wst.common.frameworks.internal.enablement"
-         point="org.eclipse.jem.util.uiContextSensitiveClass">
+         point="org.eclipse.wst.common.core.uiContextSensitiveClass">
       <uiContextSensitiveClass
             key="org.eclipse.wst.common.frameworks.internal.EnablementDetermination"
             context="Headless"
@@ -27,7 +27,7 @@
       </uiContextSensitiveClass>
    </extension>
    <extension 
-       point="org.eclipse.jem.util.uiContextSensitiveClass">
+       point="org.eclipse.wst.common.core.uiContextSensitiveClass">
        <uiContextSensitiveClass
           key="ISimpleValidateEditContext"
           className="org.eclipse.wst.common.frameworks.internal.SimpleValidateEditContextHeadless"
diff --git a/plugins/org.eclipse.wst.common.frameworks/src-non_workbench/org/eclipse/wst/common/frameworks/internal/enablement/nonui/WFTWrappedException.java b/plugins/org.eclipse.wst.common.frameworks/src-non_workbench/org/eclipse/wst/common/frameworks/internal/enablement/nonui/WFTWrappedException.java
index 9a59c94..70990f5 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src-non_workbench/org/eclipse/wst/common/frameworks/internal/enablement/nonui/WFTWrappedException.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src-non_workbench/org/eclipse/wst/common/frameworks/internal/enablement/nonui/WFTWrappedException.java
@@ -57,6 +57,7 @@
 	/**
 	 * Print out a stack trace to the system err.
 	 */
+	@Override
 	public void printStackTrace() {
 		printStackTrace(System.err);
 	}
@@ -64,6 +65,7 @@
 	/**
 	 * Prints the exception to System.err. If we have a nested exception, print its stack.
 	 */
+	@Override
 	public void printStackTrace(java.io.PrintStream s) {
 		if (getTargetException() != null) {
 			s.println(this);
@@ -79,6 +81,7 @@
 	/**
 	 * Prints the exception to System.err. If we have a nested exception, print its stack.
 	 */
+	@Override
 	public void printStackTrace(java.io.PrintWriter s) {
 		if (getTargetException() != null) {
 			s.println(this);
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/AbstractDataModelOperation.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/AbstractDataModelOperation.java
index 705b22a..00f877f 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/AbstractDataModelOperation.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/AbstractDataModelOperation.java
@@ -173,6 +173,7 @@
 	 * Default empty implementation of redo.
 	 * </p>
 	 */
+	@Override
 	public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
 		return Status.OK_STATUS;
 	}
@@ -182,6 +183,7 @@
 	 * Default empty implementation of undo.
 	 * </p>
 	 */
+	@Override
 	public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
 		return Status.OK_STATUS;
 	}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/DataModelFactory.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/DataModelFactory.java
index 5cb0732..3682a6d 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/DataModelFactory.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/DataModelFactory.java
@@ -10,9 +10,9 @@
  *******************************************************************************/
 package org.eclipse.wst.common.frameworks.datamodel;
 
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.wst.common.frameworks.internal.datamodel.DataModelExtensionReader;
 import org.eclipse.wst.common.frameworks.internal.datamodel.DataModelImpl;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
 
 /**
  * <p>
@@ -96,7 +96,7 @@
 	public static IDataModel createDataModel(Class aClass) {
 		if(aClass.isInterface()){
 				try{
-					Class clazz = (Class)aClass.getField("_provider_class").get(null);
+					Class clazz = (Class)aClass.getField("_provider_class").get(null); //$NON-NLS-1$
 					if(clazz != null){
 						IDataModelProvider provider = (IDataModelProvider)clazz.newInstance();
 						return createDataModel(provider);
@@ -104,13 +104,13 @@
 				} catch (NoSuchFieldException e) {
 					//ignore; the interface may not have defined the field and is relying on extensions.
 				} catch (IllegalArgumentException e) {
-					Logger.getLogger().logError(e);
+					WTPCommonPlugin.logError(e);
 				} catch (SecurityException e) {
-					Logger.getLogger().logError(e);
+					WTPCommonPlugin.logError(e);
 				} catch (IllegalAccessException e) {
-					Logger.getLogger().logError(e);
+					WTPCommonPlugin.logError(e);
 				} catch (InstantiationException e) {
-					Logger.getLogger().logError(e);
+					WTPCommonPlugin.logError(e);
 				}  
 		}
 		return createDataModel(aClass.getName());
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/DataModelPropertyDescriptor.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/DataModelPropertyDescriptor.java
index 2154ecc..dc757df 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/DataModelPropertyDescriptor.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/datamodel/DataModelPropertyDescriptor.java
@@ -134,6 +134,7 @@
 		return (null != str) ? str : ""; //$NON-NLS-1$
 	}
 	
+	@Override
 	public String toString(){
 		return getPropertyDescription();
 	}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SaveHandlerHeadless.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SaveHandlerHeadless.java
index a9c07ce..2ae150f 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SaveHandlerHeadless.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SaveHandlerHeadless.java
@@ -12,8 +12,8 @@
 package org.eclipse.wst.common.frameworks.internal;
 
 import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.wst.common.frameworks.internal.enablement.nonui.IWFTWrappedException;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
 
 /**
  * Insert the type's description here. Creation date: (10/19/2001 11:40:59 AM)
@@ -80,7 +80,7 @@
 		if (aFile == null)
 			return false;
 		String error = WTPResourceHandler.getString("Unable_to_save_read-only_f_ERROR_", new Object[]{aFile.getFullPath()}); //$NON-NLS-1$ = "Unable to save read-only file: "
-		Logger.getLogger().logError(error);
+		WTPCommonPlugin.logError(error);
 		return false;
 	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SaveHandlerRegister.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SaveHandlerRegister.java
index 7dee26d..7aaef00 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SaveHandlerRegister.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SaveHandlerRegister.java
@@ -10,8 +10,7 @@
  *******************************************************************************/
 package org.eclipse.wst.common.frameworks.internal;
 
-import org.eclipse.jem.util.UIContextDetermination;
-
+import org.eclipse.wst.common.core.util.UIContextDetermination;
 
 /**
  * A registry for the default ISaveHandler to use when saving edit models
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SimpleValidateEdit.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SimpleValidateEdit.java
index ec84468..f8d6acb 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SimpleValidateEdit.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/SimpleValidateEdit.java
@@ -14,7 +14,7 @@
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jem.util.UIContextDetermination;
+import org.eclipse.wst.common.core.util.UIContextDetermination;
 
 public class SimpleValidateEdit {
 
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WTPPlugin.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WTPPlugin.java
index e33fdf6..7f798ba 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WTPPlugin.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WTPPlugin.java
@@ -8,26 +8,16 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
-/*
- * Created on Dec 10, 2003
- * 
- * To change the template for this generated file go to Window - Preferences - Java - Code
- * Generation - Code and Comments
- */
 package org.eclipse.wst.common.frameworks.internal;
 
 import java.util.ResourceBundle;
 
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Plugin;
-import org.eclipse.jem.util.logger.proxy.Logger;
-import org.eclipse.jem.util.logger.proxyrender.DefaultPluginTraceRenderer;
-import org.eclipse.jem.util.logger.proxyrender.IMsgLogger;
 import org.eclipse.wst.common.frameworks.internal.enablement.nonui.WorkbenchUtil;
 import org.osgi.framework.BundleContext;
 
-public abstract class WTPPlugin extends Plugin implements IMsgLogger {
-	protected static Logger logger = null;
+public abstract class WTPPlugin extends Plugin {
 	protected static WTPPlugin instance = null; 
 	public ResourceBundle resourceBundle;
 
@@ -39,24 +29,6 @@
 		instance = this;
 	}
 
-	public Logger getMsgLogger() {
-		if (logger == null) {
-			logger = Logger.getLogger(getPluginID());
-			setRenderer(logger);
-		}
-		return logger;
-	}
-
-	/**
-	 * @param aLogger
-	 */
-	protected void setRenderer(Logger aLogger) {
-		new DefaultPluginTraceRenderer(aLogger);
-	}
-
-	public Logger getLogger() {
-		return getMsgLogger();
-	}
 	public static boolean isPlatformCaseSensitive() {
 		return Platform.OS_MACOSX.equals(Platform.getOS()) ? false : new
 				java.io.File("a").compareTo(new java.io.File("A")) != 0;  //$NON-NLS-1$//$NON-NLS-2$
@@ -69,6 +41,7 @@
 	 * 
 	 * @see org.eclipse.core.runtime.Plugin#startup()
 	 */
+	@Override
 	public void start(BundleContext context) throws Exception  {
 		super.start(context);
 		WorkbenchUtil.setWorkbenchIsRunning(true);
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WrappedException.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WrappedException.java
index cd2aba8..3c182d1 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WrappedException.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WrappedException.java
@@ -49,6 +49,7 @@
 	/**
 	 * Print out a stack trace to the system err.
 	 */
+	@Override
 	public void printStackTrace() {
 		printStackTrace(System.err);
 	}
@@ -56,6 +57,7 @@
 	/**
 	 * Prints the exception to System.err. If we have a nested exception, print its stack.
 	 */
+	@Override
 	public void printStackTrace(java.io.PrintStream s) {
 		if (getTargetException() != null) {
 			s.println(this);
@@ -69,6 +71,7 @@
 	/**
 	 * Prints the exception to System.err. If we have a nested exception, print its stack.
 	 */
+	@Override
 	public void printStackTrace(java.io.PrintWriter s) {
 		if (getTargetException() != null) {
 			s.println(this);
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WrappedRuntimeException.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WrappedRuntimeException.java
index 351de84..7e9895f 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WrappedRuntimeException.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/WrappedRuntimeException.java
@@ -77,6 +77,7 @@
 	 * <code>Throwable.getCause()</code>.
 	 * @return The nested exception held by the receiver.
 	 */
+	@Override
 	public java.lang.Throwable getCause() {
 		return getNestedException();
 	}
@@ -84,6 +85,7 @@
 	/**
 	 * Print out a stack trace to the system err.
 	 */
+	@Override
 	public void printStackTrace() {
 		printStackTrace(System.err);
 	}
@@ -91,6 +93,7 @@
 	/**
 	 * Prints the exception to System.err. If we have a nested exception, print its stack.
 	 */
+	@Override
 	public void printStackTrace(java.io.PrintStream s) {
 		if (nestedException != null) {
 			s.println(this);
@@ -104,6 +107,7 @@
 	/**
 	 * Prints the exception to System.err. If we have a nested exception, print its stack.
 	 */
+	@Override
 	public void printStackTrace(java.io.PrintWriter s) {
 		if (nestedException != null) {
 			s.println(this);
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/activities/WTPActivityBridge.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/activities/WTPActivityBridge.java
index 3538ea4..6c7fa23 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/activities/WTPActivityBridge.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/activities/WTPActivityBridge.java
@@ -24,7 +24,7 @@
 import org.eclipse.core.runtime.IExtension;
 import org.eclipse.core.runtime.IExtensionPoint;
 import org.eclipse.core.runtime.Platform;
-import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
 
 /**
  * @author jsholl
@@ -58,8 +58,8 @@
 	}
 
 	public Set getEnabledActivityIds() {
-		for (int i = 0; i < listeners.length; i++) {
-			return listeners[i].getEnabledActivityIds();
+		if(listeners.length > 0){
+			return listeners[0].getEnabledActivityIds();
 		}
 		return Collections.EMPTY_SET;
 	}
@@ -71,8 +71,8 @@
 	}
 
 	public Set getActivityIDsFromContribution(String localID, String pluginID) {
-		for (int i = 0; i < listeners.length; i++) {
-			return listeners[i].getActivityIDsFromContribution(localID, pluginID);
+		if(listeners.length > 0) {
+			return listeners[0].getActivityIDsFromContribution(localID, pluginID);
 		}
 		return Collections.EMPTY_SET;
 	}
@@ -101,6 +101,6 @@
 		StringBuffer buf = new StringBuffer();
 		buf.append("Plugin " + extension.getNamespace() + ", extension " + extension.getExtensionPointUniqueIdentifier()); //$NON-NLS-1$ //$NON-NLS-2$
 		buf.append("\n" + text); //$NON-NLS-1$
-		Logger.getLogger().logError(buf.toString());
+		WTPCommonPlugin.logError(buf.toString());
 	}
 }
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/DataModelExtensionReader.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/DataModelExtensionReader.java
index 86adbc6..5b1fe15 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/DataModelExtensionReader.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/DataModelExtensionReader.java
@@ -16,8 +16,7 @@
 
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.wst.common.core.util.RegistryReader;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
 import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
 
@@ -45,35 +44,36 @@
 		super(WTPCommonPlugin.PLUGIN_ID, EXTENSION);
 	}
 
+	@Override
 	public boolean readElement(IConfigurationElement element) {
 		if (element.getName().equals(PROVIDER_ELEMENT)) {
 			String id = element.getAttribute(ATTRIBUTE_ID);
 			if (null == id || id.trim().length() == 0) {
-				Logger.getLogger().logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + PROVIDER_ELEMENT + " is missing " + ATTRIBUTE_ID)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				WTPCommonPlugin.logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + PROVIDER_ELEMENT + " is missing " + ATTRIBUTE_ID)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 			}
 			String className = element.getAttribute(ATTRIBUTE_CLASS);
 			if (null == className || className.trim().length() == 0) {
-				Logger.getLogger().logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + PROVIDER_ELEMENT + " is missing " + ATTRIBUTE_CLASS)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				WTPCommonPlugin.logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + PROVIDER_ELEMENT + " is missing " + ATTRIBUTE_CLASS)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 			}
 			addProviderExtension(id, element);
 		} else if (element.getName().equals(DEFINES_TYPE_ELEMENT)) {
 			String type = element.getAttribute(ATTRIBUTE_PROVIDER_TYPE);
 			if (null == type || type.trim().length() == 0) {
-				Logger.getLogger().logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + DEFINES_TYPE_ELEMENT + " is missing " + ATTRIBUTE_PROVIDER_TYPE)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				WTPCommonPlugin.logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + DEFINES_TYPE_ELEMENT + " is missing " + ATTRIBUTE_PROVIDER_TYPE)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 			}
 			String id = element.getAttribute(ATTRIBUTE_PROVIDER_ID);
 			if (null == id || id.trim().length() == 0) {
-				Logger.getLogger().logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + DEFINES_TYPE_ELEMENT + " is missing " + ATTRIBUTE_PROVIDER_ID)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				WTPCommonPlugin.logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + DEFINES_TYPE_ELEMENT + " is missing " + ATTRIBUTE_PROVIDER_ID)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 			}
 			addDefinesExtension(type, id);
 		} else if (element.getName().equals(IMPLEMENTS_TYPE_ELEMENT)) {
 			String type = element.getAttribute(ATTRIBUTE_PROVIDER_TYPE);
 			if (null == type || type.trim().length() == 0) {
-				Logger.getLogger().logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + DEFINES_TYPE_ELEMENT + " is missing " + ATTRIBUTE_PROVIDER_TYPE)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				WTPCommonPlugin.logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + DEFINES_TYPE_ELEMENT + " is missing " + ATTRIBUTE_PROVIDER_TYPE)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 			}
 			String id = element.getAttribute(ATTRIBUTE_PROVIDER_ID);
 			if (null == id || id.trim().length() == 0) {
-				Logger.getLogger().logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + DEFINES_TYPE_ELEMENT + " is missing " + ATTRIBUTE_PROVIDER_ID)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				WTPCommonPlugin.logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + DEFINES_TYPE_ELEMENT + " is missing " + ATTRIBUTE_PROVIDER_ID)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 			}
 			addImplementsExtension(type, id);
 		}
@@ -82,14 +82,14 @@
 
 	private void addProviderExtension(String id, IConfigurationElement element) {
 		if (providerExtensions.containsKey(id)) {
-			Logger.getLogger().logError(new RuntimeException("Duplicate " + PROVIDER_ELEMENT + " " + ATTRIBUTE_ID + " " + id)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			WTPCommonPlugin.logError(new RuntimeException("Duplicate " + PROVIDER_ELEMENT + " " + ATTRIBUTE_ID + " " + id)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		}
 		providerExtensions.put(id, element);
 	}
 
 	private void addDefinesExtension(String type, String id) {
 		if (definesExtensions.containsKey(type)) {
-			Logger.getLogger().logError(new RuntimeException("Duplicate " + PROVIDER_ELEMENT + " " + ATTRIBUTE_PROVIDER_TYPE + " " + type)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+			WTPCommonPlugin.logError(new RuntimeException("Duplicate " + PROVIDER_ELEMENT + " " + ATTRIBUTE_PROVIDER_TYPE + " " + type)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		}
 		definesExtensions.put(type, id);
 	}
@@ -108,7 +108,7 @@
 		readRegistryIfNecessary();
 		IConfigurationElement element = (IConfigurationElement) providerExtensions.get(id);
 		if (null == element) {
-			Logger.getLogger().log(new RuntimeException("Extension:" + EXTENSION + " Element:" + PROVIDER_ELEMENT + " not found for " + ATTRIBUTE_ID + ": " + id)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+			WTPCommonPlugin.logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + PROVIDER_ELEMENT + " not found for " + ATTRIBUTE_ID + ": " + id)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 		}
 		return element;
 	}
@@ -117,7 +117,7 @@
 		readRegistryIfNecessary();
 		String element = (String) definesExtensions.get(providerType);
 		if (null == element) {
-			Logger.getLogger().log(new RuntimeException("Extension:" + EXTENSION + " Element:" + DEFINES_TYPE_ELEMENT + " not found for " + ATTRIBUTE_PROVIDER_TYPE + ": " + providerType)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+			WTPCommonPlugin.logError(new RuntimeException("Extension:" + EXTENSION + " Element:" + DEFINES_TYPE_ELEMENT + " not found for " + ATTRIBUTE_PROVIDER_TYPE + ": " + providerType)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 		}
 		return element;
 	}
@@ -157,7 +157,7 @@
 		try {
 			provider = (IDataModelProvider) element.createExecutableExtension(ATTRIBUTE_CLASS);
 		} catch (CoreException e) {
-			Logger.getLogger().logError(e);
+			WTPCommonPlugin.logError(e);
 		}
 		return provider;
 	}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/DataModelImpl.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/DataModelImpl.java
index 7a4dc3a..434e312 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/DataModelImpl.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/DataModelImpl.java
@@ -327,14 +327,15 @@
 		return descriptor == null ? new DataModelPropertyDescriptor(getProperty(propertyName)) : descriptor;
 	}
 
-	public void notifyPropertyChange(String propertyName, int flag) {
-		if (flag == DEFAULT_CHG) {
+	public void notifyPropertyChange(final String propertyName, final int flag) {
+		int innerFlag = flag;
+		if (innerFlag == DEFAULT_CHG) {
 			if (isPropertySet(propertyName)) {
 				return;
 			}
-			flag = VALUE_CHG;
+			innerFlag = VALUE_CHG;
 		}
-		notifyListeners(new DataModelEvent(this, propertyName, flag));
+		notifyListeners(new DataModelEvent(this, propertyName, innerFlag));
 	}
 
 	private void notifyListeners(DataModelEvent event) {
@@ -375,19 +376,19 @@
 				propName = (String) it.next();
 				propStatus = provider.validate(propName);
 				if (propStatus != null) {
-					if (status == null || status.isOK())
+					if (status == null || status.isOK()) {
 						status = propStatus;
-					else {
-						if (status.isMultiStatus())
+					} else {
+						if (status.isMultiStatus()) {
 							((MultiStatus) status).merge(propStatus);
-						else {
+						} else {
 							MultiStatus multi = new MultiStatus("org.eclipse.wst.common.frameworks.internal", 0, "", null); //$NON-NLS-1$ //$NON-NLS-2$
 							multi.merge(status);
 							multi.merge(propStatus);
 							status = multi;
 						}
 					}
-					if (stopOnFirstFailure && status != null && !status.isOK() && status.getSeverity() == IStatus.ERROR)
+					if (stopOnFirstFailure && !status.isOK() && status.getSeverity() == IStatus.ERROR)
 						return status;
 				}
 			}
@@ -445,6 +446,7 @@
 		IDataModelOperation providerOp = provider.getDefaultOperation();
 		if (null == providerOp) {
 			providerOp = new AbstractDataModelOperation(this) {
+				@Override
 				public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
 					return OK_STATUS;
 				}
@@ -457,6 +459,7 @@
 		return new DataModelPausibleOperationImpl(getRawOperation());
 	}
 
+	@Override
 	public String toString() {
 		return "IDataModel, provider=" + provider.toString(); //$NON-NLS-1$
 	}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/DataModelPausibleOperationImpl.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/DataModelPausibleOperationImpl.java
index 63bc4b3..31d078a 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/DataModelPausibleOperationImpl.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/datamodel/DataModelPausibleOperationImpl.java
@@ -123,10 +123,12 @@
 		throw new RuntimeException();
 	}
 
+	@Override
 	public boolean canRedo() {
 		return (COMPLETE_UNDO == executionState) && super.canRedo();
 	}
 
+	@Override
 	public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
 		return cacheThreadAndContinue(monitor, info, REDO_IMPL);
 	}
@@ -160,10 +162,12 @@
 		}
 	}
 
+	@Override
 	public boolean canUndo() {
 		return (executionState == COMPLETE_EXECUTE || executionState == COMPLETE_REDO) && super.canUndo();
 	}
 
+	@Override
 	public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
 		return cacheThreadAndContinue(monitor, info, UNDO_IMPL);
 	}
@@ -198,6 +202,7 @@
 		}
 	}
 
+	@Override
 	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
 		return cacheThreadAndContinue(monitor, info, EXECUTE_IMPL);
 	}
@@ -329,46 +334,50 @@
 	}
 
 	protected OperationStatus addStatus(OperationStatus returnStatus, IStatus status) {
-		if (returnStatus == null) {
-			returnStatus = new OperationStatus(status.getMessage(), status.getException());
-			returnStatus.setSeverity(status.getSeverity());
-			returnStatus.add(status);
+		OperationStatus innerReturnStatus = returnStatus;
+		if (innerReturnStatus == null) {
+			innerReturnStatus = new OperationStatus(status.getMessage(), status.getException());
+			innerReturnStatus.setSeverity(status.getSeverity());
+			innerReturnStatus.add(status);
 		} else {
-			returnStatus.add(status);
+			innerReturnStatus.add(status);
 		}
-		return returnStatus;
+		return innerReturnStatus;
 	}
 
 	private OperationStatus addExtendedStatus(OperationStatus returnStatus, IStatus aStatus) {
-		if (returnStatus == null) {
-			returnStatus = new OperationStatus(new IStatus[]{WTPCommonPlugin.OK_STATUS});
+		OperationStatus innerReturnStatus = returnStatus;
+		if (innerReturnStatus == null) {
+			innerReturnStatus = new OperationStatus(new IStatus[]{WTPCommonPlugin.OK_STATUS});
 		}
-		returnStatus.addExtendedStatus(aStatus);
-		return returnStatus;
+		innerReturnStatus.addExtendedStatus(aStatus);
+		return innerReturnStatus;
 	}
 
 	private OperationStatus runOperation(final IDataModelOperation operation, final IProgressMonitor monitor, final IAdaptable info, final int executionType, OperationStatus returnStatus) {
+		OperationStatus innerReturnStatus = returnStatus;
 		if (rootOperation == operation) {
 			IStatus status = runOperation(operation, monitor, info, IDataModelPausibleOperationEvent.EXECUTE);
 			if (!status.isOK()) {
-				returnStatus = addStatus(returnStatus, status);
+				innerReturnStatus = addStatus(innerReturnStatus, status);
 			}
 		} else {
 			try {
 				IStatus status = runOperation(operation, monitor, info, IDataModelPausibleOperationEvent.EXECUTE);
 				if (!status.isOK()) {
-					returnStatus = addExtendedStatus(returnStatus, status);
+					innerReturnStatus = addExtendedStatus(innerReturnStatus, status);
 				}
 			} catch (Exception e) {
 				IStatus status = new Status(IStatus.ERROR, WTPCommonPlugin.PLUGIN_ID, 0, WTPResourceHandler.getString("25", new Object[]{operation.getClass().getName()}), e); //$NON-NLS-1$
-				returnStatus = addExtendedStatus(returnStatus, status);
+				innerReturnStatus = addExtendedStatus(innerReturnStatus, status);
 			}
 		}
-		return returnStatus;
+		return innerReturnStatus;
 	}
 
 	private IStatus runOperation(final IDataModelOperation operation, final IProgressMonitor monitor, final IAdaptable info, final int executionType) {
 		IWorkspaceRunnableWithStatus workspaceRunnable = new IWorkspaceRunnableWithStatus(info) {
+			@Override
 			public void run(IProgressMonitor pm) throws CoreException {
 				try {
 					switch (executionType) {
@@ -387,7 +396,7 @@
 					}
 				} catch (Exception e) {
 					this.setStatus(new Status(IStatus.ERROR, WTPCommonPlugin.PLUGIN_ID, 0, WTPResourceHandler.getString("25", new Object[]{operation.getClass().getName()}), e)); //$NON-NLS-1$
-					WTPCommonPlugin.getDefault().getLogger().logError(e);
+					WTPCommonPlugin.logError(e);
 				}
 			}
 		};
@@ -485,6 +494,7 @@
 			return null;
 		}
 
+		@Override
 		public String toString() {
 			return getOperationID();
 		}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/EnablementIdentifier.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/EnablementIdentifier.java
index a6dbbd9..7147a3e 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/EnablementIdentifier.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/EnablementIdentifier.java
@@ -87,6 +87,7 @@
 
 	}
 
+	@Override
 	public boolean equals(Object object) {
 		if (!(object instanceof EnablementIdentifier))
 			return false;
@@ -116,6 +117,7 @@
 		return id;
 	}
 
+	@Override
 	public int hashCode() {
 		if (!hashCodeComputed) {
 			hashCode = HASH_INITIAL;
@@ -142,10 +144,10 @@
 	}
 
 	protected boolean setFunctionGroupIds(Set functionGroupIds) {
-		functionGroupIds = Util.safeCopy(functionGroupIds, String.class);
+		Set safeFunctionGroupIds = Util.safeCopy(functionGroupIds, String.class);
 
-		if (!Util.equals(functionGroupIds, this.functionGroupIds)) {
-			this.functionGroupIds = functionGroupIds;
+		if (!Util.equals(safeFunctionGroupIds, this.functionGroupIds)) {
+			this.functionGroupIds = safeFunctionGroupIds;
 			this.functionGroupIdsAsArray = (String[]) this.functionGroupIds.toArray(new String[this.functionGroupIds.size()]);
 
 			hashCodeComputed = false;
@@ -189,6 +191,7 @@
 		return false;
 	}
 
+	@Override
 	public String toString() {
 		if (string == null) {
 			final StringBuffer stringBuffer = new StringBuffer();
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/EnablementIdentifierEvent.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/EnablementIdentifierEvent.java
index d90b19c..5e077b7 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/EnablementIdentifierEvent.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/EnablementIdentifierEvent.java
@@ -72,6 +72,7 @@
 	 * 
 	 * @see java.lang.Object#toString()
 	 */
+	@Override
 	public String toString() {
 		return "EnablementIdentifierEvent [identifier=" + identifier.toString() + ", functionGroupIdsChanged=" + hasFunctionGroupIdsChanged() + ", enabledChanged=" + hasEnabledChanged() + "]"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 	}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/EnablementManager.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/EnablementManager.java
index 4b4b5e8..5a21de8 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/EnablementManager.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/EnablementManager.java
@@ -28,7 +28,6 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.MultiStatus;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonMessages;
 import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
 
@@ -60,17 +59,22 @@
 	}
 
     public IEnablementIdentifier getIdentifier(String identifierId, IProject project) {
-        if (identifierId == null) throw new NullPointerException();
-        if (project != null && !project.isAccessible()) project = null;
+        if (identifierId == null){
+        	throw new NullPointerException();
+        }
+        IProject innerProject = project;
+        if (innerProject != null && !innerProject.isAccessible()){
+        	innerProject = null;
+        }
         
         EnablementIdentifier identifier = null;
         boolean identifierRequiresUpdate = false;
         synchronized(this) {
-	        Map identifiersById = getIdentifiersById(project);	
+	        Map identifiersById = getIdentifiersById(innerProject);	
 	        identifier = (EnablementIdentifier) identifiersById.get(identifierId);
 	        if(identifier == null){
 	        	identifierRequiresUpdate = true;
-	        	identifier = createIdentifier(identifierId, project);
+	        	identifier = createIdentifier(identifierId, innerProject);
 	            identifiersById.put(identifierId, identifier);
 	        }
 	    }
@@ -141,7 +145,7 @@
 			} catch (Exception ex) {
 				//Defer the exception so others can handle it.
 				nextStatus = WTPCommonPlugin.createErrorStatus(WTPCommonMessages.INTERNAL_ERROR, ex);
-				Logger.getLogger().logError(ex);
+				WTPCommonPlugin.logError(ex);
 				if (errorStatus == null)
 					errorStatus = nextStatus;
 				else if (errorStatus.isMultiStatus())
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/FunctionGroup.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/FunctionGroup.java
index 8fb8259..c470bbc 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/FunctionGroup.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/FunctionGroup.java
@@ -16,8 +16,8 @@
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.wst.common.frameworks.internal.WTPResourceHandler;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
 
 
 /**
@@ -85,12 +85,13 @@
 			try {
 				groupInterface = (IGroupInitializer) element.createExecutableExtension(GROUP_INTIALIZER_CLASS_ATTR);
 			} catch (CoreException e) {
-				Logger.getLogger().logError(WTPResourceHandler.getString("29", new Object[]{GROUP_INTIALIZER_CLASS_ATTR, getInitalizerClassName(), getDeclaringExtensionName()}) + "\r\n"); //$NON-NLS-1$//$NON-NLS-2$
-				Logger.getLogger().logError(e);
+				WTPCommonPlugin.logError(WTPResourceHandler.getString("29", new Object[]{GROUP_INTIALIZER_CLASS_ATTR, getInitalizerClassName(), getDeclaringExtensionName()}) + "\r\n"); //$NON-NLS-1$//$NON-NLS-2$
+				WTPCommonPlugin.logError(e);
 			}
 		return groupInterface;
 	}
 
+	@Override
 	public String toString() {
 		return "\"" + getName() + "\" (" + getGroupID() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 	}
@@ -131,7 +132,7 @@
 	public boolean isMatch(String string) {
 		if (functionGroupPatternBindings == null) {
 			if (!errorReported) {
-				Logger.getLogger().logError(WTPResourceHandler.getString("30", new Object[]{getGroupID()})); //$NON-NLS-1$
+				WTPCommonPlugin.logError(WTPResourceHandler.getString("30", new Object[]{getGroupID()})); //$NON-NLS-1$
 				errorReported = true;
 			}
 			return false;
@@ -147,12 +148,10 @@
 	}
 
 	boolean setFunctionGroupPatternBindings(Set functionGroupPatternBindings) {
-		functionGroupPatternBindings = Util.safeCopy(functionGroupPatternBindings, FunctionGroupPatternBinding.class);
+		Set safeFunctionGroupPatternBindings = Util.safeCopy(functionGroupPatternBindings, FunctionGroupPatternBinding.class);
 
-		if (!Util.equals(functionGroupPatternBindings, this.functionGroupPatternBindings)) {
-			this.functionGroupPatternBindings = functionGroupPatternBindings;
-//			this.functionGroupPatternBindingsAsArray = (FunctionGroupPatternBinding[]) this.functionGroupPatternBindings.toArray(new FunctionGroupPatternBinding[this.functionGroupPatternBindings.size()]);
-
+		if (!Util.equals(safeFunctionGroupPatternBindings, this.functionGroupPatternBindings)) {
+			this.functionGroupPatternBindings = safeFunctionGroupPatternBindings;
 			return true;
 		}
 
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/FunctionGroupPatternBinding.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/FunctionGroupPatternBinding.java
index d387771..464bcc5 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/FunctionGroupPatternBinding.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/FunctionGroupPatternBinding.java
@@ -56,6 +56,7 @@
 		return compareTo;
 	}
 
+	@Override
 	public boolean equals(Object object) {
 		if (!(object instanceof FunctionGroupPatternBinding))
 			return false;
@@ -75,6 +76,7 @@
 		return pattern;
 	}
 
+	@Override
 	public int hashCode() {
 		if (!hashCodeComputed) {
 			hashCode = HASH_INITIAL;
@@ -86,6 +88,7 @@
 		return hashCode;
 	}
 
+	@Override
 	public String toString() {
 		if (string == null) {
 			final StringBuffer stringBuffer = new StringBuffer();
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/FunctionGroupRegistry.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/FunctionGroupRegistry.java
index 996c92c..ce55ca9 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/FunctionGroupRegistry.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/FunctionGroupRegistry.java
@@ -25,16 +25,13 @@
 
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.RegistryReader;
-import org.eclipse.jem.util.logger.proxy.Logger;
+import org.eclipse.wst.common.core.util.RegistryReader;
 import org.eclipse.wst.common.frameworks.internal.WTPResourceHandler;
 import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
 
 /**
  * The FunctionGroupRegistry will consume Configuration elements conforming to the FunctionGroup
  * Extension Point schema.
- * 
- * @author mdelder/blancett
  */
 public class FunctionGroupRegistry extends RegistryReader {
 
@@ -67,6 +64,7 @@
 	 * (non-Javadoc) Read all the elements first, then set the pattern bindings on the function
 	 * groups
 	 */
+	@Override
 	public void readRegistry() {
 		super.readRegistry();
 		setPatternBindings();
@@ -85,6 +83,7 @@
 
 	}
 
+	@Override
 	public boolean readElement(IConfigurationElement element) {
 		if (element.getName().equals(GROUP_ELEMENT)) {
 			readGroup(element);
@@ -224,11 +223,11 @@
 		FunctionGroup group1 = getGroupByID(groupID1);
 		FunctionGroup group2 = getGroupByID(groupID2);
 		if (group1 == null) {
-			Logger.getLogger().logError(new IllegalArgumentException(WTPResourceHandler.getString("28", new Object[]{groupID1}))); //$NON-NLS-1$
+			WTPCommonPlugin.logError(new IllegalArgumentException(WTPResourceHandler.getString("28", new Object[]{groupID1}))); //$NON-NLS-1$
 			return -1;
 		}
 		if (group2 == null) {
-			Logger.getLogger().logError(new IllegalArgumentException(WTPResourceHandler.getString("28", new Object[]{groupID2}))); //$NON-NLS-1$
+			WTPCommonPlugin.logError(new IllegalArgumentException(WTPResourceHandler.getString("28", new Object[]{groupID2}))); //$NON-NLS-1$
 			return 1;
 		}
 
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/IEnablementManager.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/IEnablementManager.java
index 454c94c..ab6fcdc 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/IEnablementManager.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/IEnablementManager.java
@@ -8,26 +8,14 @@
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
-/*
- * Created on Feb 12, 2004
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
 package org.eclipse.wst.common.frameworks.internal.enablement;
 
 import java.util.Collection;
 
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jem.util.UIContextDetermination;
+import org.eclipse.wst.common.core.util.UIContextDetermination;
 
-/**
- * @author schacher
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
 public interface IEnablementManager {
 	String INTERNAL_ENABLEMENT_DETERMINATION_ID = "org.eclipse.wst.common.frameworks.internal.EnablementDetermination"; //$NON-NLS-1$
 
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/IdentifiableComparator.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/IdentifiableComparator.java
index 0df26cf..b6d9a61 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/IdentifiableComparator.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/IdentifiableComparator.java
@@ -60,9 +60,14 @@
 	 * 
 	 * @see java.util.Comparator#equals(java.lang.Object)
 	 */
+	@Override
 	public boolean equals(Object obj) {
 		return obj instanceof IdentifiableComparator;
 	}
+	@Override
+	public int hashCode() {
+		return super.hashCode();
+	}
 
 	private int compareLoadOrder(Identifiable lvalue, Identifiable rvalue) {
 		/* R - L implies 0 is the highest priority */
@@ -74,4 +79,6 @@
 			return FunctionGroupRegistry.getInstance().getFunctionPriority(identifiable.getID());
 		return DEFAULT_PRIORITY;
 	}
+
+	
 }
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/Util.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/Util.java
index 740270a..2c49776 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/Util.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/enablement/Util.java
@@ -220,13 +220,13 @@
 		if (list == null || c == null)
 			throw new NullPointerException();
 
-		list = Collections.unmodifiableList(new ArrayList(list));
-		Iterator iterator = list.iterator();
+		List safeList = Collections.unmodifiableList(new ArrayList(list));
+		Iterator iterator = safeList.iterator();
 
 		while (iterator.hasNext())
 			assertInstance(iterator.next(), c, allowNullElements);
 
-		return list;
+		return safeList;
 	}
 
 	public static Map safeCopy(Map map, Class keyClass, Class valueClass) {
@@ -237,8 +237,8 @@
 		if (map == null || keyClass == null || valueClass == null)
 			throw new NullPointerException();
 
-		map = Collections.unmodifiableMap(new HashMap(map));
-		Iterator iterator = map.entrySet().iterator();
+		Map safeMap = Collections.unmodifiableMap(new HashMap(map));
+		Iterator iterator = safeMap.entrySet().iterator();
 
 		while (iterator.hasNext()) {
 			Map.Entry entry = (Map.Entry) iterator.next();
@@ -246,7 +246,7 @@
 			assertInstance(entry.getValue(), valueClass, allowNullValues);
 		}
 
-		return map;
+		return safeMap;
 	}
 
 	public static Set safeCopy(Set set, Class c) {
@@ -257,13 +257,13 @@
 		if (set == null || c == null)
 			throw new NullPointerException();
 
-		set = Collections.unmodifiableSet(new HashSet(set));
-		Iterator iterator = set.iterator();
+		Set safeSet = Collections.unmodifiableSet(new HashSet(set));
+		Iterator iterator = safeSet.iterator();
 
 		while (iterator.hasNext())
 			assertInstance(iterator.next(), c, allowNullElements);
 
-		return set;
+		return safeSet;
 	}
 
 	public static SortedMap safeCopy(SortedMap sortedMap, Class keyClass, Class valueClass) {
@@ -274,8 +274,8 @@
 		if (sortedMap == null || keyClass == null || valueClass == null)
 			throw new NullPointerException();
 
-		sortedMap = Collections.unmodifiableSortedMap(new TreeMap(sortedMap));
-		Iterator iterator = sortedMap.entrySet().iterator();
+		SortedMap safeSortedMap = Collections.unmodifiableSortedMap(new TreeMap(sortedMap));
+		Iterator iterator = safeSortedMap.entrySet().iterator();
 
 		while (iterator.hasNext()) {
 			Map.Entry entry = (Map.Entry) iterator.next();
@@ -283,7 +283,7 @@
 			assertInstance(entry.getValue(), valueClass, allowNullValues);
 		}
 
-		return sortedMap;
+		return safeSortedMap;
 	}
 
 	public static SortedSet safeCopy(SortedSet sortedSet, Class c) {
@@ -294,13 +294,13 @@
 		if (sortedSet == null || c == null)
 			throw new NullPointerException();
 
-		sortedSet = Collections.unmodifiableSortedSet(new TreeSet(sortedSet));
-		Iterator iterator = sortedSet.iterator();
+		SortedSet safeSortedSet = Collections.unmodifiableSortedSet(new TreeSet(sortedSet));
+		Iterator iterator = safeSortedSet.iterator();
 
 		while (iterator.hasNext())
 			assertInstance(iterator.next(), c, allowNullElements);
 
-		return sortedSet;
+		return safeSortedSet;
 	}
 
 	public static boolean startsWith(List left, List right, boolean equals) {
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ComposedExtendedOperationHolder.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ComposedExtendedOperationHolder.java
index 8b754b5..b1676d2 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ComposedExtendedOperationHolder.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ComposedExtendedOperationHolder.java
@@ -15,8 +15,8 @@
 import java.util.Iterator;
 
 import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.wst.common.frameworks.internal.enablement.EnablementManager;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
 
 public class ComposedExtendedOperationHolder {
 
@@ -46,7 +46,7 @@
 						extOperationHolder.addPreOperation(preOp);
 					}
 				} catch (CoreException e) {
-					Logger.getLogger().logError(e);
+					WTPCommonPlugin.logError(e);
 				}
 				try {
 					postOp = currentExt.getPostOperation();
@@ -54,7 +54,7 @@
 						extOperationHolder.addPostOperation(postOp);
 					}
 				} catch (CoreException e) {
-					Logger.getLogger().logError(e);
+					WTPCommonPlugin.logError(e);
 				}
 			}
 		}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationExtensionReader.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationExtensionReader.java
index 31f25db..3228037 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationExtensionReader.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationExtensionReader.java
@@ -8,12 +8,6 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
-/*
- * Created on Nov 3, 2003
- * 
- * To change the template for this generated file go to Window&gt;Preferences&gt;Java&gt;Code
- * Generation&gt;Code and Comments
- */
 package org.eclipse.wst.common.frameworks.internal.operations;
 
 import java.util.ArrayList;
@@ -21,7 +15,7 @@
 import java.util.HashMap;
 
 import org.eclipse.core.runtime.IConfigurationElement;
-import org.eclipse.jem.util.RegistryReader;
+import org.eclipse.wst.common.core.util.RegistryReader;
 import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
 
 public class OperationExtensionReader extends RegistryReader {
@@ -42,6 +36,7 @@
 	 * postOperationClass="com.ibm.etools....PostDeleteOperation"> </operationExtension>
 	 */
 
+	@Override
 	public boolean readElement(IConfigurationElement element) {
 		if (!element.getName().equals(ELEMENT_J2EEOPEXT))
 			return false;
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationStatus.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationStatus.java
index d90a4c8..22bf0f3 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationStatus.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/OperationStatus.java
@@ -39,6 +39,7 @@
 	/**
 	 * Overridden to expose as public instead of protected
 	 */
+	@Override
 	public void setCode(int code) {
 		super.setCode(code);
 	}
@@ -46,6 +47,7 @@
 	/**
 	 * Overridden to expose as public instead of protected
 	 */
+	@Override
 	public void setException(Throwable exception) {
 		super.setException(exception);
 	}
@@ -53,6 +55,7 @@
 	/**
 	 * Overridden to expose as public instead of protected
 	 */
+	@Override
 	public void setMessage(String message) {
 		super.setMessage(message);
 	}
@@ -60,10 +63,12 @@
 	/**
 	 * Overridden to expose as public instead of protected
 	 */
+	@Override
 	public void setSeverity(int severity) {
 		super.setSeverity(severity);
 	}
 
+	@Override
 	public void add(IStatus status) {
 		int newSev = status.getSeverity();
 		if (newSev > getSeverity()) {
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationDataModelProviderNew.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationDataModelProviderNew.java
index 3823ed7..8796f68 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationDataModelProviderNew.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationDataModelProviderNew.java
@@ -32,14 +32,17 @@
 
 public class ProjectCreationDataModelProviderNew extends AbstractDataModelProvider implements IProjectCreationPropertiesNew {
 
+	@Override
 	public IDataModelOperation getDefaultOperation() {
 		return new ProjectCreationOperationNew(model);
 	}
 
+	@Override
 	public void init() {
 		super.init();
 	}
 
+	@Override
 	public Set getPropertyNames() {
 		Set propertyNames = super.getPropertyNames();
 		propertyNames.add(PROJECT);
@@ -54,6 +57,7 @@
 		return propertyNames;
 	}
 
+	@Override
 	public Object getDefaultProperty(String propertyName) {
 		if (propertyName.equals(PROJECT_LOCATION)) {
 			if (getBooleanProperty(USE_DEFAULT_LOCATION)) {
@@ -81,6 +85,7 @@
 		return path.toOSString();
 	}
 
+	@Override
 	public boolean propertySet(String propertyName, Object propertyValue) {
 		if (propertyName.equals(PROJECT_LOCATION) || propertyName.equals(DEFAULT_LOCATION) || propertyName.equals(PROJECT_DESCRIPTION)) {
 			throw new RuntimeException();
@@ -117,6 +122,7 @@
 		return (null != projectName && projectName.length() > 0) ? ResourcesPlugin.getWorkspace().getRoot().getProject(projectName) : null;
 	}
 
+	@Override
 	public IStatus validate(String propertyName) {
 		if (propertyName.equals(PROJECT_NAME)) {
 			String name = model.getStringProperty(PROJECT_NAME);
@@ -176,6 +182,9 @@
 			return status;
 		if (projectName.endsWith(" ")) //$NON-NLS-1$
 			return WTPCommonPlugin.createErrorStatus(WTPResourceHandler.getString("41")); //$NON-NLS-1$
+		//special FRAGMENT_SEPARATOR char in org.eclipse.emf.common.util.URI
+		if (projectName.indexOf('#') != -1) 
+			return WTPCommonPlugin.createErrorStatus(WTPResourceHandler.getString("8")); //$NON-NLS-1$
 		return OK_STATUS;
 	}
 
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationOperationNew.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationOperationNew.java
index d837cfe..a1ba7bb 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationOperationNew.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/operations/ProjectCreationOperationNew.java
@@ -25,9 +25,9 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.OperationCanceledException;
 import org.eclipse.core.runtime.SubProgressMonitor;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.plugin.WTPCommonPlugin;
 
 public class ProjectCreationOperationNew extends AbstractDataModelOperation implements IProjectCreationPropertiesNew {
 
@@ -35,6 +35,7 @@
 		super(dataModel);
 	}
 
+	@Override
 	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
 		try {
 			IProgressMonitor subMonitor = new SubProgressMonitor(monitor, IProgressMonitor.UNKNOWN);
@@ -56,7 +57,7 @@
 				project.setDescription(desc, monitor);
 			}
 		} catch (CoreException e) {
-			Logger.getLogger().logError(e);
+			WTPCommonPlugin.logError(e);
 		} finally {
 			monitor.done();
 		}
@@ -65,10 +66,12 @@
 		return OK_STATUS;
 	}
 
+	@Override
 	public boolean canUndo() {
 		return false;
 	}
 
+	@Override
 	public boolean canRedo() {
 		return false;
 	}
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/plugin/WTPCommonMessages.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/plugin/WTPCommonMessages.java
index 8fade80..85111d6 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/plugin/WTPCommonMessages.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/plugin/WTPCommonMessages.java
@@ -50,4 +50,5 @@
 	public static final String WEBCONTENTFOLDER_EMPTY = "40"; //$NON-NLS-1$
 	public static final String PROJECT_EXISTS_SAMENAME_ERROR = "43"; //$NON-NLS-1$
 	public static final String RUNTIME_NONE = "44"; //$NON-NLS-1$
+	public static final String EAR_WILL_BE_CREATED = "45"; //$NON-NLS-1$
 }
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/plugin/WTPCommonPlugin.java b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/plugin/WTPCommonPlugin.java
index 994c720..e3fc87d 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/plugin/WTPCommonPlugin.java
+++ b/plugins/org.eclipse.wst.common.frameworks/src/org/eclipse/wst/common/frameworks/internal/plugin/WTPCommonPlugin.java
@@ -8,12 +8,6 @@
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
-/*
- * Created on Oct 29, 2003
- *
- * To change the template for this generated file go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
 package org.eclipse.wst.common.frameworks.internal.plugin;
 
 import java.text.MessageFormat;
@@ -25,13 +19,10 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.wst.common.frameworks.internal.WTPPlugin;
+import org.eclipse.core.runtime.Platform;
+import java.lang.Throwable;
+import org.eclipse.core.runtime.CoreException;
 
-/**
- * @author jsholl
- * 
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
- */
 public class WTPCommonPlugin extends WTPPlugin {
 
 	public static final String PLUGIN_ID = "org.eclipse.wst.common.frameworks"; //$NON-NLS-1$
@@ -138,7 +129,28 @@
 	 * 
 	 * @see org.eclipse.wst.common.frameworks.internal.WTPPlugin#getPluginID()
 	 */
+	@Override
 	public String getPluginID() {
 		return PLUGIN_ID;
 	}
+
+	public static IStatus createStatus(int severity, String message, Throwable exception) {
+		return new Status(severity, PLUGIN_ID, message, exception);
+	}
+
+	public static IStatus createStatus(int severity, String message) {
+		return createStatus(severity, message, null);
+	}
+
+	public static void logError(Throwable exception) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( createStatus(IStatus.ERROR, exception.getMessage(), exception));
+	}
+
+	public static void logError(CoreException exception) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( exception.getStatus() );
+	}
+
+	public static void logError(String message) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( createStatus(IStatus.ERROR, message));
+	}
 }
diff --git a/plugins/org.eclipse.wst.common.frameworks/src/wtp_common.properties b/plugins/org.eclipse.wst.common.frameworks/src/wtp_common.properties
index 3af3db7..81046cb 100644
--- a/plugins/org.eclipse.wst.common.frameworks/src/wtp_common.properties
+++ b/plugins/org.eclipse.wst.common.frameworks/src/wtp_common.properties
@@ -52,3 +52,4 @@
 42=Resource already exists with a different case.
 43=A project already exists with this name.
 44=<None>
+45=EAR project {0} does not exist. It will be created.
diff --git a/plugins/org.eclipse.wst.common.infopop/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.common.infopop/META-INF/MANIFEST.MF
index f9d7c2a..9d5c8ce 100644
--- a/plugins/org.eclipse.wst.common.infopop/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.wst.common.infopop/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Bundle-Name.0
 Bundle-SymbolicName: org.eclipse.wst.common.infopop; singleton:=true
-Bundle-Version: 1.0.100.qualifier
+Bundle-Version: 1.0.300.qualifier
 Bundle-Vendor: %Bundle-Vendor.0
 Bundle-Localization: plugin
 Eclipse-LazyStart: true
diff --git a/plugins/org.eclipse.wst.common.infopop/plugin.properties b/plugins/org.eclipse.wst.common.infopop/plugin.properties
index 74f0260..b21e8ec 100644
--- a/plugins/org.eclipse.wst.common.infopop/plugin.properties
+++ b/plugins/org.eclipse.wst.common.infopop/plugin.properties
@@ -1,3 +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
+Bundle-Vendor.0 = Eclipse Web Tools Platform
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/.classpath b/plugins/org.eclipse.wst.common.modulecore.ui/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/.project b/plugins/org.eclipse.wst.common.modulecore.ui/.project
new file mode 100644
index 0000000..4977ea7
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.wst.common.modulecore.ui</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</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.modulecore.ui/.settings/org.eclipse.jdt.core.prefs b/plugins/org.eclipse.wst.common.modulecore.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..44d82f6
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,74 @@
+#Fri Sep 11 17:13:08 PDT 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=ignore
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
+org.eclipse.jdt.core.compiler.problem.comparingIdentical=warning
+org.eclipse.jdt.core.compiler.problem.deadCode=warning
+org.eclipse.jdt.core.compiler.problem.deprecation=warning
+org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
+org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
+org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
+org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
+org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
+org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
+org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore
+org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=error
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
+org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=error
+org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=error
+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=error
+org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingHashCodeMethod=ignore
+org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
+org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
+org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
+org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
+org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=error
+org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning
+org.eclipse.jdt.core.compiler.problem.nullReference=ignore
+org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=error
+org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
+org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
+org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
+org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
+org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=error
+org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
+org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
+org.eclipse.jdt.core.compiler.problem.typeParameterHiding=error
+org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
+org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
+org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=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.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
+org.eclipse.jdt.core.compiler.problem.unusedImport=error
+org.eclipse.jdt.core.compiler.problem.unusedLabel=error
+org.eclipse.jdt.core.compiler.problem.unusedLocal=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
+org.eclipse.jdt.core.compiler.problem.unusedParameterIncludeDocCommentReference=enabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
+org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
+org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
+org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
+org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=ignore
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.common.modulecore.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..458d79b
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,27 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %Bundle-Name.0
+Bundle-Vendor: %provider
+Bundle-SymbolicName: org.eclipse.wst.common.modulecore.ui; singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-Localization: plugin
+Bundle-Activator: org.eclipse.wst.common.componentcore.ui.ModuleCoreUIPlugin
+Require-Bundle: org.eclipse.ui;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.core.runtime;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.core.resources;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.wst.common.modulecore;bundle-version="[1.1.300,2.0.0)",
+ org.eclipse.wst.common.frameworks;bundle-version="[1.1.300,2.0.0)",
+ org.eclipse.wst.common.project.facet.core;bundle-version="[1.4.0,2.0.0)",
+ org.eclipse.jem.util;bundle-version="[2.0.200,3.0.0)",
+ org.eclipse.emf.ecore;bundle-version="[2.5.0,3.0.0)",
+ org.eclipse.ui.ide;bundle-version="[3.5.0,4.0.0)",
+ org.eclipse.wst.common.emfworkbench.integration;bundle-version="[1.2.0,2.0.0)",
+ org.eclipse.wst.server.core;bundle-version="[1.1.202,2.0.0)"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: org.eclipse.wst.common.componentcore.internal.impl;x-internal:=true,
+ org.eclipse.wst.common.componentcore.ui;x-internal:=true,
+ org.eclipse.wst.common.componentcore.ui.internal.propertypage;x-internal:=true,
+ org.eclipse.wst.common.componentcore.ui.internal.propertypage.verifier;x-internal:=true,
+ org.eclipse.wst.common.componentcore.ui.internal.taskwizard;x-internal:=true,
+ org.eclipse.wst.common.componentcore.ui.propertypage;x-internal:=true
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/about.html b/plugins/org.eclipse.wst.common.modulecore.ui/about.html
new file mode 100644
index 0000000..b6ed5b0
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/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>August, 2009</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.modulecore.ui/build.properties b/plugins/org.eclipse.wst.common.modulecore.ui/build.properties
new file mode 100644
index 0000000..ef0787e
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/build.properties
@@ -0,0 +1,19 @@
+###############################################################################
+# Copyright (c) 2009 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.. = src/
+output.. = bin/
+bin.includes = plugin.xml,\
+               .,\
+               icons/,\
+               META-INF/,\
+               about.html,\
+               plugin.properties
+src.includes = schema/
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/icons/folder.gif b/plugins/org.eclipse.wst.common.modulecore.ui/icons/folder.gif
new file mode 100644
index 0000000..c91b267
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/icons/folder.gif
Binary files differ
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/icons/jar_obj.gif b/plugins/org.eclipse.wst.common.modulecore.ui/icons/jar_obj.gif
new file mode 100644
index 0000000..ec315d5
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/icons/jar_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/icons/prj_obj.gif b/plugins/org.eclipse.wst.common.modulecore.ui/icons/prj_obj.gif
new file mode 100644
index 0000000..a4ea580
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/icons/prj_obj.gif
Binary files differ
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/plugin.properties b/plugins/org.eclipse.wst.common.modulecore.ui/plugin.properties
new file mode 100644
index 0000000..a8fb0c7
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/plugin.properties
@@ -0,0 +1,15 @@
+###############################################################################
+# Copyright (c) 2009 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
+###############################################################################
+provider=Eclipse.org
+Bundle-Name.0 = Modulecore UI Plug-in
+Module_assembly.name = Deployment Assembly
+Project=Project
+Folder_Mapping=Folder Mapping
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/plugin.xml b/plugins/org.eclipse.wst.common.modulecore.ui/plugin.xml
new file mode 100644
index 0000000..0fbfc6d
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/plugin.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+<plugin>
+   <extension-point id="moduleDependencyPropertyPage" name="moduleDependencyPropertyPage" schema="schema/moduleDependencyPropertyPage.exsd"/>
+   <extension-point id="referenceWizardFragment" name="referenceWizardFragment" schema="schema/referenceWizardFragment.exsd"/>
+   <extension-point id="virtualComponentLabelProvider" name="virtualComponentLabelProvider" schema="schema/virtualComponentLabelProvider.exsd"/>
+   <extension-point id="deploymentAssemblyVerifier" name="Deployment Assembly Verifier" schema="schema/deploymentAssemblyVerifier.exsd"/>
+   <!-- =========== DeploymentAssemblyPage ============ -->
+   <extension
+   		point="org.eclipse.ui.propertyPages">
+ 	<page
+      		name="%Module_assembly.name"
+            class="org.eclipse.wst.common.componentcore.ui.propertypage.ModuleAssemblyRootPage"
+            id="org.eclipse.wst.common.componentcore.ui.DeploymentAssemblyPage">
+           <enabledWhen>
+				<adapt
+					type="org.eclipse.core.resources.IProject">
+					<test
+						property="org.eclipse.core.resources.projectNature"
+          				value="org.eclipse.wst.common.modulecore.ModuleCoreNature"/>
+				</adapt>
+         </enabledWhen>          
+      </page>
+      </extension>
+
+
+    <extension
+          point="org.eclipse.wst.common.modulecore.ui.referenceWizardFragment">
+       <referenceFragment
+             class="org.eclipse.wst.common.componentcore.ui.internal.propertypage.ProjectReferenceWizardFragment"
+             icon="icons/prj_obj.gif"
+             id="org.eclipse.wst.common.componentcore.ui.newProjectReference"
+             name="%Project">
+       </referenceFragment>
+       <referenceFragment
+             class="org.eclipse.wst.common.componentcore.ui.internal.propertypage.FolderMappingWizardFragment"
+             icon="icons/folder.gif"
+             id="org.eclipse.wst.common.componentcore.ui.resourceMappingReference"
+             name="%Folder_Mapping">
+       </referenceFragment>
+    </extension>
+</plugin>
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/schema/deploymentAssemblyVerifier.exsd b/plugins/org.eclipse.wst.common.modulecore.ui/schema/deploymentAssemblyVerifier.exsd
new file mode 100644
index 0000000..36e2203
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/schema/deploymentAssemblyVerifier.exsd
@@ -0,0 +1,115 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.wst.common.modulecore.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.wst.common.modulecore.ui" id="DeploymentAssemblyVerifier" name="Deployment Assembly Verifier"/>
+      </appInfo>
+      <documentation>
+         The extension point gives the ability to extend deployment assembly validation during the creation of resource and dependency mappings. Registration of the verifier is based on component type and server target.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appInfo>
+            <meta.element />
+         </appInfo>
+      </annotation>
+      <complexType>
+         <sequence>
+            <element ref="verifier"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  a fully qualified identifier of the target extension point
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  an optional identifier of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  an optional name of the extension instance
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="verifier">
+      <complexType>
+         <sequence>
+            <element ref="runtime" minOccurs="1" maxOccurs="unbounded"/>
+            <element ref="component"/>
+         </sequence>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  the qualified name of the class to be used as the verifier
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn="AbstractDeploymentAssemblyVerifier:"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="runtime">
+      <complexType>
+         <attribute name="runtime_server_id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  the runtime server id for this verifier
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="component">
+      <complexType>
+         <attribute name="component_type" type="string" use="required">
+            <annotation>
+               <documentation>
+                  the supported component type for this verifier(uses facet id)
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         &lt;b&gt;This extension point 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.&lt;/b&gt;
+      </documentation>
+   </annotation>
+
+
+
+
+   <annotation>
+      <appInfo>
+         <meta.section type="copyright"/>
+      </appInfo>
+      <documentation>
+         Copyright (c) 2010 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.modulecore.ui/schema/moduleDependencyPropertyPage.exsd b/plugins/org.eclipse.wst.common.modulecore.ui/schema/moduleDependencyPropertyPage.exsd
new file mode 100644
index 0000000..7562a68
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/schema/moduleDependencyPropertyPage.exsd
@@ -0,0 +1,108 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.wst.common.componentcore.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appinfo>
+         <meta.schema plugin="org.eclipse.wst.common.componentcore.ui" id="moduleDependencyPropertyPage" name="moduleDependencyPropertyPage"/>
+      </appinfo>
+      <documentation>
+         [Enter description of this extension point.]
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appinfo>
+         </appinfo>
+      </annotation>
+      <complexType>
+         <sequence minOccurs="1" maxOccurs="unbounded">
+            <element ref="dependencyPage"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appinfo>
+                  <meta.attribute translatable="true"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="dependencyPage">
+      <complexType>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appinfo>
+                  <meta.attribute kind="java" basedOn=":org.eclipse.wst.common.componentcore.ui.propertypage.IDependencyPageProvider"/>
+               </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>
+
+
+</schema>
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/schema/referenceWizardFragment.exsd b/plugins/org.eclipse.wst.common.modulecore.ui/schema/referenceWizardFragment.exsd
new file mode 100644
index 0000000..dbe2db5
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/schema/referenceWizardFragment.exsd
@@ -0,0 +1,133 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.wst.common.componentcore.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appinfo>
+         <meta.schema plugin="org.eclipse.wst.common.componentcore.ui" id="referenceWizardFragment" name="referenceWizardFragment"/>
+      </appinfo>
+      <documentation>
+         [Enter description of this extension point.]
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appinfo>
+            <meta.element internal="true" />
+         </appinfo>
+      </annotation>
+      <complexType>
+         <sequence minOccurs="1" maxOccurs="unbounded">
+            <element ref="referenceFragment"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appinfo>
+                  <meta.attribute translatable="true"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="referenceFragment">
+      <complexType>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The name will be displayed in the UI, inside the viewer
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="icon" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appinfo>
+                  <meta.attribute kind="resource"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appinfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.wst.common.componentcore.ui.internal.taskwizard.WizardFragment:"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+         <attribute name="hidden" type="boolean">
+            <annotation>
+               <documentation>
+                  True if this reference type should be hidden and NOT exposed as a possible reference for all virtual components, false if it will be hidden and added manually to relevant components&apos; reference wizards.
+               </documentation>
+            </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>
+
+
+</schema>
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/schema/virtualComponentLabelProvider.exsd b/plugins/org.eclipse.wst.common.modulecore.ui/schema/virtualComponentLabelProvider.exsd
new file mode 100644
index 0000000..07d87a8
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/schema/virtualComponentLabelProvider.exsd
@@ -0,0 +1,109 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.wst.common.modulecore.ui" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.wst.common.modulecore.ui" id="virtualComponentLabelProvider" name="virtualComponentLabelProvider"/>
+      </appInfo>
+      <documentation>
+         [Enter description of this extension point.]
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appInfo>
+            <meta.element />
+         </appInfo>
+      </annotation>
+      <complexType>
+         <sequence minOccurs="1" maxOccurs="unbounded">
+            <element ref="provider"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="provider">
+      <complexType>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn=":org.eclipse.wst.common.componentcore.ui.internal.propertypage.IVirtualComponentLabelProvider"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="weight" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </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>
+
+
+</schema>
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/internal/impl/TaskModel.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/internal/impl/TaskModel.java
new file mode 100644
index 0000000..de61006
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/internal/impl/TaskModel.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2007 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.componentcore.internal.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+/**
+ * A task model represents a model that can be shared between multiple
+ * tasks in a common workflow.
+ * <p>
+ * The task model contains information about the overall task flow and allows
+ * tasks to store and retrieve data. Its usage allows multiple tasks to be
+ * chained together and share data from the output of one task to the input
+ * of another.
+ * </p>
+ * 
+ * @since 1.0
+ */
+public class TaskModel {
+
+	private Map<String, Object> map = new HashMap<String, Object>();
+
+	/**
+	 * Returns the object in the task model with the given id.
+	 * <p>
+	 * The id can be any of the predefined ids within TaskModel, or
+	 * any other key to retrieve task-specific data.
+	 * </p>
+	 * 
+	 * @param id an id for the object
+	 * @return the object with the given id, or <code>null</code>
+	 *    if no object could be found with that id
+	 */
+	public Object getObject(String id) {
+		try {
+			return map.get(id);
+		} catch (Exception e) {
+			return null;
+		}
+	}
+
+	/**
+	 * Put an object into the task model with the given id.
+	 * <p>
+	 * The id can be any of the predefined ids within TaskModel, or
+	 * any other key to store task-specific data. 
+	 * </p>
+	 * 
+	 * @param id the id to associate the object with
+	 * @param obj an object, or <code>null</code> to reset (clear) the id
+	 */
+	public void putObject(String id, Object obj) {
+		map.put(id, obj);
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/Messages.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/Messages.java
new file mode 100644
index 0000000..c73d3e7
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/Messages.java
@@ -0,0 +1,55 @@
+/*******************************************************************************
+ * Copyright (c) 2009, 2010 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
+ *     
+ * API in these packages is provisional in this release
+ *******************************************************************************/
+package org.eclipse.wst.common.componentcore.ui;
+
+import org.eclipse.osgi.util.NLS;
+
+public class Messages extends NLS {
+	private static final String BUNDLE_NAME = "org.eclipse.wst.common.componentcore.ui.messages"; //$NON-NLS-1$
+	public static String ModuleAssemblyRootPageDescription;
+	public static String ModuleAssembly;
+	public static String ErrorCheckingFacets;
+	public static String ErrorNotVirtualComponent;
+	public static String DeploymentAssemblyVerifierHelper_0;
+	public static String DeployPathColumn;
+	public static String SourceColumn;
+	public static String InternalLibJarWarning;
+	public static String AddFolder;
+	public static String AddFolderElipses;
+	public static String AddFolderMappings;
+	public static String AddEllipsis;
+	public static String EditEllipsis;
+	public static String RemoveSelected;
+	public static String JarTitle;
+	public static String JarDescription;
+	public static String ExternalJarTitle;
+	public static String ExternalJarDescription;
+	public static String Browse;
+	public static String NewReferenceTitle;
+	public static String NewReferenceDescription;
+	public static String NewReferenceWizard;
+	public static String ProjectReferenceTitle;
+	public static String ProjectReferenceDescription;
+	public static String VariableReferenceTitle;
+	public static String VariableReferenceDescription;
+	public static String WizardError;
+	public static String ProjectConversionError;
+	
+	static {
+		// initialize resource bundle
+		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
+	}
+
+	private Messages() {
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/ModuleCoreUIPlugin.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/ModuleCoreUIPlugin.java
new file mode 100644
index 0000000..2734514
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/ModuleCoreUIPlugin.java
@@ -0,0 +1,174 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ *    
+ * API in these packages is provisional in this release
+ ******************************************************************************/
+package org.eclipse.wst.common.componentcore.ui;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class ModuleCoreUIPlugin extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "org.eclipse.wst.common.modulecore.ui"; //$NON-NLS-1$
+	
+	public static final String[] ICON_DIRS = new String[]{"icons/full/obj16", //$NON-NLS-1$
+		"icons/full/cview16", //$NON-NLS-1$
+		"icons/full/ctool16", //$NON-NLS-1$
+		"icons/full/clcl16", //$NON-NLS-1$
+		"icons/full/ovr16", //$NON-NLS-1$
+		"icons/full/extra", //$NON-NLS-1$
+		"icons/full/wizban", //$NON-NLS-1$
+		"icons", //$NON-NLS-1$
+		""}; //$NON-NLS-1$
+
+	// The shared instance
+	private static ModuleCoreUIPlugin plugin;
+	/**
+	 * The constructor for this plugin
+	 */
+	public ModuleCoreUIPlugin() {
+		super();
+	}
+
+	/**
+	 * Returns the singleton instance of this plugin.
+	 *
+	 * @return org.eclipse.wst.server.ui.internal.plugin.ServerUIPlugin
+	 */
+	public static ModuleCoreUIPlugin getInstance() {
+		return plugin;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Get a .gif from the image registry.
+	 */
+	public Image getImage(String key) {
+		ImageRegistry imageRegistry = getImageRegistry();
+		Image image = imageRegistry.get(key);
+		if (image == null || image.isDisposed()) {
+			ImageDescriptor descriptor = getImageDescriptor(key);
+			if (descriptor != null) {
+				image = descriptor.createImage();
+				imageRegistry.put(key, image);
+			}
+		}
+		return image;
+	}
+
+	/**
+	 * This gets a .gif from the icons folder.
+	 */
+	public ImageDescriptor getImageDescriptor(String key) {
+		ImageDescriptor imageDescriptor = null;
+		URL gifImageURL = getImageURL(key,getBundle());
+		if (gifImageURL != null)
+			imageDescriptor = ImageDescriptor.createFromURL(gifImageURL);
+		return imageDescriptor;
+	}
+
+	/**
+	 * This gets a .gif from the icons folder.
+	 */
+	public URL getImageURL(String key, Bundle bundle) {
+		String gif = "/" + key + ".gif"; //$NON-NLS-1$ //$NON-NLS-2$
+		IPath path = null;
+		for (int i = 0; i < ICON_DIRS.length; i++) {
+			path = new Path(ICON_DIRS[i]).append(gif);
+			if (Platform.find(bundle,path) == null)
+				continue;
+			try {
+				return new URL( bundle.getEntry("/"), path.toString()); //$NON-NLS-1$ 
+			} catch (MalformedURLException exception) {
+				logError(exception);
+				continue;
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static ModuleCoreUIPlugin getDefault() {
+		return plugin;
+	}
+
+	public static void log(Exception e) {
+		log(e.getMessage(), e);
+	}
+	
+	public static void log(String message, Exception e) {
+		IStatus status = new Status(IStatus.ERROR, PLUGIN_ID, message, e);
+		getDefault().getLog().log(status);
+	}
+	public static IStatus createStatus(int severity, int aCode,
+			String aMessage, Throwable exception) {
+		return new Status(severity, PLUGIN_ID, aCode,
+				aMessage != null ? aMessage : "No message.", exception); //$NON-NLS-1$
+	}
+	public static IStatus createErrorStatus(int aCode, String aMessage,
+			Throwable exception) {
+		return createStatus(IStatus.ERROR, aCode, aMessage, exception);
+	}
+
+	public static IStatus createStatus(int severity, String message, Throwable exception) {
+		return new Status(severity, PLUGIN_ID, message, exception);
+	}
+
+	public static IStatus createStatus(int severity, String message) {
+		return createStatus(severity, message, null);
+	}
+	public static void logError(Throwable exception) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( createStatus(IStatus.ERROR, exception.getMessage(), exception));
+	}
+
+	public static void logError(CoreException exception) {
+		Platform.getLog(Platform.getBundle(PLUGIN_ID)).log( exception.getStatus() );
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/Trace.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/Trace.java
new file mode 100644
index 0000000..941d375
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/Trace.java
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2007 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
+ *     
+ * API in these packages is provisional in this release
+ *******************************************************************************/
+package org.eclipse.wst.common.componentcore.ui;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+/**
+ * Helper class to route trace output.
+ */
+public class Trace {
+	public static final byte CONFIG = 0;
+	public static final byte INFO = 1;
+	public static final byte WARNING = 2;
+	public static final byte SEVERE = 3;
+	public static final byte FINEST = 4;
+	public static final byte FINER = 5;
+	public static final byte PERFORMANCE = 6;
+	public static final byte EXTENSION_POINT = 7;
+
+	private static final String[] levelNames = new String[] {
+		"CONFIG ", "INFO   ", "WARNING", "SEVERE ", "FINER  ", "FINEST ", "PERF   ", "EXTENSION"};
+
+	private static final SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yy HH:mm.ss.SSS");
+
+	private static Set<String> logged = new HashSet<String>();
+
+	/**
+	 * Trace constructor comment.
+	 */
+	private Trace() {
+		super();
+	}
+
+	/**
+	 * Trace the given text.
+	 *
+	 * @param level a trace level
+	 * @param s a message
+	 */
+	public static void trace(byte level, String s) {
+		trace(level, s, null);
+	}
+
+	/**
+	 * Trace the given message and exception.
+	 *
+	 * @param level a trace level
+	 * @param s a message
+	 * @param t a throwable
+	 */
+	public static void trace(byte level, String s, Throwable t) {
+		if (s == null)
+			return;
+		
+		if (level == SEVERE) {
+			if (!logged.contains(s)) {
+				ModuleCoreUIPlugin.getInstance().getLog().log(
+						new Status(IStatus.ERROR, 
+								ModuleCoreUIPlugin.PLUGIN_ID, s, t));
+				logged.add(s);
+			}
+		}
+		
+		if (!ModuleCoreUIPlugin.getInstance().isDebugging())
+			return;
+		
+		StringBuffer sb = new StringBuffer(ModuleCoreUIPlugin.PLUGIN_ID);
+		sb.append(" ");
+		sb.append(levelNames[level]);
+		sb.append(" ");
+		sb.append(sdf.format(new Date()));
+		sb.append(" ");
+		sb.append(s);
+		System.out.println(sb.toString());
+		if (t != null)
+			t.printStackTrace();
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/AddFolderDialog.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/AddFolderDialog.java
new file mode 100644
index 0000000..2c93a37
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/AddFolderDialog.java
@@ -0,0 +1,151 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ ******************************************************************************/
+package org.eclipse.wst.common.componentcore.ui.internal.propertypage;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.common.componentcore.ui.Messages;
+
+@Deprecated
+public class AddFolderDialog extends TitleAreaDialog {
+	private IProject project;
+	private TreeViewer viewer;
+	private IContainer selected = null;
+	public AddFolderDialog(Shell parentShell, IProject project) {
+		super(parentShell);        
+        setShellStyle( getShellStyle() | SWT.RESIZE );
+		this.project = project;
+	}
+
+	protected void configureShell(Shell shell) {
+		super.configureShell(shell);
+		
+		shell.setBounds(shell.getLocation().x, shell.getLocation().y, 400,300);
+		
+	}
+	
+	protected Control createDialogArea(Composite parent) {
+		Composite c = (Composite)super.createDialogArea(parent);
+		parent.getShell().setText(Messages.AddFolder);
+		setTitle(Messages.AddFolder);
+	    setMessage(Messages.AddFolderMappings);
+	    //setTitleImage(  );
+		this.viewer = new TreeViewer(c, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+		viewer.setContentProvider(getContentProvider());
+		viewer.setLabelProvider(getLabelProvider());
+		viewer.addFilter(getFilter());
+		viewer.setInput(project);
+		viewer.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
+		viewer.addSelectionChangedListener(getListener());
+		return c;
+	}
+	
+	protected ISelectionChangedListener getListener() {
+		return new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				IStructuredSelection sel = (IStructuredSelection)viewer.getSelection();
+				Object first = sel.getFirstElement();
+				if( first instanceof IContainer) 
+					selected = (IContainer)first;
+			}
+		};
+	}
+	
+	public IContainer getSelected() {
+		return selected;
+	}
+	
+	protected ViewerFilter getFilter() {
+		return new ViewerFilter() {
+			public boolean select(Viewer viewer, Object parentElement,
+					Object element) {
+				return element instanceof IContainer;
+			}
+		};
+	}
+	
+	protected ITreeContentProvider getContentProvider() {
+		return new ITreeContentProvider() {
+			
+			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+			}
+			
+			public void dispose() {
+			}
+			
+			public Object[] getElements(Object inputElement) {
+				try {
+					return project.members();
+				} catch( CoreException ce ) {
+					return new Object[]{};
+				}
+			}
+			
+			public boolean hasChildren(Object element) {
+				if( element instanceof IContainer) {
+					try {
+						return ((IContainer)element).members().length > 0;
+					} catch( CoreException ce ) {
+					}
+				}
+				return false;
+			}
+			
+			public Object getParent(Object element) {
+				if( element instanceof IResource)
+					return ((IResource)element).getParent();
+				return null;
+			}
+			
+			public Object[] getChildren(Object parentElement) {
+				if( parentElement instanceof IContainer) {
+					try {
+						return ((IContainer)parentElement).members();
+					} catch( CoreException ce ) {
+					}
+				}
+				return new Object[]{};
+			}
+		};
+	}
+
+	protected LabelProvider getLabelProvider() {
+		return new LabelProvider() {
+			public Image getImage(Object element) {
+				return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
+			}
+			public String getText(Object element) {
+				if( element instanceof IResource)
+					return ((IResource)element).getName();
+				return element.toString();
+			}
+		};
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/ComponentDependencyContentProvider.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/ComponentDependencyContentProvider.java
new file mode 100644
index 0000000..9c140bc
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/ComponentDependencyContentProvider.java
@@ -0,0 +1,144 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ ******************************************************************************/
+package org.eclipse.wst.common.componentcore.ui.internal.propertypage;
+
+import java.util.ArrayList;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jface.viewers.DecoratingLabelProvider;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.model.WorkbenchLabelProvider;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.componentcore.ui.ModuleCoreUIPlugin;
+import org.eclipse.wst.common.componentcore.ui.propertypage.AddModuleDependenciesPropertiesPage;
+import org.eclipse.wst.common.componentcore.ui.propertypage.AddModuleDependenciesPropertiesPage.ComponentResourceProxy;
+
+
+/*
+ *  The only valid elements this content provider (should) provide
+ *  are IProject or IVirtualComponent objects. The runtime paths portion is 
+ *  shared with the preference page itself where they can both modify the data. 
+ * 
+ * This provider no longer "meddles" in to the content as it used to, 
+ * but rather serves as only a view of it. 
+ */
+public class ComponentDependencyContentProvider extends LabelProvider implements IStructuredContentProvider, ITableLabelProvider {
+	
+	final static String PATH_SEPARATOR = String.valueOf(IPath.SEPARATOR);
+	
+	private ArrayList<IVirtualReference> runtimePaths;
+	private ArrayList<ComponentResourceProxy> resourceMappings;
+	private DecoratingLabelProvider decProvider = new DecoratingLabelProvider(
+	                new WorkbenchLabelProvider(), PlatformUI.getWorkbench().
+	                 getDecoratorManager().getLabelDecorator());
+	private IVirtualComponentLabelProvider[] delegates;
+	public ComponentDependencyContentProvider(AddModuleDependenciesPropertiesPage addModuleDependenciesPropertiesPage) {
+		super();
+		decProvider.addListener(addModuleDependenciesPropertiesPage);
+		delegates = DependencyPageExtensionManager.loadDelegates();
+	}
+
+	public void setRuntimePaths(ArrayList<IVirtualReference> runtimePaths) {
+		this.runtimePaths = runtimePaths;
+	}
+
+	public void setResourceMappings(ArrayList<ComponentResourceProxy> mappings) {
+		this.resourceMappings = mappings;
+	}
+	
+	public Object[] getElements(Object inputElement) {
+		Object[] empty = new Object[0];
+		if( !(inputElement instanceof IWorkspaceRoot))
+			return empty;
+		ArrayList<Object> list = new ArrayList<Object>();
+		list.addAll(resourceMappings);
+		list.addAll(runtimePaths);
+		return list.toArray();
+	}
+	
+	public Image getColumnImage(Object element, int columnIndex) {
+		if( element instanceof ComponentResourceProxy) {
+			return ModuleCoreUIPlugin.getInstance().getImage("folder");
+		}
+		if (element instanceof IVirtualReference) {
+			if (columnIndex == 0)
+				return ModuleCoreUIPlugin.getInstance().getImage("jar_obj");
+			else
+				return handleSourceImage(((IVirtualReference)element).getReferencedComponent());
+		} 
+		if (element instanceof IProject){
+			return decProvider.getImage(element);
+		}
+		return null;
+	}
+
+	public String getColumnText(Object element, int columnIndex) {
+		if( element instanceof ComponentResourceProxy) {
+			if( columnIndex == 0 ) 
+				return ((ComponentResourceProxy)element).runtimePath.toString();
+			else if( columnIndex == 1 ) 
+				return ((ComponentResourceProxy)element).source.toString();
+		}
+		if( element instanceof IVirtualReference) {
+			if (columnIndex == 0) {
+				return AddModuleDependenciesPropertiesPage.getSafeRuntimePath((IVirtualReference)element);
+			} else if (columnIndex == 1) {
+				return handleSourceText(((IVirtualReference)element).getReferencedComponent());
+			}
+		}
+		return null;
+	}
+
+	
+	private String handleSourceText(IVirtualComponent component) {
+		if( delegates != null ) {
+			for( int i = 0; i < delegates.length; i++ )
+				if( delegates[i].canHandle(component))
+					return delegates[i].getSourceText(component);
+		}
+		
+		// default impl
+		if( component.isBinary() ) {
+			IPath p = (IPath)component.getAdapter(IPath.class);
+			return p == null ? null : p.toString();
+		}
+		return component.getProject().getName();
+	}
+
+	private Image handleSourceImage(IVirtualComponent component) {
+		if( delegates != null ) {
+			for( int i = 0; i < delegates.length; i++ )
+				if( delegates[i].canHandle(component))
+					return delegates[i].getSourceImage(component);
+		}
+		
+		// default impl
+		if(component.isBinary())
+			return ModuleCoreUIPlugin.getInstance().getImage("jar_obj");
+		else return decProvider.getImage(component.getProject());
+	}
+	
+	
+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/DependencyPageExtensionManager.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/DependencyPageExtensionManager.java
new file mode 100644
index 0000000..05eadcc
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/DependencyPageExtensionManager.java
@@ -0,0 +1,202 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ ******************************************************************************/
+package org.eclipse.wst.common.componentcore.ui.internal.propertypage;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.eclipse.wst.common.componentcore.ui.ModuleCoreUIPlugin;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.WizardFragment;
+import org.eclipse.wst.common.componentcore.ui.propertypage.IDependencyPageProvider;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+
+public class DependencyPageExtensionManager {
+	private static DependencyPageExtensionManager manager = null;
+	public static DependencyPageExtensionManager getManager() {
+		if( manager == null )
+			manager = new DependencyPageExtensionManager();
+		return manager;
+	}
+	
+	private HashMap<String, IDependencyPageProvider> providers = null;
+	
+	public IDependencyPageProvider getProvider(IFacetedProject project) {
+		if( providers == null )
+			loadProviders();
+		Iterator<IDependencyPageProvider> i = providers.values().iterator();
+		IDependencyPageProvider temp;
+		while(i.hasNext()) {
+			temp = i.next();
+			if( temp.canHandle(project))
+				return temp;
+		}
+		return null;
+	}
+	
+	private void loadProviders() {
+		HashMap<String, IDependencyPageProvider> temp = new HashMap<String, IDependencyPageProvider>();
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		IConfigurationElement[] cf = registry.getConfigurationElementsFor(
+				ModuleCoreUIPlugin.PLUGIN_ID, "moduleDependencyPropertyPage"); //$NON-NLS-1$
+		for( int i = 0; i < cf.length; i++ ) {
+			try {
+				temp.put(cf[i].getAttribute("id"),  //$NON-NLS-1$
+					(IDependencyPageProvider)cf[i].createExecutableExtension("class"));  //$NON-NLS-1$
+			} catch( CoreException ce ) {}
+		}
+		providers = temp;
+	}
+	
+	public WizardFragment[] loadAllReferenceWizardFragments() {
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		IConfigurationElement[] cf = registry.getConfigurationElementsFor(
+				ModuleCoreUIPlugin.PLUGIN_ID, "referenceWizardFragment"); //$NON-NLS-1$
+		ArrayList<WizardFragment> list = new ArrayList<WizardFragment>();
+		for( int i = 0; i < cf.length; i++ ) {
+			try {
+				list.add((WizardFragment)cf[i].createExecutableExtension("class"));
+			} catch( CoreException ce) {}
+		}
+		return list.toArray(new WizardFragment[list.size()]);
+	}
+	
+	public WizardFragment loadReferenceWizardFragment(String id) {
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		IConfigurationElement[] cf = registry.getConfigurationElementsFor(
+				ModuleCoreUIPlugin.PLUGIN_ID, "referenceWizardFragment"); //$NON-NLS-1$
+		for( int i = 0; i < cf.length; i++ ) {
+			if( cf[i].getAttribute("id").equals(id)) //$NON-NLS-1$
+				try {
+					return (WizardFragment)cf[i].createExecutableExtension("class"); //$NON-NLS-1$
+				} catch( CoreException ce) {}
+		}
+		return null;
+	}
+	
+	public ReferenceExtension[] getExposedReferenceExtensions() {
+		ArrayList<ReferenceExtension> list = new ArrayList<ReferenceExtension>();
+		list.addAll(Arrays.asList(getAllReferenceExtensions()));
+		for(Iterator<ReferenceExtension> i = list.iterator();i.hasNext();) {
+			if(i.next().isHidden())
+				i.remove();
+		}
+		return list.toArray(new ReferenceExtension[list.size()]);
+	}
+	
+	public ReferenceExtension[] getAllReferenceExtensions() {
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		IConfigurationElement[] cf = registry.getConfigurationElementsFor(
+				ModuleCoreUIPlugin.PLUGIN_ID, "referenceWizardFragment"); //$NON-NLS-1$
+		ArrayList<ReferenceExtension> list = new ArrayList<ReferenceExtension>();
+		for( int i = 0; i < cf.length; i++ ) {
+			list.add(new ReferenceExtension(cf[i]));
+		}
+		return list.toArray(new ReferenceExtension[list.size()]);
+	}
+	
+	public ReferenceExtension findReferenceExtension(String id) {
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		IConfigurationElement[] cf = registry.getConfigurationElementsFor(
+				ModuleCoreUIPlugin.PLUGIN_ID, "referenceWizardFragment"); //$NON-NLS-1$
+		ArrayList<ReferenceExtension> list = new ArrayList<ReferenceExtension>();
+		for( int i = 0; i < cf.length; i++ ) {
+			if(cf[i].getAttribute("id").equals(id)) //$NON-NLS-1$
+				return new ReferenceExtension(cf[i]);
+		}
+		return null;
+	}
+	
+	public class ReferenceExtension {
+		private IConfigurationElement element;
+		private String id, name, imageLoc;
+		private Image image;
+		private boolean hidden;
+		public ReferenceExtension(IConfigurationElement element) {
+			this.element = element;
+			this.id = element.getAttribute("id"); //$NON-NLS-1$
+			this.name = element.getAttribute("name"); //$NON-NLS-1$
+			this.imageLoc = element.getAttribute("icon"); //$NON-NLS-1$
+			this.hidden = Boolean.parseBoolean(element.getAttribute("hidden")); //$NON-NLS-1$
+		}
+		
+		public String getId() { return this.id;}
+		public String getName() { return this.name; }
+		public boolean isHidden() { return this.hidden; }
+		public Image getImage() { 
+			if( image == null ) {
+				if( imageLoc != null && element.getContributor().getName() != null) {
+					ImageDescriptor desc = AbstractUIPlugin.imageDescriptorFromPlugin(element.getContributor().getName(), imageLoc);
+					image = desc.createImage();
+				}
+			}
+			return image;
+		}
+		public void disposeImage() {
+			if( image != null ) {
+				image.dispose();
+				image = null;
+			}
+		}
+	}
+	
+	public static IVirtualComponentLabelProvider[] loadDelegates() {
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		IConfigurationElement[] cf = registry.getConfigurationElementsFor(
+				ModuleCoreUIPlugin.PLUGIN_ID, "virtualComponentLabelProvider"); //$NON-NLS-1$
+		List<IConfigurationElement> list = Arrays.asList(cf);
+		Comparator c = new Comparator<IConfigurationElement>() {
+			public int compare(IConfigurationElement o1,
+					IConfigurationElement o2) {
+				String o1String, o2String;
+				int o1int, o2int;
+				o1String=o1.getAttribute("weight");
+				o2String=o2.getAttribute("weight");
+				try {
+					o1int = Integer.parseInt(o1String);
+				} catch(NumberFormatException nfe ) {
+					o1int = 0;
+				}
+				try {
+					o2int = Integer.parseInt(o2String);
+				} catch(NumberFormatException nfe ) {
+					o2int = 0;
+				}
+				return o1int-o2int;
+			}
+		};
+		Collections.sort(list, c);
+		ArrayList<IVirtualComponentLabelProvider> retList = new ArrayList<IVirtualComponentLabelProvider>();
+		Iterator<IConfigurationElement> i = list.iterator();
+		while(i.hasNext()) {
+			try {
+				IConfigurationElement el = i.next();
+				String className = el.getAttribute("class");
+				retList.add((IVirtualComponentLabelProvider)el.createExecutableExtension("class"));
+			} catch( CoreException ce) {
+				// log
+			}
+		}
+		return retList.toArray(new IVirtualComponentLabelProvider[retList.size()]);
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/FolderMappingWizardFragment.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/FolderMappingWizardFragment.java
new file mode 100644
index 0000000..af3ab88
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/FolderMappingWizardFragment.java
@@ -0,0 +1,174 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ ******************************************************************************/
+package org.eclipse.wst.common.componentcore.ui.internal.propertypage;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerFilter;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.ISharedImages;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.common.componentcore.ui.Messages;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.IWizardHandle;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.WizardFragment;
+import org.eclipse.wst.common.componentcore.ui.propertypage.AddModuleDependenciesPropertiesPage.ComponentResourceProxy;
+import org.eclipse.wst.common.componentcore.ui.propertypage.IReferenceWizardConstants;
+
+public class FolderMappingWizardFragment extends WizardFragment {
+	private IProject project;
+	private TreeViewer viewer;
+	private IContainer selected = null;
+	protected IWizardHandle handle;
+
+	boolean isComplete = false;
+
+	public boolean isComplete() {
+		return isComplete;
+	}
+	
+	public boolean hasComposite() {
+		return true;
+	}
+
+	public Composite createComposite(Composite parent, IWizardHandle handle) {
+		this.handle = handle;
+		handle.setTitle(Messages.AddFolder);
+		handle.setDescription(Messages.AddFolderMappings);
+		project = (IProject)getTaskModel().getObject(IReferenceWizardConstants.PROJECT);		
+		Composite c = new Composite(parent, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		c.setLayout(layout);
+		this.viewer = new TreeViewer(c, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
+		viewer.setContentProvider(getContentProvider());
+		viewer.setLabelProvider(getLabelProvider());
+		viewer.addFilter(getFilter());
+		viewer.setInput(project);
+		viewer.addSelectionChangedListener(getListener());
+		GridData data = new GridData(GridData.FILL_BOTH);
+		data.widthHint = 390;
+		data.heightHint = 185;
+		viewer.getTree().setLayoutData(data);
+		return c;
+	}
+	
+	protected ISelectionChangedListener getListener() {
+		return new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				IStructuredSelection sel = (IStructuredSelection)viewer.getSelection();
+				Object first = sel.getFirstElement();
+				if( first instanceof IContainer) {
+					selected = (IContainer)first;
+					if(!isComplete) {
+						isComplete = true;
+						handle.update();
+					}
+				}
+			}
+		};
+	}
+	
+	public IContainer getSelected() {
+		return selected;
+	}
+	
+	protected ViewerFilter getFilter() {
+		return new ViewerFilter() {
+			public boolean select(Viewer viewer, Object parentElement,
+					Object element) {
+				return element instanceof IContainer;
+			}
+		};
+	}
+	
+	protected ITreeContentProvider getContentProvider() {
+		return new ITreeContentProvider() {
+			
+			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+			}
+			
+			public void dispose() {
+			}
+			
+			public Object[] getElements(Object inputElement) {
+				try {
+					return project.members();
+				} catch( CoreException ce ) {
+					return new Object[]{};
+				}
+			}
+			
+			public boolean hasChildren(Object element) {
+				if( element instanceof IContainer) {
+					try {
+						return ((IContainer)element).members().length > 0;
+					} catch( CoreException ce ) {
+					}
+				}
+				return false;
+			}
+			
+			public Object getParent(Object element) {
+				if( element instanceof IResource)
+					return ((IResource)element).getParent();
+				return null;
+			}
+			
+			public Object[] getChildren(Object parentElement) {
+				if( parentElement instanceof IContainer) {
+					try {
+						return ((IContainer)parentElement).members();
+					} catch( CoreException ce ) {
+					}
+				}
+				return new Object[]{};
+			}
+		};
+	}
+
+	protected LabelProvider getLabelProvider() {
+		return new LabelProvider() {
+			public Image getImage(Object element) {
+				return PlatformUI.getWorkbench().getSharedImages().getImage(ISharedImages.IMG_OBJ_FOLDER);
+			}
+			public String getText(Object element) {
+				if( element instanceof IResource)
+					return ((IResource)element).getName();
+				return element.toString();
+			}
+		};
+	}
+
+
+	public void performFinish(IProgressMonitor monitor) throws CoreException {
+		IContainer c = getSelected();
+		if( c != null ) {
+			IPath p = c.getProjectRelativePath();
+			ComponentResourceProxy proxy = new ComponentResourceProxy(p, new Path("/")); //$NON-NLS-1$
+			getTaskModel().putObject(IReferenceWizardConstants.FOLDER_MAPPING, proxy);
+		}
+	}	
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/IReferenceEditor.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/IReferenceEditor.java
new file mode 100644
index 0000000..eb00ab3
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/IReferenceEditor.java
@@ -0,0 +1,31 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ ******************************************************************************/
+package org.eclipse.wst.common.componentcore.ui.internal.propertypage;
+
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+
+/**
+ * WizardFragments that are providing reference wizard extensions
+ * may also implement IReferenceEditor to show that this particular
+ * fragment may be able to edit components it has created. 
+ */
+public interface IReferenceEditor {
+	
+	/**
+	 * The wizard fragment that implements this interface 
+	 * and is able to edit the provided reference is expected 
+	 * to cache this reference at the time canEdit(etc) is called
+	 * 
+	 * @param vc
+	 * @return
+	 */
+	public boolean canEdit(IVirtualReference reference);
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/IVirtualComponentLabelProvider.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/IVirtualComponentLabelProvider.java
new file mode 100644
index 0000000..6007c03
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/IVirtualComponentLabelProvider.java
@@ -0,0 +1,43 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ ******************************************************************************/
+package org.eclipse.wst.common.componentcore.ui.internal.propertypage;
+
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+
+public interface IVirtualComponentLabelProvider {
+	/**
+	 * Return whether this label provider can provide
+	 * UI elements for this component
+	 * @param component
+	 * @return
+	 */
+	public boolean canHandle(IVirtualComponent component);
+	
+	/**
+	 * Return a string representation for this component
+	 * @param component
+	 * @return
+	 */
+	public String getSourceText(IVirtualComponent component);
+	
+	/**
+	 * Return an image representing this component
+	 * @param component
+	 * @return
+	 */
+	public Image getSourceImage(IVirtualComponent component);
+	
+	/**
+	 * Clean up any images you created
+	 */
+	public void dispose();
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/NewReferenceRootWizardFragment.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/NewReferenceRootWizardFragment.java
new file mode 100644
index 0000000..573a906
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/NewReferenceRootWizardFragment.java
@@ -0,0 +1,171 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ ******************************************************************************/
+package org.eclipse.wst.common.componentcore.ui.internal.propertypage;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.wst.common.componentcore.ui.Messages;
+import org.eclipse.wst.common.componentcore.ui.internal.propertypage.DependencyPageExtensionManager.ReferenceExtension;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.IWizardHandle;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.WizardFragment;
+
+public class NewReferenceRootWizardFragment extends WizardFragment {
+	protected Map<String, WizardFragment> fragmentMap = 
+		new HashMap<String, WizardFragment>();
+	private IWizardHandle wizard;
+	private TreeViewer viewer;
+	private ReferenceExtension[] extensions = null;
+	public NewReferenceRootWizardFragment(ReferenceExtension[] extensions) {
+		this.extensions = extensions != null ? extensions :
+				DependencyPageExtensionManager.getManager().getExposedReferenceExtensions();
+		if( this.extensions.length == 0 )
+			setComplete(false);
+	}
+	
+	public boolean hasComposite() {
+		return true;
+	}
+
+	public Composite createComposite(Composite parent, final IWizardHandle wizard) {
+		this.wizard = wizard;
+		wizard.setTitle(Messages.NewReferenceTitle);
+		wizard.setDescription(Messages.NewReferenceDescription);
+		Composite c = new Composite(parent, SWT.NONE);
+		c.setLayout(new FillLayout());
+		viewer = new TreeViewer(c, SWT.SINGLE | SWT.BORDER);
+		viewer.setLabelProvider(getLabelProvider());
+		viewer.setContentProvider(getContentProvider());
+		viewer.setInput(ResourcesPlugin.getWorkspace());
+		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				viewerSelectionChanged();
+			}
+		});
+		viewer.addDoubleClickListener(new IDoubleClickListener() {
+			public void doubleClick(DoubleClickEvent event) {
+				advanceToNextPageOrFinish();
+			}
+		});
+		return c;
+	}
+
+	protected void viewerSelectionChanged() {
+		wizard.update();
+	}
+	
+	protected WizardFragment getWizardFragment(String extensionPointID) {
+		try {
+			WizardFragment fragment = fragmentMap.get(extensionPointID);
+			if (fragment != null)
+				return fragment;
+		} catch (Exception e) {
+			// ignore
+		}
+		
+		WizardFragment fragment = DependencyPageExtensionManager.getManager().loadReferenceWizardFragment(extensionPointID);
+		if (fragment != null)
+			fragmentMap.put(extensionPointID, fragment);
+		return fragment;
+	}
+
+	public List getChildFragments() {
+		List<WizardFragment> listImpl = new ArrayList<WizardFragment>();
+		createChildFragments(listImpl);
+		return listImpl;
+	}
+
+	protected void createChildFragments(List<WizardFragment> list) {
+		// Instantiate and add the fragment for the current ID
+		if( viewer != null ) {
+			IStructuredSelection sel = (IStructuredSelection)viewer.getSelection();
+			ReferenceExtension selected = (ReferenceExtension)sel.getFirstElement();
+			if( selected != null ) {
+				WizardFragment child = getWizardFragment(selected.getId());
+				if( child != null )
+					list.add(child);
+			}
+		}
+	}
+
+	public boolean isComplete() {
+		return true;
+	}
+
+	
+	private LabelProvider labelProvider = null;
+	private ITreeContentProvider contentProvider = null;
+	protected LabelProvider getLabelProvider() {
+		if( labelProvider == null ) {
+			labelProvider = new LabelProvider() {
+				public Image getImage(Object element) {
+					if( element instanceof ReferenceExtension)
+						return ((ReferenceExtension)element).getImage();
+					return null;
+				}
+				public String getText(Object element) {
+					if( element instanceof ReferenceExtension)
+						return ((ReferenceExtension)element).getName();
+					return element == null ? "" : element.toString();//$NON-NLS-1$
+				}
+			   public void dispose() {
+			    	super.dispose();
+			    	if( extensions != null ) {
+			    		for( int i = 0; i < extensions.length; i++) {
+			    			extensions[i].disposeImage();
+			    		}
+			    	}
+			    }
+			};
+		}
+		return labelProvider;
+	}
+	
+	protected ITreeContentProvider getContentProvider() {
+		if( contentProvider == null ) {
+			contentProvider = new ITreeContentProvider() {
+				public Object[] getElements(Object inputElement) {
+					return extensions;
+				}
+				public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+				}
+				public void dispose() {
+				}
+				public boolean hasChildren(Object element) {
+					return false;
+				}
+				public Object getParent(Object element) {
+					return null;
+				}
+				public Object[] getChildren(Object parentElement) {
+					return null;
+				}
+			};
+		}
+		return contentProvider;
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/NewReferenceWizard.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/NewReferenceWizard.java
new file mode 100644
index 0000000..b4f2440
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/NewReferenceWizard.java
@@ -0,0 +1,71 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ ******************************************************************************/
+package org.eclipse.wst.common.componentcore.ui.internal.propertypage;
+
+import java.util.List;
+
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.componentcore.ui.Messages;
+import org.eclipse.wst.common.componentcore.ui.internal.propertypage.DependencyPageExtensionManager.ReferenceExtension;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.TaskWizard;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.WizardFragment;
+import org.eclipse.wst.common.componentcore.ui.propertypage.IReferenceWizardConstants;
+
+public class NewReferenceWizard extends TaskWizard implements IReferenceWizardConstants {
+	private static final Object REFERENCE_FAMILY = new Object();
+	public NewReferenceWizard() {
+		this(null);
+	}
+	public NewReferenceWizard(ReferenceExtension[] extensions) {
+		super(Messages.NewReferenceWizard, new RootWizardFragment(extensions));
+		setFinishJobFamily(REFERENCE_FAMILY);
+		getRootFragment().setTaskModel(getTaskModel());
+	}
+	protected static class RootWizardFragment extends WizardFragment {
+		private ReferenceExtension[] extensions = null;
+		public RootWizardFragment() {}
+		public RootWizardFragment(ReferenceExtension[] extensions) {
+			this.extensions = extensions;
+		}
+
+		protected void createChildFragments(List<WizardFragment> list) {
+			IVirtualReference origRef = (IVirtualReference)getTaskModel().getObject(ORIGINAL_REFERENCE);
+			if( origRef == null )
+				list.add(new NewReferenceRootWizardFragment(extensions));
+			else {
+				WizardFragment fragment = getFirstEditingFragment(origRef);
+				if( fragment != null )
+					list.add(fragment);
+			}
+			if( list.size() == 0 )
+				setComplete(false);
+		}
+	}
+
+	public static WizardFragment getFirstEditingFragment(IVirtualReference reference) {
+		WizardFragment[] frags = DependencyPageExtensionManager.getManager().loadAllReferenceWizardFragments();
+		for( int i = 0; i < frags.length; i++ ) {
+			if( frags[i] instanceof IReferenceEditor ) {
+				if( ((IReferenceEditor)frags[i]).canEdit(reference)) {
+					// accept first one
+					return frags[i];
+				}
+			}
+		}
+		return null;
+	}
+	
+	public void init(IWorkbench newWorkbench, IStructuredSelection newSelection) {
+		// do nothing
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/ProjectReferenceWizardFragment.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/ProjectReferenceWizardFragment.java
new file mode 100644
index 0000000..725cdd6
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/ProjectReferenceWizardFragment.java
@@ -0,0 +1,224 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ ******************************************************************************/
+package org.eclipse.wst.common.componentcore.ui.internal.propertypage;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.ide.IDE;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.ModuleCoreNature;
+import org.eclipse.wst.common.componentcore.internal.IModuleHandler;
+import org.eclipse.wst.common.componentcore.internal.resources.VirtualReference;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.componentcore.ui.Messages;
+import org.eclipse.wst.common.componentcore.ui.ModuleCoreUIPlugin;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.IWizardHandle;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.TaskWizardPage;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.WizardFragment;
+import org.eclipse.wst.common.componentcore.ui.propertypage.IReferenceWizardConstants;
+import org.eclipse.wst.common.componentcore.ui.propertypage.IReferenceWizardConstants.ProjectConverterOperationProvider;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+
+public class ProjectReferenceWizardFragment extends WizardFragment {
+	protected LabelProvider labelProvider = null;
+	protected ITreeContentProvider contentProvider = null;
+	protected TreeViewer viewer;
+	protected IProject[] selected;
+	
+	public ProjectReferenceWizardFragment() {
+		super();
+		setComplete(false);
+	}
+	public boolean hasComposite() {
+		return true;
+	}
+
+	public Composite createComposite(Composite parent, IWizardHandle handle) {
+		handle.setTitle(Messages.ProjectReferenceTitle);
+		handle.setDescription(Messages.ProjectReferenceDescription);
+		
+		Composite c = new Composite(parent, SWT.NONE);
+		c.setLayout(new GridLayout());
+		viewer = new TreeViewer(c, SWT.MULTI | SWT.BORDER);
+		viewer.setContentProvider(getContentProvider());
+		viewer.setLabelProvider(getLabelProvider());
+		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				selChanged();
+			}
+		});
+		viewer.addDoubleClickListener(new IDoubleClickListener() {
+			public void doubleClick(DoubleClickEvent event) {
+				advanceToNextPageOrFinish();
+			}
+		});
+		viewer.setInput(ResourcesPlugin.getWorkspace());
+		GridData data = new GridData(GridData.FILL_BOTH);
+		data.widthHint = 390;
+		data.heightHint = 185;
+		viewer.getTree().setLayoutData(data);
+		return c;
+	}
+	
+	protected void selChanged() {
+		if( viewer != null ) {
+			IStructuredSelection sel = (IStructuredSelection)viewer.getSelection();
+			if( sel != null ) {
+				List selectionList = sel.toList();
+				selected = (IProject[])selectionList.toArray(new IProject[selectionList.size()]);
+				if (selected.length != 0) setComplete(true);
+				else setComplete(false);
+			} else setComplete(false);
+		}
+		((TaskWizardPage)getPage()).update();
+	}
+	
+	public void performFinish(IProgressMonitor monitor) throws CoreException {
+		VirtualReference[] refs = new VirtualReference[selected.length];
+		String runtimeLoc = (String) getTaskModel().getObject(IReferenceWizardConstants.DEFAULT_LIBRARY_LOCATION);
+		ProjectConverterOperationProvider converter = (ProjectConverterOperationProvider)getTaskModel().getObject(IReferenceWizardConstants.PROJECT_CONVERTER_OPERATION_PROVIDER);
+		runtimeLoc = runtimeLoc != null ? runtimeLoc : "/"; //$NON-NLS-1$
+		for (int i = 0; i < selected.length; i++) {
+			IProject proj = selected[i];
+			
+			if( !ModuleCoreNature.isFlexibleProject(proj)) {
+				convertProject(selected[i], converter, monitor);
+			}
+			String path = null;
+			refs[i] = new VirtualReference(
+					(IVirtualComponent)getTaskModel().getObject(IReferenceWizardConstants.ROOT_COMPONENT), 
+					ComponentCore.createComponent(proj, false));
+			refs[i].setArchiveName(getArchiveName(proj, refs[i].getReferencedComponent()));
+			refs[i].setRuntimePath(new Path(runtimeLoc).makeAbsolute());
+		}
+		getTaskModel().putObject(IReferenceWizardConstants.FINAL_REFERENCE, refs);
+	}
+
+	protected void convertProject(IProject proj, ProjectConverterOperationProvider converter, IProgressMonitor monitor) {
+		if( converter != null ) {
+			IDataModelOperation operation = converter.getConversionOperation(proj);
+			if( operation != null ) {
+				try {
+					operation.execute(monitor, null);
+					return;
+				} catch( ExecutionException ee ) {
+					ModuleCoreUIPlugin.log(NLS.bind(Messages.ProjectConversionError, proj.getName()), ee);
+				}
+			}
+		} 
+		try {
+			if( !ModuleCoreNature.isFlexibleProject(proj)) {
+				ModuleCoreNature.addModuleCoreNatureIfNecessary(proj, monitor);
+				ProjectFacetsManager.create(proj, true, monitor);
+			}
+		} catch( CoreException ce) {
+			ModuleCoreUIPlugin.log(NLS.bind(Messages.ProjectConversionError, proj.getName()), ce);
+		}
+	}
+	
+	protected String getArchiveName(IProject proj, IVirtualComponent comp) {
+		return getModuleHandler().getArchiveName(proj,comp);
+	}
+
+	
+	protected IModuleHandler getModuleHandler() {
+		return (IModuleHandler)getTaskModel().getObject(IReferenceWizardConstants.MODULEHANDLER);
+	}
+
+	protected LabelProvider getLabelProvider() {
+		if( labelProvider == null ) {
+			labelProvider = new LabelProvider() {
+				public Image getImage(Object element) {
+					return PlatformUI.getWorkbench().getSharedImages().getImage(IDE.SharedImages.IMG_OBJ_PROJECT);
+				}
+				public String getText(Object element) {
+					if( element instanceof IProject )
+						return ((IProject)element).getName();
+					return element == null ? "" : element.toString();//$NON-NLS-1$
+				}
+			};
+		}
+		return labelProvider;
+	}
+	
+	protected ITreeContentProvider getContentProvider() {
+		if( contentProvider == null ) {
+			contentProvider = new ITreeContentProvider() {
+				public Object[] getElements(Object inputElement) {
+					IProject root = (IProject)getTaskModel().getObject(IReferenceWizardConstants.PROJECT);
+					IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+					ArrayList<IVirtualReference> currentRefs = (ArrayList<IVirtualReference>)getTaskModel().getObject(IReferenceWizardConstants.CURRENT_REFS);
+					ArrayList<IProject> availableList = getAvailableProjects(projects,currentRefs);
+					IVirtualComponent comp = (IVirtualComponent)getTaskModel().getObject(IReferenceWizardConstants.ROOT_COMPONENT);
+					List filtered = getModuleHandler().getFilteredProjectListForAdd(comp, availableList);
+					return filtered.toArray(new IProject[filtered.size()]);
+				}
+				private ArrayList<IProject> getAvailableProjects(IProject[] projects, ArrayList<IVirtualReference> currentRefs) {
+					if (currentRefs.isEmpty())
+						return new ArrayList<IProject>(Arrays.asList(projects));
+					ArrayList availProjects = new ArrayList();
+					for (int i = 0; i < projects.length; i++) {
+						IProject proj = projects[i];
+						boolean matches = false;
+						for (int j = 0; j < currentRefs.size() && !matches; j++) {
+							IVirtualReference ref = currentRefs.get(j);
+							if ((ref.getReferencedComponent().getProject().equals(proj)) || availProjects.contains(proj))
+								matches = true;
+						}
+						if( !matches )
+							availProjects.add(proj);
+					}
+					return availProjects;
+				}
+				public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+				}
+				public void dispose() {
+				}
+				public boolean hasChildren(Object element) {
+					return false;
+				}
+				public Object getParent(Object element) {
+					return null;
+				}
+				public Object[] getChildren(Object parentElement) {
+					return null;
+				}
+			};
+		}
+		return contentProvider;
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/verifier/AbstractDeploymentAssemblyVerifier.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/verifier/AbstractDeploymentAssemblyVerifier.java
new file mode 100644
index 0000000..7cc4832
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/verifier/AbstractDeploymentAssemblyVerifier.java
@@ -0,0 +1,23 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.componentcore.ui.internal.propertypage.verifier;
+
+import org.eclipse.core.runtime.IStatus;
+
+/**
+ * All extenders of AbstractDeploymentAssemblyVerifier must implement the verify methods to perform any verification on the deployment assembly wizard page
+ *
+ */
+public abstract class AbstractDeploymentAssemblyVerifier implements IDeploymentAssemblyVerifier {
+
+	public abstract IStatus verify(DeploymentAssemblyVerifierData data);
+
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/verifier/DeploymentAssemblyVerifierData.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/verifier/DeploymentAssemblyVerifierData.java
new file mode 100644
index 0000000..c183835
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/verifier/DeploymentAssemblyVerifierData.java
@@ -0,0 +1,67 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.componentcore.ui.internal.propertypage.verifier;
+
+import java.util.ArrayList;
+
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.componentcore.ui.propertypage.AddModuleDependenciesPropertiesPage.ComponentResourceProxy;
+import org.eclipse.wst.server.core.IRuntime;
+
+public class DeploymentAssemblyVerifierData {
+	
+	public DeploymentAssemblyVerifierData(IVirtualComponent component, IRuntime runtime, ArrayList<IVirtualReference> currentReferences,
+			ArrayList<ComponentResourceProxy> resourceMappings, boolean resourceMappingsChanged) {
+		super();
+		this.component = component;
+		this.runtime = runtime;
+		this.currentReferences = currentReferences;
+		this.resourceMappings = resourceMappings;
+		this.resourceMappingsChanged = resourceMappingsChanged;
+	}
+	private IVirtualComponent component;
+	private IRuntime runtime;
+	private ArrayList<IVirtualReference> currentReferences;
+	private ArrayList<ComponentResourceProxy> resourceMappings;
+	private boolean resourceMappingsChanged;
+	public IVirtualComponent getComponent() {
+		return component;
+	}
+	public void setComponent(IVirtualComponent component) {
+		this.component = component;
+	}
+	public IRuntime getRuntime() {
+		return runtime;
+	}
+	public void setRuntime(IRuntime runtime) {
+		this.runtime = runtime;
+	}
+	public ArrayList<IVirtualReference> getCurrentReferences() {
+		return currentReferences;
+	}
+	public void setCurrentReferences(ArrayList<IVirtualReference> currentReferences) {
+		this.currentReferences = currentReferences;
+	}
+	public ArrayList<ComponentResourceProxy> getResourceMappings() {
+		return resourceMappings;
+	}
+	public void setResourceMappings(ArrayList<ComponentResourceProxy> resourceMappings) {
+		this.resourceMappings = resourceMappings;
+	}
+	public boolean isResourceMappingsChanged() {
+		return resourceMappingsChanged;
+	}
+	public void setResourceMappingsChanged(boolean resourceMappingsChanged) {
+		this.resourceMappingsChanged = resourceMappingsChanged;
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/verifier/DeploymentAssemblyVerifierHelper.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/verifier/DeploymentAssemblyVerifierHelper.java
new file mode 100644
index 0000000..f73b46b
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/verifier/DeploymentAssemblyVerifierHelper.java
@@ -0,0 +1,95 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.componentcore.ui.internal.propertypage.verifier;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.componentcore.ui.Messages;
+import org.eclipse.wst.common.componentcore.ui.ModuleCoreUIPlugin;
+import org.eclipse.wst.common.componentcore.ui.propertypage.AddModuleDependenciesPropertiesPage.ComponentResourceProxy;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.eclipse.wst.server.core.IRuntime;
+
+public class DeploymentAssemblyVerifierHelper {
+	
+	
+	/**
+	 * This method will use the facet framework to find all registered verifiers based on installed facets and runtimes.
+	 * All the verifiers will have an opportunity to verify and return status on the proposed component mappings
+	 * @param component
+	 * @param runtime
+	 * @param resourceMappingsChanged 
+	 * @param resourceMappings 
+	 * @param currentReferences 
+	 * @return IStatus
+	 */
+	public static IStatus verify(IVirtualComponent component,IRuntime runtime, ArrayList<IVirtualReference> currentReferences, ArrayList<ComponentResourceProxy> resourceMappings, boolean resourceMappingsChanged) {
+		IProject project = component.getProject();
+		
+		List verifiers = collectAllVerifiers(project,runtime);
+		if (verifiers.isEmpty()) return Status.OK_STATUS;
+		MultiStatus masterStatus = new MultiStatus(ModuleCoreUIPlugin.PLUGIN_ID, IStatus.OK, Messages.DeploymentAssemblyVerifierHelper_0,null); 
+		
+		for (int i = 0; i < verifiers.size(); i++) {
+			if (!(verifiers.get(i) instanceof IConfigurationElement))
+				continue;
+			IDeploymentAssemblyVerifier verifier = null;
+			try {
+				verifier = (IDeploymentAssemblyVerifier) ((IConfigurationElement) verifiers.get(i)).createExecutableExtension(VerifierRegistryReader.VERIFIER_CLASS);
+				DeploymentAssemblyVerifierData data = new DeploymentAssemblyVerifierData(component, runtime,currentReferences,resourceMappings,resourceMappingsChanged);
+				IStatus verifyStatus = verifier.verify(data);
+				masterStatus.add(verifyStatus);
+			} catch (Exception e) {
+				ModuleCoreUIPlugin.log(e);
+				continue;
+			}
+			
+		}
+		return masterStatus;
+	}
+
+	/**
+	 * @param project
+	 * @param runtime
+	 * @return all verifiers by iterating through projects installed facets, and querying the registry
+	 */
+	private static List collectAllVerifiers(IProject project, IRuntime runtime) {
+		IFacetedProject fProj = null;
+		try {
+			fProj = ProjectFacetsManager.create(project);
+		} catch (CoreException e) {
+			ModuleCoreUIPlugin.log(e);
+			return Collections.EMPTY_LIST;
+		}
+		Set<IProjectFacetVersion> facets = fProj.getProjectFacets();
+		List verifiers = new ArrayList();
+		for (Iterator iterator = facets.iterator(); iterator.hasNext();) {
+			IProjectFacetVersion facet = (IProjectFacetVersion)iterator.next();
+			verifiers.addAll(VerifierRegistry.instance().getVerifierExtensions(facet.getProjectFacet().getId(), runtime));	
+		}
+		return verifiers;
+	}
+	
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/verifier/IDeploymentAssemblyVerifier.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/verifier/IDeploymentAssemblyVerifier.java
new file mode 100644
index 0000000..a3576b9
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/verifier/IDeploymentAssemblyVerifier.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.componentcore.ui.internal.propertypage.verifier;
+
+import org.eclipse.core.runtime.IStatus;
+
+/**
+ * This interface is used to allow verifications from extending plugins registered by runtime targets and component type
+ * This interface in NOT meant to be implemented, but instead extend the abstract class AbstractDeploymentAssemblyVerifier
+ *
+ */
+public interface IDeploymentAssemblyVerifier {
+	/**
+	 * Validate the current state of the component resource and reference mappings
+	 * 
+	 * @param data - All of the relevant dialog properties/values is sent via a DeploymentAssemblyVerifierData object
+	 * @return IStatus indicating OK, Warning , or Error.  Warning text will display in the wizard dialog, but not prevent completion. 
+	 * Error status will prevent completion
+	 */
+	IStatus verify(DeploymentAssemblyVerifierData data);
+
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/verifier/VerifierRegistry.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/verifier/VerifierRegistry.java
new file mode 100644
index 0000000..0af3524
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/verifier/VerifierRegistry.java
@@ -0,0 +1,118 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.componentcore.ui.internal.propertypage.verifier;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.wst.server.core.IRuntime;
+
+public class VerifierRegistry {
+	/**
+	 *  
+	 */
+	private static VerifierRegistry INSTANCE;
+	private HashMap assemblyVerifierExtensions = new HashMap();
+
+	public VerifierRegistry() {
+		super();
+	}
+
+	/**
+	 * @param verifier
+	 * @param serverTargets
+	 * @param components
+	 */
+	protected void register(IConfigurationElement verifier, List serverTargets, List components) {
+		HashMap targetVerifiers;
+		for (Iterator iter = components.iterator(); iter.hasNext();) {
+			String compID = (String) iter.next();
+			for (Iterator iterator = serverTargets.iterator(); iterator.hasNext();) {
+				String runtimeID = (String) iterator.next();
+				targetVerifiers = getVerifierExtensions(compID);
+				getTargetVerifiers(targetVerifiers, runtimeID).add(verifier);
+			}
+		}
+	}
+
+	private List getVerifiers(String compID, String serverTarget) {
+		HashMap targetVerifiers = getVerifierExtensions(compID);
+		return getTargetVerifiers(targetVerifiers, serverTarget);
+	}
+
+	protected static VerifierRegistry instance() {
+		if (INSTANCE == null) {
+			INSTANCE = new VerifierRegistry();
+			readRegistry();
+		}
+		return INSTANCE;
+	}
+
+	/**
+	 *  
+	 */
+	private static void readRegistry() {
+		VerifierRegistryReader reader = new VerifierRegistryReader();
+		reader.readRegistry();
+	}
+
+	/**
+	 * @param targetVerifiers
+	 * @param serverTarget
+	 */
+	private List getTargetVerifiers(HashMap targetVerifiers, String serverTarget) {
+		if (targetVerifiers.get(serverTarget) == null)
+			targetVerifiers.put(serverTarget, new ArrayList());
+		return (List) targetVerifiers.get(serverTarget);
+	}
+
+	/**
+	 * @param compID
+	 * @return
+	 */
+	private HashMap getVerifierExtensions(String compID) {
+		if (getVerifierExtensions().get(compID) == null)
+			getVerifierExtensions().put(compID, new HashMap());
+		return (HashMap) getVerifierExtensions().get(compID);
+	}
+
+	/**
+	 * @return Returns the verifierExtensions.
+	 */
+	private HashMap getVerifierExtensions() {
+		return assemblyVerifierExtensions;
+	}
+
+	/**
+	 * @param facetTypeID
+	 * @param runtime
+	 * @return List of IConfigurationElements representing instances of IDeploymentAssemblyVerifier
+	 */
+	public List getVerifierExtensions(String facetTypeID, IRuntime runtime) {
+		
+		String runtimeID = null;
+		if (runtime == null)
+			runtimeID = "None"; //$NON-NLS-1$
+		else
+			runtimeID = runtime.getRuntimeType().getId();
+		List verifiers = getVerifiers(facetTypeID, runtimeID);
+		if (verifiers == null)
+			return Collections.EMPTY_LIST;
+		return verifiers;
+	}
+
+
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/verifier/VerifierRegistryReader.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/verifier/VerifierRegistryReader.java
new file mode 100644
index 0000000..0a454d3
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/propertypage/verifier/VerifierRegistryReader.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.componentcore.ui.internal.propertypage.verifier;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.wst.common.componentcore.ui.ModuleCoreUIPlugin;
+import org.eclipse.wst.common.core.util.RegistryReader;
+
+
+public class VerifierRegistryReader extends RegistryReader {
+	/**
+	 * @param registry
+	 * @param plugin
+	 * @param extensionPoint
+	 */
+	static final String ASSEMBLY_VERIFIER_EXTENSION_POINT = "deploymentAssemblyVerifier"; //$NON-NLS-1$
+	static final String TARGET_SERVER_RUNTIME_ID = "runtime_server_id"; //$NON-NLS-1$
+	static final String RUNTIME = "runtime"; //$NON-NLS-1$
+	static final String VERIFIER = "verifier"; //$NON-NLS-1$
+	public static final String VERIFIER_CLASS = "class"; //$NON-NLS-1$
+	static final String COMPONENT_TYPE_ID = "component_type"; //$NON-NLS-1$
+	static final String COMPONENT = "component"; //$NON-NLS-1$
+
+	public VerifierRegistryReader() {
+		super(ModuleCoreUIPlugin.PLUGIN_ID, ASSEMBLY_VERIFIER_EXTENSION_POINT);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.wst.common.frameworks.internal.RegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
+	 */
+	@Override
+	public boolean readElement(IConfigurationElement element) {
+		if (!element.getName().equals(VERIFIER))
+			return false;
+		List runtimeList = new ArrayList();
+		List comps = new ArrayList();
+		IConfigurationElement[] runtimes = element.getChildren(RUNTIME);
+		for (int i = 0; i < runtimes.length; i++) {
+			IConfigurationElement runtime = runtimes[i];
+			String serverTarget = runtime.getAttribute(TARGET_SERVER_RUNTIME_ID);
+			runtimeList.add(serverTarget);
+		}
+		IConfigurationElement[] components = element.getChildren(COMPONENT);
+		for (int i = 0; i < components.length; i++) {
+			IConfigurationElement component = components[i];
+			String compType = component.getAttribute(COMPONENT_TYPE_ID);
+			comps.add(compType);
+		}
+
+		String deployer = element.getAttribute(VERIFIER_CLASS);
+		if (deployer != null) {
+			VerifierRegistry.instance().register(element, runtimeList, comps);
+			return true;
+		}
+		return false;
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/taskwizard/IWizardHandle.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/taskwizard/IWizardHandle.java
new file mode 100644
index 0000000..58f763d
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/taskwizard/IWizardHandle.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * 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.wst.common.componentcore.ui.internal.taskwizard;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.resource.ImageDescriptor;
+/**
+ * A wizard handle.
+ * 
+ * @since 1.0
+ */
+public interface IWizardHandle extends IMessageProvider {
+	/**
+	 * Updates the wizard error messages and buttons.
+	 */
+	public void update();
+
+	/**
+	 * Sets the title of this wizard page.
+	 *  
+	 * @param title the title of the wizard page
+	 */
+	public void setTitle(String title);
+
+	/**
+	 * The page's description.
+	 * 
+	 * @param desc the page's description
+	 */
+	public void setDescription(String desc);
+
+	/**
+	 * The page's image descriptor.
+	 * 
+	 * @param image the page's image descriptor
+	 */
+	public void setImageDescriptor(ImageDescriptor image);
+
+	/**
+	 * Set an error or warning message.
+	 * 
+	 * @param newMessage the new message
+	 * @param newType the new type, from IStatus
+	 */
+	public void setMessage(String newMessage, int newType);
+
+	/**
+	 * Execute a runnable within the context of the wizard. This will typically
+	 * disable the wizard while the runnable is running, and provide a progress
+	 * monitor for the user.  
+	 * 
+	 * @param fork true if a separate thread should be used
+	 * @param cancelable true if it should be cancelable
+	 * @param runnable the runnable
+	 * @throws InterruptedException thrown if it is interrupted
+	 * @throws InvocationTargetException thrown if there is an error
+	 */
+	public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable) throws InterruptedException, InvocationTargetException;
+	
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/taskwizard/TaskWizard.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/taskwizard/TaskWizard.java
new file mode 100644
index 0000000..78a2410
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/taskwizard/TaskWizard.java
@@ -0,0 +1,587 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2007 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.componentcore.ui.internal.taskwizard;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.IDialogSettings;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.wizard.IWizard;
+import org.eclipse.jface.wizard.IWizardContainer;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.RGB;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.wst.common.componentcore.internal.impl.TaskModel;
+import org.eclipse.wst.common.componentcore.ui.Messages;
+import org.eclipse.wst.common.componentcore.ui.ModuleCoreUIPlugin;
+import org.eclipse.wst.common.componentcore.ui.Trace;
+
+
+
+/**
+ * A wizard used to execute tasks.
+ */
+public class TaskWizard implements IWizard {
+	private static final byte FINISH = 2;
+	private static final byte CANCEL = 3;
+
+	private List<IWizardPage> pages;
+	private boolean addingPages;
+	private Map<WizardFragment, TaskWizardPage> fragmentData = new HashMap<WizardFragment, TaskWizardPage>();
+	protected TaskModel taskModel;
+	
+	private IWizardContainer container = null;
+	
+	private boolean needsProgressMonitor = false;
+	
+	private boolean forcePreviousAndNextButtons = false;
+
+	private boolean isHelpAvailable = false;
+	
+	private Image defaultImage = null;
+	
+	private RGB titleBarColor = null;
+
+	private String windowTitle = null;
+	
+	private IDialogSettings dialogSettings = null;
+	
+	private WizardFragment rootFragment;
+	private WizardFragment currentFragment;
+	private Object finishFamily;
+	
+	/**
+	 * Create a new TaskWizard with the given title and root fragment.
+	 * 
+	 * @param title a title
+	 * @param rootFragment a root fragment
+	 */
+	public TaskWizard(String title, WizardFragment rootFragment) {
+		this(title, rootFragment, null);
+		setWindowTitle(title);
+	}
+
+	/**
+	 * Create a new TaskWizard with the given title, root fragment, and task model.
+	 * 
+	 * @param title a title
+	 * @param rootFragment a root fragment
+	 * @param taskModel a task model
+	 */
+	public TaskWizard(String title, WizardFragment rootFragment, TaskModel taskModel) {
+		super();
+		if (title != null)
+			setWindowTitle(title);
+		this.rootFragment = rootFragment;
+		this.taskModel = taskModel;
+		if (taskModel == null)
+			this.taskModel = new TaskModel();
+		
+		setNeedsProgressMonitor(true);
+		setForcePreviousAndNextButtons(true);
+	}
+
+	public void setTaskModel(TaskModel taskModel) {
+		this.taskModel = taskModel;
+	}
+	
+	public TaskModel getTaskModel() {
+		return taskModel;
+	}
+
+	public void setRootFragment(WizardFragment rootFragment) {
+		this.rootFragment = rootFragment;
+	}
+	
+	public WizardFragment getRootFragment() {
+		return rootFragment;
+	}
+
+	/**
+	 * Cancel the client selection.
+	 *
+	 * @return boolean
+	 */
+	public boolean performCancel() {
+		final List list = getAllWizardFragments();
+		IRunnableWithProgress runnable = new IRunnableWithProgress() {
+			public void run(IProgressMonitor monitor) throws InvocationTargetException {
+				try {
+					Iterator iterator = list.iterator();
+					while (iterator.hasNext())
+						executeTask((WizardFragment) iterator.next(), CANCEL, monitor);
+				} catch (CoreException ce) {
+					throw new InvocationTargetException(ce);
+				}
+			}
+		};
+		
+		Throwable t = null;
+		try {
+			if (getContainer() != null)
+				getContainer().run(true, true, runnable);
+			else
+				runnable.run(new NullProgressMonitor());
+			return true;
+		} catch (InvocationTargetException te) {
+			t = te.getCause();
+		} catch (Exception e) {
+			t = e;
+		}
+		Trace.trace(Trace.SEVERE, "Error cancelling task wizard", t);
+		handleThrowable(t);
+		return false;
+		
+	}
+
+	public boolean performFinish() {
+		if (currentFragment != null)
+			currentFragment.exit();
+		
+		final WizardFragment cFragment = currentFragment;
+
+		final List list = getAllWizardFragments();
+		IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
+			public void run(IProgressMonitor monitor) throws CoreException {
+				// enter & exit the remaining pages
+				int index = list.indexOf(cFragment);
+				while (index > 0 && index < list.size() - 1) {
+					final WizardFragment fragment = (WizardFragment) list.get(++index);
+					try {
+						Display.getDefault().syncExec(new Runnable() {
+							public void run() {
+								fragment.enter();
+								fragment.exit();
+							}
+						});
+					} catch (Exception e) {
+						Trace.trace(Trace.WARNING, "Could not enter/exit page", e);
+					}
+				}
+				
+				if (useJob()) {
+					class FinishWizardJob extends Job {
+						public FinishWizardJob() {
+							super(getJobTitle());
+						}
+						
+						public boolean belongsTo(Object family) {
+							return (getFinishJobFamily() == null && family == null ) 
+							|| (getFinishJobFamily() != null && getFinishJobFamily().equals(family));
+						}
+
+						public IStatus run(IProgressMonitor monitor2) {
+							try {
+								Iterator iterator = list.iterator();
+								while (iterator.hasNext())
+									executeTask((WizardFragment) iterator.next(), FINISH, monitor2);
+							} catch (CoreException ce) {
+								Trace.trace(Trace.SEVERE, "Error finishing wizard job", ce);
+								return new Status(IStatus.ERROR, ModuleCoreUIPlugin.PLUGIN_ID, 0, ce.getLocalizedMessage(), null);
+							}
+							return Status.OK_STATUS;
+						}
+					}
+					
+					FinishWizardJob job = new FinishWizardJob();
+					job.setUser(true);
+					job.schedule();
+				} else {
+					Iterator iterator = list.iterator();
+					while (iterator.hasNext())
+						executeTask((WizardFragment) iterator.next(), FINISH, monitor);
+				}
+			}
+		};
+		
+		Throwable t = null;
+		try {
+			if (getContainer() != null)
+				getContainer().run(true, true, new WorkspaceRunnableAdapter(runnable));
+			else
+				runnable.run(new NullProgressMonitor());
+			return true;
+		} catch (InvocationTargetException te) {
+			Trace.trace(Trace.SEVERE, "Error finishing task wizard", te);
+			t = te.getCause();
+		} catch (Exception e) {
+			Trace.trace(Trace.SEVERE, "Error finishing task wizard 2", e);
+			t = e;
+		}
+		
+		// TODO: show better error dialog, e.g. when Tomcat config is corrupt while doing Add/Remove
+		// it currently displays the error message twice
+		Trace.trace(Trace.WARNING, "Error completing wizard", t);
+		handleThrowable(t);
+		
+		return false;
+	}
+	
+	public Object getFinishJobFamily() {
+		return finishFamily;
+	}
+	
+	public void setFinishJobFamily(Object o) {
+		this.finishFamily = o;
+	}
+	
+	public void addPage(IWizardPage page) {
+		pages.add(page);
+		page.setWizard(this);
+	}
+	
+	protected void executeTask(WizardFragment fragment, byte type, IProgressMonitor monitor) throws CoreException {
+		if (fragment == null)
+			return;
+		
+		if (type == FINISH)
+			fragment.performFinish(monitor);
+		else if (type == CANCEL)
+			fragment.performCancel(monitor);
+	}
+	
+	protected WizardFragment getCurrentWizardFragment() {
+		return currentFragment;
+	}
+	
+	protected void switchWizardFragment(WizardFragment newFragment) {
+		List list = getAllWizardFragments();
+		int oldIndex = list.indexOf(currentFragment);
+		int newIndex = list.indexOf(newFragment);
+		if (oldIndex == newIndex)
+			return;
+		
+		//safeExecuteTask(currentFragment, DEPARTURE);
+		if (currentFragment != null)
+			currentFragment.exit();
+		
+		if (oldIndex < newIndex)
+			oldIndex ++;
+		else
+			oldIndex --;
+		
+		while (oldIndex != newIndex) {
+			WizardFragment fragment = (WizardFragment) list.get(oldIndex);
+			//safeExecuteTask(fragment, ARRIVAL);
+			//safeExecuteTask(fragment, DEPARTURE);
+			fragment.enter();
+			fragment.exit();
+			if (oldIndex < newIndex)
+				oldIndex ++;
+			else
+				oldIndex --;
+		}
+		
+		currentFragment = newFragment;
+		//safeExecuteTask(currentFragment, ARRIVAL);
+		currentFragment.enter();
+	}
+	
+	private List<WizardFragment> getAllWizardFragments() {
+		List<WizardFragment> list = new ArrayList<WizardFragment>();
+		list.add(rootFragment);
+		addSubWizardFragments(rootFragment, list);
+		
+		Iterator iterator = list.iterator();
+		while (iterator.hasNext()) {
+			WizardFragment fragment = (WizardFragment) iterator.next();
+			if (!taskModel.equals(fragment.getTaskModel()))
+				fragment.setTaskModel(taskModel);
+		}
+		return list;
+	}
+
+	private void addSubWizardFragments(WizardFragment fragment, List<WizardFragment> list) {
+		Iterator iterator = fragment.getChildFragments().iterator();
+		while (iterator.hasNext()) {
+			WizardFragment child = (WizardFragment) iterator.next();
+			list.add(child);
+			addSubWizardFragments(child, list);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.IWizard#addPages()
+	 */
+	public void addPages() {
+		if (addingPages)
+			return;
+		
+		try {
+			addingPages = true;
+			pages = new ArrayList<IWizardPage>();
+			Iterator<WizardFragment> iterator = getAllWizardFragments().iterator();
+			while (iterator.hasNext()) {
+				WizardFragment fragment = iterator.next();
+				TaskWizardPage page = getFragmentData(fragment);
+				if (fragment.hasComposite()) {
+					if (page != null)
+						addPage(page);
+					else {
+						TaskWizardPage page2 = new TaskWizardPage(fragment);
+						fragmentData.put(fragment, page2);
+						addPage(page2);
+					}
+				}
+			}
+		} catch (Exception e) {
+			Trace.trace(Trace.SEVERE, "Error adding fragments to wizard", e);
+		} finally {
+			addingPages = false;
+		}
+	}
+
+	/*private static void updateWizardPages() {
+		try {
+			current.updatePages();
+			current.getContainer().updateButtons();
+		} catch (Exception e) {
+			Trace.trace(Trace.SEVERE, "Error updating wizard pages", e);
+		}
+	}*/
+
+	private TaskWizardPage getFragmentData(WizardFragment fragment) {
+		try {
+			TaskWizardPage page = fragmentData.get(fragment);
+			if (page != null)
+				return page;
+		} catch (Exception e) {
+			Trace.trace(Trace.SEVERE, "Error getting fragment data", e);
+		}
+		
+		return null;
+	}
+
+	protected void updatePages() {
+		addPages();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.IWizard#canFinish()
+	 */
+	public boolean canFinish() {
+		// Default implementation is to check if all pages are complete.
+		for (int i= 0; i < pages.size(); i++) {
+			if (!(pages.get(i)).isPageComplete())
+				return false;
+		}
+		return true;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.IWizard#createPageControls(org.eclipse.swt.widgets.Composite)
+	 */
+	public void createPageControls(Composite pageContainer) {
+		// the default behavior is to create all the pages controls
+		for (int i = 0; i < pages.size(); i++){
+			IWizardPage page = pages.get(i);
+			page.createControl(pageContainer);
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.IWizard#dispose()
+	 */
+	public void dispose() {
+		// notify pages
+		for (int i = 0; i < pages.size(); i++) {
+			pages.get(i).dispose();
+		}
+
+		// dispose of image
+		if (defaultImage != null) {
+			defaultImage.dispose();
+			defaultImage = null;
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.IWizard#getContainer()
+	 */
+	public IWizardContainer getContainer() {
+		return container;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.IWizard#getDefaultPageImage()
+	 */
+	public Image getDefaultPageImage() {
+		return defaultImage;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.IWizard#getDialogSettings()
+	 */
+	public IDialogSettings getDialogSettings() {
+		return dialogSettings;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.IWizard#getNextPage(org.eclipse.jface.wizard.IWizardPage)
+	 */
+	public IWizardPage getNextPage(IWizardPage page) {
+		int index = pages.indexOf(page);
+		if (index == pages.size() - 1 || index == -1)
+			// last page or page not found
+			return null;
+		
+		return pages.get(index + 1);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.IWizard#getPage(java.lang.String)
+	 */
+	public IWizardPage getPage(String name) {
+		for (int i= 0; i < pages.size(); i++) {
+			IWizardPage page = pages.get(i);
+			String pageName = page.getName();
+			if (pageName.equals(name))
+				return page;
+		}
+		return null;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.IWizard#getPageCount()
+	 */
+	public int getPageCount() {
+		return pages.size();
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.IWizard#getPages()
+	 */
+	public IWizardPage[] getPages() {
+		return pages.toArray(new IWizardPage[pages.size()]);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.IWizard#getPreviousPage(org.eclipse.jface.wizard.IWizardPage)
+	 */
+	public IWizardPage getPreviousPage(IWizardPage page) {
+		int index = pages.indexOf(page);
+		if (index == 0 || index == -1)
+			// first page or page not found
+			return null;
+		return pages.get(index - 1);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.IWizard#getStartingPage()
+	 */
+	public IWizardPage getStartingPage() {
+		if (pages.size() == 0)
+			return null;
+		
+		return pages.get(0);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.IWizard#getTitleBarColor()
+	 */
+	public RGB getTitleBarColor() {
+		return titleBarColor;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.IWizard#getWindowTitle()
+	 */
+	public String getWindowTitle() {
+		return windowTitle;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.IWizard#isHelpAvailable()
+	 */
+	public boolean isHelpAvailable() {
+		return isHelpAvailable;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.IWizard#needsPreviousAndNextButtons()
+	 */
+	public boolean needsPreviousAndNextButtons() {
+		return forcePreviousAndNextButtons || pages.size() > 1;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.IWizard#needsProgressMonitor()
+	 */
+	public boolean needsProgressMonitor() {
+		return needsProgressMonitor;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.IWizard#setContainer(org.eclipse.jface.wizard.IWizardContainer)
+	 */
+	public void setContainer(IWizardContainer wizardContainer) {
+		this.container = wizardContainer;
+	}
+	
+	public void setDialogSettings(IDialogSettings settings) {
+		dialogSettings = settings;
+	}
+	
+	public void setNeedsProgressMonitor(boolean b) {
+		needsProgressMonitor = b;
+	}
+	
+	public void setForcePreviousAndNextButtons(boolean b) {
+		forcePreviousAndNextButtons = b;
+	}
+	
+	public void setWindowTitle(String title) {
+		windowTitle = title;
+	}
+
+	protected boolean useJob() {
+		return false;
+	}
+
+	protected String getJobTitle() {
+		return getWindowTitle();
+	}
+	
+	private void handleThrowable(final Throwable t) {
+		Display display = Display.getCurrent();
+		if (display == null)
+			display = Display.getDefault();
+		final Shell shell = display.getActiveShell();
+		final String message = t.getLocalizedMessage();
+		final IStatus status = (t instanceof CoreException) ? ((CoreException)t).getStatus() : null;
+		
+		Display.getDefault().asyncExec(new Runnable() {
+			public void run() {
+				if( status == null )
+					MessageDialog.openError(shell, Messages.WizardError, message);
+				else
+					ErrorDialog.openError(shell, Messages.WizardError, message, status);
+			}
+		});
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/taskwizard/TaskWizardPage.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/taskwizard/TaskWizardPage.java
new file mode 100644
index 0000000..ded4661
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/taskwizard/TaskWizardPage.java
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2007 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.componentcore.ui.internal.taskwizard;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.jface.dialogs.IMessageProvider;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.wizard.IWizardContainer;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.wst.common.componentcore.ui.Trace;
+
+/**
+ * A task wizard page.
+ */
+public class TaskWizardPage extends WizardPage implements IWizardHandle {
+	protected WizardFragment fragment;
+
+	protected boolean isCreated = false;
+
+	public TaskWizardPage(WizardFragment fragment) {
+		super(fragment.toString());
+		this.fragment = fragment;
+	}
+
+	public void createControl(Composite parentComp) {
+		Composite comp = null;
+		try {
+			fragment.setPage(this);
+			comp = fragment.createComposite(parentComp, this);
+		} catch (Exception e) {
+			Trace.trace(Trace.WARNING, "Could not create wizard page composite", e);
+		}
+		if (comp == null) {
+			comp = new Composite(parentComp, SWT.NONE);
+			comp.setLayout(new FillLayout(SWT.VERTICAL));
+			Label label = new Label(comp, SWT.NONE);
+			label.setText("Internal error");
+		}
+		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL);
+		data.widthHint = convertHorizontalDLUsToPixels(150);
+		comp.setLayoutData(data);
+		setControl(comp);
+		
+		isCreated = true;
+		update();
+	}
+
+	public boolean isPageComplete() {
+		try {
+			if (!fragment.isComplete())
+				return false;
+		} catch (Exception e) {
+			return false;
+		}
+		return true;
+	}
+
+	public boolean canFlipToNextPage() {
+		if (getNextPage() == null)
+			return false;
+		try {
+			if (!fragment.isComplete())
+				return false;
+		} catch (Exception e) {
+			return false;
+		}
+		return true;
+	}
+
+	public void setVisible(boolean visible) {
+		super.setVisible(visible);
+		
+		if (visible) {
+			TaskWizard wizard = (TaskWizard) getWizard();
+			wizard.switchWizardFragment(fragment);
+			
+			if (getContainer().getCurrentPage() != null)
+				getContainer().updateButtons();
+		}
+	}
+
+	public void setMessage(String message, int type) {
+		if (type == IMessageProvider.ERROR && "".equals(message)) {
+			message = null;
+		}
+		super.setMessage(message, type);
+		WizardFragment frag = ((TaskWizard) getWizard()).getCurrentWizardFragment();
+		if (!fragment.equals(frag))
+			return;
+		getContainer().updateButtons();
+	}
+
+	public void run(boolean fork, boolean cancelable, IRunnableWithProgress runnable) throws InterruptedException, InvocationTargetException {
+		getWizard().getContainer().run(fork, cancelable, runnable);
+	}
+
+	public void update() {
+		if (!isCreated)
+			return;
+		
+		final IWizardContainer container = getContainer();
+		getShell().getDisplay().syncExec(new Runnable() {
+			public void run() {
+				fragment.updateChildFragments();
+				((TaskWizard) getWizard()).updatePages();
+				
+				if (container.getCurrentPage() != null)
+					container.updateButtons();
+			}
+		});
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/taskwizard/WizardFragment.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/taskwizard/WizardFragment.java
new file mode 100644
index 0000000..e7c9635
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/taskwizard/WizardFragment.java
@@ -0,0 +1,244 @@
+/*******************************************************************************
+ * Copyright (c) 2003, 2007 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.componentcore.ui.internal.taskwizard;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.wst.common.componentcore.internal.impl.TaskModel;
+
+/**
+ * A wizard fragment is a node within a wizard that provides a completely
+ * extendable wizard flow by supporting a flexible tree structure for the
+ * pages. As the user walks pages through the wizard, they are actually
+ * traversing the nodes of a tree, and each node can add or remove children
+ * at any time.
+ * 
+ * Each node may be non-UI (useful for injecting behaviour into the tree)
+ * or contain a single wizard page (@see hasComposite() and
+ * createComposite(Composite, IWizardHandle)). The node may also have
+ * children (@see getChildFragments(), which should be updated or refreshed
+ * whenever the updateChildFragments() method is called by another node to
+ * let this node know that it's state may have changed.
+ * 
+ * This implementation uses a createChildFragments() method to allow the
+ * fragment to add it's children into the tree. Note that this method may
+ * be called multiple times as the tree is updated and it must return the
+ * same instance of any children that have previously been returned.
+ * 
+ * @since 1.0
+ */
+public abstract class WizardFragment {
+	private TaskWizardPage page;
+	private TaskModel taskModel;
+	private boolean isComplete = true;
+	private List<WizardFragment> listImpl;
+
+	/**
+	 * Returns <code>true</code> if this fragment has an associated UI,
+	 * and <code>false</code> otherwise.
+	 * 
+	 * @return true if the fragment has a composite
+	 */
+	public boolean hasComposite() {
+		return false;
+	}
+
+	/**
+	 * Creates the composite associated with this fragment.
+	 * This method is only called when hasComposite() returns true.
+	 * 
+	 * @param parent a parent composite
+	 * @param handle a wizard handle
+	 * @return the created composite
+	 */
+	public Composite createComposite(Composite parent, IWizardHandle handle) {
+		return null;
+	}
+
+	/**
+	 * Sets the wizard task model.
+	 * <p>
+	 * A task model is shared by all fragments in the wizard and is used to share
+	 * data. It contains information about the overall task flow and allows
+	 * fragments to store and retrieve data. Its usage allows multiple fragments
+	 * to be chained together and share data from the output of one fragment to
+	 * the input of another.
+	 * </p>
+	 * 
+	 * @param taskModel the task model
+	 * @see #getTaskModel()
+	 */
+	public void setTaskModel(TaskModel taskModel) {
+		this.taskModel = taskModel;
+	}
+
+	/**
+	 * Returns the wizard task model.
+	 * 
+	 * @return the task model
+	 * @see #setTaskModel(TaskModel)
+	 */
+	public TaskModel getTaskModel() {
+		return taskModel;
+	}
+	
+	public void setPage(TaskWizardPage page) {
+		this.page = page;
+	}
+	
+	public IWizardPage getPage() {
+		return page;
+	}
+
+	/**
+	 * Called when the wizard that this fragment belongs to has traversed
+	 * into this wizard fragment. It is called to give the fragment the
+	 * opportunity to initialize any values shown in the composite or
+	 * update the task model.
+	 * <p>
+	 * When finish is pressed, the current fragment is exit()ed, and then
+	 * performFinish() is called on all of the fragments in the tree.
+	 * enter() and exit() are not called on the remaining fragments.
+	 * </p>
+	 */
+	public void enter() {
+		// do nothing
+	}
+
+	/**
+	 * Called when the wizard that this fragment belongs to has traversed
+	 * out of this wizard fragment. It is called to give the fragment the
+	 * opportunity to save any values entered into the composite or
+	 * update the task model.
+	 * <p>
+	 * When finish is pressed, the current fragment is exit()ed, and then
+	 * performFinish() is called on all of the fragments in the tree.
+	 * enter() and exit() are not called on the remaining fragments. 
+	 * </p>
+	 */
+	public void exit() {
+		// do nothing
+	}
+
+	/**
+	 * Called when the wizard that this fragment belongs to is finished.
+	 * After exit()ing the current page, all fragment's performFinish()
+	 * methods are called in order.
+	 * <p>
+	 * This method is not called on the UI thread and must not access the
+	 * composite. Not only might the user never have accessed the fragment's
+	 * composite, but this method may be called asynchronously on a job
+	 * once the wizard has closed.
+	 * </p>
+	 * 
+	 * @param monitor a progress monitor, or <code>null</code> if progress
+	 *    reporting and cancellation are not desired
+	 * @throws CoreException if something goes wrong
+	 */
+	public void performFinish(IProgressMonitor monitor) throws CoreException {
+		// do nothing
+	}
+
+	/**
+	 * Called when the wizard that this fragment belongs to is canceled.
+	 * After exit()ing the current page, all fragment's performCancel()
+	 * methods are called in order.
+	 * <p>
+	 * This method is not called on the UI thread and must not access the
+	 * composite. Not only might the user never have accessed the fragment's
+	 * composite, but this method may be called asynchronously on a job
+	 * once the wizard has closed.
+	 * </p>
+	 * 
+	 * @param monitor a progress monitor, or <code>null</code> if progress
+	 *    reporting and cancellation are not desired
+	 * @throws CoreException if something goes wrong
+	 */
+	public void performCancel(IProgressMonitor monitor) throws CoreException {
+		// do nothing
+	}
+
+	/**
+	 * Returns the child fragments. Child fragments come directly after this fragment
+	 * in the wizard flow.
+	 * 
+	 * @return a list of child fragments
+	 */
+	public List getChildFragments() {
+		if (listImpl == null) {
+			listImpl = new ArrayList<WizardFragment>();
+			createChildFragments(listImpl);
+		}
+		return listImpl;
+	}
+
+	/**
+	 * Called to give the fragment a chance to update it's child fragments in
+	 * response to other changes within the wizard or task model.
+	 */
+	public void updateChildFragments() {
+		listImpl = null;
+	}
+
+	/**
+	 * This method is called by the implementation of getChildFragments() to
+	 * allow this fragment to add it's children. This method must cache and
+	 * return the same instance of any child fragment created. If new
+	 * instances are created each time the wizard is updated, the enablement
+	 * state and the flow of the wizard will be incorrect. 
+	 * 
+	 * @param list a list to add the child fragments to
+	 */
+	protected void createChildFragments(List<WizardFragment> list) {
+		// do nothing
+	}
+
+	/**
+	 * Returns true if this fragment is complete (can finish). If it is
+	 * complete the user will be allowed to go to the next fragment or
+	 * finish the wizard. If the fragment is not complete, the Next button
+	 * will be disabled. If the fragment is complete but another fragment
+	 * is not complete, the Finish button will not be enabled.
+	 * 
+	 * @return <code>true</code> if the fragment is complete, and
+	 *    <code>false</code> otherwise
+	 */
+	public boolean isComplete() {
+		return isComplete;
+	}
+
+	/**
+	 * Set the isComplete state.
+	 * 
+	 * @param complete <code>true</code> if the fragment is complete, and
+	 *    <code>false</code> otherwise
+	 */
+	protected void setComplete(boolean complete) {
+		this.isComplete = complete;
+	}
+	
+    public void advanceToNextPageOrFinish() {
+		if (getPage().canFlipToNextPage()) {
+			getPage().getWizard().getContainer().showPage(getPage().getNextPage());
+		} else if(getPage().getWizard().canFinish()) {
+			if (getPage().getWizard().performFinish()) {
+				((WizardDialog)getPage().getWizard().getContainer()).close();
+			}
+		}
+    }
+
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/taskwizard/WorkspaceRunnableAdapter.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/taskwizard/WorkspaceRunnableAdapter.java
new file mode 100644
index 0000000..4447e53
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/internal/taskwizard/WorkspaceRunnableAdapter.java
@@ -0,0 +1,40 @@
+/*******************************************************************************
+ * 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.wst.common.componentcore.ui.internal.taskwizard;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+/**
+ * IRunnableWithProgressAdapter to allow it to run an IWorkspaceRunnable.
+ */
+public class WorkspaceRunnableAdapter implements IRunnableWithProgress {
+	private IWorkspaceRunnable workspaceRunnable;
+	
+	public WorkspaceRunnableAdapter(IWorkspaceRunnable runnable) {
+		workspaceRunnable = runnable;
+	}
+
+	/*
+	 * @see IRunnableWithProgress#run(IProgressMonitor)
+	 */
+	public void run(IProgressMonitor monitor) throws InvocationTargetException {
+		try {
+			ResourcesPlugin.getWorkspace().run(workspaceRunnable, monitor);
+		} catch (CoreException e) {
+			throw new InvocationTargetException(e);
+		}
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/messages.properties b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/messages.properties
new file mode 100644
index 0000000..ad3d55d
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/messages.properties
@@ -0,0 +1,28 @@
+ModuleAssemblyRootPageDescription=Create and change packaging structure for this project
+ModuleAssembly=Deployment a&ssembly:
+ErrorCheckingFacets=Error Checking Project Facets
+ErrorNotVirtualComponent=The given project is not a virtual component project
+DeploymentAssemblyVerifierHelper_0=Verifying Component
+DeployPathColumn=Deploy Path
+SourceColumn=Source
+InternalLibJarWarning=This library has been added to the project by using the project tree or the file system. If you want to move / remove it, use the same approach.
+AddFolder=Add Folder
+AddFolderElipses=Add Folder...
+AddFolderMappings=Add a folder mapping
+AddEllipsis=&Add...
+EditEllipsis=&Edit...
+RemoveSelected=&Remove
+ExternalJarTitle=Add an External Jar Reference
+ExternalJarDescription=Here you can reference a filesystem Jar\nThis is not a suggested use-case, but is here for backwards compatability.
+JarTitle=Add a Jar Reference
+JarDescription="Here you can reference a workspace Jar\nThis is not a suggested use-case, but is here for backwards compatability.
+Browse=Browse...
+NewReferenceTitle=Select a reference type
+NewReferenceDescription=Here you can select one of many types of references to add
+NewReferenceWizard=New Reference Wizard
+ProjectReferenceTitle=Add a Project Reference
+ProjectReferenceDescription=Here you can make a project into a reference.\nIf the project is not already a flexible project, it will be converted into one.
+VariableReferenceTitle=Add a Variable Reference
+VariableReferenceDescription="Here you can reference a variable which maps to a single jar.\nThis is not a suggested use-case, but is here for backwards compatability.
+WizardError=Wizard Error
+ProjectConversionError=Error converting project {0} into a flexible project
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/AddModuleDependenciesPropertiesPage.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/AddModuleDependenciesPropertiesPage.java
new file mode 100644
index 0000000..a4a120b
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/AddModuleDependenciesPropertiesPage.java
@@ -0,0 +1,1004 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ *    
+ * API in these packages is provisional in this release
+ ******************************************************************************/
+package org.eclipse.wst.common.componentcore.ui.propertypage;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.LabelProviderChangedEvent;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Group;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IAddReferenceDataModelProperties;
+import org.eclipse.wst.common.componentcore.internal.ComponentResource;
+import org.eclipse.wst.common.componentcore.internal.DefaultModuleHandler;
+import org.eclipse.wst.common.componentcore.internal.DependencyType;
+import org.eclipse.wst.common.componentcore.internal.IModuleHandler;
+import org.eclipse.wst.common.componentcore.internal.StructureEdit;
+import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
+import org.eclipse.wst.common.componentcore.internal.impl.TaskModel;
+import org.eclipse.wst.common.componentcore.internal.operation.AddReferenceDataModelProvider;
+import org.eclipse.wst.common.componentcore.internal.operation.RemoveReferenceDataModelProvider;
+import org.eclipse.wst.common.componentcore.internal.resources.VirtualReference;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.componentcore.ui.Messages;
+import org.eclipse.wst.common.componentcore.ui.ModuleCoreUIPlugin;
+import org.eclipse.wst.common.componentcore.ui.internal.propertypage.ComponentDependencyContentProvider;
+import org.eclipse.wst.common.componentcore.ui.internal.propertypage.DependencyPageExtensionManager;
+import org.eclipse.wst.common.componentcore.ui.internal.propertypage.DependencyPageExtensionManager.ReferenceExtension;
+import org.eclipse.wst.common.componentcore.ui.internal.propertypage.NewReferenceWizard;
+import org.eclipse.wst.common.componentcore.ui.internal.propertypage.verifier.DeploymentAssemblyVerifierHelper;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.TaskWizard;
+import org.eclipse.wst.common.componentcore.ui.internal.taskwizard.WizardFragment;
+import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.eclipse.wst.server.core.IRuntime;
+import org.eclipse.wst.server.core.internal.facets.FacetUtil;
+ 
+public class AddModuleDependenciesPropertiesPage implements Listener,
+		IModuleDependenciesControl, ILabelProviderListener {
+
+	protected static final String DEPLOY_PATH_PROPERTY = new Integer(0).toString();
+	protected static final String SOURCE_PROPERTY = new Integer(1).toString();
+	
+	
+	protected final String PATH_SEPARATOR = String.valueOf(IPath.SEPARATOR);
+	private boolean hasInitialized = false;
+	protected final IProject project;
+	protected final IRuntime runtime;
+	protected final ModuleAssemblyRootPage propPage;
+	protected IVirtualComponent rootComponent = null;
+	protected Text componentNameText;
+	protected Label availableModules;
+	protected TableViewer availableComponentsViewer;
+	protected Button addMappingButton, addReferenceButton, editReferenceButton, removeButton;
+	protected Composite buttonColumn;
+	protected static final IStatus OK_STATUS = IDataModelProvider.OK_STATUS;
+	//protected Listener tableListener;
+	protected Listener labelListener;
+
+	protected ArrayList<IVirtualReference> originalReferences = new ArrayList<IVirtualReference>();
+	protected ArrayList<IVirtualReference> currentReferences = new ArrayList<IVirtualReference>();
+
+	// A single list of wb-resource mappings. If there's any change, 
+	// all old will be removed and new ones added
+	protected ArrayList<ComponentResourceProxy> resourceMappings = new ArrayList<ComponentResourceProxy>();
+	
+	// keeps track if a change has occurred in wb-resource mappings
+	protected boolean resourceMappingsChanged = false;
+	
+	protected IModuleHandler moduleHandler;
+	
+	public static String getSafeRuntimePath(IVirtualReference ref) {
+		String archiveName = ref.getDependencyType() == DependencyType.CONSUMES ? null : ref.getArchiveName();
+		String val = (archiveName != null) ? ref.getRuntimePath().append(archiveName).toString() : ref.getRuntimePath().toString();
+		if( val == null ) val = "/";
+		return val;
+	}
+
+	public static void setRuntimePathSafe(IVirtualReference ref, String newPath) {
+		if( ref.getDependencyType() == IVirtualReference.DEPENDENCY_TYPE_CONSUMES)
+			ref.setRuntimePath(new Path(newPath == null ? "/" : newPath));
+		else {
+			IPath path2 = new Path(newPath == null ? "/" : newPath);
+			ref.setRuntimePath(path2.segmentCount() > 1 ? path2.removeLastSegments(1) : new Path("/"));
+			ref.setArchiveName(path2.segmentCount() > 0 ? path2.lastSegment() : "");
+		}
+	}
+	
+	/**
+	 * Constructor for AddModulestoEARPropertiesControl.
+	 */
+	public AddModuleDependenciesPropertiesPage(final IProject project,
+			final ModuleAssemblyRootPage page) {
+		this.project = project;
+		this.propPage = page;
+		this.runtime = setRuntime();
+		rootComponent = ComponentCore.createComponent(project);
+	}
+
+	private IRuntime setRuntime() {
+		IRuntime aRuntime = null;
+		try {
+			aRuntime = getServerRuntime(project);
+		}
+		catch (CoreException e) {
+			ModuleCoreUIPlugin.log(e);
+		}
+		return aRuntime;
+	}
+
+	/*
+	 * UI Creation Methods
+	 */
+
+	public Composite createContents(final Composite parent) {
+		Composite composite = new Composite(parent, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.marginWidth = 0;
+		layout.marginWidth = 0;
+		composite.setLayout(layout);
+		composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+		createDescriptionComposite(composite);
+		createListGroup(composite);
+		refresh();
+		Dialog.applyDialogFont(parent);
+		return composite;
+	}
+	
+	protected void createDescriptionComposite(Composite parent){
+		ModuleAssemblyRootPage.createDescriptionComposite(parent, getModuleAssemblyRootPageDescription());
+	}
+
+	protected String getModuleAssemblyRootPageDescription() {
+		return Messages.ModuleAssemblyRootPageDescription;
+	}
+
+	protected void createListGroup(Composite parent) {
+		Composite listGroup = new Composite(parent, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 1;
+		layout.marginWidth = 0;
+		layout.marginHeight = 0;
+		listGroup.setLayout(layout);
+		GridData gData = new GridData(GridData.FILL_BOTH);
+		gData.horizontalIndent = 5;
+		listGroup.setLayoutData(gData);
+
+		availableModules = new Label(listGroup, SWT.NONE);
+		gData = new GridData(GridData.HORIZONTAL_ALIGN_FILL
+				| GridData.VERTICAL_ALIGN_FILL);
+		availableModules.setText(Messages.ModuleAssembly); 
+		availableModules.setLayoutData(gData);
+		createTableComposite(listGroup);
+	}
+
+	protected void createTableComposite(Composite parent) {
+		Composite composite = new Composite(parent, SWT.NONE);
+		GridData gData = new GridData(GridData.FILL_BOTH);
+		composite.setLayoutData(gData);
+		fillTableComposite(composite);
+	}
+
+	public void fillTableComposite(Composite parent) {
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		layout.marginHeight = 0;
+		parent.setLayout(layout);
+		parent.setLayoutData(new GridData(GridData.FILL_BOTH));
+		createTable(parent);
+		createButtonColumn(parent);
+	}
+
+	protected void createButtonColumn(Composite parent) {
+		buttonColumn = createButtonColumnComposite(parent);
+		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_END);
+		buttonColumn.setLayoutData(data);
+		createPushButtons();
+	}
+
+	protected void createPushButtons() {
+		addReferenceButton = createPushButton(Messages.AddEllipsis);
+		editReferenceButton = createPushButton(Messages.EditEllipsis);
+		removeButton = createPushButton(Messages.RemoveSelected);
+	}
+
+	protected Button createPushButton(String label) {
+		Button aButton = new Button(buttonColumn, SWT.PUSH);
+		aButton.setText(label);
+		aButton.addListener(SWT.Selection, this);
+		aButton.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		return aButton;
+	}
+
+	public Composite createButtonColumnComposite(Composite parent) {
+		Composite aButtonColumn = new Composite(parent, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 1;
+		layout.marginHeight = 0;
+		layout.marginWidth = 0;
+		aButtonColumn.setLayout(layout);
+		GridData data = new GridData(GridData.HORIZONTAL_ALIGN_FILL
+				| GridData.VERTICAL_ALIGN_BEGINNING);
+		aButtonColumn.setLayoutData(data);
+		return aButtonColumn;
+	}
+
+	public Group createGroup(Composite parent) {
+		return new Group(parent, SWT.NULL);
+	}
+
+	protected void createTable(Composite parent) {
+		if (rootComponent != null) {
+			availableComponentsViewer = createAvailableComponentsViewer(parent);
+			GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL
+					| GridData.FILL_VERTICAL);
+			availableComponentsViewer.getTable().setLayoutData(gd);
+
+			ComponentDependencyContentProvider provider = createProvider();
+			provider.setRuntimePaths(currentReferences);
+			provider.setResourceMappings(resourceMappings);
+			availableComponentsViewer.setContentProvider(provider);
+			//availableComponentsViewer.setLabelProvider(new DecoratingLabelProvider(
+	        //        new WorkbenchLabelProvider(), PlatformUI.getWorkbench().
+	        //         getDecoratorManager().getLabelDecorator()));
+			availableComponentsViewer.setLabelProvider(provider);
+			addTableListeners();
+		}
+	}
+
+	/**
+	 * Subclasses should over-ride this and extend the class
+	 */
+	protected ComponentDependencyContentProvider createProvider() {
+		return new ComponentDependencyContentProvider(this);
+	}
+
+	/*
+	 * Listeners of various events
+	 */
+
+	protected void addTableListeners() {
+		addHoverHelpListeners();
+		addDoubleClickListener();
+		addSelectionListener();
+	}
+
+	protected void addHoverHelpListeners() {
+		final Table table = availableComponentsViewer.getTable();
+		createLabelListener(table);
+//		createTableListener(table);
+//		table.addListener(SWT.Dispose, tableListener);
+//		table.addListener(SWT.KeyDown, tableListener);
+//		table.addListener(SWT.MouseMove, tableListener);
+//		table.addListener(SWT.MouseHover, tableListener);
+	}
+
+	protected void createLabelListener(final Table table) {
+		labelListener = new Listener() {
+			public void handleEvent(Event event) {
+				Label label = (Label) event.widget;
+				Shell shell = label.getShell();
+				switch (event.type) {
+				case SWT.MouseDown:
+					Event e = new Event();
+					e.item = (TableItem) label.getData("_TABLEITEM"); //$NON-NLS-1$
+					table.setSelection(new TableItem[] { (TableItem) e.item });
+					table.notifyListeners(SWT.Selection, e);
+					shell.dispose();
+					table.setFocus();
+					break;
+				case SWT.MouseExit:
+					shell.dispose();
+					break;
+				}
+			}
+		};
+	}
+
+//	protected void createTableListener(final Table table) {
+//		tableListener = new Listener() {
+//			Shell tip = null;
+//			Label label = null;
+//
+//			public void handleEvent(Event event) {
+//				switch (event.type) {
+//				case SWT.Dispose:
+//				case SWT.KeyDown:
+//				case SWT.MouseMove: {
+//					if (tip == null)
+//						break;
+//					tip.dispose();
+//					tip = null;
+//					label = null;
+//					break;
+//				}
+//				case SWT.MouseHover: {
+//					TableItem item = table.getItem(new Point(event.x, event.y));
+//					if (item != null && item.getData() != null && !canEdit(item.getData())) {
+//						if (tip != null && !tip.isDisposed())
+//							tip.dispose();
+//						tip = new Shell(PlatformUI.getWorkbench()
+//								.getActiveWorkbenchWindow().getShell(),
+//								SWT.ON_TOP | SWT.NO_FOCUS | SWT.TOOL);
+//						tip.setBackground(Display.getDefault().getSystemColor(
+//								SWT.COLOR_INFO_BACKGROUND));
+//						FillLayout layout = new FillLayout();
+//						layout.marginWidth = 2;
+//						tip.setLayout(layout);
+//						label = new Label(tip, SWT.WRAP);
+//						label.setForeground(Display.getDefault()
+//								.getSystemColor(SWT.COLOR_INFO_FOREGROUND));
+//						label.setBackground(Display.getDefault()
+//								.getSystemColor(SWT.COLOR_INFO_BACKGROUND));
+//						label.setData("_TABLEITEM", item); //$NON-NLS-1$
+//						label.setText( Messages.InternalLibJarWarning);
+//						label.addListener(SWT.MouseExit, labelListener);
+//						label.addListener(SWT.MouseDown, labelListener);
+//						Point size = tip.computeSize(SWT.DEFAULT, SWT.DEFAULT);
+//						Rectangle rect = item.getBounds(0);
+//						Point pt = table.toDisplay(rect.x, rect.y);
+//						tip.setBounds(pt.x, pt.y - size.y, size.x, size.y);
+//						tip.setVisible(true);
+//					}
+//				}
+//				}
+//			}
+//		};
+//	}
+
+//	protected boolean canEdit(Object data) {
+//		if( data == null ) return false;
+//		if( !(data instanceof VirtualArchiveComponent)) return true;
+//		
+//		VirtualArchiveComponent d2 = (VirtualArchiveComponent)data;
+//		boolean sameProject = d2.getWorkspaceRelativePath() != null
+//			&& d2.getWorkspaceRelativePath().segment(0)
+//				.equals(rootComponent.getProject().getName());
+//		return !(sameProject && isPhysicallyAdded(d2));
+//	}
+	
+	protected void addDoubleClickListener() {
+		availableComponentsViewer.setColumnProperties(new String[] { 
+				DEPLOY_PATH_PROPERTY, SOURCE_PROPERTY });
+		
+		CellEditor[] editors = new CellEditor[] { 
+				new TextCellEditor(availableComponentsViewer.getTable()),
+				new TextCellEditor()};
+		availableComponentsViewer.setCellEditors(editors);
+		availableComponentsViewer
+				.setCellModifier(new RuntimePathCellModifier());
+	}
+
+	protected void addSelectionListener() {
+		availableComponentsViewer.addSelectionChangedListener(
+				new ISelectionChangedListener(){
+					public void selectionChanged(SelectionChangedEvent event) {
+						viewerSelectionChanged();
+					}
+				});
+	}
+	
+	protected void viewerSelectionChanged() {
+		editReferenceButton.setEnabled(hasEditWizardPage(getSelectedObject()));
+		removeButton.setEnabled(getSelectedObject() != null);
+	}
+	
+	protected boolean hasEditWizardPage(Object o) {
+		if( o == null || !(o instanceof IVirtualReference)) 
+			return false;
+		WizardFragment wf = NewReferenceWizard.getFirstEditingFragment((IVirtualReference)o);
+		return wf != null;
+	}
+
+	protected Object getSelectedObject() {
+		IStructuredSelection sel = (IStructuredSelection)availableComponentsViewer.getSelection();
+		return sel.getFirstElement();
+	}
+	
+	private class RuntimePathCellModifier implements ICellModifier {
+
+		public boolean canModify(Object element, String property) {
+			if( property.equals(DEPLOY_PATH_PROPERTY)) {
+				if( element instanceof IVirtualReference && !((IVirtualReference)element).isDerived())
+					return true;
+				if( element instanceof ComponentResourceProxy )
+					return true; 
+			}
+			return false;
+		}
+
+		public Object getValue(Object element, String property) {
+			if( element instanceof IVirtualReference ) {
+				return getSafeRuntimePath((IVirtualReference)element);
+			} else if( element instanceof ComponentResourceProxy) {
+				return ((ComponentResourceProxy)element).runtimePath.toString();
+			}
+			return new Path("/"); //$NON-NLS-1$
+		}
+
+		public void modify(Object element, String property, Object value) {
+			if (property.equals(DEPLOY_PATH_PROPERTY)) {
+				TableItem item = (TableItem) element;
+				if( item.getData() instanceof IVirtualReference) {
+					setRuntimePathSafe((IVirtualReference)item.getData(), (String) value);
+				} else if( item.getData() instanceof ComponentResourceProxy) {
+					ComponentResourceProxy c = ((ComponentResourceProxy)item.getData());
+					c.runtimePath = new Path((String)value);
+					resourceMappingsChanged = true;
+				}
+				refresh();
+			}
+		}
+
+	}
+
+	public void handleEvent(Event event) {
+		if( event.widget == addReferenceButton) 
+			handleAddReferenceButton();
+		else if( event.widget == editReferenceButton) 
+			handleEditReferenceButton();
+		else if( event.widget == removeButton ) 
+			handleRemoveSelectedButton();
+	}
+	
+	protected void handleAddReferenceButton() {
+		showReferenceWizard(false);
+	}
+	
+	protected void handleEditReferenceButton() {
+		showReferenceWizard(true);
+	}
+	
+	protected ReferenceExtension[] filterReferenceTypes(ReferenceExtension[] defaults) {
+		return defaults;
+	}
+	
+	protected void showReferenceWizard(boolean editing) {
+		ReferenceExtension[] extensions = 
+			DependencyPageExtensionManager.getManager().getExposedReferenceExtensions();
+		extensions = filterReferenceTypes(extensions);
+		NewReferenceWizard wizard = new NewReferenceWizard(extensions);
+		// fill the task model
+		wizard.getTaskModel().putObject(IReferenceWizardConstants.PROJECT, project);
+		wizard.getTaskModel().putObject(IReferenceWizardConstants.ROOT_COMPONENT, rootComponent);
+		wizard.getTaskModel().putObject(IReferenceWizardConstants.MODULEHANDLER, getModuleHandler());
+		wizard.getTaskModel().putObject(IReferenceWizardConstants.CURRENT_REFS, currentReferences);
+		setCustomReferenceWizardProperties(wizard.getTaskModel());
+
+		IVirtualReference selected = null;
+		if( editing ) {
+			Object o = ((IStructuredSelection)availableComponentsViewer.getSelection()).getFirstElement();
+			if( o instanceof IVirtualReference ) {
+				selected = (IVirtualReference)o;
+				wizard.getTaskModel().putObject(IReferenceWizardConstants.ORIGINAL_REFERENCE, selected);
+			} 
+		}
+		
+		WizardDialog wd = new WizardDialog(addReferenceButton.getShell(), wizard);
+		if( wd.open() != Window.CANCEL) {
+			if( editing && selected != null) {
+				// remove old
+				currentReferences.remove(selected);
+			}
+			
+			if( wizard.getTaskModel().getObject(IReferenceWizardConstants.FOLDER_MAPPING) != null )
+				handleAddFolderMapping(wizard);
+			else
+				handleAddNewReference(wizard);
+			refresh();
+		}
+	}
+	
+	/*
+	 * Clients can override this to set custom properties
+	 */
+	protected void setCustomReferenceWizardProperties(TaskModel model) {
+		// do nothing
+	}
+	
+	protected void handleAddFolderMapping(TaskWizard wizard) {
+		Object o = wizard.getTaskModel().getObject(IReferenceWizardConstants.FOLDER_MAPPING);
+		if( o != null && o instanceof ComponentResourceProxy ) {
+			ComponentResourceProxy proxy = (ComponentResourceProxy)o;
+			resourceMappings.add(proxy);
+			resourceMappingsChanged = true;
+		}
+	}
+	
+	protected void handleAddNewReference(TaskWizard wizard) {
+		Object c1 = wizard.getTaskModel().getObject(IReferenceWizardConstants.FINAL_REFERENCE);
+		if(c1 != null) {
+			IVirtualReference[] referenceArray = c1 instanceof IVirtualReference ? 
+					new IVirtualReference[] { (IVirtualReference)c1 } : 
+						(IVirtualReference[])c1;
+			currentReferences.addAll(Arrays.asList(referenceArray));
+		}
+	}
+	
+	/**
+	 * Subclasses are encouraged to override this method if 
+	 * they have some specific place (webinf/lib etc) where certain
+	 * types of references should default to. 
+	 * 
+	 * If the subclass does not understand or know about the 
+	 * this component type, or if it has no customizations to perform,
+	 * it should return the provided wizardPath unchanged
+	 * 
+	 * @param addedComp The component being added as a reference
+	 * @param addedPath The path that the wizard suggests as the path
+	 * @return The runtime path that should be added to the properties page
+	 */
+	protected String getRuntimePath(IVirtualComponent addedComp, String wizardPath) {
+		return wizardPath;
+	}
+	
+	protected void handleRemoveSelectedButton() {
+		ISelection sel = availableComponentsViewer.getSelection();
+		if( sel instanceof IStructuredSelection ) {
+			IStructuredSelection sel2 = (IStructuredSelection)sel;
+			Object[] selectedStuff = sel2.toArray();
+			for( int i = 0; i < selectedStuff.length; i++) {
+				Object o = selectedStuff[i];
+				if( o instanceof IVirtualReference)
+					currentReferences.remove(o);
+				else if( o instanceof ComponentResourceProxy) {
+					resourceMappings.remove(o);
+					resourceMappingsChanged = true;
+				}
+			}
+			refresh();
+		}
+	}
+
+	public TableViewer createAvailableComponentsViewer(Composite parent) {
+		int flags = SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI;
+
+		Table table = new Table(parent, flags);
+		TableViewer tempViewer = new TableViewer(table);
+
+		// set up table layout
+		TableLayout tableLayout = new org.eclipse.jface.viewers.TableLayout();
+		tableLayout.addColumnData(new ColumnWeightData(400, true));
+		tableLayout.addColumnData(new ColumnWeightData(500, true));
+		table.setLayout(tableLayout);
+		table.setHeaderVisible(true);
+		table.setLinesVisible(true);
+		tempViewer.setSorter(null);
+
+		TableColumn bndColumn = new TableColumn(table, SWT.NONE, 0);
+		bndColumn.setText(Messages.DeployPathColumn);
+		bndColumn.setResizable(true);
+
+		TableColumn projectColumn = new TableColumn(table, SWT.NONE, 1);
+		projectColumn.setText(Messages.SourceColumn);
+		projectColumn.setResizable(true);
+
+		tableLayout.layout(table, true);
+		return tempViewer;
+
+	}
+
+	/**
+	 * This should only be called on changes, such as adding a project
+	 * reference, adding a lib reference etc.
+	 * 
+	 * It will reset the input, manually re-add missing elements, and do other
+	 * tasks
+	 */
+	public void refresh() {
+		resetTableUI();
+		if (!hasInitialized) {
+			initialize();
+			resetTableUI();
+		}
+		verify();
+
+	}
+
+	protected void verify() {
+		
+		IStatus status = DeploymentAssemblyVerifierHelper.verify(rootComponent, runtime, currentReferences, resourceMappings,resourceMappingsChanged);
+		// Clear the messages
+		propPage.setErrorMessage(null);
+		propPage.setMessage(null);
+		if (status.isMultiStatus()) {
+			MultiStatus multi = (MultiStatus)status;
+			if (!multi.isOK()) {
+				propPage.setMessage(getMessage(multi), multi.getSeverity());
+				if (multi.getSeverity() == IStatus.ERROR) {
+					propPage.setErrorMessage(getMessage(multi));
+					propPage.setValid(false);
+				}
+				else 
+					propPage.setValid(true);
+			} else propPage.setValid(true);
+		} else if (status.isOK()) propPage.setValid(true);
+		propPage.getContainer().updateMessage();
+	}
+
+	private String getMessage(MultiStatus multi) {
+		//Append Messages
+		StringBuffer message = new StringBuffer();
+		
+		for (int i = 0; i < multi.getChildren().length; i++) {
+			IStatus status = multi.getChildren()[i];
+			if (status.getMessage() != null) {
+				message.append(status.getMessage());
+				message.append(" "); //$NON-NLS-1$
+			}
+		}
+		return message.toString();
+	}
+
+	protected void resetTableUI() {
+		IWorkspaceRoot input = ResourcesPlugin.getWorkspace().getRoot();
+		availableComponentsViewer.setInput(input);
+		GridData data = new GridData(GridData.FILL_BOTH);
+		int numlines = Math.min(10, availableComponentsViewer.getTable()
+				.getItemCount());
+		data.heightHint = availableComponentsViewer.getTable().getItemHeight()
+				* numlines;
+		availableComponentsViewer.getTable().setLayoutData(data);
+		GridData btndata = new GridData(GridData.HORIZONTAL_ALIGN_FILL
+				| GridData.VERTICAL_ALIGN_BEGINNING);
+		buttonColumn.setLayoutData(btndata);
+	}
+
+	protected void initialize() {
+		Map<String, Object> options = new HashMap<String, Object>();
+		options.put(IVirtualComponent.REQUESTED_REFERENCE_TYPE, IVirtualComponent.DISPLAYABLE_REFERENCES);
+		IVirtualReference[] refs = rootComponent.getReferences(options);
+		IVirtualComponent comp;
+		originalReferences.addAll(Arrays.asList(refs));
+		currentReferences.addAll(Arrays.asList(cloneReferences(refs)));
+
+		ComponentResource[] allMappings = findAllMappings();
+		for( int i = 0; i < allMappings.length; i++ ) {
+			resourceMappings.add(new ComponentResourceProxy(
+					allMappings[i].getSourcePath(), allMappings[i].getRuntimePath()
+			));
+		}
+		if(editReferenceButton != null)
+			editReferenceButton.setEnabled(false);
+		if(removeButton != null)
+			removeButton.setEnabled(false);
+		hasInitialized = true;
+	}
+
+	private IRuntime getServerRuntime(IProject project2) throws CoreException {
+		if (project == null)
+			return null;
+		IFacetedProject facetedProject = ProjectFacetsManager.create(project);
+		if (facetedProject == null)
+			return null;
+		org.eclipse.wst.common.project.facet.core.runtime.IRuntime runtime = facetedProject.getRuntime();
+		if (runtime == null)
+			return null;
+		return FacetUtil.getRuntime(runtime);
+	}
+
+	protected IVirtualReference[] cloneReferences(IVirtualReference[] refs) {
+		IVirtualReference[] result = new IVirtualReference[refs.length];
+		VirtualReference temp;
+		for( int i = 0; i < result.length; i++ ) {
+			temp = new VirtualReference(refs[i].getEnclosingComponent(), refs[i].getReferencedComponent());
+			temp.setDependencyType(refs[i].getDependencyType());
+			temp.setDerived(refs[i].isDerived());
+			temp.setArchiveName(refs[i].getArchiveName());
+			temp.setRuntimePath(refs[i].getRuntimePath());
+			result[i] = temp;
+		}
+		return result;
+	}
+	
+	protected ComponentResource[] findAllMappings() {
+		StructureEdit structureEdit = null;
+		try {
+			structureEdit = StructureEdit.getStructureEditForRead(project);
+			WorkbenchComponent component = structureEdit.getComponent();
+			Object[] arr = component.getResources().toArray();
+			ComponentResource[] result = new ComponentResource[arr.length];
+			for( int i = 0; i < arr.length; i++ )
+				result[i] = (ComponentResource)arr[i];
+			return result;
+		} catch(Exception e) {
+		} finally {
+			structureEdit.dispose();
+		}
+		return new ComponentResource[]{};
+	}
+	
+	public static class ComponentResourceProxy {
+		public IPath source, runtimePath;
+		public ComponentResourceProxy(IPath source, IPath runtimePath) {
+			this.source = source;
+			this.runtimePath = runtimePath;
+		}
+	}
+	
+	/*
+	 * Clean-up methods are below. These include performCancel, performDefaults,
+	 * performOK, and any other methods that are called *only* by this one.
+	 */
+	public void setVisible(boolean visible) {
+	}
+
+	public void performDefaults() {
+	}
+
+	public boolean performCancel() {
+		return true;
+	}
+
+	public void dispose() {
+		Table table = null;
+		if (availableComponentsViewer != null) {
+			table = availableComponentsViewer.getTable();
+		}
+//		if (table == null || tableListener == null)
+//			return; 
+//		table.removeListener(SWT.Dispose, tableListener);
+//		table.removeListener(SWT.KeyDown, tableListener);
+//		table.removeListener(SWT.MouseMove, tableListener);
+//		table.removeListener(SWT.MouseHover, tableListener);
+	}
+
+	
+	
+	/*
+	 * This is where the OK work goes. Lots of it. Watch your head.
+	 * xiao xin
+	 */
+	protected boolean preHandleChanges(IProgressMonitor monitor) {
+		return true;
+	}
+
+	protected boolean postHandleChanges(IProgressMonitor monitor) {
+		return true;
+	}
+
+	public boolean performOk() {
+		boolean result = true;
+		result &= saveResourceChanges();
+		result &= saveReferenceChanges();
+		return result;
+	}
+	
+	protected boolean saveResourceChanges() {
+		if( resourceMappingsChanged ) {
+			removeAllResourceMappings();
+			addNewResourceMappings();
+		}
+		return true;
+	}
+	protected boolean addNewResourceMappings() {
+		ComponentResourceProxy[] proxies = resourceMappings.toArray(new ComponentResourceProxy[resourceMappings.size()]);
+		IVirtualFolder rootFolder = rootComponent.getRootFolder();
+		for( int i = 0; i < proxies.length; i++ ) {
+			try {
+				rootFolder.getFolder(proxies[i].runtimePath).createLink(proxies[i].source, 0, null);
+			} catch( CoreException ce ) {
+			}
+		}
+		resourceMappingsChanged = false;
+		return true;
+	}
+	
+	protected boolean removeAllResourceMappings() {
+		StructureEdit moduleCore = null;
+		try {
+			moduleCore = StructureEdit.getStructureEditForWrite(project);
+			moduleCore.getComponent().getResources().clear();
+		}
+		finally {
+			if (moduleCore != null) {
+				moduleCore.saveIfNecessary(new NullProgressMonitor());
+				moduleCore.dispose();
+			}
+		}
+		return true;
+	}
+	
+	protected boolean saveReferenceChanges() {
+		// Fill our delta lists
+		ArrayList<IVirtualReference> added = new ArrayList<IVirtualReference>();
+		ArrayList<IVirtualReference> removed = new ArrayList<IVirtualReference>();
+
+		HashMap<IVirtualComponent, IVirtualReference> map = new HashMap<IVirtualComponent, IVirtualReference>();
+		Iterator<IVirtualReference> k = currentReferences.iterator();
+		IVirtualReference v1;
+		while(k.hasNext()) {
+			v1 = k.next();
+			map.put(v1.getReferencedComponent(), v1);
+		}
+		
+		Iterator<IVirtualReference> j = originalReferences.iterator();
+		IVirtualReference origRef, newRef;
+		while (j.hasNext()) {
+			origRef = j.next();
+			newRef = map.get(origRef.getReferencedComponent());
+			if( newRef == null )
+				removed.add(origRef);
+			else if( !getSafeRuntimePath(origRef).equals(getSafeRuntimePath(newRef))) {
+				removed.add(origRef);
+				added.add(newRef);
+			}
+			map.remove(origRef.getReferencedComponent());
+		}
+
+		added.addAll(map.values());
+
+		NullProgressMonitor monitor = new NullProgressMonitor();
+		boolean subResult = preHandleChanges(monitor);
+		if( !subResult )
+			return false;
+		
+		handleRemoved(removed);
+		handleAdded(added);
+
+		subResult &= postHandleChanges(monitor);
+		
+		originalReferences.clear();
+		originalReferences.addAll(currentReferences);
+		currentReferences.clear();
+		IVirtualReference[] currentTmp =
+			originalReferences.toArray(new IVirtualReference[originalReferences.size()]); 
+		currentReferences.addAll(Arrays.asList(cloneReferences(currentTmp)));
+		return subResult;
+	}
+
+	protected void handleRemoved(ArrayList<IVirtualReference> removed) {
+		// If it's removed it should *only* be a virtual component already
+		if(removed.isEmpty()) return;
+		final ArrayList<IVirtualReference> refs = new ArrayList<IVirtualReference>();
+		Iterator<IVirtualReference> i = removed.iterator();
+		IVirtualReference o;
+		while(i.hasNext()) {
+			o = i.next();
+			refs.add(o);
+		}
+		IWorkspaceRunnable runnable = new IWorkspaceRunnable(){
+			public void run(IProgressMonitor monitor) throws CoreException{
+				removeReferences(refs);
+			}
+		};
+		try {
+			ResourcesPlugin.getWorkspace().run(runnable, new NullProgressMonitor());
+		} catch( CoreException e ) {
+			ModuleCoreUIPlugin.logError(e);
+		}
+		
+	}
+	
+	protected void removeReferences(ArrayList<IVirtualReference> removed) {
+		Iterator<IVirtualReference> i = removed.iterator();
+		while(i.hasNext()) {
+			removeOneReference(i.next());
+		}
+	}
+
+	protected void removeOneReference(IVirtualReference comp) {
+		try {
+			IDataModelOperation operation = getRemoveComponentOperation(comp);
+			operation.execute(null, null);
+		} catch( ExecutionException e) {
+			ModuleCoreUIPlugin.logError(e);
+		}
+		
+	}
+
+	protected IDataModelOperation getRemoveComponentOperation(IVirtualReference reference) {
+		IDataModelProvider provider = getRemoveReferenceDataModelProvider(reference);
+		IDataModel model = DataModelFactory.createDataModel(provider);
+		model.setProperty(IAddReferenceDataModelProperties.SOURCE_COMPONENT, rootComponent);
+		List<IVirtualReference> toRemove = new ArrayList<IVirtualReference>();
+		toRemove.add(reference); 
+		model.setProperty(IAddReferenceDataModelProperties.TARGET_REFERENCE_LIST, toRemove);
+		return model.getDefaultOperation();
+	}
+	
+	protected IDataModelProvider getRemoveReferenceDataModelProvider(IVirtualReference reference) {
+		return new RemoveReferenceDataModelProvider();
+	}
+	
+	protected void handleAdded(ArrayList<IVirtualReference> added) {
+		final ArrayList<IVirtualReference> refs = new ArrayList<IVirtualReference>();
+		Iterator<IVirtualReference> i = added.iterator();
+		IVirtualReference o;
+		while(i.hasNext()) {
+			o = i.next();
+			refs.add(o);
+		}
+		
+		IWorkspaceRunnable runnable = new IWorkspaceRunnable(){
+			public void run(IProgressMonitor monitor) throws CoreException{
+				addReferences(refs);
+			}
+		};
+		try {
+			ResourcesPlugin.getWorkspace().run(runnable, new NullProgressMonitor());
+		} catch( CoreException e ) {
+			ModuleCoreUIPlugin.logError(e);
+		}
+	}
+	
+	protected void addReferences(ArrayList<IVirtualReference> refs) throws CoreException {
+		Iterator<IVirtualReference> i = refs.iterator();
+		while(i.hasNext()) {
+			addOneReference(i.next());
+		}
+	}
+	
+	protected IDataModelProvider getAddReferenceDataModelProvider(IVirtualReference component) {
+		return new AddReferenceDataModelProvider();
+	}
+	
+	protected void addOneReference(IVirtualReference ref) throws CoreException {
+		String path, archiveName;
+
+		IDataModelProvider provider = getAddReferenceDataModelProvider(ref);
+		IDataModel dm = DataModelFactory.createDataModel(provider);
+		dm.setProperty(IAddReferenceDataModelProperties.SOURCE_COMPONENT, rootComponent);
+		dm.setProperty(IAddReferenceDataModelProperties.TARGET_REFERENCE_LIST, Arrays.asList(ref));
+		
+		IStatus stat = dm.validateProperty(IAddReferenceDataModelProperties.TARGET_REFERENCE_LIST);
+		if (stat != OK_STATUS)
+			throw new CoreException(stat);
+		try {
+			dm.getDefaultOperation().execute(new NullProgressMonitor(), null);
+		} catch (ExecutionException e) {
+			ModuleCoreUIPlugin.logError(e);
+		}	
+	}
+
+	public void labelProviderChanged(LabelProviderChangedEvent event) {
+		if(!availableComponentsViewer.getTable().isDisposed())
+			availableComponentsViewer.refresh(true);
+	}
+
+	protected IModuleHandler getModuleHandler() {
+		if(moduleHandler == null)
+			moduleHandler = new DefaultModuleHandler();
+		return moduleHandler;
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/IDependencyPageProvider.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/IDependencyPageProvider.java
new file mode 100644
index 0000000..47332e2
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/IDependencyPageProvider.java
@@ -0,0 +1,63 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ *    
+ * API in these packages is provisional in this release
+ ******************************************************************************/
+package org.eclipse.wst.common.componentcore.ui.propertypage;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+
+/**
+ * Suggested use case of this class is as follows:
+ * 
+ * 		provider = DependencyPageExtensionManager.getManager().getProvider(facetedProject);
+ *		if( provider != null ) {
+ *			controls = provider.createPages(facetedProject, this);
+ *			Composite root = provider.createRootControl(controls, parent);
+ *		}
+ */
+public interface IDependencyPageProvider {
+	/**
+	 * Returns true if this page provider knows how to 
+	 * handle the given faceted project, false otherwise
+	 * @param project a project
+	 * @return true if this provider can handle it, false otherwise
+	 */
+	public boolean canHandle(IFacetedProject project);
+	
+	/**
+	 * Returns a list of page control objects which should be
+	 * presented to the user for this project type. 
+	 * 
+	 * @param project
+	 * @param parent
+	 * @return
+	 */
+	public IModuleDependenciesControl[] createPages(IFacetedProject project, ModuleAssemblyRootPage parent);
+	
+	/**
+	 * Turn this array of pages / controls into one root control
+	 * that can be returned to the Properties Page container. 
+
+	 * @param pages
+	 * @param parent
+	 * @return
+	 */
+	public Composite createRootControl(IFacetedProject project, IModuleDependenciesControl[] pages, Composite parent);
+
+	/**
+	 * 
+	 * @return String - page title string or null if default title is desired
+	 */
+	public String getPageTitle(IProject project);
+	
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/IModuleDependenciesControl.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/IModuleDependenciesControl.java
new file mode 100644
index 0000000..3c9660e
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/IModuleDependenciesControl.java
@@ -0,0 +1,59 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ *    
+ * API in these packages is provisional in this release
+ ******************************************************************************/
+package org.eclipse.wst.common.componentcore.ui.propertypage;
+
+import org.eclipse.swt.widgets.Composite;
+
+/**
+ * This represents one control which may be present on a page
+ * and requires to listen in to the specific lifecycle 
+ * events of the page. 
+ */
+public interface IModuleDependenciesControl {
+	/**
+	 * Creates the Composite associated with this control.
+	 * @param parent Parent Composite.
+	 * @return Composite for the control.
+	 */
+	Composite createContents(Composite parent);
+	
+	/**
+	 * Called when the property page's <code>performOk()</code> method is called.
+	 * @return
+	 */
+	boolean performOk();
+	
+	/**
+	 * Called when the property page's <code>performDefaults()</code> method is called.
+	 * @return
+	 */
+	void performDefaults();
+	
+	/**
+	 * Called when the property page's <code>performCancel()</code> method is called.
+	 * @return
+	 */
+	boolean performCancel();
+	
+	/**
+	 * Called when the property page's <code>setVisible()</code> method is called.
+	 * @return
+	 */
+	void setVisible(boolean visible);
+	
+	/**
+	 * Called when the property page's <code>dispose()</code> method is called.
+	 * @return
+	 */
+	void dispose();
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/IReferenceWizardConstants.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/IReferenceWizardConstants.java
new file mode 100644
index 0000000..b23ad91
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/IReferenceWizardConstants.java
@@ -0,0 +1,87 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ *    IBM - Ongoing maintenance
+ *    
+ * API in these packages is provisional in this release
+ ******************************************************************************/
+package org.eclipse.wst.common.componentcore.ui.propertypage;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+
+public interface IReferenceWizardConstants {
+	/**
+	 * The key representing that this wizard can return a folder mapping
+	 * The value should be an instanceof ComponentResourceProxy
+	 */
+	public static final String FOLDER_MAPPING = "folder.mapping"; //$NON-NLS-1$
+	
+	/**
+	 * This property should map to the IProject which is the root project
+	 * which will enclose the returned reference
+	 */
+	public static final String PROJECT = "root.project"; //$NON-NLS-1$
+	
+	/**
+	 * This property should map to the IVirtualComponent which is the root component
+	 * which will enclose the returned reference
+	 */
+	public static final String ROOT_COMPONENT = "root.component"; //$NON-NLS-1$
+	
+	/**
+	 * This property should map to the IModuleHandler for customized behaviour
+	 */
+	public static final String MODULEHANDLER = "module.handler"; //$NON-NLS-1$
+	
+	/**
+	 * This property should map to the original reference, if the wizard has been opened
+	 * in editing mode. 
+	 */
+	public static final String ORIGINAL_REFERENCE = "dependency.reference.original";//$NON-NLS-1$
+	
+	/**
+	 * This property should map to the final reference, either new reference, 
+	 * or a new instance of a modified reference. 
+	 */
+	public static final String FINAL_REFERENCE = "dependency.reference.final";//$NON-NLS-1$
+	
+	/**
+	 * This property should map to the default location that libraries should be placed.
+	 * If this is unset, the creating or editing wizard fragment can choose to 
+	 * set the runtimePath of the reference to whatever it wants.
+	 */
+	public static final String DEFAULT_LIBRARY_LOCATION = "default.library.location";
+	
+	/**
+	 * This property should map to the default location that generic resources should be placed.
+	 * If this is unset, the creating or editing wizard fragment can choose to 
+	 * set the runtimePath of the reference to whatever it wants.
+	 */
+	public static final String DEFAULT_RESOURCE_LOCATION = "default.resource.location";
+
+	/**
+	 * This property helps track the current state of the component ref model as each subsequent action is taken, but not committed
+	 */
+	public static final String CURRENT_REFS = "current.references";
+	
+	/**
+	 * This key should be used when you want to convert a project into 
+	 * a specific modulecore project type.
+	 * 
+	 */
+	public static final String PROJECT_CONVERTER_OPERATION_PROVIDER = "project.converter.operation.provider";
+	
+	/**
+	 * An interface to provide an operation for converting a specific project
+	 */
+	public static interface ProjectConverterOperationProvider {
+		public IDataModelOperation getConversionOperation(IProject project);
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/ModuleAssemblyRootPage.java b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/ModuleAssemblyRootPage.java
new file mode 100644
index 0000000..e8470f5
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore.ui/src/org/eclipse/wst/common/componentcore/ui/propertypage/ModuleAssemblyRootPage.java
@@ -0,0 +1,185 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ *    
+ * API in these packages is provisional in this release
+ ******************************************************************************/
+package org.eclipse.wst.common.componentcore.ui.propertypage;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.PropertyPage;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.ui.Messages;
+import org.eclipse.wst.common.componentcore.ui.internal.propertypage.DependencyPageExtensionManager;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+
+/**
+ * Primary project property page for Module assembly;
+ */
+public class ModuleAssemblyRootPage extends PropertyPage {
+	
+	private IProject project;
+	private IModuleDependenciesControl[] controls = new IModuleDependenciesControl[0];
+	
+	public ModuleAssemblyRootPage() {
+		super();
+	}
+	
+	private Composite getFacetErrorComposite(final Composite parent) {
+		final String errorCheckingFacet = Messages.ErrorCheckingFacets;
+		setErrorMessage(errorCheckingFacet);
+		return getErrorComposite(parent, errorCheckingFacet);		
+	}
+	private Composite getVirtCompErrorComposite(final Composite parent) {
+		final String errorCheckingFacet = Messages.ErrorNotVirtualComponent;
+		setErrorMessage(errorCheckingFacet);
+		return getErrorComposite(parent, errorCheckingFacet);		
+	}
+	
+	
+	private Composite getErrorComposite(final Composite parent, final String error) {
+		final Composite composite = new Composite(parent, SWT.NONE);
+		final GridLayout layout = new GridLayout();
+        layout.marginWidth = 0;
+        layout.marginWidth = 0;
+        composite.setLayout(layout);
+        composite.setLayoutData(new GridData(GridData.FILL_BOTH));
+		final Label label= new Label(composite, SWT.NONE);
+		label.setText(error);
+		return composite;
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.preference.IPreferencePage#performOk()
+	 */
+	public boolean performOk() {
+		for (int i = 0; i < controls.length; i++) {
+			if (controls[i] != null) {
+				if (!controls[i].performOk()) {
+					return false;
+				}
+			}
+		}
+		return true;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.preference.PreferencePage#performDefaults()
+	 */
+	public void performDefaults() {
+		for (int i = 0; i < controls.length; i++) {
+			if (controls[i] != null) {
+				controls[i].performDefaults();
+			}
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.preference.IPreferencePage#performCancel()
+	 */
+	public boolean performCancel() {
+		for (int i = 0; i < controls.length; i++) {
+			if (controls[i] != null) {
+				if (!controls[i].performCancel()) {
+					return false;
+				}
+			}
+		}
+		return super.performCancel();
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.IDialogPage#setVisible(boolean)
+	 */
+	public void setVisible(boolean visible) {
+		super.setVisible(visible);
+		for (int i = 0; i < controls.length; i++) {
+			if (controls[i] != null) {
+				controls[i].setVisible(visible);
+			}
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.IDialogPage#dispose()
+	 */
+	public void dispose() {
+		super.dispose();
+		for (int i = 0; i < controls.length; i++) {
+			if(controls[i] != null){
+				controls[i].dispose();
+			}
+		}
+	}
+
+	protected static void createDescriptionComposite(final Composite parent, final String description) {
+		Composite descriptionComp = new Composite(parent, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 1;
+		descriptionComp.setLayout(layout);
+		descriptionComp.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		fillDescription(descriptionComp, description);
+	}
+	
+	private static void fillDescription(Composite c, String s) {
+		GridData data = new GridData(GridData.FILL_HORIZONTAL);
+		data.widthHint = 250;
+		Text text = new Text(c, SWT.READ_ONLY | SWT.WRAP);
+		text.setLayoutData(data);
+		text.setText(s);
+	}
+	
+	protected Control createContents(Composite parent) {
+		
+		// Need to find out what type of project we are handling
+		project = (IProject) getElement().getAdapter(IResource.class);
+		if( project != null ) {
+			try {
+				IFacetedProject facetedProject = ProjectFacetsManager.create(project); 
+				IDependencyPageProvider provider = null;
+				if( facetedProject == null )
+					return getFacetErrorComposite(parent);
+				
+				provider = DependencyPageExtensionManager.getManager().getProvider(facetedProject);
+				if( provider != null ) {
+					controls = provider.createPages(facetedProject, this);
+					controls = controls == null ? new IModuleDependenciesControl[]{} : controls;
+					if (provider.getPageTitle(project) != null)
+						setTitle(provider.getPageTitle(project));
+					return provider.createRootControl(facetedProject, controls, parent);
+				}
+				
+				if( ComponentCore.createComponent(project) == null )
+					return getVirtCompErrorComposite(parent);
+				
+				AddModuleDependenciesPropertiesPage page = new AddModuleDependenciesPropertiesPage(project, this);
+				controls = new IModuleDependenciesControl[1];
+				controls[0] = page;
+				return page.createContents(parent);
+			} catch( CoreException ce )	{
+			}
+		}
+		return getFacetErrorComposite(parent);
+	}
+	
+    public void createControl(Composite parent){
+    	noDefaultAndApplyButton();
+    	super.createControl(parent);
+    }
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.common.modulecore/META-INF/MANIFEST.MF
index d35b199..d7f7bb1 100644
--- a/plugins/org.eclipse.wst.common.modulecore/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.wst.common.modulecore/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-Name: %Bundle-Name.0
 Bundle-Vendor: %provider
 Bundle-SymbolicName: org.eclipse.wst.common.modulecore; singleton:=true
-Bundle-Version: 1.1.201.qualifier
+Bundle-Version: 1.2.0.qualifier
 Bundle-Activator: org.eclipse.wst.common.componentcore.internal.ModulecorePlugin
 Bundle-Localization: plugin
 Export-Package: org.eclipse.wst.common.componentcore,
@@ -11,10 +11,12 @@
  org.eclipse.wst.common.componentcore.datamodel.properties,
  org.eclipse.wst.common.componentcore.internal;x-internal:=true,
  org.eclipse.wst.common.componentcore.internal.builder;x-internal:=true,
+ org.eclipse.wst.common.componentcore.internal.flat;x-internal:=true,
  org.eclipse.wst.common.componentcore.internal.impl;x-internal:=true,
  org.eclipse.wst.common.componentcore.internal.operation;x-internal:=true,
  org.eclipse.wst.common.componentcore.internal.resources;x-internal:=true,
  org.eclipse.wst.common.componentcore.internal.util;x-internal:=true,
+ org.eclipse.wst.common.componentcore.resolvers;x-internal:=true,
  org.eclipse.wst.common.componentcore.resources
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.wst.common.frameworks;bundle-version="[1.1.200,2.0.0)",
@@ -30,5 +32,6 @@
  org.eclipse.wst.common.project.facet.core;bundle-version="[1.3.0,2.0.0)",
  org.eclipse.wst.common.environment;bundle-version="[1.0.200,2.0.0)",
  org.eclipse.wst.validation;bundle-version="[1.2.0,2.0.0)"
+Bundle-ActivationPolicy: lazy
 Eclipse-LazyStart: true
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/plugins/org.eclipse.wst.common.modulecore/javadoc-images/componentCore.xsd b/plugins/org.eclipse.wst.common.modulecore/javadoc-images/componentCore.xsd
index a2d8828..f6c87e9 100644
--- a/plugins/org.eclipse.wst.common.modulecore/javadoc-images/componentCore.xsd
+++ b/plugins/org.eclipse.wst.common.modulecore/javadoc-images/componentCore.xsd
@@ -31,6 +31,9 @@
                                     	<attribute name="handle"

                                     		type="string" use="required">

                                     	</attribute>

+                                    	<attribute name="archiveName"

+                                    		type="string" use="optional">

+                                    	</attribute>

                                     	<attribute name="deploy-path"

                                     		type="string" use="required">

                                     	</attribute>

diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/modulecore.properties b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/modulecore.properties
index 55b628e..d307f4a 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/modulecore.properties
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/modulecore.properties
@@ -8,4 +8,4 @@
 # Contributors:
 # IBM Corporation - initial API and implementation
 ###############################################################################
-NEEDSMIGRATING=This project needs to migrate WTP metadata
\ No newline at end of file
+NEEDSMIGRATING=This project needs to migrate metadata
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ArtifactEdit.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ArtifactEdit.java
index 46c541d..eee7b8a 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ArtifactEdit.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ArtifactEdit.java
@@ -281,13 +281,22 @@
 	 *            {@see ModuleCoreNature}
 	 */
 	protected ArtifactEdit(ModuleCoreNature aNature, IVirtualComponent aModule, boolean toAccessAsReadOnly) {
-		if (toAccessAsReadOnly)
-			artifactEditModel = aNature.getArtifactEditModelForRead(ModuleURIUtil.fullyQualifyURI(aModule.getProject()), this);
-		else
-			artifactEditModel = aNature.getArtifactEditModelForWrite(ModuleURIUtil.fullyQualifyURI(aModule.getProject()), this);
+		
 		isReadOnly = toAccessAsReadOnly;
 		isArtifactEditModelSelfManaged = true;
 		project = aNature.getProject();
+		IProject aProject = aModule.getProject();
+		URI componentURI = ModuleURIUtil.fullyQualifyURI(aProject);
+		Map editModelParams = null;
+		if (getContentTypeDescriber() != null) {
+			editModelParams = new HashMap();
+			editModelParams.put(ArtifactEditModelFactory.PARAM_ROOT_URI, getRootURI());
+			editModelParams.put(ArtifactEditModelFactory.PARAM_ROOT_CONTENT_TYPE, getContentTypeDescriber());
+		}
+		if (toAccessAsReadOnly) 
+			artifactEditModel = aNature.getArtifactEditModelForRead(componentURI, this, null, editModelParams);
+		else 
+			artifactEditModel = aNature.getArtifactEditModelForWrite(componentURI, this, null, editModelParams);
 	}
 
 	/**
@@ -406,13 +415,13 @@
 	protected String getContentTypeDescriber() {
 		
 		if (isProjectOfType(project, IModuleConstants.JST_EJB_MODULE))
-			return "org.eclipse.jst.j2ee.ejbDD";
+			return "org.eclipse.jst.j2ee.ejbDD"; //$NON-NLS-1$
 		if (isProjectOfType(project, IModuleConstants.JST_WEB_MODULE))
-			return "org.eclipse.jst.j2ee.webDD";
+			return "org.eclipse.jst.j2ee.webDD"; //$NON-NLS-1$
 		if (isProjectOfType(project, IModuleConstants.JST_EAR_MODULE))
-			return "org.eclipse.jst.j2ee.earDD";
+			return "org.eclipse.jst.j2ee.earDD"; //$NON-NLS-1$
 		if (isProjectOfType(project, IModuleConstants.JST_APPCLIENT_MODULE))
-			return "org.eclipse.jst.j2ee.appclientDD";
+			return "org.eclipse.jst.j2ee.appclientDD"; //$NON-NLS-1$
 		return null;
 	}
 	
@@ -467,7 +476,7 @@
 	public void saveIfNecessary(IProgressMonitor aMonitor) {
 		if (isReadOnly())
 			throwAttemptedReadOnlyModification();
-		else if (validateEdit().isOK())
+		else if (artifactEditModel.isDirty() && validateEdit().isOK())
 			artifactEditModel.saveIfNecessary(aMonitor, this);
 	}
 	
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ComponentCore.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ComponentCore.java
index 93c1e35..36e4a5c 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ComponentCore.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ComponentCore.java
@@ -17,6 +17,7 @@
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.wst.common.componentcore.internal.ComponentResource;
+import org.eclipse.wst.common.componentcore.internal.ModulecorePlugin;
 import org.eclipse.wst.common.componentcore.internal.StructureEdit;
 import org.eclipse.wst.common.componentcore.internal.impl.ResourceTreeNode;
 import org.eclipse.wst.common.componentcore.internal.resources.VirtualFile;
@@ -70,6 +71,26 @@
 	 * 
 	 * @param aProject
 	 *            A valid, accessible project to contain the component
+	 * @param checkForComponentFile
+	 *            A flag to indicate if the presence of the component file should be checked
+	 * @return A handle to an IVirtualComponent that may or may not exist or
+	 *         null if passed project does not contain ModuleCoreNature.
+	 * @see org.eclipse.core.runtime.IProgressMonitor#create(int, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public static IVirtualComponent createComponent(IProject aProject, boolean checkForComponentFile) {
+		if (aProject == null || !aProject.isAccessible()){
+			return null;
+		}
+		return ComponentImplManager.instance().createComponent(aProject, checkForComponentFile);
+	}
+
+	/**
+	 * Return an IVirtualComponent with the given name (aComponentName)
+	 * contained by the given project (aProject). Component names should be
+	 * unique across a project.
+	 * 
+	 * @param aProject
+	 *            A valid, accessible project to contain the component
 	 * @return A handle to an IVirtualComponent that may or may not exist or
 	 *         null if passed project does not contain ModuleCoreNature.
 	 * @deprecated
@@ -94,6 +115,21 @@
 	}
 
 	/**
+	 * Return an IVirtualComponent with the given name (aComponentName)
+	 * and the given runtime path (path)
+	 * 
+	 * @param aComponentName
+	 *            A name to identify the component, the name can be
+	 *            lib/&lt;Absolute path of a jar&gt; or
+	 *            var/&lt;CLASSPATH_VARIABLE/library namer&gt;
+	 * @return A handle to an IVirtualComponent that may or may not exist.
+	 * @see org.eclipse.core.runtime.IProgressMonitor#create(int, org.eclipse.core.runtime.IProgressMonitor)
+	 */
+	public static IVirtualComponent createArchiveComponent(IProject aProject, String aComponentName, IPath runtimePath) {
+		return ComponentImplManager.instance().createArchiveComponent(aProject, aComponentName, runtimePath);
+	}
+
+	/**
 	 * Return an IVirtualFolder with a runtime path specified by aRuntimePath
 	 * contained by aProject, in a component named aComponentName. The resultant
 	 * IVirtualFolder may or may not exist.
@@ -181,7 +217,7 @@
 				}
 			}
 		} catch (UnresolveableURIException e) {
-			e.printStackTrace();
+			ModulecorePlugin.logError(e);
 		} finally {
 			if (se != null) {
 				se.dispose();
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ModuleCoreNature.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ModuleCoreNature.java
index 5b8a475..ab96853 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ModuleCoreNature.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/ModuleCoreNature.java
@@ -13,6 +13,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IProjectDescription;
 import org.eclipse.core.resources.IProjectNature;
@@ -38,6 +39,7 @@
 import org.eclipse.wst.common.componentcore.internal.impl.ArtifactEditModelFactory;
 import org.eclipse.wst.common.componentcore.internal.impl.ComponentCoreURIConverter;
 import org.eclipse.wst.common.componentcore.internal.impl.ModuleStructuralModelFactory;
+import org.eclipse.wst.common.componentcore.internal.impl.WTPModulesResourceFactory;
 import org.eclipse.wst.common.componentcore.internal.impl.WTPResourceFactoryRegistry;
 import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
 import org.eclipse.wst.common.componentcore.internal.util.ModuleCoreMessages;
@@ -165,8 +167,33 @@
 		}
 		return null;
 	}
+	// The existence of this Nature plus the component file on disk makes a flexible project
 	public static boolean isFlexibleProject(IProject project) {
-		return ModuleCoreNature.getModuleCoreNature(project) != null;
+		boolean foundNature = ModuleCoreNature.getModuleCoreNature(project) != null;
+		if (foundNature) {
+			return componentResourceExists(project);
+		}
+		return false;
+	}
+	public static boolean componentResourceExists(IProject project) {
+		
+		IFile compFile = project.getFile(StructureEdit.MODULE_META_FILE_NAME);
+		if (compFile.isAccessible())
+			return true;
+		else { //Need to check for legacy file locations also....
+			compFile = project.getFile(ModuleStructuralModel.R1_MODULE_META_FILE_NAME);
+			if (compFile.isAccessible())
+				return true;
+			else {
+				compFile = project.getFile(ModuleStructuralModel.R0_7_MODULE_META_FILE_NAME);
+				if (compFile.isAccessible())
+					return true;
+				else {
+					compFile = project.getFile(WTPModulesResourceFactory.FIRST_WTP_MODULES_SHORT_NAME);
+					return compFile.isAccessible();
+				}
+			}
+		}
 	}
 
 	/**
@@ -202,14 +229,14 @@
 				description.setNatureIds(newNatureIds);
 				aProject.setDescription(description, aMonitor);
 			} catch (CoreException e) {
-				e.printStackTrace(); 				
+				ModulecorePlugin.logError(e);
 			} finally {
 				manager.endRule(root);
 			} 			
 			if (aMonitor != null)
 				aMonitor.done();
 		} catch (CoreException e) {
-			e.printStackTrace();
+			ModulecorePlugin.logError(e);
 		}
 		/* Return the new nature */
 		return getModuleCoreNature(aProject);
@@ -242,15 +269,10 @@
 		ModuleStructuralModel editModel = (ModuleStructuralModel)getEmfContext().getExistingEditModel(ModuleStructuralModelFactory.MODULE_STRUCTURAL_MODEL_ID, null,true);
 		if (editModel == null) {
 			editModel = (ModuleStructuralModel)EditModelRegistry.getInstance().createEditModelForRead(ModuleStructuralModelFactory.MODULE_STRUCTURAL_MODEL_ID, getEmfContext(), null);
-			synchronized (editModel) {
-				getEmfContext().cacheEditModel(editModel, null);
-				editModel.access(anAccessorKey);
-			}
-		} else {
-			synchronized (editModel) {
-				editModel.access(anAccessorKey);
-			}
-		}
+			getEmfContext().cacheEditModel(editModel, null);
+			editModel.access(anAccessorKey);
+		} else 
+			editModel.access(anAccessorKey);
 		return editModel;
 	}
 
@@ -281,15 +303,12 @@
 		ModuleStructuralModel editModel = (ModuleStructuralModel)getEmfContext().getExistingEditModel(ModuleStructuralModelFactory.MODULE_STRUCTURAL_MODEL_ID, null,false);
 		if (editModel == null) {
 			editModel = (ModuleStructuralModel)EditModelRegistry.getInstance().createEditModelForWrite(ModuleStructuralModelFactory.MODULE_STRUCTURAL_MODEL_ID, getEmfContext(), null);
-			synchronized (editModel) {
-				getEmfContext().cacheEditModel(editModel, null);
-				editModel.access(anAccessorKey);
-			}
-		} else {
-			synchronized (editModel) {
-				editModel.access(anAccessorKey);
-			}
-		}
+			getEmfContext().cacheEditModel(editModel, null);
+			editModel.access(anAccessorKey);
+			
+		} else 
+			editModel.access(anAccessorKey);
+		
 		return editModel;
 	}
 
@@ -522,7 +541,8 @@
 		// addAdapterFactories(set);
 		// set.getSynchronizer().addExtender(this); // added so we can be informed of closes to the
 		// new J2EEResourceDependencyRegister(set); // This must be done after the URIConverter is
-		projectResourceSet.getSynchronizer().addExtender(this); // added so we can be informed of closes
+		if(projectResourceSet.getSynchronizer() != null)
+			projectResourceSet.getSynchronizer().addExtender(this); // added so we can be informed of closes
 		cacheModuleStructuralModels();
 	}
 	
@@ -582,11 +602,11 @@
 	private void cacheModuleStructuralModels() {
 		if (cachedWriteHandle == null)
 			cachedWriteHandle = getModuleStructuralModelForWrite(this);
-		if (cachedReadHandle == null)
-			cachedReadHandle = getModuleStructuralModelForRead(this);
+		//if (cachedReadHandle == null)
+		//	cachedReadHandle = getModuleStructuralModelForRead(this);
 	}
 
-	protected String getPluginID() {
+	public String getPluginID() {
 		return MODULE_PLUG_IN_ID;
 	}
 
@@ -619,8 +639,8 @@
 		if (delta.getKind() == IResourceDelta.OPEN) {
 			if (cachedWriteHandle == null)
 				cachedWriteHandle = getModuleStructuralModelForWrite(this);
-			if (cachedReadHandle == null)
-				cachedReadHandle = getModuleStructuralModelForRead(this);
+			//if (cachedReadHandle == null)
+			//	cachedReadHandle = getModuleStructuralModelForRead(this);
 		}
 	
 	}
@@ -636,8 +656,8 @@
 //		System.out.println(buffer.toString());
 		this.emfContext = null;
 		if (cachedWriteHandle != null) {
-			if (cachedWriteHandle.isDirty())
-				cachedWriteHandle.saveIfNecessary(this);
+//			if (cachedWriteHandle.isDirty())
+//				cachedWriteHandle.saveIfNecessary(this);
 			cachedWriteHandle.dispose();
 			cachedWriteHandle = null;
 		}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/FacetDataModelConfigAdapter.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/FacetDataModelConfigAdapter.java
index 431c7ee..cc8675d 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/FacetDataModelConfigAdapter.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/FacetDataModelConfigAdapter.java
@@ -62,6 +62,12 @@
     {
         return dm.validate();
     }
+    
+    public void dispose()
+    {
+        super.dispose();
+        dm.dispose();
+    }
 
     public static final class Factory
     
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/FacetProjectCreationDataModelProvider.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/FacetProjectCreationDataModelProvider.java
index d8cb5d6..6be809b 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/FacetProjectCreationDataModelProvider.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/FacetProjectCreationDataModelProvider.java
@@ -24,9 +24,9 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Platform;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
 import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.internal.ModulecorePlugin;
 import org.eclipse.wst.common.componentcore.internal.operation.FacetProjectCreationOperation;
 import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
 import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
@@ -80,10 +80,11 @@
 		return names;
 	}
 
+	private final IFacetedProjectWorkingCopy fpjwc = FacetedProjectFramework.createNewProject();
+	
 	public void init() {
 		super.init();
 		
-		final IFacetedProjectWorkingCopy fpjwc = FacetedProjectFramework.createNewProject();
 		model.setProperty(FACETED_PROJECT_WORKING_COPY, fpjwc);
 		
 		fpjwc.addListener
@@ -133,8 +134,11 @@
                     prop.equals( IProjectCreationPropertiesNew.PROJECT_NAME ) )
                 {
                     final String projectName = (String) event.getProperty();
-					getDataModel().setProperty(FACET_PROJECT_NAME, projectName);
-					fpjwc.setProjectName( projectName );
+                    IStatus status = getDataModel().validateProperty(FACET_PROJECT_NAME);
+                    if( status.isOK() ){
+						getDataModel().setProperty(FACET_PROJECT_NAME, projectName);
+						fpjwc.setProjectName( projectName );
+                    }
 				}
                 else if( prop.equals( IProjectCreationPropertiesNew.PROJECT_LOCATION ) )
                 {
@@ -146,6 +150,14 @@
 		model.addNestedModel(NESTED_PROJECT_DM, projectDataModel);
 	}
 
+	@Override
+	public void dispose() {
+		if(fpjwc != null){
+			fpjwc.dispose();
+		}
+		super.dispose();
+	}
+	
 	protected class FacetActionMapImpl extends HashMap implements FacetActionMap {
 		private static final long serialVersionUID = 1L;
 		private boolean supressNotification = false;
@@ -320,7 +332,7 @@
 								facetModel.setProperty(IFacetDataModelProperties.FACET_VERSION, newVersion);
 							}
 						} catch (CoreException e) {
-							Logger.getLogger().logError(e);
+							ModulecorePlugin.logError(e);
 						}
 					}
 				}
@@ -347,7 +359,14 @@
 	                config = Platform.getAdapterManager().getAdapter( config, IDataModel.class );
 	            }
 	            
-	            facetDmMap.add( (IDataModel) config );
+	            final IDataModel dm = (IDataModel) config;
+	            
+	            facetDmMap.put( facet.getId(), dm );
+	            
+	            for( String alias : facet.getAliases() )
+	            {
+	                facetDmMap.put( alias, dm );
+	            }
 	        }
 		}
 		return super.propertySet(propertyName, propertyValue);
@@ -420,7 +439,7 @@
 				descriptors[i] = new DataModelPropertyDescriptor(runtime, runtime.getLocalizedName());
 			}
 			if(descriptors.length > 2){
-				Arrays.sort(descriptors, 0, descriptors.length - 2, new Comparator() {
+				Arrays.sort(descriptors, 0, descriptors.length - 1, new Comparator() {
 					public int compare(Object arg0, Object arg1) {
 						DataModelPropertyDescriptor d1 = (DataModelPropertyDescriptor)arg0;
 						DataModelPropertyDescriptor d2 = (DataModelPropertyDescriptor)arg1;
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/ProjectMigratorDataModelProvider.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/ProjectMigratorDataModelProvider.java
index 21c3ca3..07adcaf 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/ProjectMigratorDataModelProvider.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/ProjectMigratorDataModelProvider.java
@@ -17,6 +17,12 @@
 import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
 
+/**
+ * This has been deprecated since WTP 3.1.2 and will be deleted post WTP 3.2.
+ * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=292934
+ * @deprecated 
+ * @author jsholl
+ */
 public class ProjectMigratorDataModelProvider extends AbstractDataModelProvider implements IProjectMigratorDataModelProperties {
 
 	public Set getPropertyNames() {
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IAddReferenceDataModelProperties.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IAddReferenceDataModelProperties.java
new file mode 100644
index 0000000..2367892
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IAddReferenceDataModelProperties.java
@@ -0,0 +1,43 @@
+/******************************************************************************
+ * Copyright (c) 2009 Red Hat
+ * 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:
+ *    Rob Stryker - initial implementation and ongoing maintenance
+ ******************************************************************************/
+package org.eclipse.wst.common.componentcore.datamodel.properties;
+
+
+/**
+ * This is an alternative to ICreateReferenceComponentsDataModelProperties
+ * It is meant to be a simpler type of operation where you can pass in
+ * an already-formed IVirtualReference rather than the individual properties
+ * to be set. 
+ */
+public interface IAddReferenceDataModelProperties {
+	
+	/**
+	 * <p>
+	 * This required property is the {@link org.eclipse.wst.common.componentcore.resources.IVirtualComponent} which will reference the
+	 * {@link org.eclipse.wst.common.componentcore.resources.IVirtualComponent}s specified by {@link #TARGET_COMPONENT_LIST}.
+	 * </p>
+	 * <p>
+	 * For example, if {@link org.eclipse.wst.common.componentcore.resources.IVirtualComponent}s A, B, and C exist and references are required
+	 * from A to B and A to C, then {@link #SOURCE_COMPONENT} should be set to A, and
+	 * {@link #TARGET_COMPONENT_LIST} should be set to a {@link java.util.List} containing B and C.
+	 * </p>
+	 */
+	public static final String SOURCE_COMPONENT = "IAddReferenceDataModelProperties.SOURCE_COMPONENT"; //$NON-NLS-1$
+
+	/**
+	 * <p>
+	 * This required property is the {@link java.util.List} containing the {@link org.eclipse.wst.common.componentcore.resources.IVirtualReference}s that
+	 * will be referenced from the {@link org.eclipse.wst.common.componentcore.resources.IVirtualComponent} specified by {@link #SOURCE_COMPONENT}.
+	 * It may also be a single {@link org.eclipse.wst.common.componentcore.resources.IVirtualReference} if desired
+	 * </p>
+	 */
+	public static final String TARGET_REFERENCE_LIST = "IAddReferenceDataModelProperties.TARGET_REFERENCE_LIST"; //$NON-NLS-1$
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IComponentCreationDataModelProperties.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IComponentCreationDataModelProperties.java
deleted file mode 100644
index c8dcf56..0000000
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IComponentCreationDataModelProperties.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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.componentcore.datamodel.properties;
-
-import org.eclipse.wst.common.frameworks.datamodel.IDataModelProperties;
-import org.eclipse.wst.common.frameworks.internal.DoNotUseMeThisWillBeDeletedPost15;
-
-/**
- * <p>
- * IComponentCreationDataModelProperties provides properties to the DataModel associated with the
- * ComponentCreationDataModelProvider as well as all extending interfaces extending
- * IComponentCreationDataModelProperties specifically, but not limited to all J2EE component related
- * creation.
- * 
- * @see org.eclipse.wst.common.componentcore.internal.operation.ComponentCreationDataModelProvider
- *      </p>
- *      <p>
- *      This interface is not intended to be implemented by clients.
- *      </p>
- * 
- * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProvider
- * @see org.eclipse.wst.common.frameworks.datamodel.DataModelFactory
- * @see org.eclipse.wst.common.frameworks.datamodel.IDataModelProperties
- * 
- * @plannedfor 1.0
- */
-/**
- * This has been slated for removal post WTP 1.5. Do not use this class/interface
- * 
- * @deprecated
- * 
- * @see IConnectorFacetInstallDataModelProperties
- */
-public interface IComponentCreationDataModelProperties extends IDataModelProperties, DoNotUseMeThisWillBeDeletedPost15 {
-
-	/**
-	 * Required, type String. The user defined name of the target project for the component to be
-	 * created.
-	 */
-	public static final String PROJECT_NAME = "IComponentCreationDataModelProperties.PROJECT_NAME"; //$NON-NLS-1$
-	/**
-	 * Required, type String. The user defined name of the component to be created.
-	 */
-	public static final String COMPONENT_NAME = "IComponentCreationDataModelProperties.COMPONENT_NAME"; //$NON-NLS-1$
-	/**
-	 * Required, type String. The user defined location on disk of the target project for the
-	 * component to be created. Defaulted to default eclipse workspace location
-	 */
-	public static final String LOCATION = "IFlexibleProjectCreationDataModelProperties.LOCATION"; //$NON-NLS-1$
-
-
-	/**
-	 * Required, type String. The user defined deploy name of the component to be created. The
-	 * DataModelProvider will default the name to the COMPONENT_NAME.
-	 */
-	public static final String COMPONENT_DEPLOY_NAME = "IComponentCreationDataModelProperties.COMPONENT_DEPLOY_NAME"; //$NON-NLS-1$
-	/**
-	 * Required, type String. Nested operation to create a new project.
-	 */
-	public static final String NESTED_PROJECT_CREATION_DM = "IComponentCreationDataModelProperties.NESTED_PROJECT_CREATION_DM"; //$NON-NLS-1$
-	// TODO delete this
-	/**
-	 * Optional, type Boolean The default value is <code>Boolean.TRUE</code>. If this property is
-	 * set to <code>Boolean.TRUE</code> then a default deployment descriptor and supporting
-	 * bindings files will be generated.
-	 */
-	public static final String CREATE_DEFAULT_FILES = "IComponentCreationDataModelProperties.CREATE_DEFAULT_FILES"; //$NON-NLS-1$
-
-	/**
-	 * An unsettable result property used to retreive the created virtual component after the
-	 * operation has executed.
-	 */
-	public static final String COMPONENT = "IComponentCreationDataModelProperties.COMPONENT"; //$NON-NLS-1$
-
-}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IProjectMigratorDataModelProperties.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IProjectMigratorDataModelProperties.java
index 1e93fff..012b49d 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IProjectMigratorDataModelProperties.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IProjectMigratorDataModelProperties.java
@@ -12,6 +12,12 @@
 
 import org.eclipse.wst.common.frameworks.datamodel.IDataModelProperties;
 
+/**
+ * This has been deprecated since WTP 3.1.2 and will be deleted post WTP 3.2.
+ * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=292934
+ * @deprecated 
+ * @author jsholl
+ */
 public interface IProjectMigratorDataModelProperties extends IDataModelProperties {
 
 
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IServerContextRootDataModelProperties.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IServerContextRootDataModelProperties.java
new file mode 100644
index 0000000..c939138
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/datamodel/properties/IServerContextRootDataModelProperties.java
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2008 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.componentcore.datamodel.properties;
+
+import org.eclipse.wst.common.componentcore.internal.operation.ServerContextRootDataModelProvider;
+
+public interface IServerContextRootDataModelProperties {
+	/**
+	 * This field should not be used.  It is not part of the API and may be modified in the future.
+	 */
+	public static Class _provider_class = ServerContextRootDataModelProvider.class;
+
+	public static final String PROJECT = "IServerContextRootDataModelProperties.PROJECT"; //$NON-NLS-1$	
+	public static final String CONTEXT_ROOT = "IServerContextRootDataModelProperties.CONTEXT_ROOT"; //$NON-NLS-1$
+
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ArtifactEditModel.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ArtifactEditModel.java
index 9e38950..4bdb739 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ArtifactEditModel.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ArtifactEditModel.java
@@ -21,7 +21,6 @@
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.wst.common.componentcore.ComponentCore;
 import org.eclipse.wst.common.componentcore.UnresolveableURIException;
 import org.eclipse.wst.common.componentcore.internal.impl.PlatformURLModuleConnection;
@@ -35,6 +34,7 @@
 import org.eclipse.wst.common.project.facet.core.IFacetedProject;
 import org.eclipse.wst.common.project.facet.core.IFacetedProjectListener;
 import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+import org.eclipse.wst.common.componentcore.internal.ModulecorePlugin;
 
 /**
  * 
@@ -149,12 +149,10 @@
 			facetProj = ProjectFacetsManager.create(project);
 			if (facetProj != null)
 				facetProj.addListener(this);
-		} catch (UnresolveableURIException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
+		} catch (UnresolveableURIException e){
+			ModulecorePlugin.logError(e);
 		} catch (CoreException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
+			ModulecorePlugin.logError(e);
 		}finally {
 			componentProject = aProject;
 		}
@@ -325,8 +323,7 @@
 		try {
 			EnablementManager.INSTANCE.notifyFunctionGroupChanged(null,getComponentProject());
 		} catch (CoreException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
+			ModulecorePlugin.logError(e);
 		}
 		
 	}
@@ -338,7 +335,7 @@
 			if (facetProj != null)
 				facetProj.removeListener(this);
 		} catch (Exception e) {
-			Logger.getLogger().logError(e);
+			ModulecorePlugin.logError(e);
 		}
 		super.doDispose();
 	}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ComponentcorePackage.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ComponentcorePackage.java
index eed4fe3..e789e75 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ComponentcorePackage.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ComponentcorePackage.java
@@ -2,7 +2,7 @@
  * <copyright>
  * </copyright>
  *
- * $Id: ComponentcorePackage.java,v 1.8 2006/04/27 04:17:40 cbridgha Exp $
+ * $Id: ComponentcorePackage.java,v 1.9 2009/06/09 20:02:04 jsholl Exp $
  */
 package org.eclipse.wst.common.componentcore.internal;
 
@@ -44,7 +44,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	String eNS_URI = "componentcore.xmi";
+	String eNS_URI = "componentcore.xmi"; //$NON-NLS-1$
 
 	/**
 	 * The package namespace name.
@@ -52,7 +52,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	String eNS_PREFIX = "org.eclipse.wst.common.componentcore";
+	String eNS_PREFIX = "org.eclipse.wst.common.componentcore"; //$NON-NLS-1$
 
 	/**
 	 * The singleton instance of the package.
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/DefaultModuleHandler.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/DefaultModuleHandler.java
new file mode 100644
index 0000000..b49b040
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/DefaultModuleHandler.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.componentcore.internal;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+
+public class DefaultModuleHandler implements IModuleHandler {
+
+	public String getArchiveName(IProject proj,IVirtualComponent comp) {
+		if (comp != null)
+			return comp.getName() + ".jar";
+		return proj.getName() + ".jar";
+	}
+
+	public List<IProject> getFilteredProjectListForAdd(IVirtualComponent sourceComponent, List<IProject> availableProjects) {
+		Iterator<IProject> i = availableProjects.iterator();
+		IProject p;
+		while(i.hasNext()) {
+			p = i.next();
+			if( !p.isOpen())
+				i.remove();
+			else if( p.equals(sourceComponent.getProject()))
+				i.remove();
+		}
+		return availableProjects;
+	}
+
+	public boolean setComponentAttributes(IProject proj) {
+		
+		return true;
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/IComponentProjectMigrator.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/IComponentProjectMigrator.java
index 0f66ad1..64c3b93 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/IComponentProjectMigrator.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/IComponentProjectMigrator.java
@@ -12,6 +12,12 @@
 
 import org.eclipse.core.resources.IProject;
 
+/**
+ * This has been deprecated since WTP 3.1.2 and will be deleted post WTP 3.2.
+ * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=292934
+ * @deprecated 
+ * @author jsholl
+ */
 public interface IComponentProjectMigrator {
 	public void migrateProject(IProject project);
 
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/IModuleHandler.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/IModuleHandler.java
new file mode 100644
index 0000000..a40393f
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/IModuleHandler.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.componentcore.internal;
+
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+
+/**
+ * Interface intended to reflect behavior of customized components
+ *
+ */
+public interface IModuleHandler {
+	
+	
+	/**
+	 * This is used to return a proper archive name based on the component type
+	 * @param proj 
+	 * @param comp
+	 * @return String archive name
+	 */
+	public String getArchiveName(IProject proj, IVirtualComponent comp);
+	
+	/**
+	 * Used to filter items displayed in Add dialog
+	 * @param sourceComponent
+	 * @param availableComponents
+	 * @return List of items that will not be shown in the add ref dialogs
+	 */
+	public List<IProject> getFilteredProjectListForAdd(IVirtualComponent sourceComponent, List<IProject> availableComponents);
+
+	/**
+	 * This call is meant to add IVirtualCompoonent infrastructure to any project passed if needed
+	 * Meant be overridden to include technology specific attributes
+	 * @param proj
+	 * @return boolean indicating operation success
+	 */
+	public boolean setComponentAttributes(IProject proj);
+	
+
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleCoreValidator.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleCoreValidator.java
index 0372d3c..e1fd00b 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleCoreValidator.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleCoreValidator.java
@@ -31,6 +31,12 @@
 import org.eclipse.wst.validation.internal.provisional.core.IValidatorJob;
 
 
+/**
+ * This has been deprecated since WTP 3.1.2 and will be deleted post WTP 3.2.
+ * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=292934
+ * @deprecated 
+ * @author jsholl
+ */
 public class ModuleCoreValidator implements IValidatorJob {
 		protected IReporter _reporter;
 
@@ -49,6 +55,8 @@
 			if (structureEdit != null) {
 				ModuleStructuralModel structuralModel = structureEdit.getModuleStructuralModel();
 				if (structuralModel != null) {
+					// First touch the model File to make sure is synched before getting the lock
+					structuralModel.getComponentFile();
 					// acquiring the ModuleStructuralModel lock here first because the call to getPrimaryResource()
 					// will cause this lock to be acquired later resulting in a potential deadlock
 					ILock lock = EMFWorkbenchEditContextFactory.getProjectLockObject(structuralModel.getProject());
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleCoreValidatorHelper.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleCoreValidatorHelper.java
index 1969f61..ad2c320 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleCoreValidatorHelper.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleCoreValidatorHelper.java
@@ -14,6 +14,12 @@
 import org.eclipse.wst.validation.internal.operations.WorkbenchContext;
 
 
+/**
+ * This has been deprecated since WTP 3.1.2 and will be deleted post WTP 3.2.
+ * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=292934
+ * @deprecated 
+ * @author jsholl
+ */
 public class ModuleCoreValidatorHelper extends WorkbenchContext {
 
 		public static final String MODULECORE = "MODULECORE";
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleMigratorManager.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleMigratorManager.java
index 88a9078..caf21e0 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleMigratorManager.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleMigratorManager.java
@@ -33,6 +33,12 @@
 import org.eclipse.wst.common.frameworks.internal.datamodel.IWorkspaceRunnableWithStatus;
 import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
 
+/**
+ * This has been deprecated since WTP 3.1.2 and will be deleted post WTP 3.2.
+ * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=292934
+ * @deprecated 
+ * @author jsholl
+ */
 public class ModuleMigratorManager {
 
 	private static HashMap managerCache = new HashMap();
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java
index b913a42..bf37cea 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ModuleStructuralModel.java
@@ -10,6 +10,7 @@
  *******************************************************************************/
 package org.eclipse.wst.common.componentcore.internal;
 
+import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -21,11 +22,11 @@
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRoot;
 import org.eclipse.core.resources.IWorkspaceRunnable;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Platform;
@@ -78,11 +79,12 @@
 */ 
 public class ModuleStructuralModel extends EditModel implements IAdaptable {
 	
-	private static final String R0_7_MODULE_META_FILE_NAME = ".component";
-	private static final String R1_MODULE_META_FILE_NAME = ".settings/.component";
+	public static final String R0_7_MODULE_META_FILE_NAME = ".component";
+	public static final String R1_MODULE_META_FILE_NAME = ".settings/.component";
 	public static final String MODULE_CORE_ID = "moduleCoreId"; //$NON-NLS-1$ 
 	private static final String PROJECT_VERSION_1_5 = "1.5.0";
 	private boolean useOldFormat = false;
+	private Boolean needsSync = new Boolean(true);
 	public ModuleStructuralModel(String editModelID, EMFWorkbenchContext context, boolean readOnly) {
         super(editModelID, context, readOnly);
     }
@@ -98,6 +100,8 @@
 	}
 	protected boolean removeResource(Resource aResource) {
 		if (aResource != null) {
+			//First checking if resource is loaded (Which will prevent removing in middle of loading by checking resource adapter lock)
+			aResource.isLoaded();
 			synchronized (aResource) {
 				aResource.eAdapters().remove(resourceAdapter);
 				return getResources().remove(aResource);
@@ -116,8 +120,7 @@
 			if (res == null)
 				return null;
 		} catch (CoreException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
+			ModulecorePlugin.logError(e);
 		}
 		EObject modelRoot = null;
 		modelRoot = super.getPrimaryRootObject();
@@ -234,10 +237,6 @@
 	}
 	public Resource prepareProjectModulesIfNecessary() throws CoreException {
 		XMIResource res;
-		if (!isComponentSynchronizedOrNull()) {
-			//Return if component file is out of sync from workspace
-			return null;
-		}
 		res = (XMIResource) getPrimaryResource();
 		if (res != null && resNeedsMigrating(res) && !useOldFormat)
 			return null;
@@ -251,33 +250,64 @@
 		return res;
 	}
 	
-	/**
-	 * This methods checks the status of the component file, and first checks for existance, then if its locally synchronized
-	 * @return boolean
-	 */
-	private boolean isComponentSynchronizedOrNull() {
-		IFile componentFile = getProject().getFile(StructureEdit.MODULE_META_FILE_NAME);
-		IPath componentFileLocation = componentFile.getLocation();
-		if (componentFileLocation != null && !componentFileLocation.toFile().exists()) {
-			componentFile = getProject().getFile(R1_MODULE_META_FILE_NAME);
-			componentFileLocation = componentFile.getLocation();
-			if (componentFileLocation != null && !componentFileLocation.toFile().exists()) {
-				componentFile = getProject().getFile(R0_7_MODULE_META_FILE_NAME);
-				componentFileLocation = componentFile.getLocation();
-				if (componentFileLocation != null && !componentFileLocation.toFile().exists()) 
-					return true;
+	
+	public IFile getComponentFile() {
+		
+		IFile compFile = getProject().getFile(StructureEdit.MODULE_META_FILE_NAME);
+		if (compFile.isAccessible()) {
+			checkSync(compFile);	
+			return compFile;
+		}
+		else { //Need to check for legacy file locations also....
+			compFile = getProject().getFile(ModuleStructuralModel.R1_MODULE_META_FILE_NAME);
+			if (compFile.isAccessible()) {
+				checkSync(compFile);	
+				return compFile;
+			}
+			else {
+				compFile = getProject().getFile(ModuleStructuralModel.R0_7_MODULE_META_FILE_NAME);
+				if (compFile.isAccessible()) {
+					checkSync(compFile);	
+					return compFile;
+				}
 			}
 		}
-		if (componentFileLocation == null)
-			return true;
-		else return componentFile.isSynchronized(IResource.DEPTH_ZERO);
+		return getProject().getFile(StructureEdit.MODULE_META_FILE_NAME);
 	}
+	
+	private void checkSync(IFile compFile) {
+		boolean localNeedsSync = false;
+		synchronized (needsSync) {
+			localNeedsSync = needsSync;
+		}
+		if (localNeedsSync) { // Only check sync once for life of this model
+			if (!compFile.isSynchronized(IResource.DEPTH_ONE)) {
+				File iofile = compFile.getFullPath().toFile();
+				if (iofile.exists() || compFile.exists()) {
+					IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+					try {
+						// OK wait to get workspace root before refreshing
+						Job.getJobManager().beginRule(root, null);
+						compFile.getProject().refreshLocal(IResource.DEPTH_INFINITE, null);
+					} catch (CoreException ce) {
+						// ignore
+					} finally {
+						Job.getJobManager().endRule(root);
+					}
+				}
+			}
+			synchronized (needsSync) {
+				needsSync = new Boolean(false);
+			}
+		}
+	}
+	
 	public WTPModulesResource  makeWTPModulesResource() {
 		return (WTPModulesResource) createResource(WTPModulesResourceFactory.WTP_MODULES_URI_OBJ);
 	}
 	protected void runSaveOperation(IWorkspaceRunnable runnable, IProgressMonitor monitor) throws SaveFailedException {
 		try {
-			ResourcesPlugin.getWorkspace().run(runnable, null,IWorkspace.AVOID_UPDATE,monitor);
+			ResourcesPlugin.getWorkspace().run(runnable, getComponentFile(),IWorkspace.AVOID_UPDATE,monitor);
 		} catch (CoreException e) {
 			throw new SaveFailedException(e);
 		}
@@ -295,25 +325,14 @@
 	 * @return
 	 */
 	public Resource getPrimaryResource() {
-		// Overriden to handle loading the .component resource in new and old forms
-		// First will try to load from .settings/org.eclipse.wst.common.component
-		// Second will try to load from the old location(s) .settings/.component or .component
+		// Will always go through the getFile method that searches for all possible locations.
+		IFile compFile = getComponentFile();
 		
-		URI uri = URI.createURI(StructureEdit.MODULE_META_FILE_NAME);
+		URI uri = URI.createURI(compFile.getProjectRelativePath().toPortableString());
 		WTPModulesResource res = (WTPModulesResource)getResource(uri);
-		if (res == null || !res.isLoaded()) {
+		if (res == null || !res.isLoaded() || res.getContents().isEmpty()) {
 			removeResource(res);
-			uri = URI.createURI(R1_MODULE_META_FILE_NAME);
-			res = (WTPModulesResource)getResource(uri);
-			if (res == null || !res.isLoaded()) {
-				removeResource(res);
-				uri = URI.createURI(R0_7_MODULE_META_FILE_NAME);
-				res = (WTPModulesResource)getResource(uri);
-				if (res == null || !res.isLoaded()) {
-					removeResource(res);
-					res = null;
-				}
-			}
+			res = null;
 		}
 		return res;
 	}
@@ -374,33 +393,21 @@
 	}
 	@Override
 	public void access(Object accessorKey) {
-		
-		super.access(accessorKey);
-//		StringBuffer buffer = new StringBuffer("Access Module model (");
-//		buffer.append(this.hashCode());
-//		buffer.append(") Project: ");
-//		buffer.append(this.getProject());
-//		if (isReadOnly())
-//			buffer.append(" R = "); //$NON-NLS-1$
-//		else
-//			buffer.append(" W = "); //$NON-NLS-1$
-//		buffer.append(getRegistry().size());
-//		System.out.println(buffer.toString());
+		//Not bothering with ref counting model access - always allow save/access
 				
 	}
 	@Override
 	public void releaseAccess(Object accessorKey) {
 		
-		super.releaseAccess(accessorKey);
-//		StringBuffer buffer = new StringBuffer("Release Module model (");
-//		buffer.append(this.hashCode());
-//		buffer.append(") Project: ");
-//		buffer.append(this.getProject());
-//		if (isReadOnly())
-//			buffer.append(" R = "); //$NON-NLS-1$
-//		else
-//			buffer.append(" W = "); //$NON-NLS-1$
-//		buffer.append(getRegistry().size());
-//		System.out.println(buffer.toString());
+		//Not bothering with ref counting model access - always allow save/access
+	}
+	@Override
+	protected void assertPermissionToSave(Object accessorKey) {
+		//Not bothering with ref counting model access - always allow save/access
+	}
+	@Override
+	public boolean isShared() {
+		//Not bothering with ref counting model access - always allow save/access
+		return false;
 	}
 }
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ProjectMigratorRegistry.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ProjectMigratorRegistry.java
index f6883ca..0848454 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ProjectMigratorRegistry.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/ProjectMigratorRegistry.java
@@ -24,8 +24,10 @@
 import org.eclipse.jem.util.RegistryReader;
 
 /**
- * To change the template for this generated type comment go to
- * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
+ * This has been deprecated since WTP 3.1.2 and will be deleted post WTP 3.2.
+ * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=292934
+ * @deprecated 
+ * @author jsholl
  */
 public class ProjectMigratorRegistry extends RegistryReader {
 
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/StructureEdit.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/StructureEdit.java
index 3891ce6..4bcf5a8 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/StructureEdit.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/StructureEdit.java
@@ -18,8 +18,10 @@
 import java.util.List;
 import java.util.Map;
 
+import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
@@ -27,19 +29,19 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.jobs.ILock;
+import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.emf.common.util.EList;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.jem.util.UIContextDetermination;
 import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.wst.common.componentcore.ComponentCore;
 import org.eclipse.wst.common.componentcore.IEditModelHandler;
 import org.eclipse.wst.common.componentcore.ModuleCoreNature;
 import org.eclipse.wst.common.componentcore.UnresolveableURIException;
 import org.eclipse.wst.common.componentcore.internal.impl.ModuleURIUtil;
-import org.eclipse.wst.common.componentcore.internal.impl.PlatformURLModuleConnection;
 import org.eclipse.wst.common.componentcore.internal.impl.ResourceTreeNode;
-import org.eclipse.wst.common.componentcore.internal.resources.VirtualReference;
 import org.eclipse.wst.common.componentcore.internal.util.EclipseResourceAdapter;
+import org.eclipse.wst.common.componentcore.resolvers.IReferenceResolver;
+import org.eclipse.wst.common.componentcore.resolvers.ReferenceResolverUtil;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
 import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
 import org.eclipse.wst.common.internal.emf.utilities.ExtendedEcoreUtil;
@@ -56,7 +58,7 @@
  * {@see org.eclipse.wst.common.modulecore.ModuleStructuralModel}) correctly. Each project has
  * exactly one ({@see org.eclipse.wst.common.modulecore.ModuleStructuralModel}) for read and
  * exactly one for write. Each of these is shared among all clients and reference counted as
- * necessary. Clients should use ModuleCore when working with the WTP Modules Strcutrual Model.
+ * necessary. Clients should use ModuleCore when working with the WTP Modules Structural Model.
  * </p>
  * 
  * <p>
@@ -246,6 +248,7 @@
 		if (eclipseResourceAdapter != null)
 			return eclipseResourceAdapter.getEclipseResource();
 		eclipseResourceAdapter = new EclipseResourceAdapter();
+		eclipseResourceAdapter.setTarget(aModuleResource);
 		aModuleResource.eAdapters().add(eclipseResourceAdapter);
 		return eclipseResourceAdapter.getEclipseResource();
 	}
@@ -281,45 +284,14 @@
 		return componentType;
 	}
 
-	public static IVirtualReference createVirtualReference(IVirtualComponent context, ReferencedComponent referencedComponent) {
-
-		IVirtualComponent targetComponent = null;
-		IProject targetProject = null;
-		URI uri = referencedComponent.getHandle();
-		if (uri == null)
-			return null;
-		boolean isClassPathURI = ModuleURIUtil.isClassPathURI(uri);
-		if( !isClassPathURI ){
-			try { 
-				targetProject = StructureEdit.getContainingProject(uri);
-			} catch(UnresolveableURIException uurie) {
-				//Ignore
-			} 
-			// if the project cannot be resolved, assume it's local - really it probably deleted 
-			
-			targetComponent = ComponentCore.createComponent(targetProject);  
-				
-
-		}else{
-			String archiveType = ""; //$NON-NLS-1$
-			String archiveName = ""; //$NON-NLS-1$
-			try {
-				archiveType = ModuleURIUtil.getArchiveType(uri);
-				archiveName = ModuleURIUtil.getArchiveName(uri);
-				
-			} catch (UnresolveableURIException e) {
-				//Ignore
-			}
-			targetComponent = ComponentCore.createArchiveComponent(context.getProject(), archiveType + IPath.SEPARATOR + archiveName ); 
-		}
-		return new VirtualReference(context, targetComponent, referencedComponent.getRuntimePath(), referencedComponent.getDependencyType().getValue());
+	public static IVirtualReference createVirtualReference(IVirtualComponent context, ReferencedComponent reference) {
+		IReferenceResolver resolver = ReferenceResolverUtil.getDefault().getResolver(context, reference);
+		return resolver.resolve(context, reference);
 	}
 
 	protected StructureEdit(ModuleCoreNature aNature, boolean toAccessAsReadOnly) {
-		if (toAccessAsReadOnly)
-			structuralModel = aNature.getModuleStructuralModelForRead(this);
-		else
-			structuralModel = aNature.getModuleStructuralModelForWrite(this);
+		// always get the write editmodel - one instance only
+		structuralModel = aNature.getModuleStructuralModelForWrite(this);
 		aProject = aNature.getProject();
 		isReadOnly = toAccessAsReadOnly;
 		isStructuralModelSelfManaged = true;
@@ -356,10 +328,18 @@
 		if (isReadOnly)
 			throwAttemptedReadOnlyModification();
 		else if (validateEdit().isOK()) { 
+			// Make sure we obtain workspace rule before saving
+			IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+			try {
+			//OK wait to get workspace root before refreshing
+			Job.getJobManager().beginRule(root, null);
 			synchronized (structuralModel) {
 				if (!structuralModel.isDisposed())
 					structuralModel.save(aMonitor, this);
 			}
+			} finally {
+				Job.getJobManager().endRule(root);
+			}
 		}
 	}
 
@@ -377,7 +357,7 @@
 	public void saveIfNecessary(IProgressMonitor aMonitor) {
 		if (isReadOnly)
 			throwAttemptedReadOnlyModification();
-		else if (validateEdit().isOK()) { 
+		else if (structuralModel.isDirty() && validateEdit().isOK()) { 
 				if (!structuralModel.isDisposed())
 					structuralModel.saveIfNecessary(aMonitor, this);
 		}
@@ -422,8 +402,7 @@
 				try {
 					structuralModel.prepareProjectModulesIfNecessary();
 				} catch (CoreException e) {
-					// TODO Auto-generated catch block
-					e.printStackTrace();
+					ModulecorePlugin.logError(e);
 				}
 			}
 		}
@@ -435,10 +414,17 @@
 	 * to add or remove {@see WorkbenchComponent}s. If a client needs to just read the existing
 	 * {@see WorkbenchComponent}s, use {@see #getWorkbenchModules()}.
 	 * </p>
+	 * <p>
+	 * Deadlock Warning: Calling this method requires two locks.  First the component file's file lock
+	 * is required and then the EMFWorkbenchEditContextFactory's projectILock is required.  If another
+	 * thread acquires these same two locks in the opposite order, deadlock could occur.
+	 * </p>
 	 * 
 	 * @return The root object of the underlying model
 	 */
 	public ProjectComponents getComponentModelRoot() {
+		IFile file = structuralModel.getComponentFile();
+		if (file == null) return null;
 		ProjectComponents comps = null;
 		ILock lock = EMFWorkbenchEditContextFactory.getProjectLockObject(structuralModel.getProject());
 		try{
@@ -454,8 +440,7 @@
 				lock.release();
 			}
 		}
-		
-		return comps;
+		return comps;		
 	}
 
 	/**
@@ -933,9 +918,8 @@
 	}
 
 	public static URI createComponentURI(IProject aContainingProject, String aComponentName) {
-		return URI.createURI(PlatformURLModuleConnection.MODULE_PROTOCOL + IPath.SEPARATOR + PlatformURLModuleConnection.RESOURCE_MODULE + aContainingProject.getName() + IPath.SEPARATOR + aComponentName);
+		return ModuleURIUtil.fullyQualifyURI(aContainingProject, aComponentName);
 	}
-
 	
 	protected IProject getProject() {
 		return aProject;
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraph.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraph.java
index 74341f2..f31970a 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraph.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraph.java
@@ -28,7 +28,7 @@
 
 	public IProject[] getReferencingComponents(IProject target) {
 		Set<IProject> referencingComponents = IDependencyGraph.INSTANCE.getReferencingComponents(target);
-		return (IProject[]) referencingComponents.toArray(new IProject[referencingComponents.size()]);
+		return referencingComponents.toArray(new IProject[referencingComponents.size()]);
 	}
 
 	public void addReference(IProject target, IProject referencingComponent) {
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphEvent.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphEvent.java
new file mode 100644
index 0000000..d6fdcf0
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphEvent.java
@@ -0,0 +1,121 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.componentcore.internal.builder;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.resources.IProject;
+
+public class DependencyGraphEvent implements IDependencyGraphUpdateEvent {
+
+	private int type = 0;
+	private long modStamp = 0;
+
+	/**
+	 * Both these maps are reverse reference maps as the ones are in
+	 * {@link IDependencyGraph}
+	 */
+	private Map<IProject, Set<IProject>> addedReferences = null;
+	private Map<IProject, Set<IProject>> removedReferences = null;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @seeorg.eclipse.wst.common.componentcore.internal.builder.
+	 * IDependencyGraphUpdateEvent#getType()
+	 */
+	public int getType() {
+		return type;
+	}
+
+	void setModStamp(long modStamp) {
+		this.modStamp = modStamp;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @seeorg.eclipse.wst.common.componentcore.internal.builder.
+	 * IDependencyGraphUpdateEvent#getModStamp()
+	 */
+	public long getModStamp() {
+		return modStamp;
+	}
+
+	void addRefererence(IProject sourceProject, IProject targetProject) {
+		if (sourceProject == null) {
+			throw new NullPointerException("Source project must not be null.");
+		}
+		if (targetProject == null) {
+			throw new NullPointerException("Target project must not be null.");
+		}
+		if (addedReferences == null) {
+			type = type | ADDED;
+			addedReferences = new HashMap<IProject, Set<IProject>>();
+		}
+		Set references = addedReferences.get(targetProject);
+		if (references == null) {
+			references = new HashSet<IProject>();
+			addedReferences.put(targetProject, references);
+		}
+		references.add(sourceProject);
+	}
+
+	void removeReference(IProject sourceProject, IProject targetProject) {
+		if (sourceProject == null) {
+			throw new NullPointerException("Source project must not be null.");
+		}
+		if (targetProject == null) {
+			throw new NullPointerException("Target project must not be null.");
+		}
+		if (removedReferences == null) {
+			type = type | REMOVED;
+			removedReferences = new HashMap<IProject, Set<IProject>>();
+		}
+		Set references = removedReferences.get(targetProject);
+		if (references == null) {
+			references = new HashSet<IProject>();
+			removedReferences.put(targetProject, references);
+		}
+		references.add(sourceProject);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @seeorg.eclipse.wst.common.componentcore.internal.builder.
+	 * IDependencyGraphUpdateEvent#getAddedReferences()
+	 */
+	public Map<IProject, Set<IProject>> getAddedReferences() {
+		if (addedReferences == null) {
+			return Collections.EMPTY_MAP;
+		}
+		return addedReferences;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @seeorg.eclipse.wst.common.componentcore.internal.builder.
+	 * IDependencyGraphUpdateEvent#getRemovedReferences()
+	 */
+	public Map<IProject, Set<IProject>> getRemovedReferences() {
+		if (removedReferences == null) {
+			return Collections.EMPTY_MAP;
+		}
+		return removedReferences;
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphImpl.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphImpl.java
index 04d8dcd..1700033 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphImpl.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/DependencyGraphImpl.java
@@ -6,6 +6,7 @@
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
+import java.util.Map.Entry;
 
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
@@ -21,12 +22,15 @@
 import org.eclipse.core.runtime.ListenerList;
 import org.eclipse.core.runtime.SafeRunner;
 import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.IJobManager;
 import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.wst.common.componentcore.ComponentCore;
 import org.eclipse.wst.common.componentcore.internal.ModulecorePlugin;
 import org.eclipse.wst.common.componentcore.internal.impl.WTPModulesResourceFactory;
+import org.eclipse.wst.common.componentcore.internal.resources.VirtualComponent;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
 import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.osgi.framework.Bundle;
 
 public class DependencyGraphImpl implements IDependencyGraph {
 
@@ -36,13 +40,17 @@
 	private Object graphLock = new Object();
 
 	/**
-	 * If projects and and B both depend on C an entry in this graph would be {C ->
+	 * If projects A and and B both depend on C an entry in this graph would be {C ->
 	 * {A, B} }
 	 */
 	private Map<IProject, Set<IProject>> graph = null;
-
+	
 	private long modStamp = 0;
 
+	private Map<String, Object> referenceOptions = new HashMap<String, Object>();
+	
+	private ListenerList listeners = new ListenerList();
+	
 	/**
 	 * This is not public; only {@link IDependencyGraph#INSTANCE} should be
 	 * used.
@@ -68,6 +76,11 @@
 		}
 	}
 
+	/**
+	 * Returns the set of projects whose components reference the specified
+	 * target project's component. For example if projects A and B both
+	 * reference C. Passing C as the targetProject will return {A, B}
+	 */
 	public Set<IProject> getReferencingComponents(IProject targetProject) {
 		waitForAllUpdates(null);
 		synchronized (graphLock) {
@@ -153,50 +166,84 @@
 	 */
 	private void initGraph() {
 		synchronized (graphLock) {
+			referenceOptions.put("GET_JAVA_REFS", Boolean.FALSE);
 			try {
 				preUpdate();
 				graph = new HashMap<IProject, Set<IProject>>();
 				listener = new DependencyGraphResourceChangedListener();
 				ResourcesPlugin.getWorkspace().addResourceChangeListener(listener, IResourceChangeEvent.POST_CHANGE);
-				IProject[] allProjects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
-				for (IProject sourceProject : allProjects) {
-					queueProjectAdded(sourceProject);
-				}
+				initAll();
 			} finally {
 				postUpdate();
 			}
 		}
 	}
-
-	private void removeAllReferences(IProject project) {
+	
+	private void initAll(){
 		synchronized (graphLock) {
-			graph.remove(project);
-			for (Iterator<Set<IProject>> iterator = graph.values().iterator(); iterator.hasNext();) {
-				iterator.next().remove(project);
+			try{
+				preUpdate();
+				IProject[] allProjects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+				for (IProject sourceProject : allProjects) {
+					queueProjectAdded(sourceProject);
+				}	
+			} finally{
+				postUpdate();
 			}
-			modStamp++;
+			
 		}
 	}
 
-	private void removeReference(IProject sourceProject, IProject targetProject) {
+	private void removeAllReferences(IProject targetProject, DependencyGraphEvent event) {
+		synchronized (graphLock) {
+			boolean removed = false;
+			Set<IProject> removedSet = graph.remove(targetProject);
+			if(removedSet != null && !removedSet.isEmpty()){
+				removed = true;
+				for(Iterator<IProject>iterator = removedSet.iterator(); iterator.hasNext();){
+					event.removeReference(iterator.next(), targetProject);
+				}
+			}
+			for(Iterator <Entry<IProject,Set<IProject>>>iterator = graph.entrySet().iterator(); iterator.hasNext();){
+				Entry<IProject,Set<IProject>> entry = iterator.next();
+				if(!entry.getValue().isEmpty() && entry.getValue().remove(targetProject)){
+					removed = true;
+					event.removeReference(targetProject, entry.getKey());
+				}
+			}
+			if(removed){
+				modStamp++;
+				event.setModStamp(modStamp);
+			}
+		}
+	}
+
+	private void removeReference(IProject sourceProject, IProject targetProject, DependencyGraphEvent event) {
 		synchronized (graphLock) {
 			Set<IProject> referencingProjects = graph.get(targetProject);
 			if (referencingProjects != null) {
-				referencingProjects.remove(sourceProject);
+				if(referencingProjects.remove(sourceProject)){
+					event.removeReference(sourceProject, targetProject);
+					modStamp++;
+					event.setModStamp(modStamp);
+				}
 			}
-			modStamp++;
 		}
 	}
 
-	private void addReference(IProject sourceProject, IProject targetProject) {
+	private void addReference(IProject sourceProject, IProject targetProject, DependencyGraphEvent event) {
 		synchronized (graphLock) {
 			Set<IProject> referencingProjects = graph.get(targetProject);
 			if (referencingProjects == null) {
 				referencingProjects = new HashSet<IProject>();
 				graph.put(targetProject, referencingProjects);
 			}
-			referencingProjects.add(sourceProject);
-			modStamp++;
+			boolean added = referencingProjects.add(sourceProject);
+			if(added){
+				event.addRefererence(sourceProject, targetProject);
+				modStamp++;
+				event.setModStamp(modStamp);
+			}
 		}
 	}
 
@@ -270,6 +317,7 @@
 		}
 
 		protected IStatus run(IProgressMonitor monitor) {
+			final DependencyGraphEvent event = new DependencyGraphEvent(); 
 			final Object[] removed = projectsRemoved.getListeners();
 			final Object[] updated = projectsUpdated.getListeners();
 			final Object[] added = projectsAdded.getListeners();
@@ -289,38 +337,62 @@
 					synchronized (graphLock) {
 						for (Object o : removed) {
 							IProject project = (IProject) o;
-							removeAllReferences(project);
+							removeAllReferences(project, event);
 						}
 					}
 					// get the updated queue in case there are any adds
 					// if there are any added projects, then unfortunately the
 					// entire workspace needs to be processed
 					if (added.length > 0) {
-						IProject[] allProjects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+						IProject[] allProjects = null;
+						int state = ResourcesPlugin.getPlugin().getBundle().getState();
+						if (state == Bundle.ACTIVE) {
+							allProjects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+						} else {
+							return;
+						}
+						
 						for (IProject sourceProject : allProjects) {
 							IVirtualComponent component = ComponentCore.createComponent(sourceProject);
 							if (component != null) {
-								IVirtualReference[] references = component.getReferences();
+								IVirtualReference[] references = null;
+								if(referenceOptions != null && component instanceof VirtualComponent) {
+									references = ((VirtualComponent)component).getReferences(referenceOptions);
+								} else {
+									references = component.getReferences();
+								}
 								for (IVirtualReference ref : references) {
 									IVirtualComponent targetComponent = ref.getReferencedComponent();
 									if (targetComponent != null) {
 										IProject targetProject = targetComponent.getProject();
 										if (targetProject != null && !targetProject.equals(sourceProject)) {
-											addReference(sourceProject, targetProject);
+											addReference(sourceProject, targetProject, event);
 										}
 									}
 								}
 							}
 						}
 					} else if (updated.length > 0) {
-						IProject[] allProjects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+						IProject[] allProjects = null;
+						int state = ResourcesPlugin.getPlugin().getBundle().getState();
+						if (state == Bundle.ACTIVE) {
+							allProjects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
+						} else {
+							return;
+						}
+						
 						Set<IProject> validRefs = new HashSet<IProject>();
 						for (Object o : updated) {
 							IProject sourceProject = (IProject) o;
 							IVirtualComponent component = ComponentCore.createComponent(sourceProject);
 							if (component != null) {
 								validRefs.clear();
-								IVirtualReference[] references = component.getReferences();
+								IVirtualReference[] references = null;
+								if(referenceOptions != null && component instanceof VirtualComponent) {
+									references = ((VirtualComponent)component).getReferences(referenceOptions);
+								} else {
+									references = component.getReferences();
+								}
 								for (IVirtualReference ref : references) {
 									IVirtualComponent targetComponent = ref.getReferencedComponent();
 									if (targetComponent != null) {
@@ -336,19 +408,52 @@
 										// above, be sure to add it
 										// otherwise, remove it
 										if (validRefs.remove(targetProject)) {
-											addReference(sourceProject, targetProject);
+											addReference(sourceProject, targetProject, event);
 										} else {
-											removeReference(sourceProject, targetProject);
+											removeReference(sourceProject, targetProject, event);
 										}
 									}
 								}
 							} else {
 								// if this project is not a component, then it
 								// should be completely removed.
-								removeAllReferences(sourceProject);
+								removeAllReferences(sourceProject, event);
 							}
 						}
 					}
+					boolean scheduleUpdate = false;
+					synchronized (graphLock) {
+						if(referenceOptions != null){
+							scheduleUpdate = true;
+							referenceOptions = null;
+						}
+					}
+					if(scheduleUpdate){
+						initAll();
+					}
+					
+					//fire notifications on a different job so they do not block waitForAllUpdates()
+					Job notificationJob = new Job("Graph Update Notification Job"){
+						@Override
+						protected IStatus run(final IProgressMonitor monitor) {
+							SafeRunner.run(new ISafeRunnable() {
+								public void run() throws Exception {
+									for(Object listener : listeners.getListeners()){
+										((IDependencyGraphListener)listener).dependencyGraphUpdate(event);
+									}
+									monitor.done();
+								}
+
+								public void handleException(Throwable exception) {
+									ModulecorePlugin.logError(exception);
+								}
+							});
+							return Status.OK_STATUS;
+						}
+					};
+					notificationJob.setSystem(true);
+					notificationJob.setRule(null);
+					notificationJob.schedule();
 				}
 			});
 			// System.err.println(IDependencyGraph.INSTANCE);
@@ -356,6 +461,14 @@
 		}
 	};
 
+	public void addListener(IDependencyGraphListener listener) {
+		listeners.add(listener);		
+	}
+	
+	public void removeListener(IDependencyGraphListener listener) {
+		listeners.remove(listener);
+	}
+	
 	/**
 	 * @deprecated use {@link #update(IProject, int)}
 	 */
@@ -430,7 +543,39 @@
 		Thread graphUpdateThread = graphUpdateJob.getThread();
 		if(graphUpdateThread != null && graphUpdateThread != Thread.currentThread()) {
 			try {
-				graphUpdateJob.join();
+				// Note: Since the Javadoc for Job.join() states:
+				//     If the calling thread owns a lock or object monitor that the joined thread
+				//     is waiting for, deadlock will occur.
+				// we need to do whatever deadlock avoidance we can.
+				
+				// If this thread is the one handling the current workspace operation,
+				// then we need to try to force this thread to yield to the GraphUpdateJob,
+				// or we really risk a deadlock.
+				if (ResourcesPlugin.getWorkspace().isTreeLocked()) {
+					IJobManager manager = Job.getJobManager();
+					Job job = manager.currentJob();
+					// If we are running a job and the job has no rule, force this job
+					// to yield to the GraphUpdateJob by applying the same scheduling rule.
+					if (job != null && job.getRule() == null) {
+						try {
+							manager.beginRule(ResourcesPlugin.getWorkspace().getRoot(), monitor);
+							graphUpdateJob.join();
+						}
+						finally {
+							manager.endRule(ResourcesPlugin.getWorkspace().getRoot());
+						}
+					}
+					// Else for now, cross your fingers until additional deadlock avoidance
+					// can be implemented.
+					else {
+						graphUpdateJob.join();
+					}
+				}
+				else {
+					// Else for now, cross your fingers until additional deadlock avoidance
+					// can be implemented.
+					graphUpdateJob.join();
+				}
 			} catch (InterruptedException e) {
 				ModulecorePlugin.logError(e);
 			}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/IDependencyGraph.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/IDependencyGraph.java
index aa4f58c..07442a1 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/IDependencyGraph.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/IDependencyGraph.java
@@ -72,6 +72,10 @@
 	 * if the project dependencies ever change.
 	 */
 	public long getModStamp();
+	
+	public void addListener(IDependencyGraphListener listener);
+	
+	public void removeListener(IDependencyGraphListener listener);
 
 	/**
 	 * WARNING: this should only be called by implementors of the
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/IDependencyGraphListener.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/IDependencyGraphListener.java
new file mode 100644
index 0000000..c1f637b
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/IDependencyGraphListener.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.componentcore.internal.builder;
+
+public interface IDependencyGraphListener {
+
+	public void dependencyGraphUpdate(IDependencyGraphUpdateEvent event);
+	
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/IDependencyGraphUpdateEvent.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/IDependencyGraphUpdateEvent.java
new file mode 100644
index 0000000..0d1094b
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/builder/IDependencyGraphUpdateEvent.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2010 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.componentcore.internal.builder;
+
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.resources.IProject;
+
+public interface IDependencyGraphUpdateEvent {
+
+	public static int ADDED = 1;
+	public static int REMOVED = 2;
+
+	
+	/**
+	 * Returns a bitwise or of the reference change types.
+	 * 
+	 * @see {@link #ADDED} {@link #REMOVED}
+	 * @return
+	 */
+	public abstract int getType();
+
+	/**
+	 * Returns the modification stamp for the last update change in the
+	 * {@link IDependencyGraph} being notified by this event.
+	 * 
+	 * Note that updates to the {@link IDependencyGraph} may be queued so
+	 * several are handled by a single event.
+	 * 
+	 * @see IDependencyGraph#getModStamp()
+	 * 
+	 * @return
+	 */
+	public abstract long getModStamp();
+
+	/**
+	 * The key contains the referenced component, the value contains the set of
+	 * referencing components recently added. This map will only contain the
+	 * changes since the last event was fired. If {@link #getType()} |
+	 * {@link #ADDED} != {@link #ADDED} then this will be an empty map.
+	 * 
+	 * Note that the changes specified by this map do not necessarily reflect
+	 * the current state of the {@link IDependencyGraph} because it is possible
+	 * that additional changes have occurred since this event was fired.
+	 * {@link IDependencyGraph#getReferencingComponents(IProject)} will return
+	 * the current reference state.
+	 * 
+	 * @return
+	 */
+	public abstract Map<IProject, Set<IProject>> getAddedReferences();
+
+	/**
+	 * The key contains the referenced component, the value contains the set of
+	 * referencing components recently removed. This map will only contain the
+	 * changes since the last event was fired. If {@link #getType()} |
+	 * {@link #REMOVED} != {@link #REMOVED} then this will be an empty map.
+	 * 
+	 * Note that the changes specified by this map do not necessarily reflect
+	 * the current state of the {@link IDependencyGraph} because it is possible
+	 * that additional changes have occurred since this event was fired.
+	 * {@link IDependencyGraph#getReferencingComponents(IProject)} will return
+	 * the current reference state.
+	 * 
+	 * @return
+	 */
+	public abstract Map<IProject, Set<IProject>> getRemovedReferences();
+
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/AbstractFlattenParticipant.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/AbstractFlattenParticipant.java
new file mode 100644
index 0000000..024f710
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/AbstractFlattenParticipant.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Red Hat 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:
+ *     Red Hat - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.common.componentcore.internal.flat;
+
+import java.util.List;
+
+import org.eclipse.wst.common.componentcore.internal.flat.FlatVirtualComponent.FlatComponentTaskModel;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+
+/**
+ * A simple abstract class with default values so clients
+ * can extend and override only the method they care about
+ */
+public class AbstractFlattenParticipant implements IFlattenParticipant {
+
+	public void initialize(IVirtualComponent component,
+			FlatComponentTaskModel dataModel, List<IFlatResource> resources) {
+	}
+
+	public boolean canOptimize(IVirtualComponent component,
+			FlatComponentTaskModel dataModel) {
+		return false;
+	}
+
+	public void optimize(IVirtualComponent component, FlatComponentTaskModel dataModel, 
+			List<IFlatResource> resources, List<IChildModuleReference> childModules) {
+	}
+
+	public void finalize(IVirtualComponent component,
+			FlatComponentTaskModel dataModel, List<IFlatResource> resources) {
+	}
+
+	public boolean isChildModule(IVirtualComponent rootComponent,
+			FlatComponentTaskModel dataModel, IFlatFile file) {
+		return false;
+	}
+
+	public boolean isChildModule(IVirtualComponent rootComponent,
+			IVirtualReference referenced, FlatComponentTaskModel dataModel) {
+		return false;
+	}
+
+	public boolean shouldAddExportableFile(IVirtualComponent rootComponent,
+			IVirtualComponent currentComponent, FlatComponentTaskModel dataModel,
+			IFlatFile file) {
+		return true;
+	}
+	
+	public boolean shouldIgnoreReference(IVirtualComponent rootComponent,
+			IVirtualReference referenced, FlatComponentTaskModel dataModel) {
+		return false;
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/ChildModuleReference.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/ChildModuleReference.java
new file mode 100644
index 0000000..f48af99
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/ChildModuleReference.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Red Hat 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:
+ *     Red Hat - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.common.componentcore.internal.flat;
+
+import java.io.File;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.wst.common.componentcore.internal.resources.VirtualArchiveComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+
+/**
+ * Clients of this class will need to pay attention to 
+ * if this module is binary or not. If it's binary, you 
+ * should get the file, and copy it directly to the URI provided.
+ * 
+ * If it's not binary, you should use the provided uri
+ * as a base from which you can append it's member resources
+ *  
+ * String parentRelative = module.getRelativeURI(); //  path/to/childmod.jar
+ * String uri = parentLoc.append(parentRelative);
+ * if( module.isBinary()) {
+ *    File f = module.getFile();
+ *    // copy file f to uri;
+ * } else {
+ *    ExportModel em = new ExportModel(module.getComponent());
+ *    ExportableResource[] members = em.fetchResources();
+ *    String uri1 = uri.append(members[1].getModuleRelativePath());
+ *    String uri2 = ....
+ * }
+ * @author rob
+ *
+ */
+public class ChildModuleReference implements IChildModuleReference {
+	private IProject project;
+	private File file;
+	private IVirtualComponent component;
+	private IVirtualReference reference;
+	private IPath uri;
+	public ChildModuleReference(IProject project, IFlatFile f) {
+		this.project = project;
+		this.file = f == null ? null : (File)f.getAdapter(File.class);
+		if( f != null && file != null ) {
+			this.uri = f.getModuleRelativePath().append(f.getName());
+		}
+	}
+	
+	public ChildModuleReference(IVirtualReference reference, IPath root) {
+		this.reference = reference;
+		this.component = reference.getReferencedComponent();
+		this.project = this.component.getProject();
+		if( component.isBinary() ) {
+			File f = (File)component.getAdapter(File.class);
+			if( f.exists() && f.isFile()) {
+				this.file = f;
+			}
+		}
+		this.uri = root.append(reference.getRuntimePath()).append(reference.getArchiveName());
+	}
+	
+	/**
+	 * Will return a file if this can be tracked to one
+	 * @return
+	 */
+	public File getFile() {
+		return file;
+	}
+	
+	public IVirtualReference getReference() {
+		return reference;
+	}
+	
+	/**
+	 * Return the component if it exists
+	 * @return
+	 */
+	public IVirtualComponent getComponent() {
+		if( component != null ) 
+			return component;
+		if( file != null ) 
+			return new VirtualArchiveComponent(project, VirtualArchiveComponent.LIBARCHIVETYPE + "/" + file.getAbsolutePath(), new Path("/"));
+		return null;
+	}
+	
+	/**
+	 * If this is a single file, return true.
+	 * If a more complex component, return false
+	 * @return
+	 */
+	public boolean isBinary() {
+		return component == null || component.isBinary();
+	}
+	
+	/**
+	 * Get the relative URI to it's direct parent, 
+	 * including path + filename + extension
+	 * @return
+	 */
+	public IPath getRelativeURI() {
+		return uri;
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/FilterResourceParticipant.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/FilterResourceParticipant.java
new file mode 100644
index 0000000..635caa6
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/FilterResourceParticipant.java
@@ -0,0 +1,64 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Red Hat 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:
+ *     Red Hat - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.common.componentcore.internal.flat;
+
+import java.io.File;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.wst.common.componentcore.internal.flat.FlatVirtualComponent.FlatComponentTaskModel;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+
+public class FilterResourceParticipant extends AbstractFlattenParticipant {
+	public interface IExportableResourceFilter {
+		public boolean accepts(IFlatResource resource);
+	}
+	
+	public static class FilterExtensionsParticipant implements IExportableResourceFilter {
+		private String[] bannedExtensions;
+		public FilterExtensionsParticipant(String[] extensions) {
+			this.bannedExtensions = extensions;
+		}
+		public boolean accepts(IFlatResource resource) {
+			IFile ifile = (IFile)resource.getAdapter(IFile.class);
+			String name = null;
+			if( ifile != null ) {
+				name = ifile.getName();
+			} else {
+				File f = (File)resource.getAdapter(File.class);
+				if( f != null )
+					name = f.getName();
+			}
+			if( name != null) {
+				for( int i = 0; i < bannedExtensions.length; i++ ) {
+					if( name.endsWith(bannedExtensions[i]))
+						return false;
+				}
+				return true;
+			} 
+			return false;
+		}
+	}
+	
+	public static FilterResourceParticipant createSuffixFilterParticipant(String[] strings) {
+		return new FilterResourceParticipant(new FilterExtensionsParticipant(strings));
+	}
+	
+	private IExportableResourceFilter filter;
+	public FilterResourceParticipant(IExportableResourceFilter filter) {
+		this.filter = filter;
+	}
+	
+	public boolean shouldAddExportableFile(IVirtualComponent rootComponent,
+			IVirtualComponent currentComponent, FlatComponentTaskModel dataModel,
+			IFlatFile file) {
+		return filter.accepts(file);
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/FlatFile.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/FlatFile.java
new file mode 100644
index 0000000..84639f8
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/FlatFile.java
@@ -0,0 +1,178 @@
+/*******************************************************************************
+ * 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.componentcore.internal.flat;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IPath;
+
+/**
+ * A deployable file
+ */
+public class FlatFile extends FlatResource implements IFlatFile {
+	private InputStream stream;
+	private IFile file;
+	private File file2;
+	private String name;
+	private IPath path;
+	private long stamp = -1;
+
+	/**
+	 * Creates a workspace module file with the current modification stamp.
+	 * 
+	 * @param file a file in the workspace
+	 * @param name a name
+	 * @param path the path to the file
+	 */
+	public FlatFile(IFile file, String name, IPath path) {
+		if (name == null)
+			throw new IllegalArgumentException();
+		this.file = file;
+		this.name = name;
+		this.path = path;
+		if (file != null)
+			stamp = file.getModificationStamp() + file.getLocalTimeStamp();
+	}
+
+	/**
+	 * Creates an external module file 
+	 * 
+	 * @param file
+	 * @param name
+	 * @param path
+	 */
+	public FlatFile(File file, String name, IPath path) {
+		if (name == null)
+			throw new IllegalArgumentException();
+		this.file2 = file;
+		this.name = name;
+		this.path = path;
+		if (file2 != null)
+			stamp = file2.lastModified();
+	}
+
+	/**
+	 * Creates an unknown module file with a specific modification stamp.
+	 * 
+	 * @param file
+	 * @param name
+	 * @param path
+	 * @param stamp
+	 */
+	public FlatFile(InputStream is, String name, IPath path, long stamp) {
+		if (name == null)
+			throw new IllegalArgumentException();
+		this.stream = is;
+		this.name = name;
+		this.path = path;
+		this.stamp = stamp;
+	}
+	
+	/**
+	 * Creates an unknown module file with the current modification stamp.
+	 * 
+	 * @param file
+	 * @param name
+	 * @param path
+	 */
+	public FlatFile(InputStream is, String name, IPath path) {
+		this(is, name, path, System.currentTimeMillis());
+	}
+
+	/**
+	 * Creates a module file with a specific modification stamp and no
+	 * file reference.
+	 * 
+	 * @param name
+	 * @param path
+	 * @param stamp
+	 */
+	public FlatFile(String name, IPath path, long stamp) {
+		if (name == null)
+			throw new IllegalArgumentException();
+		this.name = name;
+		this.path = path;
+		this.stamp = stamp;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.server.core.model.IModuleFile#getModificationStamp()
+	 */
+	public long getModificationStamp() {
+		return stamp;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.server.core.model.IModuleResource#getModuleRelativePath()
+	 */
+	public IPath getModuleRelativePath() {
+		return path;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.server.core.model.IModuleResource#getName()
+	 */
+	public String getName() {
+		return name;
+	}
+
+	public boolean equals(Object obj) {
+		if (obj == this)
+			return true;
+		
+		if (!(obj instanceof FlatFile))
+			return false;
+		
+		FlatFile mf = (FlatFile) obj;
+		if (!name.equals(mf.getName()))
+			return false;
+		if (!path.equals(mf.getModuleRelativePath()))
+			return false;
+		return true;
+	}
+
+	public int hashCode() {
+		return name.hashCode() * 37 + path.hashCode();
+	}
+
+	public Object getAdapter(Class cl) {
+		if (IFile.class.equals(cl) || IResource.class.equals(cl))
+			return file;
+		else if (File.class.equals(cl)) {
+			if( file2 != null )
+				return file2;
+			if( file != null )
+				return file.getLocation().toFile();
+		}
+		else if( InputStream.class.equals(cl)) {
+			try {
+				if( stream != null )
+					return stream;
+				if( file2 != null && file2.exists()) 
+					return new FileInputStream(file2);
+				if( file != null && file.exists()) 
+					return new FileInputStream(file.getLocation().toFile());
+			} catch( IOException ioe) {
+				// Do Nothing
+			}
+		}
+		return null;
+	}
+
+	public String toString() {
+		return "DeployableFile [" + name + ", " + path + ", " + stamp + "]";
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/FlatFolder.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/FlatFolder.java
new file mode 100644
index 0000000..c55c023
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/FlatFolder.java
@@ -0,0 +1,111 @@
+/*******************************************************************************
+ * 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.componentcore.internal.flat;
+
+import java.io.File;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IPath;
+
+/**
+ * An implementation of {@link IFlatFolder} for physical folders on disk or in the
+ * workspace.
+ */
+public class FlatFolder extends FlatResource implements IFlatFolder {
+	private static final FlatResource[] EMPTY_RESOURCE_ARRAY = new FlatResource[0];
+
+	private IContainer container;
+	private String name;
+	private IPath path;
+	private IFlatResource[] members;
+
+	/**
+	 * Creates a module folder.
+	 * 
+	 * @param container the container, or <code>null</code> for unknown container
+	 * @param name a name
+	 * @param path the module relative path to the folder
+	 */
+	public FlatFolder(IContainer container, String name, IPath path) {
+		if (name == null)
+			throw new IllegalArgumentException();
+		this.container = container;
+		this.name = name;
+		this.path = path;
+	}
+
+	/**
+	 * Sets the members (contents) of this folder.
+	 * 
+	 * @param members the members
+	 */
+	public void setMembers(IFlatResource[] members) {
+		this.members = members;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.server.core.model.IModuleResource#getModuleRelativePath()
+	 */
+	public IPath getModuleRelativePath() {
+		return path;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.server.core.model.IModuleResource#getName()
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.wst.server.core.model.IModuleFolder#members()
+	 */
+	public IFlatResource[] members() {
+		if (members == null)
+			return EMPTY_RESOURCE_ARRAY;
+		return members;
+	}
+
+	public boolean equals(Object obj) {
+		if (obj == this)
+			return true;
+		
+		if (!(obj instanceof FlatFolder))
+			return false;
+		
+		FlatFolder mf = (FlatFolder) obj;
+		if (!name.equals(mf.name))
+			return false;
+		if (!path.equals(mf.path))
+			return false;
+		return true;
+	}
+
+	public int hashCode() {
+		return name.hashCode() * 37 + path.hashCode();
+	}
+
+	public Object getAdapter(Class cl) {
+		if (container != null) {
+			if (IContainer.class.equals(cl) || IFolder.class.equals(cl) || IResource.class.equals(cl))
+				return container;
+			if( File.class.equals(cl))
+				return container.getLocation().toFile();
+		}
+		return null;
+	}
+
+	public String toString() {
+		return "DeployableFolder [" + name + ", " + path + "]";
+	}
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/FlatResource.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/FlatResource.java
new file mode 100644
index 0000000..ff6f174
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/FlatResource.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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.componentcore.internal.flat;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IPath;
+
+public abstract class FlatResource implements IFlatResource, IAdaptable {
+	/**
+	 * Returns the module relative path to this resource.
+	 * 
+	 * @return the module relative path to this resource
+	 */
+	public abstract IPath getModuleRelativePath();
+
+	/**
+	 * Returns the name of this resource.
+	 * 
+	 * @return the name of this resource
+	 */
+	public abstract String getName();
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/FlatVirtualComponent.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/FlatVirtualComponent.java
new file mode 100644
index 0000000..09829f1
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/FlatVirtualComponent.java
@@ -0,0 +1,347 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Red Hat 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:
+ *     Red Hat - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.common.componentcore.internal.flat;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.wst.common.componentcore.internal.DependencyType;
+import org.eclipse.wst.common.componentcore.internal.flat.VirtualComponentFlattenUtility.ShouldIncludeUtilityCallback;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+
+public class FlatVirtualComponent implements IFlatVirtualComponent, ShouldIncludeUtilityCallback {
+	
+	public static class FlatComponentTaskModel extends HashMap<Object, Object> {
+			private static final long serialVersionUID = 1L;
+	}
+	
+	/**
+	 * The datamodel, which may contain preferences, settings, or other data
+	 * used by the various participants to determine how to properly 
+	 * traverse this component. 
+	 */
+	private FlatComponentTaskModel dataModel;
+	
+	/**
+	 * The root component being flattened. 
+	 */
+	private IVirtualComponent component;
+	
+	/**
+	 * The list of participants to engage in the flattening process. 
+	 */
+	private IFlattenParticipant[] participants;
+
+	/**
+	 * The list of member resources for this component
+	 */
+	private List<IFlatResource> members = null;
+	
+	/**
+	 * The list of child modules for this component
+	 */
+	private List<IChildModuleReference> children = null;
+	
+	
+	public FlatVirtualComponent(IVirtualComponent component) {
+		this(component, new FlatComponentTaskModel());
+	}
+	
+	public FlatVirtualComponent(IVirtualComponent component, FlatComponentTaskModel dataModel) {
+		this.component = component;
+		this.dataModel = dataModel;
+		participants = setParticipants();
+		dataModel.put(EXPORT_MODEL, this);
+	}
+	
+	/**
+	 * Set the list of participants for this virtual component. 
+	 * This is pulled from the datamodel. 
+	 */
+	protected IFlattenParticipant[] setParticipants() {
+		Object o = dataModel.get(PARTICIPANT_LIST);
+		if( o != null ) {
+			if( o instanceof IFlattenParticipant )
+				return new IFlattenParticipant[] { (IFlattenParticipant)o};
+			if( o instanceof IFlattenParticipant[])
+				return (IFlattenParticipant[])o;
+			if( o instanceof List ) {
+				List<IFlattenParticipant> l = (List<IFlattenParticipant>)o;
+				return (IFlattenParticipant[]) l
+						.toArray(new IFlattenParticipant[l.size()]);
+			}
+		}
+		return new IFlattenParticipant[]{};
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.wst.common.componentcore.internal.flat.IFlatVirtualComponent#fetchResources()
+	 */
+	public IFlatResource[] fetchResources() throws CoreException {
+		if( members == null)
+			cacheResources();
+		return (FlatResource[]) members.toArray(new FlatResource[members.size()]);
+	}
+	
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.wst.common.componentcore.internal.flat.IFlatVirtualComponent#getChildModules()
+	 */
+	public IChildModuleReference[] getChildModules() throws CoreException {
+		if( members == null )
+			cacheResources();
+		return (ChildModuleReference[]) children.toArray(new ChildModuleReference[children.size()]);
+	}
+	
+	
+	protected void cacheResources() throws CoreException {
+		runInitializations();
+		if( canOptimize()) {
+			optimize(members, children);
+		} else {
+			treeWalk();
+			runFinalizations(members);
+		}
+	}
+	
+	protected void runInitializations() {
+		members = new ArrayList<IFlatResource>();
+		children = new ArrayList<IChildModuleReference>();
+		for( int i = 0; i < participants.length; i++ ) {
+			participants[i].initialize(component, dataModel, members);
+		}
+	}
+	
+	protected boolean canOptimize() {
+		for( int i = 0; i < participants.length; i++ ) {
+			if( participants[i].canOptimize(component, dataModel))
+				return true;
+		}
+		return false;
+	}
+
+	protected void optimize(List<IFlatResource> resources, List<IChildModuleReference> children) {
+		for( int i = 0; i < participants.length; i++ ) {
+			if( participants[i].canOptimize(component, dataModel)) {
+				participants[i].optimize(component, dataModel, resources, children);
+				return;
+			}
+		}
+	}
+	
+	protected void runFinalizations(List<IFlatResource> resources) {
+		for( int i = 0; i < participants.length; i++ ) {
+			participants[i].finalize(component, dataModel, resources);
+		}
+	}
+	
+	protected void treeWalk() throws CoreException {
+		if (component != null) {
+			VirtualComponentFlattenUtility util = new VirtualComponentFlattenUtility(members, this);
+			IVirtualFolder vFolder = component.getRootFolder();
+			
+			// actually walk the tree
+			util.addMembers(component, vFolder, Path.EMPTY);
+
+			//addRelevantOutputFolders(); // to be done in a participant later
+
+			addConsumedReferences(util, component, new Path(""));
+			addUsedReferences(util, component, new Path(""));
+		}
+	}
+	
+	/**
+	 * Consumed references are, by definition, consumed, and should not
+	 * be eligible to be exposed as child modules. They are consumed 
+	 * directly into the module tree. 
+	 * 
+	 * The reference in question may have references of its own, both
+	 * used and consumed. References of the child will be treated
+	 * as references of the parent, whether consumed or used.  
+	 * 
+	 * A key difference in the handling of non-child USED references 
+	 * as compared to CONSUMES is that CONSUMED references have their
+	 * archiveName *ignored*, and its child members are directly consumed. 
+	 * In contrast, a USED non-child keeps its archiveName as the folder name. 
+	 *  
+	 * @param vc
+	 */
+	protected void addConsumedReferences(VirtualComponentFlattenUtility util, IVirtualComponent vc, IPath root) throws CoreException {
+		List consumableMembers = new ArrayList();
+		Map<String, Object> options = new HashMap<String, Object>();
+		options.put(IVirtualComponent.REQUESTED_REFERENCE_TYPE, IVirtualComponent.FLATTENABLE_REFERENCES);
+		IVirtualReference[] refComponents = vc.getReferences(options);
+    	for (int i = 0; i < refComponents.length; i++) {
+    		IVirtualReference reference = refComponents[i];
+    		if (reference != null && reference.getDependencyType()==IVirtualReference.DEPENDENCY_TYPE_CONSUMES) {
+    			IVirtualComponent consumedComponent = reference.getReferencedComponent();
+				if (consumedComponent.getRootFolder()!=null) {
+					IVirtualFolder vFolder = consumedComponent.getRootFolder();
+					util.addMembers(consumedComponent, vFolder, root.append(reference.getRuntimePath().makeRelative()));
+					addConsumedReferences(util, consumedComponent, root.append(reference.getRuntimePath().makeRelative()));
+					addUsedReferences(util, consumedComponent, root.append(reference.getRuntimePath().makeRelative()));
+				}
+    		}
+    	}
+	}
+	
+	/**
+	 * This checks to see if any exportable file is actually a child module.
+	 * Children modules will be exposed via the getChildModules() method. 
+	 */
+	public boolean shouldAddComponentFile(IVirtualComponent current, IFlatFile file) {
+		for( int i = 0; i < participants.length; i++ ) {
+			if( participants[i].isChildModule(component, dataModel, file)) {
+				ChildModuleReference child = new ChildModuleReference(current.getProject(), file);
+				children.add(child); 
+				return false;
+			} else if( !participants[i].shouldAddExportableFile(component, current, dataModel, file))
+				return false;
+		}
+		return true;
+	}
+
+	protected void addUsedReferences(VirtualComponentFlattenUtility util, IVirtualComponent vc, IPath root) throws CoreException {
+		Map<String, Object> options = new HashMap<String, Object>();
+		options.put(IVirtualComponent.REQUESTED_REFERENCE_TYPE, IVirtualComponent.FLATTENABLE_REFERENCES);
+		IVirtualReference[] allReferences = vc.getReferences(options);
+    	for (int i = 0; i < allReferences.length; i++) {
+    		IVirtualReference reference = allReferences[i];
+			IVirtualComponent virtualComp = reference.getReferencedComponent();
+			if (reference.getDependencyType() == DependencyType.USES ) {
+				if( shouldIgnoreReference(reference))
+					continue;
+				
+				if( !isChildModule(reference)) {
+					addNonChildUsedReference(util, vc, reference, root.append(reference.getRuntimePath()));
+				} else {
+					ChildModuleReference cm = new ChildModuleReference(reference, root);
+					List<IChildModuleReference> duplicates = new ArrayList();
+					for( IChildModuleReference tmp : children ) {
+						if(tmp.getRelativeURI().equals(cm.getRelativeURI()))
+							duplicates.add(tmp);
+					}
+					children.removeAll(duplicates);
+					children.add(cm);
+				}
+			}
+    	}
+	}
+	
+	/**
+	 * Should we expose this used reference as a member file?
+	 * 
+	 * @param currentComponent the current component we're traversing
+	 * @return true if it's a member file, false if it's a child module
+	 */
+	protected boolean isChildModule(IVirtualReference referencedComponent) {
+		for( int i = 0; i < participants.length; i++ ) {
+			if( participants[i].isChildModule(component, referencedComponent, dataModel))
+				return true;
+		}
+		return false;
+	}
+
+	protected boolean shouldIgnoreReference(IVirtualReference referencedComponent) {
+		for( int i = 0; i < participants.length; i++ ) {
+			if( participants[i].shouldIgnoreReference(component, referencedComponent, dataModel))
+				return true;
+		}
+		return false;
+	}
+
+	protected void addNonChildUsedReference(VirtualComponentFlattenUtility util, IVirtualComponent parent, 
+			IVirtualReference reference, IPath runtimePath) throws CoreException {
+		if( reference.getReferencedComponent().isBinary()) {
+			handleNonChildUsedBinaryReference(util, parent, reference, runtimePath);
+		} else /* !virtualComp.isBinary() */ {
+			/*
+			 * used references to non-binary components that are NOT child modules.
+			 * These should be 'consumed' but maintain their name
+			 * As of now I don't believe there are any such instances of this.
+			 * I also believe in most cases, this probably is a child module that 
+			 * the parent just doesn't know about.
+			 * 
+			 * Example: Ear Project consumes ESB project, Ear project does not 
+			 * recognize ESB project as a child However, if the server adapter 
+			 * can use nested exploded deployments (folders instead of zips),
+			 * then this will still work. 
+			 * 
+			 * TODO Investigate / Discuss
+			 */
+			util.addMembers(reference.getReferencedComponent(), reference.getReferencedComponent().getRootFolder(), 
+					runtimePath.append(reference.getArchiveName()));
+		}
+	}
+	
+	protected void handleNonChildUsedBinaryReference(VirtualComponentFlattenUtility util, IVirtualComponent parent, 
+			IVirtualReference reference, IPath runtimePath) throws CoreException {
+		// Binary used references must be added as a single file unless they're child modules
+		final String archiveName2 = reference.getArchiveName();
+		final String archiveName = new Path(archiveName2).lastSegment();
+		final IVirtualComponent virtualComp = reference.getReferencedComponent();
+		FlatFile mf = null;
+		IFile ifile = (IFile)virtualComp.getAdapter(IFile.class);
+		if( ifile != null ) {
+			String name = null != archiveName ? archiveName : ifile.getName();
+			mf = new FlatFile(ifile, name, runtimePath.makeRelative());
+		} else {
+			File extFile = (File)virtualComp.getAdapter(File.class);
+			if( extFile != null ) {
+				String name = null != archiveName ? archiveName : extFile.getName();
+				mf = new FlatFile(extFile, name, runtimePath.makeRelative());
+			}
+		}
+		
+		if( mf != null ) {
+			IFlatResource moduleParent = VirtualComponentFlattenUtility.getExistingModuleResource(members, mf.getModuleRelativePath());
+			if (moduleParent != null && moduleParent instanceof IFlatFolder) {
+				IFlatResource[] mf_members = ((IFlatFolder)moduleParent).members();
+				for (int i = 0; i < mf_members.length; i++) {
+					if (mf_members[i].getName().equals(mf.getName()))
+						return;
+				}
+				VirtualComponentFlattenUtility.addMembersToModuleFolder((IFlatFolder)moduleParent, new FlatResource[]{mf});
+			} else {
+				if( shouldAddComponentFile(virtualComp, mf)) {
+					if (mf.getModuleRelativePath().isEmpty()) {
+						for( IFlatResource tmp : members) 
+							if( tmp.getName().equals(mf.getName()))
+								return;
+						members.add(mf);
+					} else {
+						if (moduleParent == null) {
+							moduleParent = VirtualComponentFlattenUtility.ensureParentExists(members, mf.getModuleRelativePath(), (IContainer)parent.getRootFolder().getUnderlyingResource());
+						}
+						VirtualComponentFlattenUtility.addMembersToModuleFolder((IFlatFolder)moduleParent, new FlatResource[] {mf});
+					}
+				} else {
+					// Automatically added to children if it needed to be
+				}
+			}
+		}
+	}
+
+	public IVirtualComponent getComponent() {
+		return component;
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/IChildModuleReference.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/IChildModuleReference.java
new file mode 100644
index 0000000..963f0e5
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/IChildModuleReference.java
@@ -0,0 +1,58 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Red Hat 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:
+ *     Red Hat - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.common.componentcore.internal.flat;
+
+import java.io.File;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+
+/**
+ * A child module may be based on a file (if binary), 
+ * or on a reference / component if not. 
+ * 
+ * This interface is not intended to be implemented by clients
+ */
+public interface IChildModuleReference {
+	/**
+	 * Will return a file if this can be tracked to one
+	 * @return
+	 */
+	public File getFile();
+	
+	
+	/**
+	 * Return the reference if it exists
+	 * @return
+	 */
+	public IVirtualReference getReference();
+	
+	/**
+	 * Return the component if it exists
+	 * @return
+	 */
+	public IVirtualComponent getComponent();
+	
+	/**
+	 * If this is a single file, return true.
+	 * If a more complex component, return false
+	 * @return
+	 */
+	public boolean isBinary();
+	
+	/**
+	 * Get the relative URI to it's direct parent, 
+	 * including path + filename + extension
+	 * @return
+	 */
+	public IPath getRelativeURI();
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/IFlatFile.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/IFlatFile.java
new file mode 100644
index 0000000..6a649b7
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/IFlatFile.java
@@ -0,0 +1,26 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Red Hat 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:
+ *     Red Hat - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.common.componentcore.internal.flat;
+
+/**
+ * 
+ * This interface is not intended to be implemented by clients
+ *
+ */
+public interface IFlatFile extends IFlatResource {
+	/**
+	 * Returns a modification stamp. Whenever the modification
+	 * stamp changes, there may have been a change to the file.
+	 * 
+	 * @return the modification stamp
+	 */
+	public long getModificationStamp();
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/IFlatFolder.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/IFlatFolder.java
new file mode 100644
index 0000000..aedcf50
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/IFlatFolder.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * 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.componentcore.internal.flat;
+
+/**
+ * 
+ * This interface is not intended to be implemented by clients
+ *
+ */
+public interface IFlatFolder extends IFlatResource {
+	/**
+	 * Returns the members (contents) of this folder.
+	 * 
+	 * @return an array containing the module resources contained in this folder
+	 */
+	public IFlatResource[] members();
+	/**
+	 * Sets the members (contents) of this folder.
+	 * 
+	 * @param members the members
+	 */
+	public void setMembers(IFlatResource[] members);
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/IFlatResource.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/IFlatResource.java
new file mode 100644
index 0000000..fdb9197
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/IFlatResource.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Red Hat 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:
+ *     Red Hat - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.common.componentcore.internal.flat;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IPath;
+
+/**
+ * 
+ * This interface is not intended to be implemented by clients
+ *
+ */
+public interface IFlatResource extends IAdaptable {
+	/**
+	 * Returns the module relative path to this resource.
+	 * 
+	 * @return the module relative path to this resource
+	 */
+	public IPath getModuleRelativePath();
+
+	/**
+	 * Returns the name of this resource.
+	 * 
+	 * @return the name of this resource
+	 */
+	public String getName();
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/IFlatVirtualComponent.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/IFlatVirtualComponent.java
new file mode 100644
index 0000000..81b9b85
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/IFlatVirtualComponent.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Red Hat 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:
+ *     Red Hat - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.common.componentcore.internal.flat;
+
+import org.eclipse.core.runtime.CoreException;
+
+public interface IFlatVirtualComponent {
+	
+	/**
+	 * An options key listing the export participants.
+	 * The value must be a List<IExportUtilParticipant>, 
+	 *  or simply an IExportUtilParticipant
+	 */
+	public static String PARTICIPANT_LIST = "org.eclipse.wst.common.componentcore.export.participantList";
+	
+	/**
+	 * The ExportModel being used; the value of this should be the IFlatVirtualComponent itself. 
+	 */
+	public static String EXPORT_MODEL = "org.eclipse.wst.common.componentcore.export.exportModel";
+
+	/**
+	 * Fetch the list of resources, which include raw files or folders only
+	 * @return
+	 * @throws CoreException
+	 */
+	public IFlatResource[] fetchResources() throws CoreException;
+	
+	/**
+	 * Fetch a list of child module references.
+	 * @return
+	 * @throws CoreException
+	 */
+	public IChildModuleReference[] getChildModules() throws CoreException;
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/IFlattenParticipant.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/IFlattenParticipant.java
new file mode 100644
index 0000000..54fd742
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/IFlattenParticipant.java
@@ -0,0 +1,166 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Red Hat 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:
+ *     Red Hat - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.common.componentcore.internal.flat;
+
+import java.util.List;
+
+import org.eclipse.wst.common.componentcore.internal.flat.FlatVirtualComponent.FlatComponentTaskModel;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+
+/**
+ * This class represents a participant in the process
+ * of traversing the virtual component and deciding which
+ * resources should be exposed by the model, and 
+ * in what fashion.
+ * 
+ * Clients should not implement this class directly, 
+ * but should rather extend AbstractExportParticipant. 
+ */
+public interface IFlattenParticipant {
+	
+	/**
+	 * Seed the list of resources with entries that must be present, 
+	 * specifically files that may be missed by optimizations.
+	 * 
+	 * @param component
+	 * @param dataModel
+	 * @param original
+	 * @return
+	 */
+	public void initialize(IVirtualComponent component, 
+			FlatComponentTaskModel dataModel, List<IFlatResource> resources);
+	
+	/**
+	 * Can this participant return optimized members that
+	 * preclude the need for running the full algorithm?
+	 * 
+	 * Caution is encouraged. If reference types you do not understand
+	 * are present and you mistakenly claim you canOptimize, you may
+	 * leave some references ignored and the archive incompletely assembled.
+	 * 
+	 * Example: if the component satisfies singleRoot requirements, this may return true
+	 * 
+	 * @param component
+	 * @param dataModel
+	 * @return
+	 */
+	public boolean canOptimize(IVirtualComponent component, 
+			FlatComponentTaskModel dataModel);
+	
+	/**
+	 * Return a full and complete list of members to be published.
+	 * The original entries should be included, unless left out intentionally.
+	 * 
+	 * Only the first participant to claim it can optimize will be allowed to do so.
+	 * This will be the final list returned by ExportUtil.
+	 * No finalization or other actions on this list will take place
+	 * 
+	 * @param component
+	 * @param dataModel
+	 * @param original
+	 * @return
+	 */
+	public void optimize(IVirtualComponent component, FlatComponentTaskModel dataModel, 
+			List<IFlatResource> resources, List<IChildModuleReference> children);
+	
+	/**
+	 * Returns true if this participant considers this file to be a child module
+	 * The framework will consider the file a child module if at least one participant
+	 * returns true to this method. 
+	 * 
+	 * The item in question is a flat file which has been found inside the project
+	 * or inside a consumed reference of the project. The framework is asking
+	 * all participants if this file is a child module, to be exposed as such later, 
+	 * or if it is just a generic resource, which should be exposed as a regular member file. 
+	 * 
+	 * @param rootComponent
+	 * @param dataModel
+	 * @param file
+	 * @return
+	 */
+	public boolean isChildModule(IVirtualComponent rootComponent,
+			FlatComponentTaskModel dataModel, IFlatFile file);
+	
+	
+	/**
+	 * Should the proposed file be included in the result set or not.
+	 * If any one participant says no, the file will not be included.
+	 * The default behaviour would be to return true unless you
+	 * have a compelling reason to block the file from inclusion
+	 * 
+	 * Example: If the file is being actively filtered (in a .svn folder) return false
+	 * Caution is encouraged here, as a consumed reference may actively 
+	 * be providing the files you may be trying to filter. It's advised to only
+	 * filter if you know what type currentComponent is and how it works.
+	 * 
+	 * @param rootComponent The root component that is being assembled
+	 * @param currentComponent The component currently being processed, either rootComponent or a consumed reference
+	 * @param dataModel
+	 * @param file
+	 * @return
+	 */
+	public boolean shouldAddExportableFile(IVirtualComponent rootComponent,
+			IVirtualComponent currentComponent, 
+			FlatComponentTaskModel dataModel, IFlatFile file);
+	
+	
+	/**
+	 * Returns true if this participant considers the reference a child module.
+	 * The framework will consider it a child module if at least one participant returns true. 
+	 * 
+	 * The framework is asking whether the referenced component is a child module, 
+	 * which should be added to the list of children modules and exposed as an  
+	 * IChildModuleReference, or if it is just some generic type of entity to be 
+	 * exposed as member resources inside the current flat component. 
+	 * 
+	 * The parameter "referenced" is guaranteed to be a "USED" reference,
+	 * as "CONSUMED" references have already been consumed directly into the project
+	 * as if they were part of it originally.  
+	 * 
+	 * A "USED" reference which is a child module will be exposed as an 
+	 * IChildModuleReference and use the archiveName retrieved from the IVirtualReference. 
+	 * 
+	 * A "USED" reference which is *not* a child module will be represented
+	 * as a folder member resource inside the parent, and the folder's name will
+	 * also be retrieved from the archiveName attribute of the IVirtualReference.
+	 * 
+	 * @param rootComponent
+	 * @param referenced 
+	 * @param dataModel
+	 * @return
+	 */
+	public boolean isChildModule(IVirtualComponent rootComponent, 
+			IVirtualReference referenced, FlatComponentTaskModel dataModel);
+	
+	/**
+	 * Should this reference be ignored, ie handled elsewhere
+	 * @param rootComponent
+	 * @param referenced
+	 * @param dataModel
+	 * @return
+	 */
+	public boolean shouldIgnoreReference(IVirtualComponent rootComponent,
+			IVirtualReference referenced, FlatComponentTaskModel dataModel);
+	/**
+	 * Finalize the list of resources by adding missed resources or 
+	 * removing files added by mistake. 
+	 * 
+	 * @param component
+	 * @param dataModel
+	 * @param original
+	 * @param resources
+	 * @return
+	 */
+	public void finalize(IVirtualComponent component, 
+			FlatComponentTaskModel dataModel, List<IFlatResource> resources);
+
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/VirtualComponentFlattenUtility.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/VirtualComponentFlattenUtility.java
new file mode 100644
index 0000000..01aad61
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/flat/VirtualComponentFlattenUtility.java
@@ -0,0 +1,253 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Red Hat 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:
+ *     Red Hat - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.common.componentcore.internal.flat;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualContainer;
+import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
+
+/**
+ * This utility class is almost entirely copied from ComponentDeployable
+ * and deals with the nuts and bolts of creating the model objects when
+ * walking a portion of the tree
+ */
+public class VirtualComponentFlattenUtility {
+	public static interface ShouldIncludeUtilityCallback {
+		public boolean shouldAddComponentFile(IVirtualComponent current, IFlatFile file);
+	}
+	
+	private List<IFlatResource> members;
+	private ShouldIncludeUtilityCallback handler;
+	public VirtualComponentFlattenUtility(
+			List<IFlatResource> members, ShouldIncludeUtilityCallback handler) {
+		this.members = members;
+		this.handler = handler;
+	}
+	
+	public void addMembers(IVirtualComponent current, IVirtualContainer cont, IPath path) throws CoreException {
+		ensureParentExists(members, path, null);
+		FlatResource[] mr = addMembersInternal(current, cont, path);
+		int size = mr.length;
+		for (int j = 0; j < size; j++) {
+			members.add(mr[j]);
+		}
+	}
+	
+	// Add this container's children
+	public void addContainer(IContainer container, IPath path) throws CoreException {
+		IResource[] children = container.members();
+		for( int i = 0; i < children.length; i++ ) {
+			if( children[i] instanceof IContainer ) {
+				addContainerInternal((IContainer)children[i], path);
+			} else if( children[i] instanceof IFile ){
+				addFile(null, (IFile)children[i], path);
+			}
+		}
+	}
+	
+	// Physically adds this container
+	protected void addContainerInternal(IContainer container, IPath path) throws CoreException {
+		IFlatFolder mf = (FlatFolder) getExistingModuleResource(members,path.append(container.getName()).makeRelative());
+		if( mf == null ) {
+			mf = new FlatFolder(container, container.getName(), path);
+			IFlatFolder parent = (FlatFolder) getExistingModuleResource(members, path);
+			if (path.isEmpty())
+				members.add(mf);
+			else {
+				if (parent == null)
+					parent = ensureParentExists(members, path, container);
+				addMembersToModuleFolder(parent, new IFlatResource[] {mf});
+			}
+		}
+		// recurse
+		addContainer(container, path.append(container.getName()));
+	}
+	
+	protected FlatResource[] addMembersInternal(IVirtualComponent current, IVirtualContainer cont, IPath path) throws CoreException {
+		IVirtualResource[] res = cont.members();
+		int size2 = res.length;
+		List list = new ArrayList(size2);
+		for (int j = 0; j < size2; j++) {
+			if (res[j] instanceof IVirtualContainer) {
+				IVirtualContainer cc = (IVirtualContainer) res[j];
+				IFlatFolder mf = addVirtualContainerInternal(cc, path);
+				IFlatResource[] mr = addMembersInternal(current, cc, path.append(cc.getName()));
+				addMembersToModuleFolder(mf, mr);
+			} else {
+				addFile(current, path, (IAdaptable)res[j]);
+			}
+		}
+		FlatResource[] mr = new FlatResource[list.size()];
+		list.toArray(mr);
+		return mr;
+	}
+	
+	public void addFile(IVirtualComponent current, IPath path, IAdaptable file) {
+		IFile f = (IFile)file.getAdapter(IFile.class);
+		IFlatFile mf = null;
+		if( f != null )
+			 mf = createModuleFile(f, path.makeRelative());
+		else {
+			File f2 = (File)file.getAdapter(File.class);
+			if( f2 != null )
+				mf = new FlatFile(f2, f2.getName(), path.makeRelative());
+		}
+		if( mf != null ) {
+			if (handler == null || handler.shouldAddComponentFile(current, mf)) {
+				if( mf.getModuleRelativePath().isEmpty()) {
+					members.remove(mf);
+					members.add(mf);
+				}
+				else {
+					IFlatFolder moduleParent = VirtualComponentFlattenUtility.ensureParentExists(members, mf.getModuleRelativePath(), null);
+					List tempParentMembers = new ArrayList(Arrays.asList(moduleParent.members()));
+					tempParentMembers.remove(mf);
+					tempParentMembers.add(mf);
+					moduleParent.setMembers((IFlatResource[]) tempParentMembers.toArray(new IFlatResource[tempParentMembers.size()]));
+				}
+			}
+		}
+	}
+	
+	public void addFile(IVirtualComponent current, IFile f, IPath path) {
+		addFile(current, path, (IAdaptable)f);
+	}
+	
+	protected IFlatFolder addVirtualContainerInternal(IVirtualContainer cc, IPath path) {
+		// Retrieve already existing module folder if applicable
+		IFlatFolder mf = (FlatFolder) getExistingModuleResource(members,path.append(cc.getName()).makeRelative());
+		if (mf == null) {
+			mf = new FlatFolder((IContainer)cc.getUnderlyingResource(), cc.getName(), path);
+			IFlatFolder parent = (FlatFolder) getExistingModuleResource(members, path);
+			if (path.isEmpty())
+				members.add(mf);
+			else {
+				if (parent == null)
+					parent = ensureParentExists(members, path, (IContainer)cc.getUnderlyingResource());
+				addMembersToModuleFolder(parent, new IFlatResource[] {mf});
+			}
+		}
+		return mf;
+	}
+	
+	public static FlatFile createModuleFile(final IFile file, final IPath path) {
+		return new FlatFile(file, file.getName(), path);
+	}
+
+	
+	/**
+	 * Check the current cache to see if we already have an existing module resource for
+	 * the given path.
+	 * @param aList
+	 * @param path
+	 * @return an existing moduleResource from the cached result
+	 */
+	 
+	public static FlatResource getExistingModuleResource(List aList, IPath path) { 
+    	// If the list is empty, return null
+    	if (aList==null || aList.isEmpty() || path == null)
+    		return null;
+    	// Otherwise recursively check to see if given resource matches current resource or if it is a child
+    	String[] pathSegments = path.segments(); 
+    	FlatResource exportableResource = null;
+    	
+    	if(pathSegments.length == 0)
+    		return null;
+    	for (Iterator iter = aList.iterator(); iter.hasNext();) {
+    		exportableResource = (FlatResource) iter.next();     	
+    		String[] moduleSegments = exportableResource.getModuleRelativePath().segments();
+    		// If the last segment in passed in path equals the module resource name 
+    		// and segment count is the same and the path segments start with the module path segments
+    		// then we have a match and we return the existing moduleResource
+    		if (pathSegments[pathSegments.length - 1].equals(exportableResource.getName()) && 
+		    		(moduleSegments.length + 1) == pathSegments.length && 
+		    		startsWith(moduleSegments, pathSegments))
+		    	return exportableResource; 
+    		
+    		// Otherwise, if it is a folder, check its children for the existing resource path
+    		// but only check if the beginning segments are a match
+	    	if(exportableResource instanceof FlatFolder && 
+	    			startsWith(moduleSegments, pathSegments) && pathSegments.length > moduleSegments.length &&
+	    			exportableResource.getName().equals(pathSegments[moduleSegments.length > 0 ? moduleSegments.length : 0]))	    	  
+    			if (((FlatFolder)exportableResource).members()!=null)
+    				return getExistingModuleResource(Arrays.asList(((FlatFolder)exportableResource).members()),path);
+    	}
+    	return null;
+    }
+	
+	/**
+	 * @return True if beginningSegments[i] == testSegments[i] for all 0<=i<beginningSegments[i] 
+	 */
+	private static boolean startsWith(String[] beginningSegments, String[] testSegments) { 
+		for(int i=0; i < beginningSegments.length; i++) {
+			if(!beginningSegments[i].equals(testSegments[i]))
+				return false;
+		}
+		return true;
+	}
+	
+	public static IFlatFolder ensureParentExists(List<IFlatResource> members, IPath path, IContainer cc) {
+		IFlatFolder parent = (IFlatFolder) getExistingModuleResource(members, path);
+		if (parent == null && path.segmentCount() > 0) {
+			String folderName = path.lastSegment();
+			IPath folderPath = Path.EMPTY;
+			if (path.segmentCount()>1)
+				folderPath = path.removeLastSegments(1);
+			parent = new FlatFolder(cc, folderName, folderPath);
+			if (path.segmentCount()>1)
+				addMembersToModuleFolder(ensureParentExists(members, path.removeLastSegments(1),cc), new IFlatResource[] {parent});
+			else
+				members.add(parent);
+		}
+		return parent;
+	}
+	
+	/**
+	 * Add the resources from mr to the existing resources in Module Folder mf
+	 * @param ModuleFolder mf
+	 * @param IModuleResource[] mr
+	 */
+	public static void addMembersToModuleFolder(IFlatFolder mf, IFlatResource[] mr) {
+		// If the folder is null or the resources to add are null or empty, bail and return
+		if (mf == null || mr == null || mr.length==0) 
+			return;
+		// Get the existing members in the module folder
+		IFlatResource[] mf_members = mf.members();
+		int mf_size = 0;
+		// Get the length of the existing members in the module folder
+		if (mf_members != null)
+			mf_size = mf_members.length;
+		// Create a new array to set on the module folder which will combine the existing and
+		// new module resources
+		IFlatResource[] res = new FlatResource[mf_size + mr.length];
+		// Copy the existing members into the array if there are any
+		if (mf_members != null && mf_size > 0)
+			System.arraycopy(mf_members, 0, res, 0, mf_size);
+		// Copy the new members into the array
+		System.arraycopy(mr, 0, res, mf_size, mr.length);
+		// Set the new members array on the module folder
+		mf.setMembers(res);
+	}
+	
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentCoreURIConverter.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentCoreURIConverter.java
index a2722b6..2739cad 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentCoreURIConverter.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentCoreURIConverter.java
@@ -26,6 +26,7 @@
 import org.eclipse.jem.util.emf.workbench.ResourceSetWorkbenchSynchronizer;
 import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
 import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.internal.ModulecorePlugin;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
 import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
 import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
@@ -79,8 +80,8 @@
 		if(PlatformURLModuleConnection.MODULE.equals(aURI.scheme())) { 		
 			try {
 				normalizedURI = PlatformURLModuleConnection.resolve(aURI);
-			} catch(IOException ioe) {
-				ioe.printStackTrace();
+			} catch(IOException e) {
+				ModulecorePlugin.logError(e);
 			} 
 		} else {
 			normalizedURI = super.normalize(aURI);
@@ -109,7 +110,7 @@
 			return URI.createPlatformResourceURI(newFile.getWorkspaceRelativePath().toString());
 			 
 		} catch(Exception e) {
-			e.printStackTrace();
+			ModulecorePlugin.logError(e);
 		}
 		return null;
 	}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentResourceImpl.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentResourceImpl.java
index 9147466..84ea36d 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentResourceImpl.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentResourceImpl.java
@@ -2,7 +2,7 @@
  * <copyright>
  * </copyright>
  *
- * $Id: ComponentResourceImpl.java,v 1.3 2006/01/11 18:40:31 cbridgha Exp $
+ * $Id: ComponentResourceImpl.java,v 1.4 2010/05/13 04:04:35 canderson Exp $
  */
 package org.eclipse.wst.common.componentcore.internal.impl;
 
@@ -23,6 +23,7 @@
 import org.eclipse.wst.common.componentcore.internal.ComponentResource;
 import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
 import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
+import org.eclipse.wst.common.internal.emf.utilities.ExtendedEcoreUtil.ESynchronizedAdapterList;
 
 /**
  * <!-- begin-user-doc -->
@@ -430,5 +431,15 @@
 		owningProject = aProject;
 	}
 	
+	@Override
+	public EList eAdapters()
+	  {
+	    if (eAdapters == null)
+	    {
+	      eAdapters =  new ESynchronizedAdapterList(this);
+	    }
+	    return eAdapters;
+	  }
+	
 
 } //ComponentResourceImpl
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentcorePackageImpl.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentcorePackageImpl.java
index 888ba54..c04eedd 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentcorePackageImpl.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ComponentcorePackageImpl.java
@@ -2,7 +2,7 @@
  * <copyright>
  * </copyright>
  *
- * $Id: ComponentcorePackageImpl.java,v 1.9 2006/04/27 04:17:40 cbridgha Exp $
+ * $Id: ComponentcorePackageImpl.java,v 1.10 2009/06/09 20:02:04 jsholl Exp $
  */
 package org.eclipse.wst.common.componentcore.internal.impl;
 
@@ -567,51 +567,51 @@
 		// Add supertypes to classes
 
 		// Initialize classes and features; add operations and parameters
-		initEClass(workbenchComponentEClass, WorkbenchComponent.class, "WorkbenchComponent", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getWorkbenchComponent_Name(), ecorePackage.getEString(), "name", "", 1, 1, WorkbenchComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getWorkbenchComponent_Resources(), this.getComponentResource(), this.getComponentResource_Component(), "resources", null, 0, -1, WorkbenchComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getWorkbenchComponent_ComponentType(), this.getComponentType(), null, "componentType", null, 1, 1, WorkbenchComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getWorkbenchComponent_ReferencedComponents(), this.getReferencedComponent(), null, "referencedComponents", null, 0, -1, WorkbenchComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getWorkbenchComponent_Properties(), this.getProperty(), null, "properties", null, 0, -1, WorkbenchComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getWorkbenchComponent_MetadataResources(), this.getIPath(), "metadataResources", null, 0, -1, WorkbenchComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEClass(workbenchComponentEClass, WorkbenchComponent.class, "WorkbenchComponent", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEAttribute(getWorkbenchComponent_Name(), ecorePackage.getEString(), "name", "", 1, 1, WorkbenchComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEReference(getWorkbenchComponent_Resources(), this.getComponentResource(), this.getComponentResource_Component(), "resources", null, 0, -1, WorkbenchComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEReference(getWorkbenchComponent_ComponentType(), this.getComponentType(), null, "componentType", null, 1, 1, WorkbenchComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEReference(getWorkbenchComponent_ReferencedComponents(), this.getReferencedComponent(), null, "referencedComponents", null, 0, -1, WorkbenchComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEReference(getWorkbenchComponent_Properties(), this.getProperty(), null, "properties", null, 0, -1, WorkbenchComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEAttribute(getWorkbenchComponent_MetadataResources(), this.getIPath(), "metadataResources", null, 0, -1, WorkbenchComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
 
-		initEClass(componentResourceEClass, ComponentResource.class, "ComponentResource", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getComponentResource_SourcePath(), this.getIPath(), "sourcePath", null, 1, 1, ComponentResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getComponentResource_RuntimePath(), this.getIPath(), "runtimePath", null, 1, 1, ComponentResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getComponentResource_Exclusions(), ecorePackage.getEString(), "exclusions", "", 0, -1, ComponentResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getComponentResource_Component(), this.getWorkbenchComponent(), this.getWorkbenchComponent_Resources(), "component", null, 1, 1, ComponentResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getComponentResource_ResourceType(), ecorePackage.getEString(), "resourceType", "", 1, 1, ComponentResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEClass(componentResourceEClass, ComponentResource.class, "ComponentResource", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEAttribute(getComponentResource_SourcePath(), this.getIPath(), "sourcePath", null, 1, 1, ComponentResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEAttribute(getComponentResource_RuntimePath(), this.getIPath(), "runtimePath", null, 1, 1, ComponentResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEAttribute(getComponentResource_Exclusions(), ecorePackage.getEString(), "exclusions", "", 0, -1, ComponentResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEReference(getComponentResource_Component(), this.getWorkbenchComponent(), this.getWorkbenchComponent_Resources(), "component", null, 1, 1, ComponentResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEAttribute(getComponentResource_ResourceType(), ecorePackage.getEString(), "resourceType", "", 1, 1, ComponentResource.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
 
-		initEClass(componentTypeEClass, ComponentType.class, "ComponentType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getComponentType_ComponentTypeId(), ecorePackage.getEString(), "componentTypeId", "", 1, 1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getComponentType_Version(), ecorePackage.getEString(), "version", "", 1, 1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getComponentType_Properties(), this.getProperty(), null, "properties", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getComponentType_MetadataResources(), this.getIPath(), "metadataResources", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEClass(componentTypeEClass, ComponentType.class, "ComponentType", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEAttribute(getComponentType_ComponentTypeId(), ecorePackage.getEString(), "componentTypeId", "", 1, 1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEAttribute(getComponentType_Version(), ecorePackage.getEString(), "version", "", 1, 1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEReference(getComponentType_Properties(), this.getProperty(), null, "properties", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEAttribute(getComponentType_MetadataResources(), this.getIPath(), "metadataResources", null, 0, -1, ComponentType.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
 
 		initEClass(propertyEClass, Property.class, "Property", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getProperty_Name(), ecorePackage.getEString(), "name", "", 1, 1, Property.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getProperty_Value(), ecorePackage.getEString(), "value", "", 1, 1, Property.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getProperty_Name(), ecorePackage.getEString(), "name", "", 1, 1, Property.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEAttribute(getProperty_Value(), ecorePackage.getEString(), "value", "", 1, 1, Property.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
 
 		initEClass(referencedComponentEClass, ReferencedComponent.class, "ReferencedComponent", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getReferencedComponent_Handle(), this.getURI(), "handle", null, 1, 1, ReferencedComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getReferencedComponent_RuntimePath(), this.getIPath(), "runtimePath", null, 1, 1, ReferencedComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getReferencedComponent_DependencyType(), this.getDependencyType(), "dependencyType", null, 1, 1, ReferencedComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getReferencedComponent_DependentObject(), ecorePackage.getEObject(), null, "dependentObject", null, 0, 1, ReferencedComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getReferencedComponent_ArchiveName(), ecorePackage.getEString(), "archiveName", null, 0, 1, ReferencedComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getReferencedComponent_Handle(), this.getURI(), "handle", null, 1, 1, ReferencedComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEAttribute(getReferencedComponent_RuntimePath(), this.getIPath(), "runtimePath", null, 1, 1, ReferencedComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEAttribute(getReferencedComponent_DependencyType(), this.getDependencyType(), "dependencyType", null, 1, 1, ReferencedComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEReference(getReferencedComponent_DependentObject(), ecorePackage.getEObject(), null, "dependentObject", null, 0, 1, ReferencedComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEAttribute(getReferencedComponent_ArchiveName(), ecorePackage.getEString(), "archiveName", null, 0, 1, ReferencedComponent.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
 
-		initEClass(projectComponentsEClass, ProjectComponents.class, "ProjectComponents", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getProjectComponents_ProjectName(), ecorePackage.getEString(), "projectName", "", 1, 1, ProjectComponents.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getProjectComponents_Components(), this.getWorkbenchComponent(), null, "components", null, 0, -1, ProjectComponents.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getProjectComponents_Version(), ecorePackage.getEString(), "version", null, 1, 1, ProjectComponents.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEClass(projectComponentsEClass, ProjectComponents.class, "ProjectComponents", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEAttribute(getProjectComponents_ProjectName(), ecorePackage.getEString(), "projectName", "", 1, 1, ProjectComponents.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEReference(getProjectComponents_Components(), this.getWorkbenchComponent(), null, "components", null, 0, -1, ProjectComponents.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEAttribute(getProjectComponents_Version(), ecorePackage.getEString(), "version", null, 1, 1, ProjectComponents.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
 
 		// Initialize enums and add enum literals
-		initEEnum(dependencyTypeEEnum, DependencyType.class, "DependencyType");
+		initEEnum(dependencyTypeEEnum, DependencyType.class, "DependencyType"); //$NON-NLS-1$
 		addEEnumLiteral(dependencyTypeEEnum, DependencyType.USES_LITERAL);
 		addEEnumLiteral(dependencyTypeEEnum, DependencyType.CONSUMES_LITERAL);
 
 		// Initialize data types
-		initEDataType(iPathEDataType, IPath.class, "IPath", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
-		initEDataType(uriEDataType, org.eclipse.emf.common.util.URI.class, "URI", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
+		initEDataType(iPathEDataType, IPath.class, "IPath", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEDataType(uriEDataType, org.eclipse.emf.common.util.URI.class, "URI", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
 
 		// Create resource
 		createResource(eNS_URI);
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/IResourceFactoryExtPtConstants.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/IResourceFactoryExtPtConstants.java
index fda1a5c..c6e1e45 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/IResourceFactoryExtPtConstants.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/IResourceFactoryExtPtConstants.java
@@ -26,6 +26,8 @@
 	String ATT_CONTENTTYPEID = "contentTypeId"; //$NON-NLS-1$ 
 	
 	String ATT_ISDEFAULT = "isDefault"; //$NON-NLS-1$ 
+	
+	String ATT_OVERRIDES_FACTORY ="overridesFactoryClass"; //$NON-NLS-1$ 
 		
 
 }
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ModuleURIUtil.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ModuleURIUtil.java
index 170c513..1076676 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ModuleURIUtil.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ModuleURIUtil.java
@@ -200,7 +200,7 @@
 		if (aComponent.isBinary())
 			return ModuleURIUtil.archiveComponentfullyQualifyURI(aComponent.getName()).toString();
 		else
-			return "[" + aComponent.getProject().getFullPath() + "]:" + aComponent.getProject().getName();
+			return "[" + aComponent.getProject().getFullPath() + "]:" + aComponent.getProject().getName(); //$NON-NLS-1$  //$NON-NLS-2$
 	}
 
 	public static String getContentTypeName(URI uri) {
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ReferencedComponentXMIResourceFactory.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ReferencedComponentXMIResourceFactory.java
index 2a157ad..55d2299 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ReferencedComponentXMIResourceFactory.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ReferencedComponentXMIResourceFactory.java
@@ -19,7 +19,6 @@
 
 	public ReferencedComponentXMIResourceFactory() {
 		super();
-		// TODO Auto-generated constructor stub
 	}
 	/**
 	 * This is the method that subclasses can override to actually instantiate a new Resource
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ReferencedComponentXMIResourceImpl.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ReferencedComponentXMIResourceImpl.java
index 333b4b0..ac46885 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ReferencedComponentXMIResourceImpl.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/ReferencedComponentXMIResourceImpl.java
@@ -20,12 +20,10 @@
 
 	public ReferencedComponentXMIResourceImpl() {
 		super();
-		// TODO Auto-generated constructor stub
 	}
 
 	public ReferencedComponentXMIResourceImpl(URI uri) {
 		super(uri);
-		// TODO Auto-generated constructor stub
 	}
 	protected MappedXMIHelper doCreateXMLHelper() {
 		return new MappedComponentXMIHelper(this, getPrefixToPackageURIs());
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPResourceFactoryRegistry.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPResourceFactoryRegistry.java
index e0698b2..71fda2c 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPResourceFactoryRegistry.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WTPResourceFactoryRegistry.java
@@ -11,7 +11,11 @@
 package org.eclipse.wst.common.componentcore.internal.impl;
 
 import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Comparator;
 import java.util.Iterator;
+import java.util.Map;
 import java.util.Set;
 
 import org.eclipse.core.resources.IFile;
@@ -26,8 +30,10 @@
 import org.eclipse.core.runtime.SafeRunner;
 import org.eclipse.core.runtime.content.IContentDescription;
 import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.core.runtime.jobs.ILock;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.Resource.Factory;
 import org.eclipse.jem.util.RegistryReader;
 import org.eclipse.wst.common.componentcore.ComponentCore;
 import org.eclipse.wst.common.componentcore.UnresolveableURIException;
@@ -40,6 +46,7 @@
 import org.eclipse.wst.common.internal.emf.resource.ResourceFactoryDescriptor;
 import org.eclipse.wst.common.internal.emf.utilities.DefaultOverridableResourceFactoryRegistry;
 import org.eclipse.wst.common.internal.emfworkbench.WorkbenchResourceHelper;
+import org.eclipse.wst.common.internal.emfworkbench.edit.EMFWorkbenchEditContextFactory;
 
 /**
  * <p>
@@ -63,26 +70,44 @@
 		return WTPResourceFactoryRegistry.INSTANCE.getFactory(uri);	
 	}   
 
-	public synchronized Resource.Factory getFactory(URI uri, IContentDescription description) {
-		Resource.Factory resourceFactory = null;
-		if(uri != null && uri.lastSegment() != null) {
-			ResourceFactoryDescriptor descriptor = null;
-			if(null == description){
-				descriptor = getDescriptor(uri);
-			} else {
-				descriptor = getDescriptor(uri, description);
-			}
-			
-			if(descriptor != null) {
-				resourceFactory = getFactory(descriptor);	
-			}	
+	public Resource.Factory getFactory(URI uri, IContentDescription description) {
+		IProject componentProject = null;
+		try {
+			componentProject = StructureEdit.getContainingProject(uri);
+		} catch (UnresolveableURIException e) {
+			// don't do anything
 		}
-		if(resourceFactory == null)
-			resourceFactory = super.getFactory(uri);
-		return resourceFactory; 
+		ILock lock = EMFWorkbenchEditContextFactory.getProjectLockObject(componentProject);
+		try{
+			if(null != lock){
+				lock.acquire();
+			}
+			synchronized(this){
+				Resource.Factory resourceFactory = null;
+				if(uri != null && uri.lastSegment() != null) {
+					ResourceFactoryDescriptor descriptor = null;
+					if(null == description){
+						descriptor = getDescriptor(uri);
+					} else {
+						descriptor = getDescriptor(uri, description);
+					}
+					
+					if(descriptor != null) {
+						resourceFactory = getFactory(descriptor);	
+					}	
+				}
+				if(resourceFactory == null)
+					resourceFactory = super.getFactory(uri);
+				return resourceFactory;
+			}
+		} finally{
+			if(null != lock){
+				lock.release();
+			}
+		} 
 	}
 	
-	public synchronized Resource.Factory getFactory(URI uri) {
+	public Resource.Factory getFactory(URI uri) {
 		return getFactory(uri, (IContentDescription)null);
 	}	
 
@@ -115,6 +140,11 @@
 		key.shortName = descriptor.getShortSegment();
 		key.type = descriptor.getContentType();
 		key.isDefault = descriptor.isDefault();
+		if(descriptor instanceof ConfigurationResourceFactoryDescriptor){
+			ConfigurationResourceFactoryDescriptor configurationDescriptor = (ConfigurationResourceFactoryDescriptor)descriptor;
+			key.factoryClassName = configurationDescriptor.getFactoryClassName();
+			key.overridesFactoryClassName = configurationDescriptor.getOverridesFactoryClassName();
+		}
 		return key;
 	}
 	
@@ -126,6 +156,8 @@
 		private String shortSegment;
 		private IContentType contentType;
 		private boolean isDefault = true;
+		private String factoryClassName = null;
+		private String overridesFactoryClassName = null;
 		private final IConfigurationElement element; 
 		
 		public ConfigurationResourceFactoryDescriptor(IConfigurationElement ext) throws CoreException {
@@ -134,16 +166,16 @@
 			init();
 		} 
 		
+		public String getOverridesFactoryClassName() {
+			return overridesFactoryClassName;
+		}
+
+		public String getFactoryClassName() {
+			return factoryClassName;
+		}
+
 		private void init() throws CoreException {
 			shortSegment = element.getAttribute(ATT_SHORT_SEGMENT);
-			if(shortSegment == null || shortSegment.trim().length() == 0)
-				throw new CoreException(
-							ModulecorePlugin.createErrorStatus(0, 
-										"The shortSegment attribute of " + TAG_RESOURCE_FACTORY + //$NON-NLS-1$ 
-										" must specify a valid, non-null, non-empty value in " +   //$NON-NLS-1$
-										element.getNamespaceIdentifier(), null));
-			if ("false".equals(element.getAttribute(ATT_ISDEFAULT)))
-					isDefault = false;
 			
 			IConfigurationElement[] bindings = element.getChildren(TAG_CONTENTTYPE);
 			if (bindings.length > 0) {
@@ -151,14 +183,35 @@
 				contentTypeId = bindings[0].getAttribute(ATT_CONTENTTYPEID);			
 				if (contentTypeId != null)
 					contentType = Platform.getContentTypeManager().getContentType(contentTypeId);
-				}
+			}
+			
+			if ((shortSegment == null || shortSegment.trim().length() == 0)
+						&& contentType == null) {
+				throw new CoreException(
+							ModulecorePlugin.createErrorStatus(0, 
+										"Either the shortSegment attribute or the contentType element of " //$NON-NLS-1$
+										+ TAG_RESOURCE_FACTORY 
+										+ " must be specified in " 
+										+ element.getNamespaceIdentifier()
+										+ ".  The shortSegment attribute is specified with a valid, non-null, " //$NON-NLS-1$
+										+ "non-empty value, and the contentType element is specified with a " //$NON-NLS-1$
+										+ "valid, non-null, non-empty contentTypeId." //$NON-NLS-1$
+										, null));
+			}
+			
+			if ("false".equals(element.getAttribute(ATT_ISDEFAULT)))
+				isDefault = false;
+				
+            factoryClassName = element.getAttribute(ATT_CLASS);
+			overridesFactoryClassName = element.getAttribute(ATT_OVERRIDES_FACTORY);				
 		} 
 
 		public boolean isEnabledFor(URI fileURI) {
-			/* shortSegment must be non-null for the descriptor to be created, 
-			 * a validation check in init() verifies this requirement */
-			if(fileURI != null && fileURI.lastSegment() != null)
+			// Not sure where this is actually used, so not sure what the proper 
+			// implementation should be, so simply checking the short segment for now
+			if (fileURI != null && fileURI.lastSegment() != null && shortSegment != null) {
 				return shortSegment.equals(fileURI.lastSegment());
+			}
 			return false;
 		} 
 		
@@ -186,34 +239,43 @@
 		}
 
 		public IContentType getContentType() {
-			
 			return contentType;
 		}
 
 		public boolean isDefault() {
 			return isDefault;
-		}  
+		}
+		
 		public int hashCode() {
-			if (getContentType() != null)
-				return getShortSegment().hashCode() & getContentType().hashCode();
-			else return super.hashCode();
+			int hashCode = 0;
+			if (getContentType() != null) {
+				hashCode |= getContentType().hashCode();
+			}
+			if (getShortSegment() != null) {
+				hashCode |= getShortSegment().hashCode();
+			}
+			return hashCode;
 		}
 		
 		public boolean equals(Object o) {
-			if(o instanceof ResourceFactoryDescriptor && getContentType() != null)
-				return (getShortSegment().equals(((ResourceFactoryDescriptor)o).getShortSegment()) &&
-						getContentType().equals(((ResourceFactoryDescriptor)o).getContentType()));
-			else if (((ResourceFactoryDescriptor)o).getContentType() != null) return false;
-				
-			return super.equals(o);
+			if (! (o instanceof ResourceFactoryDescriptor)) {
+				return false;
+			}
+			ResourceFactoryDescriptor rfdo = (ResourceFactoryDescriptor) o;
+			boolean equals = true;
+			equals &= (getContentType() == null) ? rfdo.getContentType() == null :
+				getContentType().equals(rfdo.getContentType());
+			equals &= (getShortSegment() == null) ? rfdo.getShortSegment() == null :
+				getShortSegment().equals(rfdo.getShortSegment());
+			return equals;
 		}
-	}  
+	}
 	 
 	
 	private class ResourceFactoryRegistryReader extends RegistryReader implements IResourceFactoryExtPtConstants { 
  		
 		public ResourceFactoryRegistryReader() {
-			super(Platform.getPluginRegistry(), ModulecorePlugin.PLUGIN_ID, EXTPT_RESOURCE_FACTORIES);
+			super(ModulecorePlugin.PLUGIN_ID, EXTPT_RESOURCE_FACTORIES);
 		}
 
 		public boolean readElement(final IConfigurationElement element) {
@@ -239,6 +301,8 @@
 	}
 	private class WTPResourceFactoryRegistryKey { 
  		
+		public String overridesFactoryClassName;
+		public String factoryClassName;
 		public String shortName;
 		public IContentType type;
 		public boolean isDefault = true;
@@ -246,44 +310,116 @@
 			super();
 		}
 		
-		
+		/**
+		 * Sort in the following manner:
+		 * First, sort by shortName, if shortName is null, then it comes last
+		 * If shortNames are equal, then sort by isDefault
+		 * If isDefault is also equal, then the one defining a factoryClassName wins
+		 * If both have factoryClassNames, then check to see if one overrides the other via overridesFactoryClassName
+		 * If neither override the other factory class, then sort by factoryClassname
+		 * @param other
+		 * @return
+		 */
+		public int compareTo(WTPResourceFactoryRegistryKey other){
+			if(this == other){
+				return 0;
+			}
+			if(shortName == null && other.shortName == null){
+				return 0;
+			} else if(shortName == null){
+				return 1;
+			} else if(other.shortName == null){
+				return -1;
+			}
+			
+			int shortNameCompare = this.shortName.compareTo(other.shortName);
+			if(shortNameCompare != 0){
+				return shortNameCompare;
+			} else {
+				if(this.isDefault != other.isDefault){
+					if(this.isDefault){
+						return -1;
+					} else {
+						return 1;
+					}
+				} else {
+					if(this.factoryClassName == null && other.factoryClassName == null){
+						return 0;
+					} else if(other.factoryClassName == null){
+						return -1;
+					} else if (this.factoryClassName == null){
+						return 1;
+					} else if(other.factoryClassName.equals(this.overridesFactoryClassName)){
+						return -1;
+					} else if(this.factoryClassName.equals(other.overridesFactoryClassName)){
+						return 1;
+					} else {
+						return this.factoryClassName.compareTo(other.factoryClassName);
+					}	
+				}
+			}
+		}
 	}
 
 	protected void addDescriptor(ResourceFactoryDescriptor descriptor) {
 		getDescriptors().put(getKey(descriptor), descriptor);
 	}
+	
+	private WTPResourceFactoryRegistryKey []  sortedDescriptors = null;
+	
+	private WTPResourceFactoryRegistryKey []  getSortedDescriptorKeys() {
+		if(sortedDescriptors == null || sortedDescriptors.length != getDescriptors().size()){
+			Set keys = getDescriptors().keySet();
+			WTPResourceFactoryRegistryKey [] array = new WTPResourceFactoryRegistryKey [keys.size()];
+			int count = 0;
+			for (Iterator iterator = keys.iterator(); iterator.hasNext();count++) {
+				WTPResourceFactoryRegistryKey key = (WTPResourceFactoryRegistryKey) iterator.next();
+				array[count] = key;
+			}
+			Arrays.sort(array, new Comparator<WTPResourceFactoryRegistryKey>() {
+				public int compare(WTPResourceFactoryRegistryKey key1,
+						WTPResourceFactoryRegistryKey key2) {
+					return key1.compareTo(key2);
+				}
+			});
+			sortedDescriptors = array;
+		}
+		return sortedDescriptors;
+	}
 
 	protected synchronized ResourceFactoryDescriptor getDescriptor(URI uri, IContentDescription description) {
-		Set keys = getDescriptors().keySet();
-		ResourceFactoryDescriptor defaultDesc = null;
-		for (Iterator iterator = keys.iterator(); iterator.hasNext();) {
-			WTPResourceFactoryRegistryKey key = (WTPResourceFactoryRegistryKey) iterator.next();
-			if (key.shortName.equals(uri.lastSegment())) {
-				ResourceFactoryDescriptor desc = (ResourceFactoryDescriptor)getDescriptors().get(key);
-				if (description == null) {
-					if (key.type == null) 
-						return desc;
-					else if (desc.isDefault()) 
-						return desc;
+		WTPResourceFactoryRegistryKey [] keys = getSortedDescriptorKeys();
+		ResourceFactoryDescriptor defaultDescriptor = null;
+		
+		// first check content type
+		if (description != null) {
+			for (WTPResourceFactoryRegistryKey key : keys) {
+				ResourceFactoryDescriptor descriptor = (ResourceFactoryDescriptor) getDescriptors().get(key);
+				
+				if ((key.type != null) && (description.getContentType().equals(key.type))) {
+					if ((defaultDescriptor == null) || (key.isDefault)) {
+						defaultDescriptor = descriptor;
+					}
 				}
-				//Allow the contentType discrimination to take place
-				if ((key.type != null) && 
-						(description != null) && 
-						(description.getContentType().equals(key.type))) {
-					// If the current describer is "default" then specify
-					if(desc.isDefault())
-						return desc;
-					else 	
-						defaultDesc = desc;
-				}
-					
-				if ((description != null) && (desc.isDefault()) && (defaultDesc == null))
-					defaultDesc = desc;
 			}
 		}
-		return defaultDesc;
+		
+		// then check short name, overriding default if necessary
+		for (WTPResourceFactoryRegistryKey key : keys) {
+			ResourceFactoryDescriptor descriptor = (ResourceFactoryDescriptor) getDescriptors().get(key);
+						
+			if ((key.shortName != null) && (uri.lastSegment().equals(key.shortName))) {
+				if ((defaultDescriptor == null) 
+						|| ((description == null) && (key.isDefault))) {
+					defaultDescriptor = descriptor;
+				}
+			}
+		}
+		
+		return defaultDescriptor;
 	}
-private URI newPlatformURI(URI aNewURI, IProject project) {
+	
+	private URI newPlatformURI(URI aNewURI, IProject project) {
 		
 		if (project == null)
 			return ModuleURIUtil.trimToDeployPathSegment(aNewURI);
@@ -299,7 +435,7 @@
 			return URI.createPlatformResourceURI(newFile.getWorkspaceRelativePath().toString());
 			 
 		} catch(Exception e) {
-			e.printStackTrace();
+			ModulecorePlugin.logError(e);
 		}
 		return null;
 	}
@@ -320,8 +456,7 @@
 			try {
 				description = file.getContentDescription();
 			} catch (CoreException e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
+				ModulecorePlugin.logError(e);
 			}
 		}
 		if (description == null) {//Check for optional embedded uri segment, then normalize
@@ -332,15 +467,13 @@
 					try {
 						componentProject = StructureEdit.getContainingProject(uri);
 					} catch (UnresolveableURIException e) {
-						// TODO Auto-generated catch block
-						e.printStackTrace();
+						ModulecorePlugin.logError(e);
 					}
 					uri = PlatformURLModuleConnection.resolve(uri);
 					uri = newPlatformURI(uri,componentProject);
 				} 
 			} catch (IOException e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
+				ModulecorePlugin.logError(e);
 			}
 		}
 		
@@ -353,4 +486,30 @@
 			return super.getDescriptor(uri);
 		}
 	}
+
+	public Factory getFactory(URI uri, String contentType) {
+		IContentType type = Platform.getContentTypeManager().getContentType(contentType);
+		if (type != null)
+			return getFactory(uri, type.getDefaultDescription());
+		return super.getFactory(uri, contentType);
+	}
+	
+	
+	/**
+	 *  Returns true if the uri is found in the WTPResourceFactoryRegistry descriptor.
+	 *  This will not load any extension points
+	 */
+	public synchronized boolean shortNameRegistered(URI uri) {
+		Map m = getDescriptors();
+		Collection c = m.values();
+		Iterator iter = c.iterator();
+		String uriLastSegment = uri.lastSegment();
+		while(iter.hasNext()) {
+			ResourceFactoryDescriptor descriptor = (ResourceFactoryDescriptor) iter.next();
+			if(descriptor.getShortSegment() != null && descriptor.getShortSegment().equals(uriLastSegment)) {
+				return true;
+			}
+		}
+		return false;
+	}
 }
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WorkbenchComponentImpl.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WorkbenchComponentImpl.java
index 883ebb9..cf24cb8 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WorkbenchComponentImpl.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/impl/WorkbenchComponentImpl.java
@@ -1,9 +1,13 @@
-/**
- * <copyright>
- * </copyright>
+/*******************************************************************************
+ * Copyright (c) 2003, 2009 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
  *
- * $Id: WorkbenchComponentImpl.java,v 1.14 2007/02/14 16:00:52 jsholl Exp $
- */
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
 package org.eclipse.wst.common.componentcore.internal.impl;
 
 import java.util.Collection;
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/AddReferenceDataModelProvider.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/AddReferenceDataModelProvider.java
new file mode 100644
index 0000000..40c6e65
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/AddReferenceDataModelProvider.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 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.componentcore.internal.operation;
+
+import java.util.Set;
+
+import org.eclipse.wst.common.componentcore.datamodel.properties.IAddReferenceDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+
+/**
+ * This class is meant to be an alternative to CreateReferenceComponentsDataModelProvider
+ * which requires less options and allows for a pre-made IVirtualReference to be stored.
+ */
+public class AddReferenceDataModelProvider extends AbstractDataModelProvider implements IAddReferenceDataModelProperties {
+
+	public AddReferenceDataModelProvider() {
+		super();
+	}
+
+	public Set getPropertyNames() {
+		Set propertyNames = super.getPropertyNames();
+		propertyNames.add(SOURCE_COMPONENT);
+		propertyNames.add(TARGET_REFERENCE_LIST);
+		return propertyNames;
+	}
+
+	public IDataModelOperation getDefaultOperation() {
+		return new AddReferencesOp(model);
+	}
+
+	public Object getDefaultProperty(String propertyName) {
+		// No defaults, both must be set
+		return super.getDefaultProperty(propertyName);
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/AddReferencesOp.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/AddReferencesOp.java
new file mode 100644
index 0000000..35812bf
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/AddReferencesOp.java
@@ -0,0 +1,120 @@
+/*******************************************************************************
+ * Copyright (c) 2005, 2007 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.componentcore.internal.operation;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jem.util.UIContextDetermination;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IAddReferenceDataModelProperties;
+import org.eclipse.wst.common.componentcore.internal.ModulecorePlugin;
+import org.eclipse.wst.common.componentcore.internal.StructureEdit;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.internal.emfworkbench.validateedit.IValidateEditContext;
+
+public class AddReferencesOp extends AbstractDataModelOperation {
+
+
+	public AddReferencesOp(IDataModel model) {
+		super(model);
+	}
+
+	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		if (!validateEdit().isOK())
+			return Status.CANCEL_STATUS;
+		addReferencedComponents(monitor);
+		addProjectReferences();
+		return OK_STATUS;
+	}
+	
+	/**
+	 * Validate edit for resource state
+	 */
+	protected IStatus validateEdit() {
+		IStatus status = OK_STATUS;
+		IValidateEditContext validator = (IValidateEditContext) UIContextDetermination.createInstance(IValidateEditContext.CLASS_KEY);
+		IVirtualComponent sourceComp = (IVirtualComponent) model.getProperty(IAddReferenceDataModelProperties.SOURCE_COMPONENT);
+		IProject project = sourceComp.getProject();
+
+		if (status.isOK()) {
+			StructureEdit sEdit = null;
+			try {
+				sEdit = StructureEdit.getStructureEditForWrite(project);
+				status = validator.validateState(sEdit.getModuleStructuralModel());
+			} finally {
+				if (sEdit !=null)
+					sEdit.dispose();
+			}
+		}
+		
+		IFile [] files = new IFile[1];
+		files[0] = project.getFile(ProjectUtilities.DOT_PROJECT);
+		status = ResourcesPlugin.getWorkspace().validateEdit(files, null);
+		return status;
+	}
+	
+	public static List<IVirtualReference> getListFromModel(IDataModel model) {
+		Object value = model.getProperty(IAddReferenceDataModelProperties.TARGET_REFERENCE_LIST);
+		List<IVirtualReference> modList = value instanceof List ?  (List<IVirtualReference>)value : Arrays.asList(new IVirtualReference[]{(IVirtualReference)value});
+		return modList;
+	}
+	
+	protected void addProjectReferences() {
+
+		IVirtualComponent sourceComp = (IVirtualComponent) model.getProperty(IAddReferenceDataModelProperties.SOURCE_COMPONENT);
+		List modList = getListFromModel(model);
+		List targetprojectList = new ArrayList();
+		for (int i = 0; i < modList.size(); i++) {
+			IVirtualComponent virtualComponent = ((IVirtualReference) modList.get(i)).getReferencedComponent();
+			if(virtualComponent.isBinary()){
+				continue;
+			}
+			IProject targetProject = virtualComponent.getProject();
+			targetprojectList.add(targetProject);
+		}
+		try {
+			ProjectUtilities.addReferenceProjects(sourceComp.getProject(), targetprojectList);
+		} catch (CoreException e) {
+			ModulecorePlugin.logError(e);
+		}
+
+	}
+
+	protected void addReferencedComponents(IProgressMonitor monitor) {
+		IVirtualComponent sourceComp = (IVirtualComponent) model.getProperty(IAddReferenceDataModelProperties.SOURCE_COMPONENT);
+		List<IVirtualReference> refList = getListFromModel(model);
+		IVirtualReference[] refs = (IVirtualReference[]) refList.toArray(new IVirtualReference[refList.size()]);
+		sourceComp.addReferences(refs);
+	}
+
+	public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		return null;
+	}
+
+	public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		return null;
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ArtifactEditProviderOperation.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ArtifactEditProviderOperation.java
index b956516..b0a46d3 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ArtifactEditProviderOperation.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ArtifactEditProviderOperation.java
@@ -40,7 +40,6 @@
 
 	public ArtifactEditProviderOperation() {
 		super();
-		// TODO Auto-generated constructor stub
 	}
 
 	public ArtifactEditProviderOperation(IDataModel model) {
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/CreateReferenceComponentsOp.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/CreateReferenceComponentsOp.java
index dfcc622..9fcc768 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/CreateReferenceComponentsOp.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/CreateReferenceComponentsOp.java
@@ -29,6 +29,7 @@
 import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
 import org.eclipse.wst.common.componentcore.ComponentCore;
 import org.eclipse.wst.common.componentcore.datamodel.properties.ICreateReferenceComponentsDataModelProperties;
+import org.eclipse.wst.common.componentcore.internal.ModulecorePlugin;
 import org.eclipse.wst.common.componentcore.internal.StructureEdit;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
 import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
@@ -83,14 +84,17 @@
 		List modList = (List) model.getProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST);
 		List targetprojectList = new ArrayList();
 		for (int i = 0; i < modList.size(); i++) {
-			IVirtualComponent IVirtualComponent = (IVirtualComponent) modList.get(i);
-			IProject targetProject = IVirtualComponent.getProject();
+			IVirtualComponent virtualComponent = (IVirtualComponent) modList.get(i);
+			if(virtualComponent.isBinary()){
+				continue;
+			}
+			IProject targetProject = virtualComponent.getProject();
 			targetprojectList.add(targetProject);
 		}
 		try {
 			ProjectUtilities.addReferenceProjects(sourceComp.getProject(), targetprojectList);
 		} catch (CoreException e) {
-			e.printStackTrace();
+			ModulecorePlugin.logError(e);
 		}
 
 	}
@@ -106,6 +110,8 @@
 		if (deployPathStr != null && deployPathStr.length() > 0){
 			deployPath = new Path(deployPathStr);
 		}
+		else if (deployPathStr.length() == 0) deployPath = new Path("/"); //$NON-NLS-1$);
+	
 		for (int i = 0; i < modList.size(); i++) {
 			IVirtualComponent comp = (IVirtualComponent) modList.get(i);
 			if (!srcComponentContainsReference(sourceComp, comp, deployPath)) {
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/FacetDataModelOperation.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/FacetDataModelOperation.java
index 1558b11..71d4dc1 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/FacetDataModelOperation.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/FacetDataModelOperation.java
@@ -10,22 +10,29 @@
  *******************************************************************************/
 package org.eclipse.wst.common.componentcore.internal.operation;
 
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 
 import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
 import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
 import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
 import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+import org.eclipse.wst.common.frameworks.internal.operations.IProjectCreationPropertiesNew;
 import org.eclipse.wst.common.project.facet.core.IFacetedProject;
 import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
 import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
 import org.eclipse.wst.common.project.facet.core.IFacetedProject.Action.Type;
+import org.eclipse.wst.common.project.facet.core.runtime.IRuntime;
 
 public class FacetDataModelOperation extends AbstractDataModelOperation {
 
@@ -36,7 +43,7 @@
 	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
 		IFacetedProject facetProj;
 		try {
-			facetProj = ProjectFacetsManager.create(model.getStringProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME), null, monitor);
+			facetProj = createProject(monitor);
 			Set actions = new HashSet();
 			actions.add(new IFacetedProject.Action((Type) model.getProperty(IFacetDataModelProperties.FACET_TYPE), (IProjectFacetVersion) model.getProperty(IFacetDataModelProperties.FACET_VERSION), model));
 			facetProj.modify(actions, monitor);
@@ -46,4 +53,29 @@
 		return OK_STATUS;
 	}
 
+	public IFacetedProject createProject(IProgressMonitor monitor) throws CoreException {
+		IProject project = ProjectUtilities.getProject((String) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME));
+		IFacetedProject facetProj = null;
+
+		if (project.exists()) {
+			facetProj = ProjectFacetsManager.create(project, true, monitor);
+		} else {
+			String location = null;
+			if (model.isProperty(IProjectCreationPropertiesNew.PROJECT_LOCATION))
+			{
+				location = (String) model.getProperty(IProjectCreationPropertiesNew.PROJECT_LOCATION);
+			}
+			IPath locationPath = null == location ? null : new Path(location);
+			facetProj = ProjectFacetsManager.create(model.getStringProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME), locationPath, monitor);
+		}
+		if (model.isProperty(IFacetProjectCreationDataModelProperties.FACET_RUNTIME))
+		{
+			IRuntime runtime = (IRuntime) model.getProperty(IFacetProjectCreationDataModelProperties.FACET_RUNTIME);
+			IRuntime existingRuntime = facetProj.getPrimaryRuntime();
+			if (runtime != null && (existingRuntime == null || !runtime.equals(existingRuntime))) {
+				facetProj.setTargetedRuntimes(Collections.singleton(runtime), null);
+			}
+		}
+		return facetProj;
+	}
 }
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/FacetProjectCreationOperation.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/FacetProjectCreationOperation.java
index abdcd14..c85ad06 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/FacetProjectCreationOperation.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/FacetProjectCreationOperation.java
@@ -25,9 +25,9 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties;
 import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
+import org.eclipse.wst.common.componentcore.internal.ModulecorePlugin;
 import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
 import org.eclipse.wst.common.frameworks.internal.operations.IProjectCreationPropertiesNew;
@@ -106,10 +106,10 @@
 			}
 
 		} catch (CoreException e) {
-			Logger.getLogger().logError(e);
+			ModulecorePlugin.logError(e);
 			throw new ExecutionException(e.getMessage(), e);
 		} catch (Exception e) {
-			Logger.getLogger().logError(e);
+			ModulecorePlugin.logError(e);
 		}
 		return OK_STATUS;
 	}
@@ -127,7 +127,7 @@
 			if (!actions.isEmpty())
 				facetProj.modify(actions, null);
 		} catch (CoreException e) {
-			Logger.getLogger().logError(e);
+			ModulecorePlugin.logError(e);
 		}
 	}
 
@@ -153,9 +153,16 @@
 	public static void addDefaultFactets(IFacetedProject facetProj, IRuntime runtime) throws ExecutionException {
 		
 			if (runtime != null) {
-				final IFacetedProjectWorkingCopy fpjwc = facetProj.createWorkingCopy();
-				Set<IProjectFacetVersion> presetFacets = fpjwc.getDefaultConfiguration().getProjectFacets();
-				addDefaultFacets(facetProj, presetFacets);
+				IFacetedProjectWorkingCopy fpjwc = null;
+				try{
+					fpjwc = facetProj.createWorkingCopy();
+					Set<IProjectFacetVersion> presetFacets = fpjwc.getDefaultConfiguration().getProjectFacets();
+					addDefaultFacets(facetProj, presetFacets);
+				} finally{
+					if(fpjwc != null){
+						fpjwc.dispose();
+					}
+				}
 			}
 		
 	}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ProjectMigratorDataModelOperation.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ProjectMigratorDataModelOperation.java
index d507389..9587406 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ProjectMigratorDataModelOperation.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ProjectMigratorDataModelOperation.java
@@ -22,6 +22,12 @@
 import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
 import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
 
+/**
+ * This has been deprecated since WTP 3.1.2 and will be deleted post WTP 3.2.
+ * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=292934
+ * @deprecated 
+ * @author jsholl
+ */
 public class ProjectMigratorDataModelOperation extends AbstractDataModelOperation {
 
 	public ProjectMigratorDataModelOperation(IDataModel model) {
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/RemoveReferenceComponentOperation.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/RemoveReferenceComponentOperation.java
index bb1f2c3..65b5ea9 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/RemoveReferenceComponentOperation.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/RemoveReferenceComponentOperation.java
@@ -22,8 +22,8 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
-import org.eclipse.jem.util.logger.proxy.Logger;
 import org.eclipse.wst.common.componentcore.datamodel.properties.ICreateReferenceComponentsDataModelProperties;
+import org.eclipse.wst.common.componentcore.internal.ModulecorePlugin;
 import org.eclipse.wst.common.componentcore.internal.resources.VirtualComponent;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
 import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
@@ -90,7 +90,7 @@
 		try {
 			ProjectUtilities.removeReferenceProjects(sourceComp.getProject(),targetprojectList);
 		} catch (CoreException e) {
-			Logger.getLogger().logError(e);
+			ModulecorePlugin.logError(e);
 		}		
 		
 	}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/RemoveReferenceDataModelProvider.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/RemoveReferenceDataModelProvider.java
new file mode 100644
index 0000000..58086c4
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/RemoveReferenceDataModelProvider.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * 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
+ *******************************************************************************/
+package org.eclipse.wst.common.componentcore.internal.operation;
+
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+
+/**
+ * This class is meant to  be an alternative to RemoveReferenceComponentsDataModelProvider
+ * in order to remove pre-made or pre-crafted IVirtualReferences, rather than 
+ * searching for their individual properties
+ */
+public class RemoveReferenceDataModelProvider extends AddReferenceDataModelProvider {
+
+	public RemoveReferenceDataModelProvider() {
+		super();
+	}
+
+	public IDataModelOperation getDefaultOperation() {
+		return new RemoveReferenceOperation(model);
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/RemoveReferenceOperation.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/RemoveReferenceOperation.java
new file mode 100644
index 0000000..fcc3b1a
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/RemoveReferenceOperation.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * 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.componentcore.internal.operation;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IAddReferenceDataModelProperties;
+import org.eclipse.wst.common.componentcore.internal.ModulecorePlugin;
+import org.eclipse.wst.common.componentcore.internal.resources.VirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+/**
+ * This class is meant to be an alternative to RemoveReferenceComponentOperation
+ * in order to remove pre-made or pre-crafted IVirtualReferences, rather than 
+ * searching for their individual properties
+ */
+public class RemoveReferenceOperation extends AbstractDataModelOperation {
+
+	public RemoveReferenceOperation() {
+		super();
+	}
+
+	public RemoveReferenceOperation(IDataModel model) {
+		super(model);
+	}
+
+	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		removeReferences(monitor);
+		return OK_STATUS;
+	}
+
+	protected List<IVirtualReference> getListFromModel(IDataModel model) {
+		Object value = model.getProperty(IAddReferenceDataModelProperties.TARGET_REFERENCE_LIST);
+		List<IVirtualReference> modList = value instanceof List ?  (List<IVirtualReference>)value : Arrays.asList(new IVirtualReference[]{(IVirtualReference)value});
+		return modList;
+	}
+
+	protected void removeReferences(IProgressMonitor monitor) {
+		
+		IVirtualComponent sourceComp = (IVirtualComponent) model.getProperty(IAddReferenceDataModelProperties.SOURCE_COMPONENT);
+		if (sourceComp == null || !sourceComp.getProject().isAccessible() || sourceComp.isBinary()) return;
+		
+		IVirtualReference [] existingReferencesArray = sourceComp.getReferences();
+		if(existingReferencesArray == null || existingReferencesArray.length == 0){
+			return;
+		}
+		
+		List<IVirtualReference> existingReferences = new ArrayList<IVirtualReference>();
+		existingReferences.addAll(Arrays.asList(existingReferencesArray));
+		List<IVirtualReference> modList = getListFromModel(model);
+		List targetprojectList = new ArrayList();
+		for (int i = 0; i < modList.size() && !existingReferences.isEmpty(); i++) {
+			IVirtualReference ref = modList.get(i);
+			if (ref.getReferencedComponent()==null )
+				continue;
+
+			IVirtualReference existing = findMatchingReference(existingReferences, 
+					ref.getReferencedComponent(), ref.getRuntimePath());
+			//if a ref was found matching the specified deployPath, then remove it
+			if(existing != null){
+				removeRefereneceInComponent(sourceComp, existing);
+				existingReferences.remove(existing);
+				//after removing the ref, check to see if it was the last ref removed to that component
+				//and if it was, then also remove the project reference
+				existing = findMatchingReference(existingReferences, ref.getReferencedComponent());
+				if(existing == null){
+					IProject targetProject = ref.getReferencedComponent().getProject();
+					targetprojectList.add(targetProject);
+				}
+			}
+		}
+		
+		try {
+			ProjectUtilities.removeReferenceProjects(sourceComp.getProject(),targetprojectList);
+		} catch (CoreException e) {
+			ModulecorePlugin.logError(e);
+		}		
+		
+	}
+
+	private IVirtualReference findMatchingReference(List existingReferences, IVirtualComponent comp, IPath path) {
+		for(int i=0;i<existingReferences.size(); i++){
+			IVirtualReference ref = (IVirtualReference)existingReferences.get(i);
+			IVirtualComponent c = ref.getReferencedComponent();
+			if(c != null && c.getName().equals(comp.getName())){
+				if(path == null){
+					return ref;
+				} else if(path.equals(ref.getRuntimePath())){
+					return ref;
+				}
+			}
+		}
+		return null;
+	}
+
+	private IVirtualReference findMatchingReference(List existingReferences, IVirtualComponent comp) {
+		return findMatchingReference(existingReferences, comp, null);
+	}
+
+	protected void removeRefereneceInComponent(IVirtualComponent component, IVirtualReference reference) {
+		((VirtualComponent)component.getComponent()).removeReference(reference);
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ServerContextRootDataModelProvider.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ServerContextRootDataModelProvider.java
new file mode 100644
index 0000000..01ded49
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ServerContextRootDataModelProvider.java
@@ -0,0 +1,39 @@
+package org.eclipse.wst.common.componentcore.internal.operation;
+
+/*******************************************************************************
+ * Copyright (c) 2008 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
+ *******************************************************************************/
+
+import java.util.Set;
+
+import org.eclipse.wst.common.componentcore.datamodel.properties.IServerContextRootDataModelProperties;
+import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModelOperation;
+
+public class ServerContextRootDataModelProvider 
+ extends AbstractDataModelProvider
+ implements IServerContextRootDataModelProperties{
+
+	public ServerContextRootDataModelProvider(){
+		super();
+	}
+
+	public Set getPropertyNames() {
+		Set names = super.getPropertyNames();
+		names.add(PROJECT);
+		names.add(CONTEXT_ROOT);
+		return names;
+	}
+	
+	public IDataModelOperation getDefaultOperation() {
+		return new ServerContextRootUpdateOperation(model);
+	}
+	
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ServerContextRootUpdateOperation.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ServerContextRootUpdateOperation.java
new file mode 100644
index 0000000..962b731
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/operation/ServerContextRootUpdateOperation.java
@@ -0,0 +1,45 @@
+package org.eclipse.wst.common.componentcore.internal.operation;
+
+/*******************************************************************************
+ * Copyright (c) 2008 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
+ *******************************************************************************/
+
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IServerContextRootDataModelProperties;
+import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
+import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
+
+public class ServerContextRootUpdateOperation 
+ extends  AbstractDataModelOperation 
+ implements IServerContextRootDataModelProperties{
+	
+
+	public ServerContextRootUpdateOperation(IDataModel model) {
+		super(model);
+	}
+
+	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
+		IProject project = (IProject)model.getProperty( IServerContextRootDataModelProperties.PROJECT );
+		String contextRoot = model.getStringProperty( IServerContextRootDataModelProperties.CONTEXT_ROOT );
+		if (contextRoot != null) {
+			IVirtualComponent comp = ComponentCore.createComponent(project);
+			comp.setMetaProperty(IModuleConstants.CONTEXTROOT, contextRoot);	
+		}
+		return OK_STATUS;
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/AbstractResourceListVirtualComponent.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/AbstractResourceListVirtualComponent.java
new file mode 100644
index 0000000..838187d
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/AbstractResourceListVirtualComponent.java
@@ -0,0 +1,162 @@
+/******************************************************************************* 
+ * Copyright (c) 2009 Red Hat, Inc. 
+ * Distributed under license by Red Hat, Inc. All rights reserved. 
+ * This program is 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: 
+ * Red Hat, Inc. - initial API and implementation 
+ ******************************************************************************/ 
+package org.eclipse.wst.common.componentcore.internal.resources;
+
+import java.util.Map;
+import java.util.Properties;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+
+public abstract class AbstractResourceListVirtualComponent implements IVirtualComponent {
+	protected IProject project;
+	protected IVirtualComponent referencingComp;	
+
+	public AbstractResourceListVirtualComponent(IProject p, IVirtualComponent referencingComponent) {
+		this.project = p;
+		this.referencingComp = referencingComponent;
+	}
+	
+	@Override
+	public boolean equals(Object o) {
+		if(this == o){
+			return true;
+		}
+		if(o == null){
+			return false;
+		}
+		if(!this.getClass().equals(o.getClass())){
+			return false;
+		}
+		AbstractResourceListVirtualComponent other = (AbstractResourceListVirtualComponent)o;
+		return (project == null ? other.project == null : project.equals(other.project)) && 
+			   (referencingComp == null ? other.referencingComp == null : referencingComp.equals(other.referencingComp));
+	}
+	
+	@Override
+	public int hashCode() {
+		return super.hashCode() + (project == null ? 0 : project.hashCode()) + (referencingComp == null ? 0 : referencingComp.hashCode());
+	}
+	
+
+	public void create(int updateFlags, IProgressMonitor aMonitor)
+			throws CoreException {
+		// Ignore
+	}
+
+	public boolean exists() {
+		return true;
+	}
+
+	public IVirtualComponent getComponent() {
+		return this;
+	}
+
+	public String getName() {
+		return getId();
+	}
+
+	public String getDeployedName() {
+		return getName();
+	}
+
+	public String getId() {
+		String firstSegment = getFirstIdSegment();
+		if (project != null && project.equals(
+				referencingComp.getProject()))
+			return firstSegment; 
+		return firstSegment + Path.SEPARATOR + project.getName();
+	}
+
+	protected abstract String getFirstIdSegment();
+	
+	public IProject getProject() {
+		return project;
+	}
+
+	public IVirtualComponent[] getReferencingComponents() {
+		return referencingComp == null ? new IVirtualComponent[] {}
+				: new IVirtualComponent[] { referencingComp };
+	}
+
+	public IVirtualFolder getRootFolder() {
+		// Creates a new instance each time to ensure it's not cached
+		IContainer[] containers = getUnderlyingContainers();
+		IResource[] looseResources = getLooseResources();
+		ResourceListVirtualFolder folder = 
+			new ResourceListVirtualFolder(project, new Path("/"), containers, looseResources); //$NON-NLS-1$
+		return folder;
+	}
+
+	protected abstract IContainer[] getUnderlyingContainers();
+	protected abstract IResource[] getLooseResources();
+	
+	public Properties getMetaProperties() {
+		return null;
+	}
+
+	public IPath[] getMetaResources() {
+		return null;
+	}
+
+	public IVirtualReference getReference(String aComponentName) {
+		// Ignore
+		return null;
+	}
+
+	public IVirtualReference[] getReferences() {
+		// Ignore; no children
+		return new IVirtualReference[] {};
+	}
+
+	public IVirtualReference[] getReferences(Map<String, Object> options) {
+		// Ignore, no children
+		return new IVirtualReference[]{};
+	}
+
+	
+	public boolean isBinary() {
+		return false;
+	}
+
+	public void setMetaProperties(Properties properties) {
+		// Ignore
+	}
+
+	public void setMetaProperty(String name, String value) {
+		// Ignore
+	}
+
+	public void setMetaResources(IPath[] theMetaResourcePaths) {
+		// Ignore
+	}
+
+	public void setReferences(IVirtualReference[] theReferences) {
+		// Ignore
+	}
+
+	public Object getAdapter(Class adapter) {
+		// Ignore
+		return null;
+	}
+
+	public void addReferences(IVirtualReference[] references) {
+		// Ignore
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/ResourceListVirtualFolder.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/ResourceListVirtualFolder.java
new file mode 100644
index 0000000..11d89f3
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/ResourceListVirtualFolder.java
@@ -0,0 +1,150 @@
+/******************************************************************************* 
+ * Copyright (c) 2009 Red Hat, Inc. 
+ * Distributed under license by Red Hat, Inc. All rights reserved. 
+ * This program is 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: 
+ * Red Hat, Inc. - initial API and implementation 
+ ******************************************************************************/ 
+package org.eclipse.wst.common.componentcore.internal.resources;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+
+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.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.wst.common.componentcore.resources.IVirtualFile;
+import org.eclipse.wst.common.componentcore.resources.IVirtualResource;
+
+public class ResourceListVirtualFolder extends VirtualFolder {
+
+	public interface ResourceFilter {
+		public boolean accepts(IResource resource);
+	}
+	
+	private ArrayList<IResource> children;
+	private ArrayList<IContainer> underlying;
+	private ResourceFilter filter;
+	public ResourceListVirtualFolder(
+			IProject aComponentProject,
+			IPath aRuntimePath) {
+		super(aComponentProject, aRuntimePath);
+		this.children = new ArrayList<IResource>();
+		this.underlying = new ArrayList<IContainer>();
+	}
+
+	public ResourceListVirtualFolder(
+			IProject aComponentProject,
+			IPath aRuntimePath, IContainer[] underlyingContainers) {
+		this(aComponentProject, aRuntimePath);
+		addUnderlyingResource(underlyingContainers);
+	}
+
+	public ResourceListVirtualFolder(
+			IProject aComponentProject,
+			IPath aRuntimePath, IContainer[] underlyingContainers, 
+			IResource[] looseResources) {
+		this(aComponentProject, aRuntimePath, underlyingContainers);
+		addChildren(looseResources);
+	}
+
+	public void setFilter(ResourceFilter filter) {
+		this.filter = filter;
+	}
+	
+	protected void addUnderlyingResource(IResource resource) {
+		if( resource instanceof IContainer ) { 
+			underlying.add((IContainer)resource);
+			try {
+				IResource[] newChildren = ((IContainer)resource).members();
+				for( int i = 0; i < newChildren.length; i++ ) {
+					children.add(newChildren[i]);
+				}
+			} catch( CoreException ce) {
+				// TODO log
+			}
+		}
+	}
+
+	protected void addUnderlyingResource(IResource[] resources) {
+		for( int i = 0; i < resources.length; i++ ) {
+			addUnderlyingResource(resources[i]);
+		}
+	}
+	
+	protected void addChild(IResource resource) {
+		this.children.add(resource);
+	}
+
+	protected void addChildren(IResource[] resources) {
+		this.children.addAll(Arrays.asList(resources));
+	}
+	
+	@Override
+	public IResource getUnderlyingResource() {
+		return getUnderlyingFolder();
+	}
+	
+	@Override
+	public IResource[] getUnderlyingResources() {
+		return getUnderlyingFolders();
+	}
+
+	@Override
+	public IContainer getUnderlyingFolder() { 
+		return underlying.size() > 0 ? underlying.get(0) : null;
+	}
+	
+	@Override
+	public IContainer[] getUnderlyingFolders() {
+		return underlying.toArray(new IContainer[underlying.size()]);
+	}
+
+	@Override
+	public IVirtualResource[] members(int memberFlags) throws CoreException {
+		HashMap<String, IVirtualResource> virtualResources = new HashMap<String, IVirtualResource>(); // result
+		IResource[] resources = this.children.toArray(new IResource[this.children.size()]);
+		for( int i = 0; i < resources.length; i++ ) {
+			handleResource(resources[i], virtualResources, memberFlags);
+		}
+		Collection c = virtualResources.values();
+		return (IVirtualResource[]) c.toArray(new IVirtualResource[c.size()]);
+	}
+
+	protected void handleResource(IResource resource, HashMap<String, IVirtualResource> map, int memberFlags) throws CoreException {
+		if( filter != null && !filter.accepts(resource))
+			return;
+		
+		if( resource instanceof IFile ) {
+			if( !map.containsKey(resource.getName()) ) {
+				IVirtualFile virtFile = new VirtualFile(getProject(), 
+						getRuntimePath().append(((IFile)resource).getName()), (IFile)resource);
+				map.put(resource.getName(), virtFile);
+				return;
+			} 
+		}// end file
+		else if( resource instanceof IContainer ) {
+			IContainer realContainer = (IContainer) resource;
+			//IResource[] realChildResources = realContainer.members(memberFlags);
+			IVirtualResource previousValue = map.get(resource.getName());
+			if( previousValue != null && previousValue instanceof ResourceListVirtualFolder ) {
+				((ResourceListVirtualFolder)previousValue).addUnderlyingResource(realContainer);
+			} else if( previousValue == null ) {
+				ResourceListVirtualFolder childFolder = 
+					new ResourceListVirtualFolder(getProject(), getRuntimePath().append(resource.getName()));
+				childFolder.addUnderlyingResource(realContainer);
+				if( filter != null )
+					childFolder.setFilter(filter);
+				map.put(resource.getName(), childFolder);
+			}
+		} // end container
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualArchiveComponent.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualArchiveComponent.java
index 0d66c2f..0590619 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualArchiveComponent.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualArchiveComponent.java
@@ -12,6 +12,7 @@
 
 
 import java.io.File;
+import java.util.Map;
 import java.util.Properties;
 
 import org.eclipse.core.resources.IFile;
@@ -42,18 +43,12 @@
 	
 	private static final IVirtualReference[] NO_REFERENCES = new VirtualReference[0];
 	private static final IVirtualComponent[] NO_COMPONENTS = new VirtualComponent[0];
-//	private static final IResource[] NO_RESOURCES = null;
 	private static final IVirtualResource[] NO_VIRTUAL_RESOURCES = null;
 	private static final Properties NO_PROPERTIES = new Properties();
 	private static final IPath[] NO_PATHS = new Path[0];
 
-//	private IPath runtimePath;
+	private IPath runtimePath;
 	private IProject componentProject;
-//	private IVirtualFolder rootFolder;
-	private int flag = 1;
-//	private String archiveLocation;
-
-
 	private IPath archivePath;
 	private String archiveType;
 
@@ -64,10 +59,10 @@
 			throw new NullPointerException();
 		}
 		componentProject = aComponentProject;
-//		runtimePath = aRuntimePath;
+		runtimePath = aRuntimePath;
 
 		String archivePathString = archiveLocation.substring(4, archiveLocation.length());
-		archiveType	= archiveLocation.substring(0, archiveLocation.length() - archivePathString.length() -1);
+		archiveType	= archiveLocation.substring(0, 3);
 		archivePath = new  Path(archivePathString);
 	}
 
@@ -81,6 +76,7 @@
 	
 	public String getDeployedName() {
 		return getName();
+		//return getArchivePath().lastSegment();
 	}
 
 	public void setComponentTypeId(String aComponentTypeId) {
@@ -92,8 +88,8 @@
 	}
 
 	public boolean isBinary() {
-		boolean ret = (flag & BINARY) == 1 ? true : false;
-		return ret;
+		int x = BINARY;
+		return true;
 	}
 
 	public IPath[] getMetaResources() {
@@ -108,10 +104,22 @@
 
 	}
 
+	/**
+	 * The implementation should be protected. Deprecated as of WTP 3.2 
+	 * You should convert to a File or IFile and then get the extension. 
+	 * @return
+	 */
+	@Deprecated
 	public String getFileExtension() {
 		return archivePath.getFileExtension();
 	}
 
+	/**
+	 * The implementation should be protected. Deprecated as of WTP 3.2
+	 * You should convert to an IFile and get it's full path
+	 * @return
+	 */
+	@Deprecated
 	public IPath getWorkspaceRelativePath() {
 		if( archivePath.segmentCount() > 1 ){
 			IFile aFile = ResourcesPlugin.getWorkspace().getRoot().getFile(archivePath);
@@ -121,6 +129,12 @@
 		return null;
 	}
 
+	/**
+	 * The implementation should be protected. Deprecated as of WTP 3.2
+	 * You should convert to an IFile and use IFile.getProjectRelativePath()
+	 * @return
+	 */
+	@Deprecated
 	public IPath getProjectRelativePath() {
 		IFile aFile = ResourcesPlugin.getWorkspace().getRoot().getFile(getWorkspaceRelativePath());
 		if (aFile.exists())
@@ -133,9 +147,13 @@
 	}
 
 	public IPath getRuntimePath() {
-		return ROOT;
+		return runtimePath == null ? ROOT : runtimePath;
 	}
 
+	public IPath getArchivePath() {
+		return archivePath;
+	}
+	
 	public boolean isAccessible() {
 		return true;
 	}
@@ -151,6 +169,10 @@
 	public void create(int updateFlags, IProgressMonitor aMonitor) throws CoreException {
 
 	}
+	
+	public IVirtualReference[] getReferences(Map<String, Object> options) {
+		return NO_REFERENCES;
+	}
 
 	public IVirtualReference[] getReferences() {
 		return NO_REFERENCES;
@@ -169,17 +191,8 @@
 	}
 
 	public boolean exists() {
-		boolean exists = false;
-		java.io.File diskFile = getUnderlyingDiskFile();
-		if( diskFile != null )
-			exists = diskFile.exists();
-		
-		if( !exists ){
-			IFile utilityJar = getUnderlyingWorkbenchFile();
-			if( utilityJar != null )
-				exists =  utilityJar.exists();
-		}
-		return exists;
+		File f = (File)getAdapter(File.class);
+		return f != null && f.exists();
 	}
 
 	public IVirtualFolder getRootFolder() {
@@ -191,7 +204,26 @@
 	}
 
 
+	/**
+	 * Guaranteed accepted adapters and behaviours:
+	 * org.eclipse.core.runtime.IPath - if a workspace file, returns ifile.getFullPath(),  else new Path(java.io.File.getAbsolutePath())
+	 * java.io.File - the file, whether in workspace or out, this will get the actual file if there is one
+	 * org.eclipse.core.resources.IFile - the workspace file, if it exists
+	 */
 	public Object getAdapter(Class adapterType) {
+		if( File.class.equals(adapterType))
+			return getUnderlyingDiskFile();
+		if( IFile.class.equals(adapterType)) {
+			return getUnderlyingWorkbenchFile();
+		}
+		if( IPath.class.equals(adapterType)) {
+			IFile f = getUnderlyingWorkbenchFile();
+			if( f != null ) 
+				return f.getFullPath();
+			File f2 = getUnderlyingDiskFile();
+			if( f2 != null )
+				return new Path(f2.getAbsolutePath());
+		}
 		return Platform.getAdapterManager().getAdapter(this, adapterType);
 	}
 
@@ -224,12 +256,25 @@
 	public void setMetaProperties(Properties properties) {
 
 	}
+	
+	/**
+	 * The implementation should be protected
+	 * You should use getAdapter(IFile.class)
+	 * @return
+	 */
+	@Deprecated
 	public IFile getUnderlyingWorkbenchFile() {
 		if (getWorkspaceRelativePath()==null)
 			return null;
 		return ResourcesPlugin.getWorkspace().getRoot().getFile(getWorkspaceRelativePath());
 	}
 
+	/**
+	 * The implementation should be protected
+	 * You should use getAdapter(File.class)
+	 * @return
+	 */
+	@Deprecated
 	public File getUnderlyingDiskFile() {
 		String osPath = null;
 		IPath loc = null;
@@ -266,5 +311,5 @@
 		}
 		return super.toString();
 	}
-	
+
 }
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualComponent.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualComponent.java
index ce24d69..a9bdfb8 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualComponent.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualComponent.java
@@ -12,9 +12,13 @@
 
 import java.util.ArrayList;
 import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.Properties;
+import java.util.Set;
 
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
@@ -23,18 +27,22 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.Platform;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.wst.common.componentcore.ComponentCore;
 import org.eclipse.wst.common.componentcore.ModuleCoreNature;
 import org.eclipse.wst.common.componentcore.internal.ComponentcoreFactory;
 import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
-import org.eclipse.wst.common.componentcore.internal.DependencyType;
 import org.eclipse.wst.common.componentcore.internal.ModulecorePlugin;
 import org.eclipse.wst.common.componentcore.internal.Property;
 import org.eclipse.wst.common.componentcore.internal.ReferencedComponent;
 import org.eclipse.wst.common.componentcore.internal.StructureEdit;
 import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.internal.builder.DependencyGraphManager;
-import org.eclipse.wst.common.componentcore.internal.impl.ModuleURIUtil;
+import org.eclipse.wst.common.componentcore.internal.builder.IDependencyGraph;
+import org.eclipse.wst.common.componentcore.resolvers.IReferenceResolver;
+import org.eclipse.wst.common.componentcore.resolvers.ReferenceResolverUtil;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
 import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
 import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
@@ -49,7 +57,81 @@
 	String componentTypeId;
 	private int flag = 0;
 	
+	// Cache variables
+	String name = null;
+	String deploymentName = null;
+	Map <String, IVirtualReference> referenceMap = null;
+	IVirtualReference[] referencesArray = null;
+	Properties metaProperties = null;
+	IPath[] cacheMetaResources = null;
+	IVirtualReference[] allReferences = null;
+	
+	Resource projectResource;
+	protected ResourceAdapter resourceAdapter = new ResourceAdapter();
+	
+	protected class ResourceAdapter extends AdapterImpl {
+		public void notifyChanged(Notification notification) {
+			if (notification.getFeatureID(null) == Resource.RESOURCE__IS_MODIFIED)
+				resourceChanged((Resource) notification.getNotifier());
+		}
 
+		@Override
+		public boolean equals(Object arg0) {
+			
+			return this.getClass().equals(arg0.getClass());
+		}
+
+		@Override
+		public int hashCode() {
+			
+			return getClass().hashCode();
+		}
+	}
+	
+	protected void resourceChanged(Resource aResource) {
+		clearCache();
+	}
+	
+	private void addManagedResource() {
+		if(projectResource == null)
+			projectResource = createResource();
+		if (projectResource != null && !projectResource.eAdapters().contains(resourceAdapter))
+			projectResource.eAdapters().add(resourceAdapter);
+	}
+	
+	protected void removeResource() {
+		if(projectResource != null) {
+			projectResource.eAdapters().remove(resourceAdapter);
+			projectResource = null;
+		}
+	}
+	
+	protected void initializeResource() {
+		projectResource = createResource();
+		addManagedResource();
+	}
+	
+	protected Resource createResource() {
+		StructureEdit core = null;
+		Resource res = null;
+        try {
+            core = StructureEdit.getStructureEditForRead(getProject());
+            if (core == null)
+            	return null;
+            WorkbenchComponent component = core.getComponent();
+            if(component != null)
+            	res = component.eResource();
+        } finally {
+            if(core != null)
+                core.dispose();
+        }
+        return res;
+	}
+	
+	public void dispose() {
+		removeResource();
+	}
+	
 	protected VirtualComponent(){
 	}
 	
@@ -60,6 +142,7 @@
 		componentProject = aProject;
 		runtimePath = aRuntimePath;
 		rootFolder = ComponentCore.createFolder(componentProject, new Path("/")); //$NON-NLS-1$
+		initializeResource();
 	}
 	
 	public IVirtualComponent getComponent() {
@@ -67,10 +150,17 @@
 	}
 	
 	public String getName() {
-		return getProject().getName();
+		if(name == null){
+			name = getProject().getName();
+		}
+		return name;
 	}
 	
 	public String getDeployedName() {
+		if(deploymentName != null) {
+			return deploymentName;
+		}
+			
 		StructureEdit core = null;
 		IProject project = getProject();
 		try {
@@ -78,15 +168,18 @@
 				core = StructureEdit.getStructureEditForRead(project);
 				if(core != null && core.getComponent() != null){
 					WorkbenchComponent component = core.getComponent();
-					if (component.getName()!=null && component.getName().length()>0)
-						return component.getName();
+					if (component.getName()!=null && component.getName().length()>0) {
+						deploymentName = component.getName();
+						return deploymentName;
+					}
 				}
 			}
 		} finally {
 			if(core != null)
 				core.dispose();
 		}
-		return getProject().getName();
+		deploymentName = getProject().getName();
+		return deploymentName;
 	}
 	
 	public boolean exists() { 
@@ -96,8 +189,13 @@
 	
 
 	public Properties getMetaProperties() {
+		if(metaProperties != null) {
+			return metaProperties;
+		}
+		
         StructureEdit core = null;
         Properties props = new Properties();
+        metaProperties = props;
         try {
             core = StructureEdit.getStructureEditForRead(getProject());
             if (core == null)
@@ -118,7 +216,8 @@
                     props.setProperty(name, value);
                 }
             }
-            return props; 
+            metaProperties =  props; 
+            return props;
         } finally {
             if(core != null)
                 core.dispose();
@@ -149,6 +248,7 @@
 		            // Add new property
 		            propList.add(prop);
 		         }
+		        clearCache();
 			} 
         } finally {
             if(core != null){
@@ -164,6 +264,7 @@
             core = StructureEdit.getStructureEditForWrite(getProject());
             WorkbenchComponent component = core.getComponent(); 
             component.getProperties().clear();
+            clearCache();
         } finally {
             if(core != null){
             	core.saveIfNecessary(null);
@@ -191,7 +292,7 @@
 			prop.setName(key);
 			prop.setValue(value);
 			component.getProperties().add(prop);
-            
+			clearCache();            
         } finally {
             if(core != null){
             	core.saveIfNecessary(null);
@@ -201,6 +302,9 @@
 	}
 	
 	public IPath[] getMetaResources() {
+		if(cacheMetaResources != null)
+			return cacheMetaResources;
+		
 		StructureEdit moduleCore = null;
 		List metaResources = new ArrayList();
 		try {
@@ -215,7 +319,8 @@
 				moduleCore.dispose();
 			}
 		}
-		return (IPath[]) metaResources.toArray(new IPath[metaResources.size()]);
+		cacheMetaResources = (IPath[]) metaResources.toArray(new IPath[metaResources.size()]);
+		return cacheMetaResources;
 	}
 
 	public void setMetaResources(IPath[] theMetaResourcePaths) {
@@ -228,6 +333,7 @@
 					if (!component.getMetadataResources().contains(theMetaResourcePaths[i]))
 						component.getMetadataResources().add(theMetaResourcePaths[i]);
 				}
+				clearCache();
 			}
 		} finally {
 			if (moduleCore != null) {
@@ -267,7 +373,11 @@
 		}
 	}	
 
-	public IVirtualReference[] getReferences() { 
+	public IVirtualReference[] getReferences(Map<String, Object> options) {
+//		if(referencesArray != null) {
+//			return referencesArray;
+//		}
+		
 		StructureEdit core = null;
 		List references = new ArrayList();
 		try {
@@ -281,20 +391,29 @@
 						if (referencedComponent==null) 
 							continue;
 						IVirtualReference vReference = StructureEdit.createVirtualReference(this, referencedComponent);
-						if( vReference != null ){
-							vReference.setArchiveName( referencedComponent.getArchiveName() );
-						}
-						if (vReference != null && vReference.getReferencedComponent() != null && vReference.getReferencedComponent().exists())
+						if (vReference != null && vReference.getReferencedComponent() != null && vReference.getReferencedComponent().exists()){
 							references.add(vReference); 
+							customizeCreatedReference(vReference, referencedComponent.getDependentObject());
+						}
 					}
 				}
 			}
-			return (IVirtualReference[]) references.toArray(new IVirtualReference[references.size()]);
+			referencesArray = (IVirtualReference[]) references.toArray(new IVirtualReference[references.size()]);
+			return referencesArray;
 		} finally {
 			if(core != null)
 				core.dispose();
 		}		
 	}
+	
+	protected void customizeCreatedReference(IVirtualReference reference, Object dependentObject) {
+		// Do Nothing
+	}
+	
+	public IVirtualReference[] getReferences() { 
+		HashMap<String, Object> map = new HashMap<String, Object>();
+		return getReferences(map);
+	}
 
 	public void addReferences(IVirtualReference[] references) {
 		if (references==null || references.length==0)
@@ -304,28 +423,18 @@
 			core = StructureEdit.getStructureEditForWrite(getProject());
 			if (core == null)
 				return;
+			clearCache();
 			WorkbenchComponent component = core.getComponent();
 			ReferencedComponent referencedComponent = null;
 			ComponentcoreFactory factory = ComponentcorePackage.eINSTANCE.getComponentcoreFactory();
+			IReferenceResolver resolver = null;
 			for (int i=0; i<references.length; i++) {
 				if (references[i] == null)
 					continue;
-				referencedComponent = factory.createReferencedComponent();				
-				referencedComponent.setDependencyType(DependencyType.get(references[i].getDependencyType()));
-				referencedComponent.setRuntimePath(references[i].getRuntimePath());
-
-				IVirtualComponent comp = references[i].getReferencedComponent();
-				if(comp!=null && !comp.isBinary())
-					referencedComponent.setHandle(ModuleURIUtil.fullyQualifyURI(comp.getProject()));
-				else if (comp!=null)
-					referencedComponent.setHandle(ModuleURIUtil.archiveComponentfullyQualifyURI(comp.getName()));
+				resolver = ReferenceResolverUtil.getDefault().getResolver(references[i]);
+				referencedComponent = resolver.resolve(references[i]);
 				if (component != null)
 					component.getReferencedComponents().add(referencedComponent);
-				referencedComponent.setArchiveName(references[i].getArchiveName());
-			}
-			//clean up any old obsolete references
-			if (component != null){
-				cleanUpReferences(component);
 			}
 		} finally {
 			if(core != null) {
@@ -335,41 +444,22 @@
 		}	
 	}
 	
-	private void cleanUpReferences(WorkbenchComponent component) {
-		List referencedComponents = component.getReferencedComponents();
-		for (Iterator iter = referencedComponents.iterator(); iter.hasNext();) {
-			ReferencedComponent referencedComponent = (ReferencedComponent) iter.next();
-			if (referencedComponent==null) 
-				continue;
-			IVirtualReference vReference = StructureEdit.createVirtualReference(this, referencedComponent);
-			if (vReference == null || vReference.getReferencedComponent() == null || !vReference.getReferencedComponent().exists()){
-				iter.remove();
-			}
-		}
-	}
-	
 	public void setReferences(IVirtualReference[] references) { 
 		StructureEdit core = null;
 		try {
 			core = StructureEdit.getStructureEditForWrite(getProject());
 			WorkbenchComponent component = core.getComponent();
 			ReferencedComponent referencedComponent = null;
-			  
+			 
+			clearCache();
 			component.getReferencedComponents().clear();
 			ComponentcoreFactory factory = ComponentcorePackage.eINSTANCE.getComponentcoreFactory();
+			IReferenceResolver resolver = null;
 			for (int i=0; i<references.length; i++) {
-				referencedComponent = factory.createReferencedComponent();				
-				referencedComponent.setDependencyType(DependencyType.get(references[i].getDependencyType()));
-				referencedComponent.setRuntimePath(references[i].getRuntimePath());
-
-				IVirtualComponent comp = references[i].getReferencedComponent();
-				if( !comp.isBinary())
-					referencedComponent.setHandle(ModuleURIUtil.fullyQualifyURI(references[i].getReferencedComponent().getProject()));
-				else
-					referencedComponent.setHandle(ModuleURIUtil.archiveComponentfullyQualifyURI(references[i].getReferencedComponent().getName()));
-				
-				referencedComponent.setArchiveName(references[i].getArchiveName());
-				component.getReferencedComponents().add(referencedComponent);
+				resolver = ReferenceResolverUtil.getDefault().getResolver(references[i]);
+				referencedComponent = resolver.resolve(references[i]);
+				if( referencedComponent != null)
+					component.getReferencedComponents().add(referencedComponent);
 			}
 			 
 		} finally {
@@ -381,6 +471,7 @@
 	}
 
 	public int hashCode() {
+		if(componentProject == null) return super.hashCode();  //If component factory instance, don't use project to hash
 		int hash = HashUtil.SEED;
 		hash = HashUtil.hash(hash, getProject().getName());
 		hash = HashUtil.hash(hash, getName());
@@ -388,7 +479,9 @@
 		return hash;
 	}
 	
-	public boolean equals(Object anOther) { 
+	public boolean equals(Object anOther) {
+		if(componentProject == null) return super.equals(anOther);  //If component factory instance, don't use project to compare
+		if(anOther == this) return true;
 		if(anOther instanceof IVirtualComponent) {
 			IVirtualComponent otherComponent = (IVirtualComponent) anOther;
 			return getProject().equals(otherComponent.getProject()) && 
@@ -399,12 +492,20 @@
 	}
 
 	public IVirtualReference getReference(String aComponentName) {
+		if(referenceMap == null){
+			referenceMap = new Hashtable<String, IVirtualReference>();
+		} else if(referenceMap.containsKey(aComponentName)) {
+			return (IVirtualReference) referenceMap.get(aComponentName);
+		}
+		
 		IVirtualReference[] refs = getReferences();
 		for (int i = 0; i < refs.length; i++) {
 			IVirtualReference reference = refs[i];
 			if( reference.getReferencedComponent() != null ){
-				if (reference.getReferencedComponent().getName().equals(aComponentName))
+				if (reference.getReferencedComponent().getName().equals(aComponentName)) {
+					referenceMap.put(aComponentName, reference);
 					return reference;
+				}
 			}
 		}
 		return null;
@@ -429,10 +530,11 @@
 	 * @return array of components
 	 */
 	public IVirtualComponent[] getReferencingComponents() {
-		IProject[] handles =  DependencyGraphManager.getInstance().getDependencyGraph().getReferencingComponents(getProject());
-		IVirtualComponent[] result = new IVirtualComponent[handles.length];
-		for (int i=0; i<handles.length; i++)
-			result[i] = ComponentCore.createComponent(handles[i]);
+		Set<IProject> projects = IDependencyGraph.INSTANCE.getReferencingComponents(getProject());
+		IVirtualComponent[] result = new IVirtualComponent[projects.size()];
+		Iterator<IProject> i = projects.iterator();
+		for (int j=0; j<projects.size(); j++)
+			result[j] = ComponentCore.createComponent(i.next());
 		return result;
 	}
 	
@@ -445,13 +547,18 @@
 	public void removeReference(IVirtualReference aReference) {
 		StructureEdit core = null;
 		try {
-			core = StructureEdit.getStructureEditForWrite(getProject());
-			if (core == null || aReference == null)
+			if(aReference == null)
 				return;
+			core = StructureEdit.getStructureEditForWrite(getProject());
+			if (core == null) {
+				return;
+			}
+			clearCache();
 			WorkbenchComponent component = core.getComponent();
 			ReferencedComponent refComponent = getWorkbenchReferencedComponent(aReference, component);
-			if (component != null && refComponent != null)
+			if (component != null && refComponent != null) {
 				component.getReferencedComponents().remove(refComponent);
+			}
 		} finally {
 			if(core != null) {
 				core.saveIfNecessary(null);
@@ -472,25 +579,26 @@
 		if (aReference == null || aReference.getReferencedComponent() == null || component == null)
 			return null;
 		List referencedComponents = component.getReferencedComponents();
+		URI uri = ReferenceResolverUtil.getDefault().getResolver(aReference).resolve(aReference).getHandle(); 
 		for (int i=0; i<referencedComponents.size(); i++) {
 			ReferencedComponent ref = (ReferencedComponent) referencedComponents.get(i);
-			if (!aReference.getReferencedComponent().isBinary()) {
-				if (ref.getHandle().equals(ModuleURIUtil.fullyQualifyURI(aReference.getReferencedComponent().getProject())))
-					return ref;	
-			} 
-			else {
-				if (ref.getHandle().equals(ModuleURIUtil.archiveComponentfullyQualifyURI(aReference.getReferencedComponent().getName())))
-					return ref;
-			}	
+			if( ref.getHandle().equals(uri))
+				return ref;
 		}
 		return null;
 	}
 	
+	protected boolean shouldCacheReferences() {
+		return true;
+	}
 	
 	/**
 	 * @return IVirtualReference[] - All the references of this component, including potentially deleted references
 	 */
 	public IVirtualReference[] getAllReferences() { 
+		if(shouldCacheReferences() && allReferences != null)
+			return allReferences;
+		
 		StructureEdit core = null;
 		List references = new ArrayList();
 		try {
@@ -512,13 +620,26 @@
 					}
 				}
 			}
-			return (IVirtualReference[]) references.toArray(new IVirtualReference[references.size()]);
+			allReferences = (IVirtualReference[]) references.toArray(new IVirtualReference[references.size()]);
+			return allReferences;
 		} finally {
 			if(core != null)
 				core.dispose();
 		}		
 	}
 	
+	protected void clearCache() {
+		name = null;
+		deploymentName = null;
+		if(referenceMap != null) {
+			referenceMap.clear();
+		}
+		referencesArray = null;
+		metaProperties = null;
+		cacheMetaResources = null;
+		allReferences = null;
+	}
+		
 	public String toString() {
 		return componentProject.toString();
 	}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualContainer.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualContainer.java
index 51f4f15..4e06d87 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualContainer.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualContainer.java
@@ -72,29 +72,29 @@
 	}
 
 	public IVirtualResource findMember(IPath aPath, int theSearchFlags) {
-
 		StructureEdit structureEdit = null;
 		try {
-
 			structureEdit = StructureEdit.getStructureEditForRead(getProject());
-			WorkbenchComponent component = structureEdit.getComponent();
-			if (null != component) {
-				ResourceTreeRoot root = ResourceTreeRoot.getDeployResourceTreeRoot(component);
-				ComponentResource[] resources = root.findModuleResources(getRuntimePath().append(aPath), ResourceTreeNode.CREATE_NONE);
-
-				for (int i = 0; i < resources.length; i++) {
-				// return the resources corresponding to the root, not any of the children if its a folder
-					if (resources[i].getRuntimePath().equals(getRuntimePath().append(aPath))) {
-						IResource platformResource = getProject().findMember(resources[i].getSourcePath());
-						if (platformResource == null)
-							platformResource = ResourcesPlugin.getWorkspace().getRoot().findMember(resources[i].getSourcePath());
-						if (platformResource != null) {
-							switch (platformResource.getType()) {
-								case IResource.FOLDER :
-								case IResource.PROJECT :
-									return ComponentCore.createFolder(getProject(), getRuntimePath().append(aPath));
-								case IResource.FILE :
-									return new VirtualFile(getProject(), getRuntimePath().append(aPath));
+			if(structureEdit != null){
+				WorkbenchComponent component = structureEdit.getComponent();
+				if (null != component) {
+					ResourceTreeRoot root = ResourceTreeRoot.getDeployResourceTreeRoot(component);
+					ComponentResource[] resources = root.findModuleResources(getRuntimePath().append(aPath), ResourceTreeNode.CREATE_NONE);
+	
+					for (int i = 0; i < resources.length; i++) {
+					// return the resources corresponding to the root, not any of the children if its a folder
+						if (resources[i].getRuntimePath().equals(getRuntimePath().append(aPath))) {
+							IResource platformResource = getProject().findMember(resources[i].getSourcePath());
+							if (platformResource == null)
+								platformResource = ResourcesPlugin.getWorkspace().getRoot().findMember(resources[i].getSourcePath());
+							if (platformResource != null) {
+								switch (platformResource.getType()) {
+									case IResource.FOLDER :
+									case IResource.PROJECT :
+										return ComponentCore.createFolder(getProject(), getRuntimePath().append(aPath));
+									case IResource.FILE :
+										return new VirtualFile(getProject(), getRuntimePath().append(aPath));
+								}
 							}
 						}
 					}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualFile.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualFile.java
index ee9ec04..9aa66c6 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualFile.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualFile.java
@@ -119,4 +119,15 @@
 		//Default
 	}
 
+	@Override
+	public Object getAdapter(Class adapter) { 
+		if( java.io.File.class.equals(adapter)) {
+			IFile file = getUnderlyingFile();
+			return file.getLocation().toFile();
+		}
+		if( IFile.class.equals(adapter)) {
+			return getUnderlyingFile();
+		}
+		return null;
+	}
 }
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualReference.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualReference.java
index 007b1ce..9e2c736 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualReference.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualReference.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2003, 2006 IBM Corporation and others.
+ * Copyright (c) 2003, 2010 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
@@ -16,15 +16,16 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
-import org.eclipse.wst.common.componentcore.internal.DependencyType;
 import org.eclipse.wst.common.componentcore.internal.ReferencedComponent;
 import org.eclipse.wst.common.componentcore.internal.StructureEdit;
 import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
-import org.eclipse.wst.common.componentcore.internal.impl.ModuleURIUtil;
+import org.eclipse.wst.common.componentcore.resolvers.IReferenceResolver;
+import org.eclipse.wst.common.componentcore.resolvers.ReferenceResolverUtil;
 import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
 import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.frameworks.internal.HashUtil;
 
 public class VirtualReference implements IVirtualReference {
 	
@@ -33,24 +34,31 @@
 	private IPath runtimePath;
 	private int dependencyType;
 	private String archiveName;
-
+	private boolean derived;
 	public VirtualReference() {
 		
 	} 
 	
 	public VirtualReference(IVirtualComponent anEnclosingComponent, IVirtualComponent aReferencedComponent) {
-		this(anEnclosingComponent, aReferencedComponent, new Path(String.valueOf(IPath.SEPARATOR)), DEPENDENCY_TYPE_USES); 
+		this(anEnclosingComponent, aReferencedComponent, new Path(String.valueOf(IPath.SEPARATOR)), DEPENDENCY_TYPE_USES, false); 
 	}
 	
 	public VirtualReference(IVirtualComponent anEnclosingComponent, IVirtualComponent aReferencedComponent, IPath aRuntimePath) {
-		this(anEnclosingComponent, aReferencedComponent, aRuntimePath, DEPENDENCY_TYPE_USES);
+		this(anEnclosingComponent, aReferencedComponent, aRuntimePath, DEPENDENCY_TYPE_USES, false);
 	}
 
-	public VirtualReference(IVirtualComponent anEnclosingComponent, IVirtualComponent aReferencedComponent, IPath aRuntimePath, int aDependencyType) {
+	public VirtualReference(IVirtualComponent anEnclosingComponent, IVirtualComponent aReferencedComponent, 
+			IPath aRuntimePath, int aDependencyType) {
+		this(anEnclosingComponent, aReferencedComponent, aRuntimePath, aDependencyType, false);
+	}
+	
+	public VirtualReference(IVirtualComponent anEnclosingComponent, IVirtualComponent aReferencedComponent, 
+			IPath aRuntimePath, int aDependencyType, boolean isDerived) {
 		enclosingComponent = anEnclosingComponent;
 		referencedComponent = aReferencedComponent;
 		runtimePath = aRuntimePath;
 		dependencyType = aDependencyType;
+		derived = isDerived;
 	}
 
 	public void create(int updateFlags, IProgressMonitor aMonitor) { 
@@ -59,14 +67,8 @@
 			core = StructureEdit.getStructureEditForWrite(enclosingComponent.getProject());
 			WorkbenchComponent component = core.getComponent();
 			List referencedComponents = component.getReferencedComponents();
-			ReferencedComponent refComp = ComponentcorePackage.eINSTANCE.getComponentcoreFactory().createReferencedComponent();
-			if( !referencedComponent.isBinary())
-				refComp.setHandle(ModuleURIUtil.fullyQualifyURI(referencedComponent.getProject()));
-			else
-				refComp.setHandle(ModuleURIUtil.archiveComponentfullyQualifyURI(referencedComponent.getName())); 
-			refComp.setRuntimePath(runtimePath);
-			refComp.setDependencyType(DependencyType.get(dependencyType));
-			refComp.setArchiveName(archiveName);
+			IReferenceResolver resolver = ReferenceResolverUtil.getDefault().getResolver(this);
+			ReferencedComponent refComp = resolver.resolve(this);
 			if(!referencedComponents.contains(refComp)){
 				referencedComponents.add(refComp);
 			}
@@ -123,10 +125,9 @@
 			ReferencedComponent actualReferencedComponent = enclosingCore.findReferencedComponent(enclosingComp, refComp);
 			if (actualReferencedComponent != null) {
 				referencedComponent = aReferencedComponent;
-				if(!referencedComponent.isBinary())
-					actualReferencedComponent.setHandle(ModuleURIUtil.fullyQualifyURI(referencedComponent.getProject()));
-				else
-					actualReferencedComponent.setHandle(ModuleURIUtil.archiveComponentfullyQualifyURI(referencedComponent.getName()));
+				IReferenceResolver resolver = ReferenceResolverUtil.getDefault().getResolver(this);
+				URI uri = resolver.resolve(this).getHandle();
+				actualReferencedComponent.setHandle(uri);
 				actualReferencedComponent.setDependentObject(dependentObject);
 			}
 		} finally {
@@ -148,4 +149,35 @@
 	public void setArchiveName(String archiveName) {
 		this.archiveName = archiveName;
 	}
+	
+	public boolean isDerived() {
+		return derived;
+	}
+	
+	public void setDerived(boolean val) {
+		derived = val;
+	}
+
+	public boolean equals(Object anOther) {
+		if(anOther == null || !(anOther instanceof IVirtualReference)) return false;
+		if(anOther == this) return true;
+		IVirtualReference otherRef = (IVirtualReference) anOther;
+		return (getArchiveName() != null ? getArchiveName().equals(otherRef.getArchiveName()) : (otherRef.getArchiveName() == null ? true : false)) && 
+			   getRuntimePath().equals(otherRef.getRuntimePath()) && 
+			   getEnclosingComponent().equals(otherRef.getEnclosingComponent()) && 
+			   getReferencedComponent().equals(otherRef.getReferencedComponent()) && 
+			   getDependencyType() == otherRef.getDependencyType();
+		
+	}
+
+	public int hashCode() {
+		
+		int hash = HashUtil.SEED;
+		hash = HashUtil.hash(hash, getArchiveName());
+		hash = HashUtil.hash(hash, getRuntimePath());
+		hash = HashUtil.hash(hash, getEnclosingComponent());
+		hash = HashUtil.hash(hash, getReferencedComponent());
+		hash = HashUtil.hash(hash, getDependencyType());
+		return hash;
+	}
 }
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualResource.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualResource.java
index 541a609..c8815de 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualResource.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/resources/VirtualResource.java
@@ -297,20 +297,25 @@
 		StructureEdit moduleCore = null;
 		try {
 			moduleCore = StructureEdit.getStructureEditForWrite(getProject());
-			WorkbenchComponent component = moduleCore.getComponent();
-			ResourceTreeRoot root = ResourceTreeRoot.getDeployResourceTreeRoot(component);
-			ComponentResource[] resources = root.findModuleResources(getRuntimePath(), ResourceTreeNode.CREATE_NONE);
-			if (resources.length > 0) {
-				for (int resourceIndx = 0; resourceIndx < resources.length; resourceIndx++) {
-					if (aProjectRelativeLocation.makeAbsolute().equals(resources[resourceIndx].getSourcePath())) {
-						component.getResources().remove(resources[resourceIndx]);
+			if( moduleCore != null ) {
+				WorkbenchComponent component = moduleCore.getComponent();
+				if (component != null) {
+					ResourceTreeRoot root = ResourceTreeRoot.getDeployResourceTreeRoot(component);
+					ComponentResource[] resources = root.findModuleResources(getRuntimePath(), ResourceTreeNode.CREATE_NONE);
+					if (resources.length > 0) {
+						for (int resourceIndx = 0; resourceIndx < resources.length; resourceIndx++) {
+							if (aProjectRelativeLocation.makeAbsolute().equals(resources[resourceIndx].getSourcePath())) {
+								component.getResources().remove(resources[resourceIndx]);
+							}
+						}
 					}
 				}
 			}
 		}
 		finally {
 			if (moduleCore != null) {
-				moduleCore.saveIfNecessary(monitor);
+				if (getComponent() != null)
+					moduleCore.saveIfNecessary(monitor);
 				moduleCore.dispose();
 			}
 		}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentImplManager.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentImplManager.java
index 2cc2fdc..c9755c6 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentImplManager.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentImplManager.java
@@ -10,17 +10,25 @@
  *******************************************************************************/
 package org.eclipse.wst.common.componentcore.internal.util;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.Map;
-
+import java.util.Set;
 import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResourceDelta;
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.ISafeRunnable;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.core.runtime.SafeRunner;
 import org.eclipse.jem.util.RegistryReader;
+import org.eclipse.jem.util.emf.workbench.ISynchronizerExtender;
+import org.eclipse.jem.util.emf.workbench.ProjectResourceSet;
+import org.eclipse.jem.util.emf.workbench.WorkbenchResourceHelperBase;
 import org.eclipse.wst.common.componentcore.ModuleCoreNature;
 import org.eclipse.wst.common.componentcore.internal.ModulecorePlugin;
 import org.eclipse.wst.common.componentcore.internal.resources.ResourceTimestampMappings;
@@ -31,16 +39,20 @@
 import org.eclipse.wst.common.componentcore.resources.IVirtualFolder;
 import org.eclipse.wst.common.project.facet.core.IFacetedProject;
 import org.eclipse.wst.common.project.facet.core.IProjectFacet;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
 import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
 
-public class ComponentImplManager  {
+
+
+public class ComponentImplManager implements ISynchronizerExtender{
 
 	private static final String NO_FACETS = "NONE";//$NON-NLS-1$
-	
+
 	private static final String COMPONENT_IMPL_EXTENSION_POINT = "componentimpl"; //$NON-NLS-1$
 	private static final String TAG_COMPONENT_IMPL = "componentimpl"; //$NON-NLS-1$
 	private static final String ATT_TYPE = "typeID"; //$NON-NLS-1$
 	private static final String ATT_CLASS = "class"; //$NON-NLS-1$
+	private static final String EXTENDED_ELEMENT="extendedTypeID"; //$NON-NLS-1$
 
 	private static final ComponentImplManager instance = new ComponentImplManager();
 //	private static final Object LOAD_FAILED = new Object();
@@ -48,7 +60,7 @@
 	private final Map/* <String, ComponentImplDescriptor> */ descriptors = new Hashtable();
 
 	private final Map/* <ComponentImplDescriptor, IComponentImplFactory> */ instances = new Hashtable();
-	private final ResourceTimestampMappings factoryMap = new ResourceTimestampMappings();
+	private ArrayList<HashSet> sortedDescriptorsKeyList = new ArrayList<HashSet>();
 
 	/**
 	 * @return Returns the instance.
@@ -67,13 +79,25 @@
 
 			public void run() throws Exception {
 				new ComponentImplRegistryReader().readRegistry();
-			}
+				//sort descriptors keys by size, bigger size is at lower index
+				if( descriptors != null ){
 
+					sortedDescriptorsKeyList.addAll(descriptors.keySet());
+					
+					final Comparator<HashSet> comp = new Comparator<HashSet>() {
+						public int compare(final HashSet descriptor1, final HashSet descriptor2) {
+							if( descriptor1.size() == descriptor2.size() )
+								return 0;
+							return descriptor1.size() < descriptor2.size() ? 1 : -1;
+						}
+					};
+					Collections.sort(sortedDescriptorsKeyList, comp);
+				}
+			}
 		});
 	}
-
-
-	private IComponentImplFactory getComponentImplFactory(String typeID) {
+	
+	private IComponentImplFactory getComponentImplFactory(HashSet typeID) {
 
 		ComponentImplDescriptor descriptor = (ComponentImplDescriptor) descriptors.get(typeID);
 		IComponentImplFactory factory = null;
@@ -93,102 +117,318 @@
 		}
 		return factory;
 	}
-	 
-	private IComponentImplFactory findFactoryForProject(IProject project){
-		try {
-			IComponentImplFactory factory = null;		
-			
-			if( !factoryMap.hasChanged(project) ) {				
+	
+	
 
-				if( factoryMap.hasCacheError(project))
-					return null;
-				
-				if( factoryMap.hasCacheData(project)) 
-					return (IComponentImplFactory) factoryMap.getData(project);
-			} 
-			
+	private IComponentImplFactory findFactoryForProject(IProject project, Map descriptors){
+		try {
+			IComponentImplFactory factory = ComponentCacheManager.instance().getComponentImplFactory(project);
+
+			if(factory != null)
+				return factory;
+
 			IFacetedProject facetedProject = ProjectFacetsManager.create(project);
 			if (facetedProject == null){
-				factory = getComponentImplFactory(NO_FACETS);
-				factoryMap.mark(project, factory);
+				HashSet set = new HashSet();
+				set.add(NO_FACETS);
+				factory = getComponentImplFactory(set);
+				ComponentCacheManager.instance().setComponentImplFactory(project, factory);
 				return factory;
 			}
-			Iterator keys = descriptors.keySet().iterator();
-			while (keys.hasNext()) {
-				String typeID = (String) keys.next();
-				if(typeID.equals(NO_FACETS)){
-					continue;
-				}
-				try {
-					IProjectFacet projectFacet = ProjectFacetsManager.getProjectFacet(typeID);
-					if (projectFacet != null && facetedProject.hasProjectFacet(projectFacet)){
-						factory = getComponentImplFactory(typeID);
-						if(null != factory){
-							factoryMap.mark(project, factory);
-							return factory;
-						}
-					}
-				} catch (Exception e) {
-					continue;
-				}
-			}
-			
+			return findFactorySupportingFacetsForProject(facetedProject);
+
 		} catch (Exception e) {
 			ModulecorePlugin.logError(0, "Returning null factory for project: " + project, e); //$NON-NLS-1$
-			factoryMap.markError(project);
+			ComponentCacheManager.instance().markErrorComponentImplFactory(project);
 		}
 		return null;
 	}
-	 
+	
+		
+	private IComponentImplFactory findFactorySupportingFacetsForProject(IFacetedProject facetedProject){
+		Set<IProjectFacetVersion> projectFacets = facetedProject.getProjectFacets();
+
+		IComponentImplFactory factory = null;	
+
+		if( sortedDescriptorsKeyList != null ){
+			for( HashSet key : sortedDescriptorsKeyList ){
+				
+				boolean invalidDescriptor = false;
+				Iterator iterator = key.iterator();
+
+				while (iterator.hasNext()) {
+
+					String typeID = (String) iterator.next();
+					IProjectFacet projectFacet = null;
+					try{
+						projectFacet = ProjectFacetsManager.getProjectFacet(typeID);
+					}catch(Exception e){
+						invalidDescriptor = true;
+						break;
+					}
+					//if a project does not have a facet supported by this type, return 
+					if (projectFacet != null && !facetedProject.hasProjectFacet(projectFacet)){
+						invalidDescriptor = true;
+						break;
+					}
+				}
+				if( !invalidDescriptor ){
+					factory = getComponentImplFactory(key);
+					if(null != factory){
+						ComponentCacheManager.instance().setComponentImplFactory(facetedProject.getProject(), factory);
+						return factory;
+					}
+				}
+			}
+		}
+		return null;
+	}
+
 	
 	
 	public IVirtualFolder createFolder(IProject aProject, IPath aRuntimePath){
 		try {
-			IComponentImplFactory factory = findFactoryForProject(aProject);
+			IComponentImplFactory factory = findFactoryForProject(aProject, descriptors);
 			if(null != factory){
 				return factory.createFolder(aProject, aRuntimePath);
 			}
 		} catch (Exception e) {
 			// Just return a default folder
 		}
+		ComponentCacheManager.instance().setComponentImplFactory(aProject, null);
 		return new VirtualFolder(aProject, aRuntimePath);
 	}
 
 	public IVirtualComponent createComponent(IProject project) {
+		return createComponent(project, true);
+	}
+
+	public IVirtualComponent createComponent(IProject project, boolean checkSettings) {
 		try {
-			IComponentImplFactory factory = findFactoryForProject(project);
+			IVirtualComponent component = ComponentCacheManager.instance().getComponent(project);
+			if(component != null) {
+				return component;
+			}		
+
+			IComponentImplFactory factory = findFactoryForProject(project, descriptors);
 			if(null != factory){
-				return factory.createComponent(project);
+				component = factory.createComponent(project);
+				if(component != null) {
+					ComponentCacheManager.instance().setComponent(project, component);
+					registerListener(project);
+				}
+				return component;
 			}
 		} catch (Exception e) {
 			// Just return a default component
 		}
-		if (!ModuleCoreNature.isFlexibleProject(project)){
-			return null;
+		if(checkSettings) {
+			if (!ModuleCoreNature.isFlexibleProject(project)){
+				return null;
+			}
 		}
-		return new VirtualComponent(project, new Path("/")); //$NON-NLS-1$
+		else {
+			if (ModuleCoreNature.getModuleCoreNature(project) == null){
+				return null;
+			}
+		}
+		IVirtualComponent component = new VirtualComponent(project, new Path("/")); //$NON-NLS-1$
+		if(component != null) {
+			ComponentCacheManager.instance().setComponentImplFactory(project, null);
+			ComponentCacheManager.instance().setComponent(project, component);
+			registerListener(project);
+		}
+
+		return component;
 	}
 
 	public IVirtualComponent createArchiveComponent(IProject aProject, String aComponentName) {
+		return createArchiveComponent(aProject, aComponentName, new Path("/"));
+	}
+	
+	public IVirtualComponent createArchiveComponent(IProject aProject, String aComponentName, IPath path) {
+		path = path == null ? new Path("/") : path; //$NON-NLS-1$
 		try {
-			IComponentImplFactory factory = findFactoryForProject(aProject);
+			IVirtualComponent component = ComponentCacheManager.instance().getArchiveComponent(aProject, aComponentName);
+			if(component != null)
+				return component;
+
+			if(!ComponentCacheManager.instance().isValidComponentImplFactory(aProject)) {
+				registerListener(aProject);
+			}
+
+			IComponentImplFactory factory = findFactoryForProject(aProject, descriptors);
 			if(null != factory){
-				return factory.createArchiveComponent(aProject, aComponentName, new Path("/")); //$NON-NLS-1$
+				IVirtualComponent archiveComponent = factory.createArchiveComponent(aProject, aComponentName, path);
+				ComponentCacheManager.instance().setArchiveComponent(aProject, aComponentName, archiveComponent);
+				return archiveComponent;
 			}
 		} catch (Exception e) {
 			// Just return a default archive component
 		}
-		return new VirtualArchiveComponent(aProject, aComponentName, new Path("/")); //$NON-NLS-1$
+		ComponentCacheManager.instance().setComponentImplFactory(aProject, null);
+		IVirtualComponent archiveComponent = new VirtualArchiveComponent(aProject, aComponentName, path); //$NON-NLS-1$
+		ComponentCacheManager.instance().setArchiveComponent(aProject, aComponentName, archiveComponent);
+		return archiveComponent;
 	}
 	
+	private void registerListener(IProject aProject) {
+		ProjectResourceSet resSet = getResourceSet(aProject);
+		if (resSet == null || resSet.getSynchronizer() == null)
+			return;
+		resSet.getSynchronizer().addExtender(this);
+	}
+
+	protected ProjectResourceSet getResourceSet(IProject proj) {
+		return (ProjectResourceSet)WorkbenchResourceHelperBase.getResourceSet(proj);
+	}
+
+	public void projectChanged(IResourceDelta delta) {
+		// TODO Auto-generated method stub
+
+	}
+
+	public synchronized void projectClosed() {
+		ComponentCacheManager.instance().clearCache();
+	}
+
+	private static class ComponentCacheManager  {
+		private static final ComponentCacheManager instance = new ComponentCacheManager();
+
+		private final ResourceTimestampMappings factoryMap = new ResourceTimestampMappings();	
+		private final Map <IProject , IVirtualComponent> componentsMap = new Hashtable<IProject , IVirtualComponent>();
+		private final Map <IProject , Map<String, IVirtualComponent>> componentsArchivesMap = new Hashtable<IProject , Map<String, IVirtualComponent>>();
+
+		private Object cacheLock = new Object();
+
+		public ComponentCacheManager() {}
+
+		public static ComponentCacheManager instance() {
+			return instance;
+		}
+
+		public IComponentImplFactory getComponentImplFactory(IProject project) {
+			synchronized (cacheLock) {
+				if(isValidComponentImplFactory(project)) {
+					Object data = factoryMap.getData(project);
+					if(data instanceof IComponentImplFactory)
+						return (IComponentImplFactory) data;
+				}
+				return null;
+			}
+		}
+
+		public boolean isValidComponentImplFactory(IProject project) {
+			synchronized (cacheLock) {
+				if(!factoryMap.hasChanged(project) && !factoryMap.hasCacheError(project) && factoryMap.hasCacheData(project))
+					return true;
+				return false;
+			}
+		}
+
+		public void setComponentImplFactory(IProject project, IComponentImplFactory factory){
+			synchronized (cacheLock) {
+				if(factory != null) {
+					factoryMap.mark(project, factory);
+				}
+				else {
+					factoryMap.mark(project, project);
+				}
+			}
+		}
+
+		public void markErrorComponentImplFactory(IProject project){
+			synchronized (cacheLock) {
+				factoryMap.markError(project);
+			}
+		}
+
+		public IVirtualComponent getComponent(IProject project) {
+			synchronized (cacheLock) {
+				if(componentsMap.containsKey(project)) {
+					if(isValidComponentImplFactory(project)) {
+						return componentsMap.get(project);
+					} else {
+						componentsMap.remove(project);
+					}
+				}
+				return null;
+			}
+		}
+
+		public void setComponent(IProject project, IVirtualComponent component) {
+			synchronized (cacheLock) {
+				if(component != null)
+					componentsMap.put(project, component);
+			}
+		}
+
+		public IVirtualComponent getArchiveComponent(IProject project, String componentName) {
+			synchronized (cacheLock) {
+				Map archives = getComponentArchives(project);			
+				if(isValidComponentImplFactory(project)) {
+					if(archives.containsKey(componentName)) {
+						return (IVirtualComponent) archives.get(componentName);
+					}
+				}
+				else {
+					archives = new Hashtable<String, IVirtualComponent>();
+					componentsArchivesMap.put(project, archives);
+				}
+				return null;
+			}
+		}
+
+		public Map getComponentArchives(IProject project) {
+			synchronized (cacheLock) {
+				Map archives = componentsArchivesMap.get(project);
+				if(archives == null) {
+					archives = new Hashtable<String, IVirtualComponent>();
+					componentsArchivesMap.put(project, archives);
+				}
+				return archives;
+			}
+		}
+
+		public void setArchiveComponent(IProject project, String componentName, IVirtualComponent archiveComponent) {
+			synchronized (cacheLock) {
+				if(archiveComponent != null) {
+					Map archives = ComponentCacheManager.instance().getComponentArchives(project);
+					archives.put(componentName, archiveComponent);
+				}
+			}
+		}
+
+
+		public void clearCache() {
+			Object[] components = null;
+			Object[] componentsArchives = null;
+			synchronized (cacheLock) {
+				components = (Object[]) componentsMap.values().toArray();
+				componentsMap.clear();
+				
+				componentsArchives = (Object[]) componentsArchivesMap.values().toArray();
+				componentsArchivesMap.clear();
+			}
+			
+			for(int i = 0; i < components.length; i++) {
+				if(components[i] instanceof VirtualComponent)
+					((VirtualComponent)components[i]).dispose();
+			}
+			
+			for(int i = 0; i < componentsArchives.length; i++) {
+				if(componentsArchives[i] instanceof VirtualComponent)
+					((VirtualComponent)componentsArchives[i]).dispose();
+			}
+		}
+	}
+
 	private class ComponentImplDescriptor {
 
 		private final IConfigurationElement element;
-		private final String type;
-
+		
 		public ComponentImplDescriptor(IConfigurationElement configElement) {
 			element = configElement;
-			type = element.getAttribute(ATT_TYPE);
 		}
 
 		/**
@@ -216,15 +456,6 @@
 
 			return factory[0];
 		}
-
-		/**
-		 * 
-		 * @return The type id of this ArtifactEdit definition
-		 */
-		public String getType() {
-			return type;
-		}
-
 	}
 	
 	private class ComponentImplRegistryReader extends RegistryReader {
@@ -244,9 +475,20 @@
 				 * the registry is initialized in the constructor of this type, other threads cannot
 				 * compete with readElement() for access to <i>descriptors</i>
 				 */
+				
+				HashSet<String> setOfIds = new HashSet<String>();
+				setOfIds.add( element.getAttribute(ATT_TYPE) );
+				
+				IConfigurationElement[] child = element.getChildren(EXTENDED_ELEMENT);
+				if( child.length > 0 ){
+					for( int i=0; i< child.length; i++ ){
+						setOfIds.add(child[i].getValue());
+					}
+				}
 				String type = element.getAttribute(ATT_TYPE);
 				if (type != null)
-					descriptors.put(element.getAttribute(ATT_TYPE), new ComponentImplDescriptor(element));
+					descriptors.put(setOfIds, new ComponentImplDescriptor(element));
+					//descriptors.put(element.getAttribute(ATT_TYPE), new ComponentImplDescriptor(element));
 				else
 					ModulecorePlugin.logError(0, "No type attribute is specified for " + //$NON-NLS-1$
 								ModulecorePlugin.PLUGIN_ID + "." + COMPONENT_IMPL_EXTENSION_POINT + //$NON-NLS-1$ 
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentResolver.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentResolver.java
index 94f8334..c6a83bb 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentResolver.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentResolver.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * Copyright (c) 2001, 2009 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
@@ -31,10 +31,10 @@
 import org.osgi.framework.Bundle;
 
 public class ComponentResolver implements URIResolverExtension {
-	private static boolean _DEBUG = "true".equals(Platform.getDebugOption("org.eclipse.wst.common.modulecore/ComponentResolver")); //$NON-NLS-1$ //$NON-NLS-2$ 
+	private static boolean _DEBUG = Boolean.valueOf(Platform.getDebugOption("org.eclipse.wst.common.modulecore/ComponentResolver")).booleanValue(); //$NON-NLS-1$ 
 	private static final String FILE_PROTOCOL = "file:///"; //$NON-NLS-1$
 	private static final String FILE_PROTOCOL2 = "file://"; //$NON-NLS-1$
-	private static final String ROOT_PATH_STRING = Path.ROOT.toString(); //$NON-NLS-1$
+	private static final String ROOT_PATH_STRING = Path.ROOT.toString();
 	private static final String HTTP_PROTOCOL = "http:"; //$NON-NLS-1$
 
 	/**
@@ -107,7 +107,7 @@
 
 		/* Recompute the IFile, if needed, from the base location. */
 		if (file == null) {
-			if (baseLocation == null || baseLocation.length() == 0) {
+			if (baseLocation == null || baseLocation.length() == 0 || baseLocation.startsWith("wbit:")) { //$NON-NLS-1$
 				/*
 				 * We can't proceed if we lack both an IFile and a system
 				 * reference
@@ -191,6 +191,10 @@
 				IPath resolvedRuntimePath = null;
 				if (systemId.startsWith(ROOT_PATH_STRING)) {
 					resolvedRuntimePath = new Path(systemId);
+					/* https://bugs.eclipse.org/284017 - ComponentResolver does not resolve absolute references to the context root */
+					if (resolvedRuntimePath.segmentCount() > 1 && resolvedRuntimePath.segment(0).equals(ComponentUtilities.getServerContextRoot(file.getProject()))) {
+						resolvedRuntimePath = resolvedRuntimePath.removeFirstSegments(1);
+					}
 				}
 				else {
 					resolvedRuntimePath = new Path(virtualResources[i].getRuntimePath().removeLastSegments(1).append(systemId).toString());
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentUtilities.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentUtilities.java
index ba5afa0..6150ada 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentUtilities.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentUtilities.java
@@ -12,8 +12,11 @@
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
+import org.eclipse.core.commands.ExecutionException;
 import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IFolder;
@@ -23,6 +26,7 @@
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.resource.Resource;
@@ -31,6 +35,7 @@
 import org.eclipse.wst.common.componentcore.ComponentCore;
 import org.eclipse.wst.common.componentcore.ModuleCoreNature;
 import org.eclipse.wst.common.componentcore.datamodel.properties.ICreateReferenceComponentsDataModelProperties;
+import org.eclipse.wst.common.componentcore.datamodel.properties.IServerContextRootDataModelProperties;
 import org.eclipse.wst.common.componentcore.internal.Property;
 import org.eclipse.wst.common.componentcore.internal.StructureEdit;
 import org.eclipse.wst.common.componentcore.internal.WorkbenchComponent;
@@ -110,7 +115,7 @@
 
 
 	public static IFile findFile(IVirtualComponent comp, IPath aPath) throws CoreException {
-		if (comp == null || aPath == null)
+		if (comp == null || aPath == null || comp.isBinary())
 			return null;
 		IVirtualFolder root = comp.getRootFolder();
 		IVirtualResource file = root.findMember(aPath);
@@ -215,6 +220,18 @@
 		modHandlesList.addAll(targetComponentProjects);
 		model.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENT_LIST, modHandlesList);
 		model.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_DEPLOY_PATH,"/WEB-INF/lib"); //$NON-NLS-1$
+		if(modHandlesList != null){
+			Map map = new HashMap();
+			for(int i=0; i<modHandlesList.size();i++){
+				IVirtualComponent comp = (IVirtualComponent)modHandlesList.get(i);
+				String uri = comp.getName().replace(' ', '_') + ".jar";
+				map.put(comp, uri);
+			}
+			if(map.size() > 0){
+				model.setProperty(ICreateReferenceComponentsDataModelProperties.TARGET_COMPONENTS_TO_URI_MAP, map);
+			}
+		}
+		
 		return new CreateReferenceComponentsOp(model);
 	}
 
@@ -309,9 +326,19 @@
 	 * 
 	 * @param contextRoot string
 	 */
-	public static void setServerContextRoot(IProject project, String contextRoot) {
-		IVirtualComponent comp = ComponentCore.createComponent(project);
-		comp.setMetaProperty(IModuleConstants.CONTEXTROOT, contextRoot);
+	public static void setServerContextRoot(IProject project, String newContextRoot) {
+		
+		IDataModel model = DataModelFactory.createDataModel(IServerContextRootDataModelProperties.class);
+		model.setProperty(IServerContextRootDataModelProperties.PROJECT, project);
+		model.setStringProperty(IServerContextRootDataModelProperties.CONTEXT_ROOT,
+				newContextRoot);
+		
+		try {
+			model.getDefaultOperation().execute(new NullProgressMonitor(), null);
+		}
+		catch (ExecutionException e) {
+			org.eclipse.wst.common.componentcore.internal.ModulecorePlugin.logError(e);
+		}
 	}
 
 	/**
@@ -332,4 +359,5 @@
 			uri = reference.getRuntimePath() + "/" + reference.getReferencedComponent().getProject().getName() + extension; //$NON-NLS-1$
 		}
 		return uri;
-	}}
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentcoreSwitch.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentcoreSwitch.java
index f556abc..e8c0cc4 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentcoreSwitch.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/ComponentcoreSwitch.java
@@ -2,7 +2,7 @@
  * <copyright>
  * </copyright>
  *
- * $Id: ComponentcoreSwitch.java,v 1.6 2005/10/18 22:27:18 cbridgha Exp $
+ * $Id: ComponentcoreSwitch.java,v 1.7 2009/06/09 20:02:03 jsholl Exp $
  */
 package org.eclipse.wst.common.componentcore.internal.util;
 
@@ -74,13 +74,11 @@
 		if (theEClass.eContainer() == modelPackage) {
 			return doSwitch(theEClass.getClassifierID(), theEObject);
 		}
-		else {
-			List eSuperTypes = theEClass.getESuperTypes();
-			return
-				eSuperTypes.isEmpty() ?
-					defaultCase(theEObject) :
-					doSwitch((EClass)eSuperTypes.get(0), theEObject);
-		}
+		List eSuperTypes = theEClass.getESuperTypes();
+		return
+			eSuperTypes.isEmpty() ?
+				defaultCase(theEObject) :
+				doSwitch((EClass)eSuperTypes.get(0), theEObject);
 	}
 
 	/**
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/FacetedProjectUtilities.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/FacetedProjectUtilities.java
new file mode 100644
index 0000000..98263ca
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/FacetedProjectUtilities.java
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Red Hat 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:
+ *     Red Hat - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.common.componentcore.internal.util;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject;
+import org.eclipse.wst.common.project.facet.core.IProjectFacet;
+import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+
+public class FacetedProjectUtilities {
+	public static boolean isProjectOfType(IProject project, String typeID) {
+		return getProjectFacetVersion(project, typeID) != null;
+	}
+
+	public static IProjectFacetVersion getProjectFacetVersion(IProject project, String typeID){
+		IFacetedProject facetedProject = null;
+		try {
+			facetedProject = ProjectFacetsManager.create(project);
+		} catch (CoreException e) {
+			return null;
+		}
+
+		if (facetedProject != null && ProjectFacetsManager.isProjectFacetDefined(typeID)) {
+			IProjectFacet projectFacet = ProjectFacetsManager.getProjectFacet(typeID);
+			if(projectFacet == null){
+				return null;
+			}
+			return facetedProject.getProjectFacetVersion(projectFacet);
+		}
+		return null;
+	}
+	
+	public static boolean isProjectOfType(IFacetedProject facetedProject, String typeID) {
+		if (facetedProject != null && ProjectFacetsManager.isProjectFacetDefined(typeID)) {
+			IProjectFacet projectFacet = ProjectFacetsManager.getProjectFacet(typeID);
+			return projectFacet != null && facetedProject.hasProjectFacet(projectFacet);
+		}
+		return false;
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/HRefTranslator.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/HRefTranslator.java
index 8fba627..acb7c7e 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/HRefTranslator.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/HRefTranslator.java
@@ -28,36 +28,30 @@
 
 	public HRefTranslator(String domNameAndPath, EClass eClass) {
 		super(domNameAndPath, eClass);
-		// TODO Auto-generated constructor stub
 	}
 
 	public HRefTranslator(String domNameAndPath, EStructuralFeature aFeature) {
 		super(domNameAndPath, aFeature);
-		// TODO Auto-generated constructor stub
 	}
 
 	public HRefTranslator(String domNameAndPath, EStructuralFeature aFeature,
 			EClass eClass) {
 		super(domNameAndPath, aFeature, eClass);
-		// TODO Auto-generated constructor stub
 	}
 
 	public HRefTranslator(String domNameAndPath, EStructuralFeature aFeature,
 			TranslatorPath path) {
 		super(domNameAndPath, aFeature, path);
-		// TODO Auto-generated constructor stub
 	}
 
 	public HRefTranslator(String domNameAndPath, EStructuralFeature aFeature,
 			TranslatorPath[] paths) {
 		super(domNameAndPath, aFeature, paths);
-		// TODO Auto-generated constructor stub
 	}
 
 	public HRefTranslator(String domNameAndPath, EStructuralFeature aFeature,
 			int style) {
 		super(domNameAndPath, aFeature, style);
-		// TODO Auto-generated constructor stub
 	}
 	/*
 	 * (non-Javadoc)
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/IModuleConstants.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/IModuleConstants.java
index f1c98d0..c93d9d7 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/IModuleConstants.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/IModuleConstants.java
@@ -39,6 +39,13 @@
 	public final static String JST_APPCLIENT_MODULE = "jst.appclient"; //$NON-NLS-1$
 	public final static String JST_CONNECTOR_MODULE = "jst.connector"; //$NON-NLS-1$
 	public final static String JST_JAVA = "jst.java"; //$NON-NLS-1$
+	public final static String JST_WEBFRAGMENT_MODULE = "jst.webfragment"; //$NON-NLS-1$
+	
+	// Extensions
+	public final static String EAR_EXTENSION = ".ear"; //$NON-NLS-1$
+	public final static String WAR_EXTENSION = ".war"; //$NON-NLS-1$
+	public final static String RAR_EXTENSION = ".rar"; //$NON-NLS-1$
+	public final static String JAR_EXTENSION = ".jar"; //$NON-NLS-1$
 	
 	public final static String DEPENDENT_MODULE = "dependent"; //$NON-NLS-1$
     
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/VirtualReferenceUtilities.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/VirtualReferenceUtilities.java
new file mode 100644
index 0000000..fe12b66
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/VirtualReferenceUtilities.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Red Hat 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:
+ *     Red Hat - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.common.componentcore.internal.util;
+
+import java.util.HashMap;
+import java.util.Iterator;
+
+import org.eclipse.core.runtime.Path;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
+
+public class VirtualReferenceUtilities implements IModuleConstants {
+	public static VirtualReferenceUtilities INSTANCE = new VirtualReferenceUtilities();
+	private HashMap<String, String> mapping;
+	VirtualReferenceUtilities() {
+		mapping = new HashMap<String, String>();
+		mapping.put(JST_APPCLIENT_MODULE, JAR_EXTENSION); //$NON-NLS-1$
+		mapping.put(JST_WEB_MODULE, WAR_EXTENSION); //$NON-NLS-1$
+		mapping.put(JST_EJB_MODULE, JAR_EXTENSION); //$NON-NLS-1$
+		mapping.put(WST_WEB_MODULE, WAR_EXTENSION); //$NON-NLS-1$
+		mapping.put(JST_EAR_MODULE, EAR_EXTENSION); //$NON-NLS-1$
+		mapping.put(JST_CONNECTOR_MODULE, RAR_EXTENSION); //$NON-NLS-1$
+		mapping.put(JST_UTILITY_MODULE, JAR_EXTENSION); //$NON-NLS-1$
+		mapping.put(JST_WEBFRAGMENT_MODULE, JAR_EXTENSION); //$NON-NLS-1$
+	}
+	
+	/**
+	 * Add a mapping for some facet type to some default extension
+	 * @param facet 
+	 * @param extension
+	 * @return
+	 */
+	public boolean addDefaultExtension(String facet, String extension) {
+		if( !mapping.containsKey(facet)) {
+			if( ProjectFacetsManager.isProjectFacetDefined(facet)) {
+				mapping.put(facet, extension);
+				return true;
+			}
+		}
+		return false;
+	}
+	
+	
+	/**
+	 * This is a utility method clients may or may not choose to make use of
+	 * to ensure that all Project references have some archiveName associated with it.
+	 */
+	public void ensureReferencesHaveNames(IVirtualReference[] refs) {
+		for( int i = 0; i < refs.length; i++ ) {
+			if( refs[i].getArchiveName() == null || refs[i].getArchiveName().equals("")) { //$NON-NLS-1$
+				refs[i].setArchiveName(getDefaultArchiveName(refs[i]));
+			}
+		}
+	}
+
+	/**
+	 * return what the suggested archiveName is 
+	 * @param ref
+	 * @return
+	 */
+	public String getDefaultArchiveName(IVirtualReference ref) {
+		if( !ref.getReferencedComponent().isBinary()) {
+			return getDefaultProjectArchiveName(ref.getReferencedComponent());
+		} 
+		// binary
+		return new Path(ref.getReferencedComponent().getDeployedName()).lastSegment();
+	}
+	
+	public String getDefaultProjectArchiveName(IVirtualComponent component) {
+		Iterator<String> i = mapping.keySet().iterator();
+		String facet;
+		String name = (component.getDeployedName() == null ? component.getName() : component.getDeployedName());
+		while(i.hasNext()) {
+			facet = i.next();
+			if( FacetedProjectUtilities.isProjectOfType(component.getProject(), facet))
+				return name + mapping.get(facet);
+		}
+		return name + JAR_EXTENSION; 
+	}
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/WTPModulesXmlMapperI.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/WTPModulesXmlMapperI.java
index 9ed9de9..6dd9ab3 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/WTPModulesXmlMapperI.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/internal/util/WTPModulesXmlMapperI.java
@@ -32,6 +32,6 @@
 	String PROPERTY_VALUE = "value";//$NON-NLS-1$
 	String RESOURCE_TYPE = "resource-type";//$NON-NLS-1$
 	String ARCHIVE_NAME="archiveName";//$NON-NLS-1$
-	String PROJECT_VERSION="project-version";
+	String PROJECT_VERSION="project-version"; //$NON-NLS-1$
 	
 }
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resolvers/DefaultReferenceResolver.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resolvers/DefaultReferenceResolver.java
new file mode 100644
index 0000000..e8fcd73
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resolvers/DefaultReferenceResolver.java
@@ -0,0 +1,83 @@
+package org.eclipse.wst.common.componentcore.resolvers;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.wst.common.componentcore.ComponentCore;
+import org.eclipse.wst.common.componentcore.UnresolveableURIException;
+import org.eclipse.wst.common.componentcore.internal.ComponentcorePackage;
+import org.eclipse.wst.common.componentcore.internal.DependencyType;
+import org.eclipse.wst.common.componentcore.internal.ReferencedComponent;
+import org.eclipse.wst.common.componentcore.internal.StructureEdit;
+import org.eclipse.wst.common.componentcore.internal.impl.ModuleURIUtil;
+import org.eclipse.wst.common.componentcore.internal.resources.VirtualReference;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+
+public class DefaultReferenceResolver implements IReferenceResolver {
+	// Does not need to implement, 
+	// default is always called as last resort
+	public boolean canResolve(IVirtualComponent context,
+			ReferencedComponent referencedComponent) {
+		return false;
+	}
+
+	// Does not need to implement, 
+	// default is always called as last resort
+	public boolean canResolve(IVirtualReference reference) {
+		return false;
+	}
+
+	public IVirtualReference resolve(IVirtualComponent context,
+			ReferencedComponent referencedComponent) {
+		IVirtualComponent targetComponent = null;
+		IProject targetProject = null;
+		URI uri = referencedComponent.getHandle();
+		if (uri == null)
+			return null;
+		boolean isClassPathURI = ModuleURIUtil.isClassPathURI(uri);
+		if( !isClassPathURI ){
+			try { 
+				targetProject = StructureEdit.getContainingProject(uri);
+			} catch(UnresolveableURIException uurie) {
+				//Ignore
+			} 
+			// if the project cannot be resolved, assume it's local - really it probably deleted 
+			
+			targetComponent = ComponentCore.createComponent(targetProject);  
+				
+
+		}else{
+			String archiveType = ""; //$NON-NLS-1$
+			String archiveName = ""; //$NON-NLS-1$
+			try {
+				archiveType = ModuleURIUtil.getArchiveType(uri);
+				archiveName = ModuleURIUtil.getArchiveName(uri);
+				
+			} catch (UnresolveableURIException e) {
+				//Ignore
+			}
+			targetComponent = ComponentCore.createArchiveComponent(context.getProject(), archiveType + IPath.SEPARATOR + archiveName ); 
+		}
+		VirtualReference vRef = new VirtualReference(context, targetComponent, referencedComponent.getRuntimePath(), referencedComponent.getDependencyType().getValue());
+		vRef.setArchiveName(referencedComponent.getArchiveName());
+		return vRef;
+	}
+
+	public ReferencedComponent resolve(IVirtualReference reference) {
+		IVirtualComponent referencedComponent = reference.getReferencedComponent();
+		ReferencedComponent refComp = ComponentcorePackage.eINSTANCE.getComponentcoreFactory().createReferencedComponent();
+		refComp.setRuntimePath(reference.getRuntimePath());
+		refComp.setDependencyType(DependencyType.get(reference.getDependencyType()));
+		refComp.setArchiveName(reference.getArchiveName());
+		if( referencedComponent != null ) {
+			if( !referencedComponent.isBinary())
+				refComp.setHandle(ModuleURIUtil.fullyQualifyURI(referencedComponent.getProject()));
+			else
+				refComp.setHandle(ModuleURIUtil.archiveComponentfullyQualifyURI(referencedComponent.getName())); 
+		}
+		return refComp;
+	}
+
+
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resolvers/IReferenceResolver.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resolvers/IReferenceResolver.java
new file mode 100644
index 0000000..b1dcd00
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resolvers/IReferenceResolver.java
@@ -0,0 +1,22 @@
+/*******************************************************************************
+ * Copyright (c) 2009 Red Hat 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:
+ *     Red Hat - Initial API and implementation
+ *******************************************************************************/
+package org.eclipse.wst.common.componentcore.resolvers;
+
+import org.eclipse.wst.common.componentcore.internal.ReferencedComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+
+public interface IReferenceResolver {
+	public boolean canResolve(IVirtualComponent context, ReferencedComponent referencedComponent);
+	public IVirtualReference resolve(IVirtualComponent context, ReferencedComponent referencedComponent);
+	public boolean canResolve(IVirtualReference reference);
+	public ReferencedComponent resolve(IVirtualReference reference);
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resolvers/ReferenceResolverUtil.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resolvers/ReferenceResolverUtil.java
new file mode 100644
index 0000000..ec9d3f1
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resolvers/ReferenceResolverUtil.java
@@ -0,0 +1,126 @@
+package org.eclipse.wst.common.componentcore.resolvers;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.wst.common.componentcore.internal.ModulecorePlugin;
+import org.eclipse.wst.common.componentcore.internal.ReferencedComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
+import org.eclipse.wst.common.componentcore.resources.IVirtualReference;
+
+public class ReferenceResolverUtil {
+	public static ReferenceResolverUtil instance = null;
+	public static ReferenceResolverUtil getDefault() {
+		if( instance == null )
+			instance = new ReferenceResolverUtil();
+		return instance;
+	}
+	
+	private HashMap<String, ReferenceResolverWrapper> resolvers = null;
+	private ArrayList<IReferenceResolver> sorted = null;
+	private DefaultReferenceResolver defaultResolver = new DefaultReferenceResolver();
+	public IReferenceResolver[] getResolvers() {
+		if( resolvers == null || sorted == null)
+			loadResolvers();
+		if (sorted.isEmpty()) return new IReferenceResolver[0];
+        return (IReferenceResolver[]) sorted.toArray(new IReferenceResolver[sorted.size()]);
+	}
+	
+	public IReferenceResolver getResolver(IVirtualComponent context, ReferencedComponent reference) {
+		getResolvers();
+		Iterator<IReferenceResolver> i = sorted.iterator();
+		IReferenceResolver resolver;
+		while(i.hasNext()) {
+			resolver = i.next();
+			if( resolver.canResolve(context, reference))
+				return resolver;
+		}
+		return defaultResolver;
+	}
+	
+	public IReferenceResolver getResolver(IVirtualReference reference) {
+		getResolvers();
+		Iterator<IReferenceResolver> i = sorted.iterator();
+		IReferenceResolver resolver;
+		while(i.hasNext()) {
+			resolver = i.next();
+			if( resolver.canResolve(reference))
+				return resolver;
+		}
+		return defaultResolver;
+	}
+	
+	protected void loadResolvers() {
+		HashMap<String, ReferenceResolverWrapper> map = new HashMap<String, ReferenceResolverWrapper>();
+		
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		IConfigurationElement[] cf = registry.getConfigurationElementsFor(ModulecorePlugin.PLUGIN_ID, "referenceResolver"); //$NON-NLS-1$
+		String id = null;
+		for( int j = 0; j < cf.length; j++ ) {
+			id = cf[j].getAttribute("id");
+			try {
+				map.put(id, new ReferenceResolverWrapper(
+						id, (IReferenceResolver)
+							cf[j].createExecutableExtension("class"),
+						cf[j].getAttribute("weight")));
+			} catch( CoreException ce ) {
+				// TODO figure it out
+			}
+		}
+		
+		// Cache the sorted ones
+		List<ReferenceResolverWrapper> list = new ArrayList(map.values());
+		Comparator comparator = new Comparator() { 
+			public int compare(Object o1, Object o2) {
+				if( !(o1 instanceof ReferenceResolverWrapper))
+					return -1;
+				if( !(o2 instanceof ReferenceResolverWrapper))
+					return 1;
+				return ((ReferenceResolverWrapper)o2).getWeight()
+				 	- ((ReferenceResolverWrapper)o1).getWeight();
+			}
+		};
+		
+		Collections.sort(list, comparator);
+		ArrayList<IReferenceResolver> sorted = new ArrayList<IReferenceResolver>();
+		Iterator i = list.iterator();
+		while(i.hasNext())
+			sorted.add(((ReferenceResolverWrapper)i.next()).getResolver());
+		this.sorted = sorted;
+		this.resolvers = map;
+	}
+	
+	
+	protected class ReferenceResolverWrapper {
+		private String id;
+		private IReferenceResolver resolver;
+		private int weight;
+		public ReferenceResolverWrapper(String id, IReferenceResolver resolver, String weight) {
+			this.id = id;
+			this.resolver = resolver;
+			try {
+				this.weight = Integer.parseInt(weight);
+			} catch( NumberFormatException nfe) {
+				this.weight = 1000;
+			}
+		}
+		public int getWeight() {
+			return weight;
+		}
+		public String getId() {
+			return id;
+		}
+		public IReferenceResolver getResolver() {
+			return resolver;
+		}
+	}
+	
+}
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualComponent.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualComponent.java
index 7de081d..69a1b5a 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualComponent.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualComponent.java
@@ -10,6 +10,7 @@
  *******************************************************************************/
 package org.eclipse.wst.common.componentcore.resources;
 
+import java.util.Map;
 import java.util.Properties;
 
 import org.eclipse.core.resources.IProject;
@@ -36,7 +37,15 @@
 	 */
 	public static final int BINARY = 0x1;
 	
-	
+	/**
+	 * The key for the property of which reference types we're requesting
+	 */
+	public static final String REQUESTED_REFERENCE_TYPE = "REQUESTED_REFERENCE_TYPE";
+	public static final String HARD_REFERENCES = "HARD_REFERENCES";
+	public static final String NON_DERIVED_REFERENCES = "NON_DERIVED_REFERENCES";
+	public static final String DISPLAYABLE_REFERENCES = "DISPLAYABLE_REFERENCES";
+	public static final String FLATTENABLE_REFERENCES = "FLATTENABLE_REFERENCES";
+		
 	/**
 	 * The name of the component must be unique within its enclosing project.
 	 * 
@@ -144,6 +153,19 @@
 	 * @return A by-value copy of the virtual reference array
 	 */
 	IVirtualReference[] getReferences();
+
+	/**
+	 * Virtual components may reference other virtual components to build logical dependency trees. 
+	 * <p>
+	 * Each virtual reference will indicate how the content of the reference will be absorbed 
+	 * by this component. Each virtual reference will always specify an enclosing component that will
+	 * be this component.  
+	 * </p>
+	 * @param options A hashmap full of options
+	 * @return
+	 */
+	IVirtualReference[] getReferences(Map<String, Object> options);
+
 	/**
 	 * Virtual components may reference other virtual components to build logical dependency trees. 
 	 * <p>
@@ -155,6 +177,8 @@
 	 */
 	IVirtualReference getReference(String aComponentName);
 	
+
+	
 	/**
 	 * Virtual components may reference other virtual components to build logical dependency trees. 
 	 * <p>
diff --git a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualReference.java b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualReference.java
index 6ef2274..b5c7c6b 100644
--- a/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualReference.java
+++ b/plugins/org.eclipse.wst.common.modulecore/modulecore-src/org/eclipse/wst/common/componentcore/resources/IVirtualReference.java
@@ -107,4 +107,12 @@
 	 */
 	public void setArchiveName(String archiveName);
 	
+	/**
+	 * Is this reference a 'derived' reference? A derived reference
+	 * is a reference that's not persisted in the primary model 
+	 * inside the org.eclipse.wst.component file. 
+	 * 
+	 * @return isDerived false if persisted, true otherwise 
+	 */
+	public boolean isDerived();
 }
diff --git a/plugins/org.eclipse.wst.common.modulecore/plugin.xml b/plugins/org.eclipse.wst.common.modulecore/plugin.xml
index 569dd44..20573da 100644
--- a/plugins/org.eclipse.wst.common.modulecore/plugin.xml
+++ b/plugins/org.eclipse.wst.common.modulecore/plugin.xml
@@ -34,7 +34,7 @@
       </editModel> 
    </extension>
 	
-	<extension point="org.eclipse.core.runtime.contentTypes">
+	<extension point="org.eclipse.core.contenttype.contentTypes">
  			<file-association
 				content-type="org.eclipse.core.runtime.xml"
 				file-names="org.eclipse.wst.common.component"/>
@@ -55,6 +55,7 @@
 	<extension-point id="artifactedit" name="Component Artifact Edit" schema="schema/artifactedit.exsd"/>
     <extension-point id="componentimpl" name="componentimpl" schema="schema/componentimpl.exsd"/>
 	<extension-point id="resourceFactories" name="Resource Factory Association (Internal)" schema="schema/resourceFactories.exsd"/>
+ <extension-point id="referenceResolver" name="referenceResolver" schema="schema/referenceResolver.exsd"/>
 	
 	<!-- Contribute a URIResolverExtension for flexible projects -->
 	<extension point="org.eclipse.wst.common.uriresolver.resolverExtensions">
@@ -74,63 +75,6 @@
     </factory>
   </extension>
   
-  <extension
-         id="ModuleCoreValidator"
-         name="%Validator.name"
-         point="org.eclipse.wst.validation.validator">
-      <validator>
-      	<projectNature
-               id="org.eclipse.wst.common.modulecore.ModuleCoreNature">
-         </projectNature>
-         <filter
-               objectClass="org.eclipse.core.resources.IFile"
-               caseSensitive="false"
-               nameFilter="*.wtpmodules">
-         </filter>
-         <filter
-               objectClass="org.eclipse.core.resources.IFile"
-               caseSensitive="false"
-               nameFilter="*.component">
-         </filter>
-		   <markerId
-               	   markerIdValue="ModuleCoreValidatorMarker">
-         </markerId>
-         <helper      
-               class="org.eclipse.wst.common.componentcore.internal.ModuleCoreValidatorHelper">
-         </helper>
-         <run
-               class="org.eclipse.wst.common.componentcore.internal.ModuleCoreValidator">
-         </run>
-      </validator>
-   </extension>
-
-<extension
-         id="ModuleCoreValidatorMarker"
-         name="%ValidationMarker.name"
-         point="org.eclipse.core.resources.markers">
-      <super
-            type="org.eclipse.wst.validation.problemmarker">
-      </super>
-      <persistent
-            value="true">
-      </persistent>
-      <attribute
-            name="owner">
-      </attribute>
-      <attribute
-            name="validationSeverity">
-      </attribute>
-      <attribute
-            name="targetObject">
-      </attribute>
-      <attribute
-            name="groupName">
-      </attribute>
-      <attribute
-            name="messageId">
-      </attribute>
-</extension> 
-
    <!-- Register the nature id with the EMFNature -->
    <extension
          point="org.eclipse.jem.util.nature_registration">
diff --git a/plugins/org.eclipse.wst.common.modulecore/schema/ComponentProjectMigrator.exsd b/plugins/org.eclipse.wst.common.modulecore/schema/ComponentProjectMigrator.exsd
index 507ed10..edaf17f 100644
--- a/plugins/org.eclipse.wst.common.modulecore/schema/ComponentProjectMigrator.exsd
+++ b/plugins/org.eclipse.wst.common.modulecore/schema/ComponentProjectMigrator.exsd
@@ -1,16 +1,25 @@
 <?xml version='1.0' encoding='UTF-8'?>
 <!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.common.modulecore">
+<schema targetNamespace="org.eclipse.wst.common.modulecore" xmlns="http://www.w3.org/2001/XMLSchema">
 <annotation>
       <appInfo>
          <meta.schema plugin="org.eclipse.wst.common.modulecore" id="ComponentProjectMigrator" name="Component Project Migrator"/>
       </appInfo>
       <documentation>
-         This allows specific implementations of components to contribute migrators Those plugins have dependencies on the modulecore plugin, but not vice versa. In order for code defined within the modulecore plugin to execute these actions, we need this extension point.
+         This has been deprecated since WTP 3.1.2 and will be deleted post WTP 3.2.
+See https://bugs.eclipse.org/bugs/show_bug.cgi?id=292934
+@deprecated 
+
+This allows specific implementations of components to contribute migrators Those plugins have dependencies on the modulecore plugin, but not vice versa. In order for code defined within the modulecore plugin to execute these actions, we need this extension point.
       </documentation>
    </annotation>
 
    <element name="extension">
+      <annotation>
+         <appInfo>
+            <meta.element />
+         </appInfo>
+      </annotation>
       <complexType>
          <sequence>
             <element ref="migratorExtension"/>
@@ -53,10 +62,27 @@
 
    <annotation>
       <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         This has been deprecated since WTP 3.1.2 and will be deleted post WTP 3.2.
+See https://bugs.eclipse.org/bugs/show_bug.cgi?id=292934
+@deprecated 
+
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
          <meta.section type="since"/>
       </appInfo>
       <documentation>
-         &lt;b&gt;This extension point 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.&lt;/b&gt;
+         This has been deprecated since WTP 3.1.2 and will be deleted post WTP 3.2.
+See https://bugs.eclipse.org/bugs/show_bug.cgi?id=292934
+@deprecated 
+
+
+&lt;b&gt;This extension point 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.&lt;/b&gt;
       </documentation>
    </annotation>
 
@@ -65,16 +91,10 @@
          <meta.section type="examples"/>
       </appInfo>
       <documentation>
-         
-      </documentation>
-   </annotation>
+         This has been deprecated since WTP 3.1.2 and will be deleted post WTP 3.2.
+See https://bugs.eclipse.org/bugs/show_bug.cgi?id=292934
+@deprecated 
 
-   <annotation>
-      <appInfo>
-         <meta.section type="apiInfo"/>
-      </appInfo>
-      <documentation>
-         
       </documentation>
    </annotation>
 
@@ -83,7 +103,10 @@
          <meta.section type="implementation"/>
       </appInfo>
       <documentation>
-         
+         This has been deprecated since WTP 3.1.2 and will be deleted post WTP 3.2.
+See https://bugs.eclipse.org/bugs/show_bug.cgi?id=292934
+@deprecated 
+
       </documentation>
    </annotation>
 
diff --git a/plugins/org.eclipse.wst.common.modulecore/schema/componentCore.xsd b/plugins/org.eclipse.wst.common.modulecore/schema/componentCore.xsd
index a2d8828..f6c87e9 100644
--- a/plugins/org.eclipse.wst.common.modulecore/schema/componentCore.xsd
+++ b/plugins/org.eclipse.wst.common.modulecore/schema/componentCore.xsd
@@ -31,6 +31,9 @@
                                     	<attribute name="handle"

                                     		type="string" use="required">

                                     	</attribute>

+                                    	<attribute name="archiveName"

+                                    		type="string" use="optional">

+                                    	</attribute>

                                     	<attribute name="deploy-path"

                                     		type="string" use="required">

                                     	</attribute>

diff --git a/plugins/org.eclipse.wst.common.modulecore/schema/componentimpl.exsd b/plugins/org.eclipse.wst.common.modulecore/schema/componentimpl.exsd
index 667317e..828b78e 100644
--- a/plugins/org.eclipse.wst.common.modulecore/schema/componentimpl.exsd
+++ b/plugins/org.eclipse.wst.common.modulecore/schema/componentimpl.exsd
@@ -2,15 +2,20 @@
 <!-- Schema file written by PDE -->
 <schema targetNamespace="org.eclipse.wst.common.modulecore" xmlns="http://www.w3.org/2001/XMLSchema">
 <annotation>
-      <appinfo>
+      <appInfo>
          <meta.schema plugin="org.eclipse.wst.common.modulecore" id="componentimpl" name="componentimpl"/>
-      </appinfo>
+      </appInfo>
       <documentation>
          [Enter description of this extension point.]
       </documentation>
    </annotation>
 
    <element name="extension">
+      <annotation>
+         <appInfo>
+            <meta.element />
+         </appInfo>
+      </annotation>
       <complexType>
          <sequence>
          </sequence>
@@ -33,9 +38,9 @@
                <documentation>
                   
                </documentation>
-               <appinfo>
+               <appInfo>
                   <meta.attribute translatable="true"/>
-               </appinfo>
+               </appInfo>
             </annotation>
          </attribute>
       </complexType>
@@ -43,6 +48,9 @@
 
    <element name="componentimpl">
       <complexType>
+         <sequence minOccurs="0" maxOccurs="unbounded">
+            <element ref="extendedTypeID" minOccurs="0" maxOccurs="unbounded"/>
+         </sequence>
          <attribute name="typeID" type="string" use="required">
             <annotation>
                <documentation>
@@ -55,46 +63,48 @@
                <documentation>
                   
                </documentation>
-               <appinfo>
+               <appInfo>
                   <meta.attribute kind="java" basedOn=":org.eclipse.wst.common.componentcore.resources.IVirtualComponent"/>
-               </appinfo>
+               </appInfo>
             </annotation>
          </attribute>
       </complexType>
    </element>
 
+   <element name="extendedTypeID" type="string">
+   </element>
+
    <annotation>
-      <appinfo>
+      <appInfo>
+         <meta.section type="apiInfo"/>
+      </appInfo>
+      <documentation>
+         [Enter API information here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
          <meta.section type="since"/>
-      </appinfo>
+      </appInfo>
       <documentation>
          [Enter the first release in which this extension point appears.]
       </documentation>
    </annotation>
 
    <annotation>
-      <appinfo>
+      <appInfo>
          <meta.section type="examples"/>
-      </appinfo>
+      </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>
+      <appInfo>
          <meta.section type="implementation"/>
-      </appinfo>
+      </appInfo>
       <documentation>
          [Enter information about supplied implementation of this extension point.]
       </documentation>
diff --git a/plugins/org.eclipse.wst.common.modulecore/schema/referenceResolver.exsd b/plugins/org.eclipse.wst.common.modulecore/schema/referenceResolver.exsd
new file mode 100644
index 0000000..8ed7a92
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.modulecore/schema/referenceResolver.exsd
@@ -0,0 +1,116 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.wst.common.modulecore" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.wst.common.modulecore" id="referenceResolver" name="referenceResolver"/>
+      </appInfo>
+      <documentation>
+         [Enter description of this extension point.]
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appInfo>
+            <meta.element />
+         </appInfo>
+      </annotation>
+      <complexType>
+         <sequence minOccurs="1" maxOccurs="unbounded">
+            <element ref="resolver"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="resolver">
+      <complexType>
+         <attribute name="id" type="string" use="required">
+            <annotation>
+               <documentation>
+                  A required id which can be used to reference this resolver
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The implementation class of this extension
+               </documentation>
+               <appInfo>
+                  <meta.attribute kind="java" basedOn=":org.eclipse.wst.common.componentcore.resolvers.IReferenceResolver"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+         <attribute name="weight" type="string">
+            <annotation>
+               <documentation>
+                  The weight used for sorting the resolvers. Lighter weights float to the top and are tried first.
+               </documentation>
+            </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>
+
+
+</schema>
diff --git a/plugins/org.eclipse.wst.common.modulecore/schema/resourceFactories.exsd b/plugins/org.eclipse.wst.common.modulecore/schema/resourceFactories.exsd
index dd43bdb..49f7a80 100644
--- a/plugins/org.eclipse.wst.common.modulecore/schema/resourceFactories.exsd
+++ b/plugins/org.eclipse.wst.common.modulecore/schema/resourceFactories.exsd
@@ -1,16 +1,21 @@
 <?xml version='1.0' encoding='UTF-8'?>
 <!-- Schema file written by PDE -->
-<schema targetNamespace="org.eclipse.wst.common.modulecore">
+<schema targetNamespace="org.eclipse.wst.common.modulecore" xmlns="http://www.w3.org/2001/XMLSchema">
 <annotation>
-      <appInfo>
+      <appinfo>
          <meta.schema plugin="org.eclipse.wst.common.modulecore" id="resourceFactories" name="Resource Factory Association (Internal)"/>
-      </appInfo>
+      </appinfo>
       <documentation>
          An *internal* extension point that declares an association between a short-segment filename and a Resource.Factory.
       </documentation>
    </annotation>
 
    <element name="extension">
+      <annotation>
+         <appinfo>
+            <meta.element />
+         </appinfo>
+      </annotation>
       <complexType>
          <sequence>
             <element ref="resourceFactory"/>
@@ -34,9 +39,9 @@
                <documentation>
                   
                </documentation>
-               <appInfo>
+               <appinfo>
                   <meta.attribute translatable="true"/>
-               </appInfo>
+               </appinfo>
             </annotation>
          </attribute>
       </complexType>
@@ -57,15 +62,15 @@
                <documentation>
                   Declares an implementation of &lt;code&gt;org.eclipse.emf.ecore.resource.Resource.Factory&lt;/code&gt;.
                </documentation>
-               <appInfo>
+               <appinfo>
                   <meta.attribute kind="java" basedOn="org.eclipse.emf.ecore.resource.Resource.Factory"/>
-               </appInfo>
+               </appinfo>
             </annotation>
          </attribute>
-         <attribute name="shortSegment" type="string" use="required">
+         <attribute name="shortSegment" type="string">
             <annotation>
                <documentation>
-                  Declares the short segment of a filename that the resource factory applies to (e.g. &quot;web.xml&quot;).
+                  Optionally declares the short segment of a filename that the resource factory applies to (e.g. &quot;web.xml&quot;).
                </documentation>
             </annotation>
          </attribute>
@@ -76,14 +81,24 @@
                </documentation>
             </annotation>
          </attribute>
+         <attribute name="overridesFactoryClass" type="string">
+            <annotation>
+               <documentation>
+                  This optional attribute is to resolve conflicts between multiple defeault factories registered to the same content type and short segments.  The value should be the fully qualified class name of the factory being overridden.
+               </documentation>
+               <appinfo>
+                  <meta.attribute kind="java" basedOn="org.eclipse.emf.ecore.resource.Resource.Factory:"/>
+               </appinfo>
+            </annotation>
+         </attribute>
       </complexType>
    </element>
 
    <element name="contentTypeBinding">
       <annotation>
-         <appInfo>
+         <appinfo>
             <meta.element labelAttribute="contentTypeId"/>
-         </appInfo>
+         </appinfo>
          <documentation>
             Advertises that the containing editor understands the given content type and is suitable for editing files of that type.
          </documentation>
@@ -100,48 +115,40 @@
    </element>
 
    <annotation>
-      <appInfo>
+      <appinfo>
          <meta.section type="since"/>
-      </appInfo>
+      </appinfo>
       <documentation>
          [Enter the first release in which this extension point appears.]
       </documentation>
    </annotation>
 
    <annotation>
-      <appInfo>
+      <appinfo>
          <meta.section type="examples"/>
-      </appInfo>
+      </appinfo>
       <documentation>
          [Enter extension point usage example here.]
       </documentation>
    </annotation>
 
    <annotation>
-      <appInfo>
+      <appinfo>
          <meta.section type="apiInfo"/>
-      </appInfo>
+      </appinfo>
       <documentation>
          [Enter API information here.]
       </documentation>
    </annotation>
 
    <annotation>
-      <appInfo>
+      <appinfo>
          <meta.section type="implementation"/>
-      </appInfo>
+      </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.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.common.ui/META-INF/MANIFEST.MF
index 4f53d03..65e708e 100644
--- a/plugins/org.eclipse.wst.common.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.wst.common.ui/META-INF/MANIFEST.MF
@@ -2,17 +2,18 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.wst.common.ui; singleton:=true
-Bundle-Version: 1.1.301.qualifier
+Bundle-Version: 1.1.500.qualifier
 Bundle-Activator: org.eclipse.wst.common.ui.internal.UIPlugin
 Bundle-Vendor: %pluginProvider
 Bundle-Localization: plugin
 Export-Package: org.eclipse.wst.common.ui.internal;x-internal:=true,
  org.eclipse.wst.common.ui.internal.dialogs;x-internal:=true,
  org.eclipse.wst.common.ui.internal.dnd;x-internal:=true,
+ org.eclipse.wst.common.ui.internal.navigator,
  org.eclipse.wst.common.ui.internal.search;x-internal:=true,
  org.eclipse.wst.common.ui.internal.search.dialogs,
- org.eclipse.wst.common.ui.internal.viewers;x-internal:=true,
- org.eclipse.wst.common.ui.provisional.editors
+ org.eclipse.wst.common.ui.internal.viewers;x-internal:=true
+Import-Package: com.ibm.icu.text; version="3.8"
 Require-Bundle: org.eclipse.ui.ide;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.ui;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)",
@@ -20,7 +21,6 @@
  org.eclipse.search;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.wst.common.core;bundle-version="[1.1.101,2.0.0)",
  org.eclipse.jface.text;bundle-version="[3.4.0,4.0.0)",
- org.eclipse.ui.workbench.texteditor;bundle-version="[3.4.0,4.0.0)",
- com.ibm.icu;bundle-version="[3.8.1,4.0.0)"
-Eclipse-LazyStart: true
+ org.eclipse.ui.workbench.texteditor;bundle-version="[3.4.0,4.0.0)"
+Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: J2SE-1.4
diff --git a/plugins/org.eclipse.wst.common.ui/src-search/org/eclipse/wst/common/ui/internal/search/dialogs/ComponentSearchListDialog.java b/plugins/org.eclipse.wst.common.ui/src-search/org/eclipse/wst/common/ui/internal/search/dialogs/ComponentSearchListDialog.java
index 5895525..5eed598 100644
--- a/plugins/org.eclipse.wst.common.ui/src-search/org/eclipse/wst/common/ui/internal/search/dialogs/ComponentSearchListDialog.java
+++ b/plugins/org.eclipse.wst.common.ui/src-search/org/eclipse/wst/common/ui/internal/search/dialogs/ComponentSearchListDialog.java
@@ -121,7 +121,6 @@
         Composite mainComposite = (Composite) super.createDialogArea(parent);
         GridData gData = (GridData) mainComposite.getLayoutData();
         gData.heightHint = 500;
-        gData.widthHint = 400;
         
         configuration.createWidgetAboveQualifierBox(mainComposite);        
         // Subclasses may use this Composite to add desired widgets
@@ -500,12 +499,9 @@
             try {
               // this stuff gets executed on a non-UI thread
               //
-              long time1 = System.currentTimeMillis();
               configuration.getSearchListProvider().populateComponentList(componentList, searchScope, null);              
               // Do a final update of our Input for the component tree viewer.
               fireUpdateList(componentList);
-              long time2 = System.currentTimeMillis();
-              System.out.println("time=" + (time2 - time1) + " items= " + masterComponentList.size());
             }
             catch (Exception e) {
             	e.printStackTrace();
diff --git a/plugins/org.eclipse.wst.common.ui/src-search/org/eclipse/wst/common/ui/internal/search/dialogs/ScopedComponentSearchListDialog.java b/plugins/org.eclipse.wst.common.ui/src-search/org/eclipse/wst/common/ui/internal/search/dialogs/ScopedComponentSearchListDialog.java
index 4bf7d8d..16ca611 100644
--- a/plugins/org.eclipse.wst.common.ui/src-search/org/eclipse/wst/common/ui/internal/search/dialogs/ScopedComponentSearchListDialog.java
+++ b/plugins/org.eclipse.wst.common.ui/src-search/org/eclipse/wst/common/ui/internal/search/dialogs/ScopedComponentSearchListDialog.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
+ * Copyright (c) 2004, 2008 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
@@ -54,6 +54,8 @@
   protected Text workingSetsText;
   
   protected static String valueForWorkingSetsText;
+  // Show (default/true) or hide (false) the current resource scope button
+  private boolean showCurrentResourceScope = true;
   
   // working sets currently chosen by the user
   private static IWorkingSet[] workingSets;
@@ -84,8 +86,6 @@
     bottomComposite.setLayout(layout);
     Group group = new Group(bottomComposite, SWT.NONE);
     GridLayout gridLayout = new GridLayout(3, false);
-    // gridLayout.marginWidth = 0;
-    // gridLayout.marginLeft = 2;
     group.setLayout(gridLayout);
     group.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
     group.setText(Messages._UI_LABEL_SEARCH_SCOPE);
@@ -98,6 +98,20 @@
     radioButton[2].setText(SCOPE_CURRENT_RESOURCE);
     radioButton[3] = new Button(group, SWT.RADIO);
     radioButton[3].setText(SCOPE_WORKING_SETS);
+    // https://bugs.eclipse.org/bugs/show_bug.cgi?id=250815 
+    // If the current resource scope button is hidden, it no longer is the default scope.  We must select one of the remaining 
+    // visible radio buttons (Enclosing Project) and make it the default.    
+    radioButton[2].setVisible(showCurrentResourceScope);
+    if (!showCurrentResourceScope)
+    {
+      currentSearchScope = SCOPE_ENCLOSING_PROJECT;
+      if (currentResource != null)
+      {
+        // This is to ensure that once the dialog is invoked, the list is populated with the
+        // appropriate components based on this search scope.
+        populateMasterComponentList(new ProjectSearchScope(currentResource.getFullPath()));
+      } 
+    }
     for (int i = 0; i < radioButton.length; i++)
     {
       if (radioButton[i].getText().equals(currentSearchScope))
@@ -130,11 +144,13 @@
 			if ( dialog.open() == Window.OK){
 				workingSets = dialog.getSelection();
 				valueForWorkingSetsText = "";
-				for (int i = 0; i < workingSets.length; i++){
-					valueForWorkingSetsText += workingSets[i].getLabel();
-					// if not the last item, we add a comma
-					if ( i != workingSets.length - 1) 
-						valueForWorkingSetsText += ", ";
+				if (workingSets != null) {
+					for (int i = 0; i < workingSets.length; i++){
+						valueForWorkingSetsText += workingSets[i].getLabel();
+						// if not the last item, we add a comma
+						if ( i != workingSets.length - 1) 
+							valueForWorkingSetsText += ", ";
+					}
 				}
 				workingSetsText.setText(valueForWorkingSetsText);
 			}
@@ -180,9 +196,11 @@
 			  // Constructs the working sets scope from the working sets the user
 			  // selected
 			  WorkingSetSearchScope workingSetsScope = new WorkingSetSearchScope();
-			  for (int i = 0; i < workingSets.length; i++){
-				  workingSetsScope.addAWorkingSetToScope(workingSets[i].getElements());
-			  }			  
+			  if (workingSets != null) {
+				  for (int i = 0; i < workingSets.length; i++){
+					  workingSetsScope.addAWorkingSetToScope(workingSets[i].getElements());
+				  }
+			  }
 			  scope = workingSetsScope;
 		  }
 		  
@@ -229,4 +247,14 @@
   {
     this.currentResource = currentResource;
   }
+ 
+  /**
+   * This is non-API.  See https://bugs.eclipse.org/bugs/show_bug.cgi?id=250815
+   * Show (by default), or hide the current resource search scope button
+   * @param showCurrentResourceScope.  false to hide.
+   */
+  public void setShowCurrentResourceSearchScopeBug250815(boolean showCurrentResourceScope)
+  {
+    this.showCurrentResourceScope = showCurrentResourceScope;
+  }
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/CommonUIMessages.properties b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/CommonUIMessages.properties
new file mode 100644
index 0000000..742e35b
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/CommonUIMessages.properties
@@ -0,0 +1,143 @@
+! SelectSingleFilePage and SelectMultiFilePage
+_UI_LABEL_SOURCE_FILES   = Workspace Files
+_UI_LABEL_SELECTED_FILES = Selected Files
+_UI_POPUP_EXPAND_ALL	 = Expand All
+_UI_POPUP_COLLAPSE_ALL	 = Collapse All
+	
+_UI_IMPORT_BUTTON          = Import Files...
+_UI_IMPORT_BUTTON_TOOL_TIP = Import files from file system
+
+
+! SelectMultiFilePage
+! NOTE TO TRANSLATOR: the following three lines refers to _UI_LABEL_SELECTED_FILES label above
+_UI_ADD_BUTTON_TOOL_TIP    = Add files to Selected Files list.
+_UI_REMOVE_BUTTON_TOOL_TIP = Remove files from Selected Files list.
+_UI_REMOVE_ALL_BUTTON_TOOL_TIP =  Remove all files from Selected Files list.
+
+! NOTE TO TRANSLATOR: No translation needed of following three lines
+_UI_ADD_BUTTON             = >
+_UI_REMOVE_BUTTON          = <
+_UI_REMOVE_ALL_BUTTON      = <<
+
+! SelectJavaProjectView
+_UI_LABEL_CHOOSE_FOLDER = Select a project or folder:
+
+! SelectJavaProjectDialog
+_UI_LABEL_FOLDER_SELECTION = Container Selection
+
+! TextViewerOperationAction
+_UI_MENU_COPY         = &Copy
+_UI_MENU_CUT          = Cu&t
+_UI_MENU_DELETE       = Delete
+_UI_MENU_PASTE        = &Paste
+_UI_MENU_PREFIX       = Prefix
+_UI_MENU_REDO         = Redo
+_UI_MENU_SELECT_ALL   = Select All
+_UI_MENU_SHIFT_LEFT   = Shift Left
+_UI_MENU_SHIFT_RIGHT  = Shift Right
+_UI_MENU_STRIP_PREFIX = Strip Prefix
+_UI_MENU_UNDO         = Undo
+
+! SourceViewerGotoLineAction
+_UI_MENU_GOTO_LINE           = Go To Line...
+_UI_GOTO_LINE_DIALOG_TITLE   = Go To Line
+_UI_GOTO_LINE_DIALOG_TEXT    = Enter Line Number
+
+_UI_FILE_CHANGED_TITLE = File Changed
+_UI_FILE_DELETED_SAVE_CHANGES = The file has been deleted from the file system. Do you want to save your changes or close the editor without saving?
+_UI_FILE_DELETED_EDITOR_CLOSED = The file has been deleted from the file system. This editor will be closed.
+_UI_FILE_CHANGED_LOAD_CHANGES = The file has been changed on the file system. Do you want to load the changes?
+_UI_SAVE_BUTTON = Save
+_UI_CLOSE_BUTTON = Close
+
+
+! XSL Prefererence
+_UI_XSLT_SELECT     = Select which element to use for your stylesheet
+_UI_XSLT_STYLESHEET = &Use <xsl:stylesheet>
+_UI_XSLT_TRANSFORM  = U&se <xsl:transform>
+
+! XSL Debug Prefererence
+_UI_XSL_DEBUG_SELECT_LAUNCHER = Set the default XSL launcher for the XSL Debugging and Transformation tool
+_UI_XSL_DEBUG_LOCAL           = &XSL application
+_UI_XSL_DEBUG_REMOTE          = XS&L remote application
+_UI_XSL_TILE_EDITOR           = &Show all debugging files in a tile editor
+_UI_XSL_DEBUG_AND_TRANSFORM   = &Run transformation and open a debugging session
+_UI_XSL_CONTEXT_URI           = Context Path 
+_UI_XSL_CONTEXT               = Specify a &context path for resolving URIs in xsl:import, xsl:include or document()
+
+
+_UI_OVERRIDE_FILE    = Overwrite existing files
+_UI_JAVA_EXIST_FILE1 = The following Java classes already exist.
+_UI_JAVA_EXIST_FILE2 = Do you want to overwrite the existing file?
+      
+! some options strings common to several plugins
+_UI_ERROR_CREATING_FILE_TITLE = Error Creating File
+_UI_ERROR_CREATING_FILE_SHORT_DESC = Error creating file "{0}"
+_UI_ERROR_CREATING_FILE_LONG_DESC = An error occured while attempting to create the file "{0}".
+_UI_PARENT_FOLDER_IS_READ_ONLY = The parent directory "{0}" is read only.
+_UI_UNKNOWN_ERROR_WITH_HINT = Unknown error. Ensure that the parent directory "{0}" is writeable.
+_UI_UNKNOWN_ERROR = Unknown error. Ensure that the parent directory "{0}" is writeable.
+
+! usage - this label is followed by two radio button options for the file location
+_UI_LABEL_INCLUDE_URL_FILE = Select file location
+_UI_RADIO_FILE             = Workspace projects
+_UI_RADIO_URL              = HTTP
+
+_UI_LABEL_COMPONENTS				   = Components:
+_UI_LABEL_QUALIFIER					   = Qualifier:
+
+!- component selection dialogs 
+_UI_LABEL_COMPONENT_NAME			   = Component Name:
+_UI_LABEL_MATCHING_COMPONENTS		   = Matching Components:
+_UI_LABEL_SPECIFIED_FILE			   = Specified File
+_UI_LABEL_ENCLOSING_PROJECT			   = Enclosing Project
+_UI_LABEL_WORKSPACE					   = Workspace
+_UI_LABEL_CURRENT_RESOURCE			   = Current Resource
+_UI_LABEL_SEARCH_SCOPE				   = Search Scope
+_UI_LABEL_NARROW_SEARCH_SCOPE_RESOURCE = Use resource view to narrow search scope
+_UI_LABEL_AVAILABLE_TYPES			   = Available Types
+_UI_LABEL_WORKING_SETS                 = Working Sets
+
+_UI_LABEL_New=New...
+_UI_LABEL_DECLARATION_LOCATION=Declaration Location:
+_UI_LABEL_CHOOSE=Choose...
+
+!======================================================================================
+!
+! Here is the list of Error string that have message IDs - make sure they are unique
+!  Range for b2bgui messageIDs: IWAX1201 - IWAX1400
+!
+!======================================================================================
+
+_ERROR_THE_CONTAINER_NAME = The specified container must exist in the workspace and its path must start at the workspace root.
+
+_ERROR_LOCAL_LOCATION     = The local location of this container cannot be resolved.
+_ERROR_NOT_JAVA_PROJECT   = The specified project is not a Java project.
+
+!NOTE TO TRANSLATOR: this error message text is followed by a message from another plugin
+_ERROR_INVALID_JAVA_PACKAGE = IWAX1201E Invalid package name error:
+
+!NOTE TO TRANSLATOR: (_ERROR_BAD_FILENAME_EXTENSION + string + _UI_LABEL_OR + string) or (_ERROR_BAD_FILENAME_EXTENSION)
+_ERROR_BAD_FILENAME_EXTENSION         = The file name must end with
+_ERROR_FILE_ALREADY_EXISTS            = The same name already exists.
+
+_ERROR_CONTAINER_NOT_JAVA_BUILDPATH = The container is not a Java source folder for this project
+_ERROR_USE_PROJECT_JAVA_SOURCE_FOLDER = The project is not on the build path.  Select a Java source folder for the project.
+
+_UI_ERROR             = Error
+
+!NOTE TO TRANSLATOR: this warning message text is followed by a message from another plugin
+_WARN_INVALID_JAVA_PACKAGE = Invalid package name warning:
+
+_ERROR_ROOT_ELEMENT = The XML schema does not contain any global elements that can be used as a root element.
+_ERROR_SAVING_FILE = Error saving file "{0}"
+
+! File Validator
+_UI_ERROR_VALIDATE_FAIL_TITLE = Failed to check out necessary files
+_UI_ERROR_VALIDATE_FAIL_MESSAGE = Generation failed. Necessary files could not be checked out. 
+
+! PropertyDirtyChangeListener and PropertyResourceChangeListener
+_UI_ERROR_VALIDATE_EDIT_FAIL_ONE_FILE = Error
+
+SaveFilesDialog_save_all_resources=Save All Modified Resources
+SaveFilesDialog_must_save=All modified resources must be saved before this operation.
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/Messages.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/Messages.java
index ce13bb8..0cd816a 100644
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/Messages.java
+++ b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/Messages.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2006 IBM Corporation and others.
+ * Copyright (c) 2001, 2008 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
@@ -13,7 +13,7 @@
 import org.eclipse.osgi.util.NLS;
 
 public class Messages {
-	private static final String BUNDLE_NAME = "plugin"; //$NON-NLS-1$
+	private static final String BUNDLE_NAME = "org.eclipse.wst.common.ui.internal.CommonUIMessages"; //$NON-NLS-1$
 
 	static {
 		NLS.initializeMessages(BUNDLE_NAME, Messages.class); //$NON-NLS-1$
@@ -149,6 +149,8 @@
 
 	public static String _UI_ERROR;
 
+	public static String _WARN_INVALID_JAVA_PACKAGE;
+	
 	public static String _ERROR_ROOT_ELEMENT;
 	public static String _ERROR_SAVING_FILE;
 
@@ -159,18 +161,6 @@
 //	 PropertyDirtyChangeListener and PropertyResourceChangeListener
 	public static String _UI_ERROR_VALIDATE_EDIT_FAIL_ONE_FILE;
 
-//	public static String ExampleProjectCreationWizard.title;
-//	public static String ExampleProjectCreationWizard.op_error.title;
-//	public static String ExampleProjectCreationWizard.op_error.message;
-//
-//	public static String ExampleProjectCreationWizard.overwritequery.title;
-//	public static String ExampleProjectCreationWizard.overwritequery.message;
-//
-//
-//	public static String ExampleProjectCreationOperation.op_desc;
-//	public static String ExampleProjectCreationOperation.op_desc_proj;
-//
-//	public static String ExampleProjectCreationWizardPage.error.alreadyexists;
 	public static String SaveFilesDialog_save_all_resources;
 	public static String SaveFilesDialog_must_save;
 }
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/navigator/ILoadingDDNode.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/navigator/ILoadingDDNode.java
new file mode 100644
index 0000000..ab310dd
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/internal/navigator/ILoadingDDNode.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.ui.internal.navigator;
+
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * 
+ * @author 
+ * An interface used by navigator contribution to display text and image
+ * while loading the model 
+ */
+public interface ILoadingDDNode {
+	
+	/**
+	 * 
+	 * @return
+	 */
+	String getText();
+	
+	/**
+	 * 
+	 * @return
+	 */
+	Image getImage();
+}
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/provisional/editors/PostMultiPageEditorSite.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/provisional/editors/PostMultiPageEditorSite.java
deleted file mode 100644
index ee280ca..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/provisional/editors/PostMultiPageEditorSite.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*******************************************************************************
- * 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
- *******************************************************************************/
-package org.eclipse.wst.common.ui.provisional.editors;
-
-import org.eclipse.jface.viewers.IPostSelectionProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.part.MultiPageEditorPart;
-import org.eclipse.ui.part.MultiPageEditorSite;
-
-/**
- * @deprecated - No longer necessary as of 3.2M3.
- */
-public class PostMultiPageEditorSite extends MultiPageEditorSite {
-	/**
-	 * The post selection change listener, initialized lazily;
-	 * <code>null</code> if not yet created.
-	 */
-	private ISelectionChangedListener postSelectionChangedListener = null;
-
-	public PostMultiPageEditorSite(MultiPageEditorPart multiPageEditor, IEditorPart editor) {
-		super(multiPageEditor, editor);
-	}
-
-	/**
-	 * Returns the selection changed listener which listens to the nested
-	 * editor's post selection changes, and calls
-	 * <code>handlePostSelectionChanged</code>.
-	 * 
-	 * @return the selection changed listener
-	 */
-	private ISelectionChangedListener getPostSelectionChangedListener() {
-		if (postSelectionChangedListener == null) {
-			postSelectionChangedListener = new ISelectionChangedListener() {
-				public void selectionChanged(SelectionChangedEvent event) {
-					PostMultiPageEditorSite.this.handlePostSelectionChanged(event);
-				}
-			};
-		}
-		return postSelectionChangedListener;
-	}
-
-	/**
-	 * Handles a post selection changed event from the nested editor. The
-	 * default implementation gets the selection provider from the multi-page
-	 * editor's site, and calls <code>firePostSelectionChanged</code> on it
-	 * (only if it is an instance of <code>MultiPageSelectionProvider</code>),
-	 * passing a new event object.
-	 * <p>
-	 * Subclasses may extend or reimplement this method.
-	 * </p>
-	 * 
-	 * @param event
-	 *            the event
-	 */
-	protected void handlePostSelectionChanged(SelectionChangedEvent event) {
-		ISelectionProvider parentProvider = getMultiPageEditor().getSite().getSelectionProvider();
-		if (parentProvider instanceof PostMultiPageSelectionProvider) {
-			SelectionChangedEvent newEvent = new SelectionChangedEvent(parentProvider, event.getSelection());
-			((PostMultiPageSelectionProvider) parentProvider).firePostSelectionChanged(newEvent);
-		}
-	}
-
-	/**
-	 * The <code>MultiPageEditorSite</code> implementation of this
-	 * <code>IWorkbenchPartSite</code> method remembers the selection
-	 * provider, and also hooks a listener on it, which calls
-	 * <code>handleSelectionChanged</code> when a selection changed event
-	 * occurs and <code>handlePostSelectionChanged</code> when a post
-	 * selection changed event occurs.
-	 * 
-	 * @param provider
-	 *            The selection provider.
-	 * @see PostMultiPageEditorSite#handleSelectionChanged(SelectionChangedEvent)
-	 */
-	public void setSelectionProvider(ISelectionProvider provider) {
-		ISelectionProvider oldSelectionProvider = getSelectionProvider();
-		if (oldSelectionProvider != null) {
-			if (oldSelectionProvider instanceof IPostSelectionProvider) {
-				((IPostSelectionProvider) oldSelectionProvider).removePostSelectionChangedListener(getPostSelectionChangedListener());
-			}
-		}
-
-		super.setSelectionProvider(provider);
-
-		if (provider != null) {
-			if (provider instanceof IPostSelectionProvider) {
-				((IPostSelectionProvider) provider).addPostSelectionChangedListener(getPostSelectionChangedListener());
-			}
-		}
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/provisional/editors/PostMultiPageSelectionProvider.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/provisional/editors/PostMultiPageSelectionProvider.java
deleted file mode 100644
index 3a4f908..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/provisional/editors/PostMultiPageSelectionProvider.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2004 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.ui.provisional.editors;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.util.ListenerList;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.IPostSelectionProvider;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.ui.part.MultiPageEditorPart;
-import org.eclipse.ui.part.MultiPageSelectionProvider;
-
-/**
- * @deprecated - No longer necessary as of 3.2M3.
- */
-public class PostMultiPageSelectionProvider extends MultiPageSelectionProvider implements IPostSelectionProvider {
-	private ListenerList postListeners;
-
-	public PostMultiPageSelectionProvider(MultiPageEditorPart multiPageEditor) {
-		super(multiPageEditor);
-		postListeners = new ListenerList();
-	}
-
-	public void addPostSelectionChangedListener(ISelectionChangedListener listener) {
-		postListeners.add(listener);
-	}
-
-	public void firePostSelectionChanged(final SelectionChangedEvent event) {
-		Object[] listeners = postListeners.getListeners();
-		for (int i = 0; i < listeners.length; ++i) {
-			final ISelectionChangedListener pl = (ISelectionChangedListener) listeners[i];
-			Platform.run(new SafeRunnable() {
-				public void run() {
-					pl.selectionChanged(event);
-				}
-			});
-		}
-	}
-
-	public void removePostSelectionChangedListener(ISelectionChangedListener listener) {
-		postListeners.remove(listener);
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/provisional/editors/PostSelectionMultiPageEditorPart.java b/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/provisional/editors/PostSelectionMultiPageEditorPart.java
deleted file mode 100644
index bcd2f07..0000000
--- a/plugins/org.eclipse.wst.common.ui/src/org/eclipse/wst/common/ui/provisional/editors/PostSelectionMultiPageEditorPart.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * 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
- *******************************************************************************/
-package org.eclipse.wst.common.ui.provisional.editors;
-
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.part.MultiPageEditorPart;
-
-/**
- * Adds posts selection notifications from contained editor parts to
- * listeners. This part was created as a workaround for
- * https://bugs.eclipse.org/bugs/show_bug.cgi?id=108324 and will be removed
- * once WTP is building on a platform milestone that includes a fix.
- * 
- * @deprecated - No longer necessary as of 3.2M3.
- */
-public abstract class PostSelectionMultiPageEditorPart extends MultiPageEditorPart {
-	public void init(IEditorSite site, IEditorInput input) throws PartInitException {
-		super.init(site, input);
-		site.setSelectionProvider(new PostMultiPageSelectionProvider(this));
-	}
-
-	protected void pageChange(int newPageIndex) {
-		super.pageChange(newPageIndex);
-		IEditorPart activeEditor = getEditor(newPageIndex);
-		if (activeEditor != null) {
-			ISelectionProvider selectionProvider = activeEditor.getSite().getSelectionProvider();
-			if (selectionProvider != null) {
-				SelectionChangedEvent event = new SelectionChangedEvent(selectionProvider, selectionProvider.getSelection());
-				((PostMultiPageSelectionProvider) getSite().getSelectionProvider()).firePostSelectionChanged(event);
-			}
-		}
-	}
-}
diff --git a/plugins/org.eclipse.wst.common.uriresolver/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.common.uriresolver/META-INF/MANIFEST.MF
index 66af992..888cca8 100644
--- a/plugins/org.eclipse.wst.common.uriresolver/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.wst.common.uriresolver/META-INF/MANIFEST.MF
@@ -2,15 +2,15 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.wst.common.uriresolver; singleton:=true
-Bundle-Version: 1.1.301.qualifier
+Bundle-Version: 1.1.401.qualifier
 Bundle-Activator: org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverPlugin
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
-Export-Package: org.eclipse.wst.common.uriresolver.internal,
- org.eclipse.wst.common.uriresolver.internal.provisional,
- org.eclipse.wst.common.uriresolver.internal.util
+Export-Package: org.eclipse.wst.common.uriresolver.internal;x-internal:=true,
+ org.eclipse.wst.common.uriresolver.internal.provisional;x-internal:=true,
+ org.eclipse.wst.common.uriresolver.internal.util;x-internal:=true
 Require-Bundle: org.eclipse.core.runtime;bundle-version="[3.4.0,4.0.0)",
  org.eclipse.core.resources;bundle-version="[3.4.0,4.0.0)"
 Eclipse-LazyStart: true
-Bundle-ClassPath: .
 Bundle-RequiredExecutionEnvironment: J2SE-1.4
+Bundle-ActivationPolicy: lazy
diff --git a/plugins/org.eclipse.wst.common.uriresolver/plugin.properties b/plugins/org.eclipse.wst.common.uriresolver/plugin.properties
index 307664b..f4e6c2f 100644
--- a/plugins/org.eclipse.wst.common.uriresolver/plugin.properties
+++ b/plugins/org.eclipse.wst.common.uriresolver/plugin.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2005 IBM Corporation and others.
+# Copyright (c) 2005, 2010 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
@@ -8,7 +8,7 @@
 # Contributors:
 #     IBM Corporation - initial API and implementation
 ###############################################################################
-providerName=Eclipse.org
+providerName=Eclipse Web Tools Platform
 pluginName=Common URI Resolver Framework
 ###############################################################################
 
diff --git a/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/URIResolverExtensionRegistry.java b/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/URIResolverExtensionRegistry.java
index 1403071..e5c22e8 100644
--- a/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/URIResolverExtensionRegistry.java
+++ b/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/URIResolverExtensionRegistry.java
@@ -26,6 +26,8 @@
 public class URIResolverExtensionRegistry
 {
 	protected HashMap map = new HashMap();
+	
+	protected List resolverList = new ArrayList();
 
 	public static final int STAGE_PRENORMALIZATION = 1;
 
@@ -84,6 +86,8 @@
 		URIResolverExtensionDescriptor info = new URIResolverExtensionDescriptor(
 				className, pluginId, projectNatureIds, resourceType, stage, priority);
 
+		resolverList.add(info);
+		
 		Iterator idsIter = projectNatureIds.iterator();
 		while (idsIter.hasNext())
 		{
@@ -112,29 +116,33 @@
 	 */
 	public List getExtensionDescriptors(IProject project)
 	{
-	  List result = new ArrayList();
-	  List lowPriorityList = new ArrayList();
-	  List mediumPriorityList = new ArrayList();
-	  List highPriorityList = new ArrayList();          
-	  for (Iterator i = map.keySet().iterator(); i.hasNext();)
-	  {
-	    String key = (String) i.next();
-	    try
-	    {
-	      if (key == NULL_PROJECT_NATURE_ID || project == null || project.hasNature(key))
-	      {
-	        highPriorityList.addAll((List) ((HashMap) map.get(key)).get(PRIORITY_HIGH));
-	        mediumPriorityList.addAll((List) ((HashMap) map.get(key)).get(PRIORITY_MEDIUM));
-	        lowPriorityList.addAll((List) ((HashMap) map.get(key)).get(PRIORITY_LOW));
-	      }
-	    } catch (CoreException e)
-	    {
-	    }
+	  if(project != null) {
+		  List result = new ArrayList();
+		  List lowPriorityList = new ArrayList();
+		  List mediumPriorityList = new ArrayList();
+		  List highPriorityList = new ArrayList();          
+		  for (Iterator i = map.keySet().iterator(); i.hasNext();)
+		  {
+		    String key = (String) i.next();
+		    try
+		    {
+		      if (key == NULL_PROJECT_NATURE_ID || project.hasNature(key))
+		      {
+		        highPriorityList.addAll((List) ((HashMap) map.get(key)).get(PRIORITY_HIGH));
+		        mediumPriorityList.addAll((List) ((HashMap) map.get(key)).get(PRIORITY_MEDIUM));
+		        lowPriorityList.addAll((List) ((HashMap) map.get(key)).get(PRIORITY_LOW));
+		      }
+		    } catch (CoreException e)
+		    {
+		    }
+		  }
+		  result.addAll(highPriorityList);
+		  result.addAll(mediumPriorityList);
+		  result.addAll(lowPriorityList);
+		  return result;
+	  } else {
+		  return resolverList;
 	  }
-	  result.addAll(highPriorityList);
-	  result.addAll(mediumPriorityList);
-	  result.addAll(lowPriorityList);
-	  return result;
 	}
 
 	/**
diff --git a/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/URIResolverExtensionRegistryReader.java b/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/URIResolverExtensionRegistryReader.java
index a173f28..8f1022e 100644
--- a/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/URIResolverExtensionRegistryReader.java
+++ b/plugins/org.eclipse.wst.common.uriresolver/src/org/eclipse/wst/common/uriresolver/internal/URIResolverExtensionRegistryReader.java
@@ -17,8 +17,11 @@
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IExtensionPoint;
 import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
 import org.eclipse.wst.common.uriresolver.internal.provisional.URIResolverPlugin;
+import org.osgi.framework.Bundle;
 
 /**
  * This class reads the URI resolver extension point and registers extension
@@ -92,6 +95,10 @@
 			// String projectNatureId = element.getAttribute(ATT_PROJECT_NATURE_ID);
 			String resourceType = element.getAttribute(ATT_RESOURCE_TYPE);
 			String stage = element.getAttribute(ATT_STAGE);
+			if (stage == null || stage.equals(""))
+			{
+			    stage = VAL_STAGE_POST;
+			}
 			String priority = element.getAttribute(ATT_PRIORITY);
 			if (priority == null || priority.equals(""))
 			{
@@ -127,8 +134,9 @@
 							stageint, priority);
 				} catch (Exception e)
 				{
-					// TODO: Log exception as this will cause an extension resolver
-					//       from loading.
+					Bundle bundle = URIResolverPlugin.getInstance().getBundle();
+					IStatus status = new Status(IStatus.ERROR, bundle.getSymbolicName(), e.getMessage(), e);
+					Platform.getLog(bundle).log( status);
 				}
 			}
 		}
diff --git a/plugins/org.eclipse.wst.internet.cache/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.internet.cache/META-INF/MANIFEST.MF
index c315cde..53fb468 100644
--- a/plugins/org.eclipse.wst.internet.cache/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.wst.internet.cache/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %_PLUGIN_NAME
 Bundle-SymbolicName: org.eclipse.wst.internet.cache; singleton:=true
-Bundle-Version: 1.0.301.qualifier
+Bundle-Version: 1.0.400.qualifier
 Bundle-Activator: org.eclipse.wst.internet.cache.internal.CachePlugin
 Bundle-Vendor: %_PLUGIN_PROVIDER
 Bundle-Localization: plugin
diff --git a/plugins/org.eclipse.wst.internet.cache/build.properties b/plugins/org.eclipse.wst.internet.cache/build.properties
index dbd4f60..dd443d4 100644
--- a/plugins/org.eclipse.wst.internet.cache/build.properties
+++ b/plugins/org.eclipse.wst.internet.cache/build.properties
@@ -4,7 +4,5 @@
                .,\
                plugin.properties,\
                about.html
-src.includes = exsd/,\
-               .,\
-               build.properties
+src.includes = exsd/
 output.. = bin/
diff --git a/plugins/org.eclipse.wst.internet.cache/plugin.properties b/plugins/org.eclipse.wst.internet.cache/plugin.properties
index 5df72b9..1353df2 100644
--- a/plugins/org.eclipse.wst.internet.cache/plugin.properties
+++ b/plugins/org.eclipse.wst.internet.cache/plugin.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2005 IBM Corporation and others.
+# Copyright (c) 2005, 2010 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
@@ -9,7 +9,7 @@
 #     IBM Corporation - initial API and implementation
 ###############################################################################
 
-_PLUGIN_PROVIDER                       = Eclipse.org
+_PLUGIN_PROVIDER                       = Eclipse Web Tools Platform
 _PLUGIN_NAME                           = Cache URI Resolver Plug-in
 
 cacheResource                          = Cache Resource
diff --git a/plugins/org.eclipse.wst.validation.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.validation.ui/META-INF/MANIFEST.MF
index 13b38fd..f25773c 100644
--- a/plugins/org.eclipse.wst.validation.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.wst.validation.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Bundle-Name.0
 Bundle-SymbolicName: org.eclipse.wst.validation.ui; singleton:=true
-Bundle-Version: 1.2.0.qualifier
+Bundle-Version: 1.2.204.qualifier
 Bundle-Activator: org.eclipse.wst.validation.internal.ui.plugin.ValidationUIPlugin
 Bundle-Vendor: %Bundle-Vendor.0
 Bundle-Localization: plugin
diff --git a/plugins/org.eclipse.wst.validation.ui/plugin.properties b/plugins/org.eclipse.wst.validation.ui/plugin.properties
index b8d12f2..887dfc0 100644
--- a/plugins/org.eclipse.wst.validation.ui/plugin.properties
+++ b/plugins/org.eclipse.wst.validation.ui/plugin.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2001, 2007 IBM Corporation and others.
+# Copyright (c) 2001, 2009 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
@@ -12,8 +12,8 @@
 # Version 1.3
 #
 VBF_TITLE_PROPERTIES=Validation
-VBF_UI_POPUP_RUNVALIDATION=Validate
+VBF_UI_POPUP_RUNVALIDATION=&Validate
 VBF_TITLE_PREFERENCE=Validation
 
 Bundle-Name.0 = Validation Framework UI
-Bundle-Vendor.0 = Eclipse.org
+Bundle-Vendor.0 = Eclipse Web Tools Platform
diff --git a/plugins/org.eclipse.wst.validation.ui/property_files/org/eclipse/wst/validation/ui/internal/messages.properties b/plugins/org.eclipse.wst.validation.ui/property_files/org/eclipse/wst/validation/ui/internal/messages.properties
index af8e823..b08bb43 100644
--- a/plugins/org.eclipse.wst.validation.ui/property_files/org/eclipse/wst/validation/ui/internal/messages.properties
+++ b/plugins/org.eclipse.wst.validation.ui/property_files/org/eclipse/wst/validation/ui/internal/messages.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2001, 2008 IBM Corporation and others.
+# Copyright (c) 2001, 2009 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
@@ -56,10 +56,10 @@
 #    VBF_EXC=Exception or error text
 #    VBF_UI=UI label
 #
-PREF_BUTTON_OVERRIDE=Allow projects to override these preference settings
-PREF_BUTTON_ENABLEALL=Enable All
-PREF_BUTTON_DISABLEALL=Disable All
-PREF_VALLIST_TITLE=The selected validators will run when validation is performed:
+PREF_BUTTON_OVERRIDE=Allow projects to &override these preference settings
+PREF_BUTTON_ENABLEALL=E&nable All
+PREF_BUTTON_DISABLEALL=D&isable All
+PREF_VALLIST_TITLE=The selected &validators will run when validation is performed:
 PREF_MNU_MANUAL=&Manual
 PREF_MNU_BUILD=&Build
 PREF_MNU_SETTINGS=&Settings...
@@ -72,11 +72,11 @@
  
 VBF_UI_NO_VALIDATORS_INSTALLED=No validators are installed.
 
-DISABLE_VALIDATION=Suspend all validators
+DISABLE_VALIDATION=S&uspend all validators
 
 DelegatesDialogTitle=Validator Preferences
-DelegatesComboLabel=Implementation:
-ADD_VALIDATION_BUILDER=Add Validation Builder to project
+DelegatesComboLabel=Im&plementation:
+ADD_VALIDATION_BUILDER=Add Validation &Builder to project
 ConfigWsSettings=Configure Workspace Settings...
 VALIDATOR=Validator
 MANUAL=Manual
@@ -89,7 +89,7 @@
 SaveFilesDialog_must_save=All modified resources must be saved before this operation.
 
 PrefPage_always_save=&Save all modified resources automatically prior to validating
-PrefPageConfirmDialog=Show a confirmation dialog when performing manual validations
+PrefPageConfirmDialog=Show a &confirmation dialog when performing manual validations
 
 RunValidationDialogTitle=Running Validation
 
@@ -98,18 +98,18 @@
 ErrConfig=Extension configuration error. An internal error has happened, the validator {0} has incorrectly configured the validation extension point.
 
 FilterHelp=Filter rules are grouped into groups. Inside of any one group the rules are combined by using the logical OR operator. There are two types of groups Include and Exclude. If any of the rules in the Exclude group match, the resource is not validated. If there are Include groups, at least one rule from each group must match before the resource is validated.
-ButtonAddGroupInclude=Add Include Group...
-ButtonAddGroupExclude=Add Exclude Group...
-ButtonAddRule=Add Rule...
-ButtonRemove=Remove 
+ButtonAddGroupInclude=Add &Include Group...
+ButtonAddGroupExclude=Add &Exclude Group...
+ButtonAddRule=Add R&ule...
+ButtonRemove=&Remove 
 
-LabelEnableProjectSpecific=Enable project specific settings
+LabelEnableProjectSpecific=Enable pr&oject specific settings
 
-LabelExtension=File extension
-LabelFile=Folder or file name
-LabelProjects=Project nature
-LabelFacets=Facet
-LabelContentType=Content Type
+LabelExtension=File &extension
+LabelFile=F&older or file name
+LabelProjects=Project &nature
+LabelFacets=&Facet
+LabelContentType=&Content Type
 
 # Note to translators, keep the <A> and </A> tags exactly as they are
 DoNotShowResults=Do not show this dialog in the future.
@@ -122,7 +122,7 @@
 
 ErrorsWarnings=Errors/Warnings
 
-Validation=Validation
+Validation=Validating
 ValidationStatus=Validation Status
 
 ErrSummary=Validation results. Errors={0}, Warnings={1}, Information={2}
@@ -131,22 +131,22 @@
 FrWizard=New Filter Rule Wizard
 FrSelectFilterType=Select Filter Type
 FrFileExtension=File Extension
-FrFileExtensionLabel=File extension, for example html:
-FrCaseSensitive=Is the comparison case sensitive?
-FrExactMatch=Check this if the content type needs to match exactly. Do not check it, if sub types need to match as well.
-FrSimpleFileName=For file based comparisons, use only the simple file name.
+FrFileExtensionLabel=File &extension, for example html:
+FrCaseSensitive=Is the comparison case &sensitive?
+FrExactMatch=Check this if the content type needs to &match exactly. Do not check it, if sub types need to match as well.
+FrSimpleFileName=For file based &comparisons, use only the simple file name.
 FrFolderOrFile=Folder or File Name
-FrFolderOrFileLabel=File or folder:
-FrBrowseFile=Browse File...
+FrFolderOrFileLabel=Fil&e or folder:
+FrBrowseFile=Browse &File...
 FrFileFilter=Select the file that will serve as the filter
-FrBrowseFolder=Browse Folder...
+FrBrowseFolder=Browse F&older...
 FrFolderFilter=Select the folder that will serve as the filter
 FrProjectNature=Project Nature
-FrProjectNatureLabel=Project nature:
+FrProjectNatureLabel=Project &nature:
 FrFacit=Facet
-FrFacitLabel=Facet id:
+FrFacitLabel=&Facet id:
 FrContentType=Content Type
-FrContentTypeLabel=Content Type:
+FrContentTypeLabel=&Content Type:
 FrMsgSev=Select the severity level for the following problems
 
 RebuildTitle=Validation Settings Changed
diff --git a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ValidationMenuAction.java b/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ValidationMenuAction.java
index af083e7..126c407 100644
--- a/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ValidationMenuAction.java
+++ b/plugins/org.eclipse.wst.validation.ui/validateui/org/eclipse/wst/validation/internal/ui/ValidationMenuAction.java
@@ -212,6 +212,7 @@
 					if (DisabledResourceManager.getDefault().isDisabled(res))return false;
 					if (res instanceof IFile)addSelected(res);
 					else if (res instanceof IFolder)addSelected(res);
+					else if (res instanceof IProject)addSelected(res);
 					
 					return true;
 				}
diff --git a/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/AdapterFactory.java b/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/AdapterFactory.java
index 4337534..750c6fd 100644
--- a/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/AdapterFactory.java
+++ b/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/AdapterFactory.java
@@ -14,15 +14,17 @@
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.ui.model.IWorkbenchAdapter;
 import org.eclipse.wst.validation.Validator;
+import org.eclipse.wst.validation.internal.ValidatorMutable;
 import org.eclipse.wst.validation.internal.model.FilterGroup;
 import org.eclipse.wst.validation.internal.model.FilterRule;
 
 public class AdapterFactory implements IAdapterFactory {
 
 	public Object getAdapter(Object adaptableObject, Class adapterType) {
-		if (adapterType == IWorkbenchAdapter.class&& adaptableObject instanceof Validator.V2)return _valAdaptor;
+		if (adapterType == IWorkbenchAdapter.class && adaptableObject instanceof Validator.V2)return _valAdaptor;
 		if (adapterType == IWorkbenchAdapter.class && adaptableObject instanceof FilterGroup)return _fgAdaptor;
 		if (adapterType == IWorkbenchAdapter.class && adaptableObject instanceof FilterRule)return _ruleAdaptor;
+		if (adapterType == IWorkbenchAdapter.class && adaptableObject instanceof ValidatorMutable)return _valMutableAdaptor;
 
 		return null;
 	}
@@ -50,6 +52,25 @@
 		}
 
 	};
+	private IWorkbenchAdapter _valMutableAdaptor = new IWorkbenchAdapter() {
+
+		public Object[] getChildren(Object o) {
+			return ((ValidatorMutable) o).getGroups();
+		}
+
+		public ImageDescriptor getImageDescriptor(Object o) {
+			return null;
+		}
+
+		public String getLabel(Object o) {
+			return ((ValidatorMutable) o).getName();
+		}
+
+		public Object getParent(Object o) {
+			return null;
+		}
+
+	};
 
 	private IWorkbenchAdapter _fgAdaptor = new IWorkbenchAdapter() {
 
diff --git a/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/ManualValidationRunner.java b/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/ManualValidationRunner.java
index 52b47ea..f70bcce 100644
--- a/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/ManualValidationRunner.java
+++ b/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/ManualValidationRunner.java
@@ -22,9 +22,9 @@
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.jobs.MultiRule;
 import org.eclipse.swt.widgets.Display;
-import org.eclipse.wst.validation.ValidationResult;
 import org.eclipse.wst.validation.internal.ValOperation;
 import org.eclipse.wst.validation.internal.ValType;
+import org.eclipse.wst.validation.internal.ValidationResultSummary;
 import org.eclipse.wst.validation.internal.ValidationRunner;
 import org.eclipse.wst.validation.ui.internal.dialog.ResultsDialog;
 
@@ -85,14 +85,14 @@
 		int resourceCount = 0;
 		for (Set s : _projects.values())resourceCount += s.size();
 		final int finalResourceCount = resourceCount;
-		if (vo.getResult().isCanceled())return Status.CANCEL_STATUS;
+		if (vo.isCanceled())return Status.CANCEL_STATUS;
 		
 		if (_showResults){
 			Display display = Display.getDefault();
 			Runnable run = new Runnable(){
 
 				public void run() {
-					ValidationResult vr = vo.getResult();
+					ValidationResultSummary vr = vo.getResult();
 					ResultsDialog rd = new ResultsDialog(null, vr, time, finalResourceCount);
 					rd.open();
 				}
diff --git a/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/dialog/FilterDialog.java b/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/dialog/FilterDialog.java
index 672b2d0..186eaae 100644
--- a/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/dialog/FilterDialog.java
+++ b/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/dialog/FilterDialog.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
+ * Copyright (c) 2005, 2009 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
@@ -45,6 +45,7 @@
 import org.eclipse.wst.validation.Validator;
 import org.eclipse.wst.validation.internal.ValManager;
 import org.eclipse.wst.validation.internal.ValMessages;
+import org.eclipse.wst.validation.internal.ValidatorMutable;
 import org.eclipse.wst.validation.internal.delegates.ValidatorDelegateDescriptor;
 import org.eclipse.wst.validation.internal.delegates.ValidatorDelegatesRegistry;
 import org.eclipse.wst.validation.internal.model.FilterGroup;
@@ -60,7 +61,7 @@
  * @author karasiuk
  *
  */
-public class FilterDialog extends Dialog {
+public final class FilterDialog extends Dialog {
 	
 	/** 
 	 * If we are doing project level filters this will point to the project. This is null if we are doing
@@ -68,14 +69,8 @@
 	 */
 	private IProject	_project;
 	
-	/** 
-	 * A deep copy of the validator, so that we can use it as a model object, and not worry about the
-	 * user not saving their changes.
-	 */
-	private Validator 	_validator;
+	private ValidatorMutable 	_validator;
 	
-	// The V2 version of _validator.
-	private Validator.V2	_v2;
 	private TreeViewer		_tree;
 	private Combo			_delegating;
 	private IAdapterFactory _adaptorFactory = new AdapterFactory();
@@ -86,7 +81,10 @@
 	private Button		_remove;
 	private ISelectionChangedListener	_nodeChangedListener;
 	
+	/** The currently selected group. If a rule is selected instead, then this will be null. */
 	private FilterGroup	_selectedGroup;
+	
+	/** The currently selected rule. If a group is selected instead, then this will be null. */
 	private FilterRule	_selectedRule;
 	
 	private Combo[]		_messageSev;
@@ -106,12 +104,11 @@
 	 * @param project the project that the filters are being added to. If these are workspace
 	 * level filters, then this must be null. 
 	 */
-	public FilterDialog(Shell shell, Validator validator, IProject project){
+	public FilterDialog(Shell shell, ValidatorMutable validator, IProject project){
 		super(shell);
 		_shell = shell;
 		setShellStyle(getShellStyle() | SWT.CLOSE|SWT.MIN|SWT.MAX|SWT.RESIZE);
-		_validator = validator.copy(true);
-		_v2 = _validator.asV2Validator();
+		_validator = validator;
 		_project = project;
 	}
 	
@@ -123,7 +120,7 @@
 	protected Control createDialogArea(Composite parent) {
 		Composite c = (Composite)super.createDialogArea(parent);
 		c.setLayout(new GridLayout(2, false));
-		if (_v2 == null){
+		if (!_validator.isV2Validator()){
 			new Label(c, SWT.NONE).setText(ValUIMessages.fdNoFilters);
 		}
 		else {
@@ -133,17 +130,17 @@
 			
 			_tree = new TreeViewer(c, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
 			_tree.getControl().setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
-			Platform.getAdapterManager().registerAdapters(_adaptorFactory, Validator.V2.class);
+			Platform.getAdapterManager().registerAdapters(_adaptorFactory, ValidatorMutable.class);
 			Platform.getAdapterManager().registerAdapters(_adaptorFactory, FilterGroup.class);
 			Platform.getAdapterManager().registerAdapters(_adaptorFactory, FilterRule.class);
 			_tree.setContentProvider(new BaseWorkbenchContentProvider());
 			_tree.setLabelProvider(new WorkbenchLabelProvider());
-			_tree.setInput(_v2);
+			_tree.setInput(_validator);
 			_tree.expandAll();
 			
 			addButtons(c);
 			
-			String delegatingId = _v2.getDelegatingId();
+			String delegatingId = _validator.getDelegatingId();
 			if (delegatingId != null){
 				addDelegatorSelection(c);
 			}
@@ -233,8 +230,9 @@
 				
 				FilterRule rule = nfr.getRule();
 				if (rule != null){
-					_selectedGroup.add(rule);
-					_v2.bumpChangeCountGroups();
+					FilterGroup newGroup = FilterGroup.addRule(_selectedGroup, rule);
+					_validator.replaceFilterGroup(_selectedGroup, newGroup);
+					_selectedGroup = newGroup;
 					refresh();
 				}
 			}
@@ -272,15 +270,14 @@
 	}
 	
 	private void restoreDefaults() {
-		if (_v2 != null){
+		if (_validator.isV2Validator()){
 			try {
-				String id = _v2.getId();
+				String id = _validator.getId();
 				Validator[] vals = ValManager.getDefaultValidators();
 				for (Validator v : vals){
 					if (v.getId().equals(id)){
-						_validator = v;
-						_v2 = v.asV2Validator();
-						_tree.setInput(_v2);
+						_validator = new ValidatorMutable(v);
+						_tree.setInput(_validator);
 						_tree.expandAll();
 						refresh();
 						return;
@@ -296,7 +293,7 @@
 
 
 	private void addMessageMappings(Composite c) {
-		if (_v2 == null)return;
+		if (!_validator.isV2Validator())return;
 		Map<String,MessageSeveritySetting> mappings = _validator.getMessageSettings();
 		if (mappings == null || mappings.size() == 0)return;
 		
@@ -347,7 +344,7 @@
 	 * Add a combo box so that the user can change which delegating validator to call.
 	 */
 	private void addDelegatorSelection(Composite c) {
-		Map map = ValidatorDelegatesRegistry.getInstance().getDelegateDescriptors(_v2.getValidatorClassname());
+		Map map = ValidatorDelegatesRegistry.getInstance().getDelegateDescriptors(_validator.getValidatorClassname());
 		if (map == null)return;
 		
 		Composite line = new Composite(c, SWT.NONE);
@@ -367,7 +364,7 @@
 			ValidatorDelegateDescriptor vd = (ValidatorDelegateDescriptor)it.next();
 			items[i] = vd.getName();
 			ids[i] = vd.getId();
-			if (vd.getId().equals(_v2.getDelegatingId())){
+			if (vd.getId().equals(_validator.getDelegatingId())){
 				selected = vd.getName();
 			}
 		}
@@ -380,7 +377,7 @@
 
 			public void widgetSelected(SelectionEvent e) {
 				int sel = _delegating.getSelectionIndex();
-				_v2.setDelegatingId(ids[sel]);
+				_validator.setDelegatingId(ids[sel]);
 			}
 			
 		});
@@ -391,14 +388,16 @@
 	 * @param exclude
 	 */
 	private void addGroup(boolean exclude){
-		if (_v2 == null)return;
-		_v2.add(FilterGroup.create(exclude));
+		if (!_validator.isV2Validator())return;
+		FilterRule[] rules = new FilterRule[0];
+		_validator.add(FilterGroup.create(exclude, rules));
 		refresh();
 		
 	}
 	
 	private void refresh(){
 		_tree.refresh();
+		_tree.expandAll();
 		updateButtons();		
 	}
 	
@@ -407,26 +406,38 @@
 	 */
 	private void remove(){
 		if (_selectedRule != null){
-			FilterGroup[] groups = _v2.getGroups();
-			for (int i=0; i<groups.length; i++){
-				if (groups[i].remove(_selectedRule)){
-					_v2.bumpChangeCountGroups();
-					refresh();
-					return;
-				}
+			FilterGroup group = findGroup(_selectedRule);
+			if (group != null){
+				FilterGroup newGroup = FilterGroup.removeRule(group, _selectedRule);
+				_validator.replaceFilterGroup(group, newGroup);
+				refresh();
 			}
 		}
 		
 		if (_selectedGroup != null){
-			_v2.remove(_selectedGroup);
+			_validator.remove(_selectedGroup);
 			refresh();
 			return;
 		}
 	}
 	
+	/**
+	 * Find the group in the current validator that has this rule.
+	 * @param rule The rule that we are searching for.
+	 * @return null if we can not find the group.
+	 */
+	private FilterGroup findGroup(FilterRule rule) {
+		for (FilterGroup group : _validator.getGroups()){
+			for (FilterRule fr : group.getRules()){
+				if (fr.equals(rule))return group;
+			}
+		}
+		return null;
+	}
+
 	private void updateButtons() {
-		if (_v2 != null){
-			_addGroupExclude.setEnabled(!ValidatorHelper.hasExcludeGroup(_v2));
+		if (_validator.isV2Validator()){
+			_addGroupExclude.setEnabled(!ValidatorHelper.hasExcludeGroup(_validator));
 		}
 		_addRule.setEnabled(_selectedGroup != null);
 		_remove.setEnabled(_selectedGroup != null || _selectedRule != null);
@@ -452,7 +463,7 @@
 		return new Point(600, 475);
 	}
 
-	public Validator getValidator() {
+	public ValidatorMutable getValidator() {
 		return _validator;
 	}
 }
diff --git a/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/dialog/NewFilterRule.java b/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/dialog/NewFilterRule.java
index fad49d7..7f64b96 100644
--- a/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/dialog/NewFilterRule.java
+++ b/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/dialog/NewFilterRule.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
+ * Copyright (c) 2005, 2009 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
@@ -176,7 +176,7 @@
 				button.setText(labels[i]);
 				button.setData(new Integer(i));			
 				button.addSelectionListener(listener);
-				(new Label(control, SWT.WRAP)).setText(desc[i]);
+				(new Text(control, SWT.WRAP|SWT.READ_ONLY)).setText(desc[i]);
 				if (i == 0)button.setSelection(true);				
 			}			
 			setControl(control);			
@@ -208,7 +208,7 @@
 			setControl(control);
 			control.setLayout(new GridLayout(2, false));
 			(new Label(control, SWT.NONE)).setText(ValUIMessages.FrFileExtensionLabel);
-			_pattern = new Text(control, SWT.NONE);
+			_pattern = new Text(control, SWT.BORDER);
 			_pattern.setFocus();
 			_pattern.addModifyListener(new ModifyListener(){
 
@@ -261,7 +261,7 @@
 			setControl(control);
 			control.setLayout(new GridLayout(4, false));
 			(new Label(control, SWT.NONE)).setText(ValUIMessages.FrFolderOrFileLabel);
-			_pattern = new Text(control, SWT.NONE);
+			_pattern = new Text(control, SWT.BORDER);
 			_pattern.setFocus();
 			_pattern.setLayoutData(new GridData(300, SWT.DEFAULT));
 			_pattern.addModifyListener(new ModifyListener(){
@@ -465,7 +465,7 @@
 			setControl(control);
 			control.setLayout(new GridLayout(2, false));
 			(new Label(control, SWT.NONE)).setText(ValUIMessages.FrFacitLabel);
-			_pattern = new Text(control, SWT.NONE);
+			_pattern = new Text(control, SWT.BORDER);
 			_pattern.setFocus();
 			_pattern.setLayoutData(new GridData(300, SWT.DEFAULT));
 			_pattern.addModifyListener(new ModifyListener(){
diff --git a/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/dialog/ResultsDialog.java b/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/dialog/ResultsDialog.java
index 4522eea..3534eb7 100644
--- a/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/dialog/ResultsDialog.java
+++ b/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/dialog/ResultsDialog.java
@@ -24,11 +24,12 @@
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
 import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.validation.ValidationResult;
 import org.eclipse.wst.validation.internal.Misc;
 import org.eclipse.wst.validation.internal.ValManager;
 import org.eclipse.wst.validation.internal.ValPrefManagerGlobal;
+import org.eclipse.wst.validation.internal.ValidationResultSummary;
 import org.eclipse.wst.validation.internal.model.GlobalPreferences;
+import org.eclipse.wst.validation.internal.model.GlobalPreferencesValues;
 import org.eclipse.wst.validation.internal.ui.ValidationUIMessages;
 import org.eclipse.wst.validation.ui.internal.ValUIMessages;
 
@@ -39,7 +40,7 @@
  */
 public class ResultsDialog extends IconAndMessageDialog {
 	
-	private ValidationResult 	_result;
+	private ValidationResultSummary 	_result;
 	private long				_time;
 	private int					_resourceCount;
 	private Button _hideButton;
@@ -52,7 +53,7 @@
 	 * @param time the time that the validation took in milliseconds
 	 * @param resourceCount the number of resources that were validated
 	 */
-	public ResultsDialog(Shell parentShell, ValidationResult results, long time, int resourceCount) {
+	public ResultsDialog(Shell parentShell, ValidationResultSummary results, long time, int resourceCount) {
 		super(parentShell);
 		_result = results;
 		_time = time;
@@ -62,9 +63,12 @@
 	@Override
 	protected void okPressed() {
 		if(_hideButton!=null) {
-			GlobalPreferences gp = ValManager.getDefault().getGlobalPreferences();
-			gp.setConfirmDialog(!_hideButton.getSelection());
-			ValPrefManagerGlobal.getDefault().savePreferences(gp);
+			ValManager vm = ValManager.getDefault();
+			GlobalPreferences gp = vm.getGlobalPreferences();
+			GlobalPreferencesValues gpv = gp.asValues();
+			gpv.confirmDialog = !_hideButton.getSelection();
+			int changes = vm.replace(gpv);
+			if (changes != 0)ValPrefManagerGlobal.getDefault().savePreferences();
 		}
 		super.okPressed();
 	}
diff --git a/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/preferences/ValidationPreferencePage.java b/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/preferences/ValidationPreferencePage.java
index 0068b47..2f1da24 100644
--- a/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/preferences/ValidationPreferencePage.java
+++ b/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/preferences/ValidationPreferencePage.java
@@ -1,7 +1,5 @@
-package org.eclipse.wst.validation.ui.internal.preferences;
-
 /*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * Copyright (c) 2001, 2009 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
@@ -10,13 +8,12 @@
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
+package org.eclipse.wst.validation.ui.internal.preferences;
 
 import java.lang.reflect.InvocationTargetException;
 import java.util.LinkedList;
 import java.util.List;
 
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.layout.GridDataFactory;
 import org.eclipse.jface.preference.PreferencePage;
@@ -65,8 +62,9 @@
 import org.eclipse.wst.validation.internal.ValManager;
 import org.eclipse.wst.validation.internal.ValPrefManagerGlobal;
 import org.eclipse.wst.validation.internal.ValidatorMetaData;
+import org.eclipse.wst.validation.internal.ValidatorMutable;
 import org.eclipse.wst.validation.internal.model.GlobalPreferences;
-import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
+import org.eclipse.wst.validation.internal.model.GlobalPreferencesValues;
 import org.eclipse.wst.validation.internal.ui.DelegatingValidatorPreferencesDialog;
 import org.eclipse.wst.validation.internal.ui.plugin.ValidationUIPlugin;
 import org.eclipse.wst.validation.ui.internal.HelpContextIds;
@@ -87,22 +85,17 @@
 	private Shell _shell;
 
 	public interface IValidationPage {
+		
 		Composite createPage(Composite parent) throws InvocationTargetException;
-
 		boolean performOk() throws InvocationTargetException;
-
 		boolean performDefaults() throws InvocationTargetException;
-
 		Composite getControl();
-
 		void dispose();
-
 		void loseFocus();
-
 		void gainFocus();
 	}
 
-	public class InvalidPage implements IValidationPage {
+	public final class InvalidPage implements IValidationPage {
 		private Composite page = null;
 
 		private Composite composite = null;
@@ -171,7 +164,7 @@
 		}
 	}
 
-	private class ValidatorListPage implements IValidationPage {
+	private final class ValidatorListPage implements IValidationPage {
 		private Composite _page;
 		private TableViewer _validatorList;
 		private Button _enableAllButton;
@@ -182,9 +175,9 @@
 		private Button _confirmButton;
 		private Label _listLabel;
 		private Table _validatorsTable;
-		private GlobalPreferences 	_globalPreferences = ValManager.getDefault().getGlobalPreferences();
+		private GlobalPreferencesValues 	_globalPreferences = ValManager.getDefault().getGlobalPreferences().asValues();
 		private GlobalConfiguration _globalConfig;
-		private Validator[] _validators;
+		private ValidatorMutable[] _validators;
 		
 		private int _changeCount;
 
@@ -197,8 +190,8 @@
 			}
 
 			public Object[] getElements(Object inputElement) {
-				if (inputElement instanceof Validator[]) {
-					return (Validator[]) inputElement;
+				if (inputElement instanceof ValidatorMutable[]) {
+					return (ValidatorMutable[]) inputElement;
 				}
 				return new Object[0];
 			}
@@ -214,8 +207,8 @@
 		public class ValidationLabelProvider extends LabelProvider implements ITableLabelProvider {
 			public String getText(Object element) {
 				if (element == null)return ""; //$NON-NLS-1$
-				else if (element instanceof Validator)
-					return ((Validator) element).getName();
+				else if (element instanceof ValidatorMutable)
+					return ((ValidatorMutable) element).getName();
 				else
 					return super.getText(element);
 			}
@@ -228,7 +221,7 @@
 			}
 
 			public Image getColumnImage(Object element, int columnIndex) {
-				Validator v = (Validator) element;
+				ValidatorMutable v = (ValidatorMutable) element;
 				if (columnIndex == 1) {
 					return getImage(v.isManualValidation() ? ImageNames.okTable : ImageNames.failTable);
 				} else if (columnIndex == 2) {
@@ -242,7 +235,7 @@
 			}
 
 			public String getColumnText(Object element, int columnIndex) {
-				if (columnIndex == 0)return ((Validator) element).getName();
+				if (columnIndex == 0)return ((ValidatorMutable) element).getName();
 				return null;
 			}
 		}
@@ -276,10 +269,17 @@
 			settingsColumn.setText(ValUIMessages.SETTINGS);
 			settingsColumn.pack();
 		}
+		
+		private ValidatorMutable[] getDefaultValidators(){
+			Validator[] vals = ValManager.getDefault().getValidators();
+			ValidatorMutable[] vms = new ValidatorMutable[vals.length];
+			for (int i=0; i<vals.length; i++)vms[i] = new ValidatorMutable(vals[i]);
+			return vms;
+		}
 
 		public Composite createPage(Composite parent) throws InvocationTargetException {
 			_globalConfig = new GlobalConfiguration(ConfigurationManager.getManager().getGlobalConfiguration());
-			_validators = copyValidators(ValManager.getDefault().getValidators());
+			_validators = getDefaultValidators();
 			
 			Composite validatorGroup = new Composite(parent, SWT.NONE);
 
@@ -361,12 +361,6 @@
 
 			addEnableDisable(validatorGroup);
 
-			// Have to set the tab order or only the first checkbox in a
-			// Composite can be tabbed to. (Seems to apply only to checkboxes. Have to use the
-			// arrow key to navigate the checkboxes.)
-			validatorGroup.setTabList(new Control[] { _suspend, _autoSave,
-				_validatorsTable, _enableAllButton, _disableAllButton });
-
 			updateWidgets();
 
 			applyDialogFont(validatorGroup);
@@ -404,15 +398,6 @@
 			});
 		}
 		
-		/**
-		 * Make a copy of the current validators and store the results.
-		 */
-		private Validator[] copyValidators(Validator[] vals){
-			Validator[] copy = new Validator[vals.length];
-			for (int i=0; i<vals.length; i++)copy[i] = vals[i].copy();
-			return copy;
-		}
-
 		private void addConfirm(Composite validatorGroup) {
 			GridData gd;
 			gd = new GridData(GridData.FILL_HORIZONTAL);
@@ -420,11 +405,11 @@
 			_confirmButton = new Button(validatorGroup, SWT.CHECK);
 			_confirmButton.setLayoutData(gd);
 			_confirmButton.setText(ValUIMessages.PrefPageConfirmDialog);
-			_confirmButton.setSelection(_globalPreferences.getConfirmDialog());
+			_confirmButton.setSelection(_globalPreferences.confirmDialog);
 			_confirmButton.addSelectionListener(new SelectionAdapter() {
 				public void widgetSelected(SelectionEvent e) {
 					// do not increment the _changeCount as this by itself should not trigger a build prompt
-					_globalPreferences.setConfirmDialog(_confirmButton.getSelection());
+					_globalPreferences.confirmDialog = _confirmButton.getSelection();
 					_confirmButton.setFocus();
 				}
 			});
@@ -437,11 +422,11 @@
 			_autoSave = new Button(validatorGroup, SWT.CHECK);
 			_autoSave.setLayoutData(gd);
 			_autoSave.setText(ValUIMessages.PrefPage_always_save);
-			_autoSave.setSelection(_globalPreferences.getSaveAutomatically());
+			_autoSave.setSelection(_globalPreferences.saveAutomatically);
 			_autoSave.addSelectionListener(new SelectionAdapter() {
 				public void widgetSelected(SelectionEvent e) {
 					// do not increment the _changeCount as this by itself should not trigger a build prompt
-					_globalPreferences.setSaveAutomatically(_autoSave.getSelection());
+					_globalPreferences.saveAutomatically = _autoSave.getSelection();
 					_autoSave.setFocus();
 				}
 			});
@@ -455,10 +440,9 @@
 			_suspend = new Button(validatorGroup, SWT.CHECK);
 			_suspend.setLayoutData(gd);
 			_suspend.setText(ValUIMessages.DISABLE_VALIDATION);
-			_suspend.setSelection(_globalPreferences.getDisableAllValidation());
+			_suspend.setSelection(_globalPreferences.disableAllValidation);
 			_suspend.addSelectionListener(new SelectionAdapter() {
 				public void widgetSelected(SelectionEvent e) {
-					_changeCount++;
 					_suspend.setFocus();
 					_validatorsTable.setEnabled(!_suspend.getSelection());
 					_enableAllButton.setEnabled(!_suspend.getSelection());
@@ -476,11 +460,10 @@
 			_override.setLayoutData(gd);
 			_override.setText(ValUIMessages.PREF_BUTTON_OVERRIDE);
 			_override.setEnabled(true);
-			_override.setSelection(_globalPreferences.getOverride());
+			_override.setSelection(_globalPreferences.override);
 			_override.addSelectionListener(new SelectionAdapter() {
 				public void widgetSelected(SelectionEvent e) {
-					_changeCount++;
-					_globalPreferences.setOverride(_override.getSelection());
+					_globalPreferences.override = _override.getSelection();
 					_override.setFocus();
 					
 				}
@@ -511,7 +494,7 @@
 			menu.addMenuListener(new MenuAdapter() {
 				public void menuShown(MenuEvent e) {
 					IStructuredSelection selection = (IStructuredSelection) _validatorList.getSelection();
-					Validator vw = (Validator) selection.getFirstElement();
+					ValidatorMutable vw = (ValidatorMutable) selection.getFirstElement();
 					manualItem.setSelection(vw.isManualValidation());
 					buildItem.setSelection(vw.isBuildValidation());
 					settingsItem.setEnabled(hasSettings(vw));
@@ -523,7 +506,7 @@
 
 		protected void columnClicked(int columnToEdit) {
 			IStructuredSelection selection = (IStructuredSelection) _validatorList.getSelection();
-			Validator val = (Validator) selection.getFirstElement();
+			ValidatorMutable val = (ValidatorMutable) selection.getFirstElement();
 
 			switch (columnToEdit) {
 			case 1:
@@ -535,12 +518,14 @@
 				val.setBuildValidation(!val.isBuildValidation());
 				break;
 			case 3:
-				Validator.V2 v2 = val.asV2Validator();
-				if (v2 != null){
-					FilterDialog fd = new FilterDialog(_shell, val, null);
+				if (val.isV2Validator()){
+					ValidatorMutable newVal = new ValidatorMutable(val);
+					FilterDialog fd = new FilterDialog(_shell, newVal, null);
 					if (Window.OK == fd.open()){
 						_changeCount++;
-						val.become(fd.getValidator());
+						newVal = fd.getValidator();
+						int i = findit(val);
+						if (i != -1)_validators[i] = newVal;
 					}
 				}
 				else {
@@ -554,11 +539,15 @@
 			_validatorList.refresh();
 		}
 
-		private void handleOldDelegate(Validator val) {
-			Validator.V1 v1 = val.asV1Validator();
-			if (v1 == null)return;
+		private int findit(ValidatorMutable val) {
+			for (int i=0; i<_validators.length; i++)if (_validators[i] == val)return i;
+			return -1;
+		}
+
+		private void handleOldDelegate(ValidatorMutable val) {
+			if (!val.isV1Validator())return;
 			
-			ValidatorMetaData vmd = v1.getVmd();
+			ValidatorMetaData vmd = val.getVmd();
 		    if (!vmd.isDelegating())return;
 		    
 		    String delegateID = _globalConfig.getDelegateUniqueName(vmd);
@@ -581,8 +570,8 @@
 		 * @param v
 		 * @return true if it does
 		 */
-		boolean hasSettings(Validator v){
-			if (v.asV2Validator() != null)return true;
+		boolean hasSettings(ValidatorMutable v){
+			if (v.isV2Validator())return true;
 			if (v.getDelegatingId() != null)return true;
 			return false;
 		}
@@ -597,10 +586,10 @@
 		}
 
 		private void updateAllWidgets() throws InvocationTargetException {
-			_suspend.setSelection(_globalPreferences.getDisableAllValidation());
-			_autoSave.setSelection(_globalPreferences.getSaveAutomatically());
-			_confirmButton.setSelection(_globalPreferences.getConfirmDialog());
-			_override.setSelection(_globalPreferences.getOverride());
+			_suspend.setSelection(_globalPreferences.disableAllValidation);
+			_autoSave.setSelection(_globalPreferences.saveAutomatically);
+			_confirmButton.setSelection(_globalPreferences.confirmDialog);
+			_override.setSelection(_globalPreferences.override);
 			_validatorsTable.setEnabled(!_suspend.getSelection());
 			_enableAllButton.setEnabled(!_suspend.getSelection());
 			_disableAllButton.setEnabled(!_suspend.getSelection());
@@ -609,22 +598,21 @@
 		}
 
 		public boolean performOk() throws InvocationTargetException {
-			_globalPreferences.setDisableAllValidation(_suspend.getSelection());
-			_globalPreferences.setSaveAutomatically(_autoSave.getSelection());
+			_globalPreferences.disableAllValidation = _suspend.getSelection();
+			_globalPreferences.saveAutomatically = _autoSave.getSelection();
+			ValManager vm = ValManager.getDefault();
+			int changes = vm.replace(_globalPreferences);
+			if ((changes & GlobalPreferences.BuildChangeMask) != 0)_changeCount++;
+			
 			ValPrefManagerGlobal vpm = ValPrefManagerGlobal.getDefault();
-			vpm.savePreferences(_globalPreferences, _validators);
+			vpm.savePreferences(vm.getGlobalPreferences(), _validators, null);
 			saveV1Preferences();
 			
 			if (_changeCount > 0 && 
 				MessageDialog.openQuestion(_shell, ValUIMessages.RebuildTitle, ValUIMessages.RebuildMsg)){
 				
 				FullBuildJob fbj = new FullBuildJob();
-				try {
-					fbj.runInWorkspace(new NullProgressMonitor());
-				}
-				catch (CoreException e){
-					ValidationPlugin.getPlugin().handleException(e);
-				}
+				fbj.schedule();
 			}
 			return true;
 		}
@@ -635,11 +623,7 @@
 		private void saveV1Preferences(){
 			try {
 				GlobalConfiguration gc = ConfigurationManager.getManager().getGlobalConfiguration();
-	//			gc.setCanProjectsOverride(overrideButton.getSelection());
-				
-				if (_globalPreferences.getDisableAllValidation())gc.setDisableAllValidation(true);
-				//pagePreferences.setEnabledValidators(getEnabledValidators());
-				
+				gc.setDisableAllValidation(_globalPreferences.disableAllValidation);
 				gc.setEnabledManualValidators(getEnabledManualValidators());				
 				gc.setEnabledBuildValidators(getEnabledBuildValidators());
 	
@@ -648,8 +632,7 @@
 			}
 			catch (InvocationTargetException e){
 				ValidationUIPlugin.getPlugin().handleException(e);
-			}
-			
+			}			
 		}
 
 		/**
@@ -658,13 +641,8 @@
 		 */
 		private ValidatorMetaData[] getEnabledManualValidators() {
 			List<ValidatorMetaData> list = new LinkedList<ValidatorMetaData>();
-			for (Validator v : _validators){
-				if (v.isManualValidation()){
-					Validator.V1 v1 = v.asV1Validator();
-					if (v1 != null){
-						list.add(v1.getVmd());
-					}
-				}
+			for (ValidatorMutable v : _validators){
+				if (v.isManualValidation() && v.isV1Validator())list.add(v.getVmd());
 			}
 			ValidatorMetaData[] result = new ValidatorMetaData[list.size()];
 			list.toArray(result);
@@ -677,11 +655,8 @@
 		 */
 		private ValidatorMetaData[] getEnabledBuildValidators() {
 			List<ValidatorMetaData> list = new LinkedList<ValidatorMetaData>();
-			for (Validator v : _validators){
-				if (v.isBuildValidation()){
-					Validator.V1 v1 = v.asV1Validator();
-					if (v1 != null)list.add(v1.getVmd());
-				}
+			for (ValidatorMutable v : _validators){
+				if (v.isBuildValidation() && v.isV1Validator())list.add(v.getVmd());
 			}
 			ValidatorMetaData[] result = new ValidatorMetaData[list.size()];
 			list.toArray(result);
@@ -690,7 +665,9 @@
 
 		public boolean performDefaults() throws InvocationTargetException {
 			_changeCount++;
-			_validators = copyValidators(ValManager.getDefaultValidators());
+			Validator[] vals = ValManager.getDefaultValidators();
+			_validators = new ValidatorMutable[vals.length];
+			for (int i=0; i<vals.length; i++)_validators[i] = new ValidatorMutable(vals[i]);
 			updateWidgets();
 			getDefaultsButton().setFocus();
 			return true;
@@ -712,7 +689,7 @@
 		
 		private void setAllValidators(boolean bool){
 			_changeCount++;
-			for (Validator v : _validators){
+			for (ValidatorMutable v : _validators){
 				v.setBuildValidation(bool);
 				v.setManualValidation(bool);
 			}
diff --git a/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/preferences/ValidationPropertyPage.java b/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/preferences/ValidationPropertyPage.java
index ef8dabd..53c574a 100644
--- a/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/preferences/ValidationPropertyPage.java
+++ b/plugins/org.eclipse.wst.validation.ui/vf2/org/eclipse/wst/validation/ui/internal/preferences/ValidationPropertyPage.java
@@ -1,7 +1,5 @@
-package org.eclipse.wst.validation.ui.internal.preferences;
-
 /*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * Copyright (c) 2001, 2009 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
@@ -10,9 +8,9 @@
  * Contributors:
  * IBM Corporation - initial API and implementation
  *******************************************************************************/
+package org.eclipse.wst.validation.ui.internal.preferences;
 
 import java.lang.reflect.InvocationTargetException;
-
 import org.eclipse.core.resources.ICommand;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IProjectDescription;
@@ -68,6 +66,8 @@
 import org.eclipse.wst.validation.internal.ValManager;
 import org.eclipse.wst.validation.internal.ValPrefManagerProject;
 import org.eclipse.wst.validation.internal.ValidatorMetaData;
+import org.eclipse.wst.validation.internal.ValidatorMutable;
+import org.eclipse.wst.validation.internal.ValManager.UseProjectPreferences;
 import org.eclipse.wst.validation.internal.model.ProjectPreferences;
 import org.eclipse.wst.validation.internal.operations.ValidatorManager;
 import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
@@ -89,24 +89,19 @@
 	private Shell 			_shell;
 
 	public interface IValidationPage {
+		
 		Composite createPage(Composite parent) throws InvocationTargetException;
-
 		boolean performOk() throws InvocationTargetException;
-
 		boolean performDefaults() throws InvocationTargetException;
-
 		Composite getControl();
-
 		void dispose();
-
 		void loseFocus();
-
 		void gainFocus();
 	}
 
 	public class InvalidPage implements IValidationPage {
+		
 		private Composite page = null;
-
 		private Composite composite = null;
 		private GridLayout layout = null;
 		private Label messageLabel = null;
@@ -168,7 +163,7 @@
 		}
 	}
 
-	private class ValidatorListPage implements IValidationPage {
+	private final class ValidatorListPage implements IValidationPage {
 		private Composite 		_page;
 
 		private TableViewer 	_validatorList;
@@ -179,7 +174,10 @@
 		private Link			_configLink;
 		private Button			_addValidationBuilder;
 		private Table 			_validatorsTable;
-		private Validator[]		_validators;
+		private ValidatorMutable[]		_validators;
+		
+		/** Number of things that may have changed. */
+		private int				_changes;
 
 		/**
 		 * This class is provided for the CheckboxTableViewer in the
@@ -190,8 +188,8 @@
 			}
 
 			public Object[] getElements(Object inputElement) {
-				if (inputElement instanceof Validator[]) {
-					return (Validator[]) inputElement;
+				if (inputElement instanceof ValidatorMutable[]) {
+					return (ValidatorMutable[]) inputElement;
 				}
 				return new Object[0];
 			}
@@ -209,7 +207,7 @@
 			public String getText(Object element) {
 				if (element == null)return ""; //$NON-NLS-1$
 				else if (element instanceof Validator)
-					return ((Validator) element).getName();
+					return ((ValidatorMutable) element).getName();
 				else
 					return super.getText(element);
 			}
@@ -223,7 +221,7 @@
 			}
 
 			public Image getColumnImage(Object element, int columnIndex) {
-				Validator v = (Validator) element;
+				ValidatorMutable v = (ValidatorMutable) element;
 				if (columnIndex == 1) {
 					return getImage(v.isManualValidation() ? ImageNames.okTable
 							: ImageNames.failTable);
@@ -238,7 +236,7 @@
 			}
 
 			public String getColumnText(Object element, int columnIndex) {
-				if (columnIndex == 0)return ((Validator) element).getName();
+				if (columnIndex == 0)return ((ValidatorMutable) element).getName();
 				return null;
 			}
 		}
@@ -263,7 +261,10 @@
 		}
 
 		public Composite createPage(Composite parent) throws InvocationTargetException {
-			_validators = copyValidators(ValManager.getDefault().getValidators(getProject(), false));
+			Validator[] vals = ValManager.getDefault()
+				.getValidatorsConfiguredForProject(getProject(), UseProjectPreferences.MustUse);
+			_validators = new ValidatorMutable[vals.length];
+			for (int i=0; i<vals.length; i++)_validators[i] = new ValidatorMutable(vals[i]);
 
 			Composite validatorGroup = new Composite(parent, SWT.NONE);
 
@@ -274,6 +275,8 @@
 
 			addOverride(validatorGroup);
 			addConfigLink(validatorGroup);
+			//
+			addLine(validatorGroup);
 			addSuspend(validatorGroup);
 			addValidationBuilder(validatorGroup);
 			new Label(validatorGroup, SWT.NONE).setLayoutData(new GridData());
@@ -344,11 +347,6 @@
 			
 			addButtons(validatorGroup);
 
-			// Have to set the tab order or only the first checkbox in a
-			// Composite can be tabbed to. (Seems to apply only to checkboxes. Have to use the
-			// arrow key to navigate the checkboxes.)
-			validatorGroup.setTabList(new Control[] { _override, _suspend});
-
 			updateWidgets();
 
 			applyDialogFont(validatorGroup);
@@ -399,12 +397,23 @@
 			_suspend.addSelectionListener(new SelectionAdapter() {
 				public void widgetSelected(SelectionEvent e) {
 					_suspend.setFocus();
+					_changes++;
 					enableDisableWidgets();
 					_validatorList.refresh();
 				}
 			});
 		}
 		
+		//Add a line separator
+		private void addLine(Composite validatorGroup) {
+			GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+			gd.horizontalSpan = 2;
+			Label line = new Label(validatorGroup,SWT.SEPARATOR | SWT.SHADOW_OUT | SWT.HORIZONTAL);
+			line.setLayoutData(gd);
+			
+			
+		}
+		
 		private void addConfigLink(Composite validatorGroup){
 			_configLink = new Link(validatorGroup,SWT.None);
 			GridData layout = new GridData(GridData.HORIZONTAL_ALIGN_END);
@@ -460,23 +469,14 @@
 			_addValidationBuilder.setText(ValUIMessages.ADD_VALIDATION_BUILDER);
 			_addValidationBuilder.setSelection(false);
 		}
-		
-		/**
-		 * Make a copy of the current validators and store the results.
-		 */
-		private Validator[] copyValidators(Validator[] vals){
-			Validator[] validators = new Validator[vals.length];
-			for (int i=0; i<vals.length; i++)validators[i] = vals[i].copy();
-			return validators;
-		}
-		
+				
 		/**
 		 * Does this validator have extra settings that can be configured?
 		 * @param v
 		 * @return true if it does
 		 */
-		boolean hasSettings(Validator v){
-			if (v.asV2Validator() != null)return true;
+		boolean hasSettings(ValidatorMutable v){
+			if (v.isV2Validator())return true;
 			if (v.getDelegatingId() != null)return true;
 			return false;
 		}
@@ -511,7 +511,14 @@
 			_override.addSelectionListener(new SelectionAdapter() {
 				public void widgetSelected(SelectionEvent e) {
 					_override.setFocus();
-					if (ValManager.getDefault().getGlobalPreferences().getOverride()){
+					_changes++;
+					ValManager vm = ValManager.getDefault();
+					if (vm.getGlobalPreferences().getOverride()){
+//						IProject project = getProject();
+//						UseProjectPreferences useProject = UseProjectPreferences.Normal;
+//						if (_override.getSelection())useProject = UseProjectPreferences.MustUse;
+//						_validators = copyValidators(vm.getValidatorsConfiguredForProject(project, useProject));
+//						_validatorList.setInput(_validators);
 						enableDisableWidgets();
 						_validatorList.refresh();
 					}
@@ -548,7 +555,7 @@
 			menu.addMenuListener(new MenuAdapter() {
 				public void menuShown(MenuEvent e) {
 					IStructuredSelection selection = (IStructuredSelection) _validatorList.getSelection();
-					Validator val = (Validator) selection.getFirstElement();
+					ValidatorMutable val = (ValidatorMutable) selection.getFirstElement();
 					manualItem.setSelection(val.isManualValidation());
 					buildItem.setSelection(val.isBuildValidation());
 					settingsItem.setEnabled(hasSettings(val));
@@ -560,7 +567,7 @@
 
 		protected void columnClicked(int columnToEdit) {
 			IStructuredSelection selection = (IStructuredSelection) _validatorList.getSelection();
-			Validator val = (Validator) selection.getFirstElement();
+			ValidatorMutable val = (ValidatorMutable) selection.getFirstElement();
 
 			switch (columnToEdit) {
 			case 1:
@@ -570,11 +577,14 @@
 				val.setBuildValidation(!val.isBuildValidation());
 				break;
 			case 3:
-				Validator.V2 v2 = val.asV2Validator();
-				if (v2 != null){
-					FilterDialog fd = new FilterDialog(_shell, val, getProject());
+				if (val.isV2Validator()){
+					ValidatorMutable newVal = new ValidatorMutable(val);
+					FilterDialog fd = new FilterDialog(_shell, newVal, getProject());
 					if (Window.OK == fd.open()){
-						val.become(fd.getValidator());
+						_changes++;
+						newVal = fd.getValidator();
+						int i = findit(val);
+						if (i != -1)_validators[i] = newVal;
 					}
 				}
 				else {
@@ -588,12 +598,16 @@
 			_validatorList.refresh();
 		}
 
-		private void handleOldDelegate(Validator val) {
+		private int findit(ValidatorMutable val) {
+			for (int i=0; i<_validators.length; i++)if (_validators[i] == val)return i;
+			return -1;
+		}
+		
+		private void handleOldDelegate(ValidatorMutable val) {
 			try {
-				Validator.V1 v1 = val.asV1Validator();
-				if (v1 == null)return;
+				if (!val.isV1Validator())return;
 				
-				ValidatorMetaData vmd = v1.getVmd();
+				ValidatorMetaData vmd = val.getVmd();
 			    if (!vmd.isDelegating())return;
 			    
 			    GlobalConfiguration gc = ConfigurationManager.getManager().getGlobalConfiguration();
@@ -606,7 +620,10 @@
 			    dialog.create();
 			
 			    int result = dialog.open();
-		        if (result == Window.OK)gc.setDelegateUniqueName(vmd, dialog.getDelegateID());
+		        if (result == Window.OK){
+		        	_changes++;
+		        	gc.setDelegateUniqueName(vmd, dialog.getDelegateID());
+		        }
 			}
 			catch (InvocationTargetException e){
 				
@@ -623,8 +640,11 @@
 		}
 
 		protected void updateWidgetsForDefaults() throws InvocationTargetException {
-			updateAllWidgets();
-			updateHelp();
+			_suspend.setSelection(false);
+			_override.setSelection(false);
+			enableDisableWidgets();
+			_validatorList.setInput(_validators);
+			_validatorList.refresh();
 		}
 
 		private void updateAllWidgets() throws InvocationTargetException {
@@ -638,19 +658,19 @@
 		public boolean performOk() throws InvocationTargetException {
 			
 			addBuilder();
+			for (ValidatorMutable vm : _validators)if (vm.isChanged())_changes++;
+			if (_changes == 0)return true;
 			// [213631] this warning should only be shown if the user actually tried to override
 			// the validators
 			if (!ValManager.getDefault().getGlobalPreferences().getOverride() && _override.getSelection()){
-				MessageDialog.openWarning(_shell, ValUIMessages.Validation, 
-					ValUIMessages.ProjectOverridesNotAllowed);
+				MessageDialog.openWarning(_shell, ValUIMessages.Validation, ValUIMessages.ProjectOverridesNotAllowed);
 				return false;
 			}
 			updateV1ProjectSettings();
-			getProjectPreferences().setSuspend(_suspend.getSelection());
-			getProjectPreferences().setOverride(_override.getSelection());
 			IProject project = getProject();
+			ProjectPreferences pp = new ProjectPreferences(project, _override.getSelection(), _suspend.getSelection(), null);
 			ValPrefManagerProject vpm = new ValPrefManagerProject(project);
-			vpm.savePreferences(getProjectPreferences(), _validators);
+			vpm.savePreferences(pp, _validators);
 			return true;
 		}
 		
@@ -678,7 +698,12 @@
 		}
 
 		public boolean performDefaults() throws InvocationTargetException {
-			_validators = copyValidators(ValManager.getDefaultValidators(getProject()));
+			Validator[] vals = ValManager.getDefault()
+				.getValidatorsConfiguredForProject(getProject(), UseProjectPreferences.MustNotUse);
+			_validators = new ValidatorMutable[vals.length];
+			for (int i=0; i<vals.length; i++)_validators[i] = new ValidatorMutable(vals[i]);
+
+			_changes++;
 			updateWidgetsForDefaults();
 			getDefaultsButton().setFocus();
 			return true;
@@ -693,7 +718,7 @@
 
 		private void setAllValidators(boolean bool) {
 			for (TableItem item : _validatorsTable.getItems()) {
-				Validator val = (Validator) item.getData();
+				ValidatorMutable val = (ValidatorMutable) item.getData();
 				val.setManualValidation(bool);
 				val.setBuildValidation(bool);
 			}
diff --git a/plugins/org.eclipse.wst.validation/.options b/plugins/org.eclipse.wst.validation/.options
index 36a7471..e0cc192 100644
--- a/plugins/org.eclipse.wst.validation/.options
+++ b/plugins/org.eclipse.wst.validation/.options
@@ -22,4 +22,14 @@
 # org.eclipse.wst.xml.core.xml 
 org.eclipse.wst.validation/extraValDetail=
 
+# To make debugging easier, you can make it appear is if only one validator has been 
+# registered via the extension points. You do this by setting the following filter
+# to validator id of the one validator that you want registered.
+#
+# As an example, you could use this plug-in id for a v1 validator: org.eclipse.jst.j2ee.ejb.EJBValidator
+# and org.eclipse.wst.html.ui.HTMLValidator for a v2 validator
+org.eclipse.wst.validation/filter/allExcept=
 
+# The tracing level. If not supplied a default of zero is used. The higher the number the
+# more verbose the tracing.
+org.eclipse.wst.validation/trace/level=
diff --git a/plugins/org.eclipse.wst.validation/META-INF/MANIFEST.MF b/plugins/org.eclipse.wst.validation/META-INF/MANIFEST.MF
index b849201..08ae4d5 100644
--- a/plugins/org.eclipse.wst.validation/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.wst.validation/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Bundle-Name.0
 Bundle-SymbolicName: org.eclipse.wst.validation; singleton:=true
-Bundle-Version: 1.2.0.qualifier
+Bundle-Version: 1.2.200.qualifier
 Bundle-Activator: org.eclipse.wst.validation.internal.plugin.ValidationPlugin
 Bundle-Vendor: %Bundle-Vendor.0
 Bundle-Localization: plugin
diff --git a/plugins/org.eclipse.wst.validation/plugin.properties b/plugins/org.eclipse.wst.validation/plugin.properties
index d7722e4..0fcb3b5 100644
--- a/plugins/org.eclipse.wst.validation/plugin.properties
+++ b/plugins/org.eclipse.wst.validation/plugin.properties
@@ -21,6 +21,7 @@
 ValidatorDelegates=Validator Delegates
 
 Bundle-Name.0 = Validation Framework
-Bundle-Vendor.0 = Eclipse.org
+Bundle-Vendor.0 = Eclipse Web Tools Platform
 
 Extension.validator=Validator (Version 2)
+removeV2Validator=Remove V2 Validator
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/plugin.xml b/plugins/org.eclipse.wst.validation/plugin.xml
index 1b17568..b8a430a 100644
--- a/plugins/org.eclipse.wst.validation/plugin.xml
+++ b/plugins/org.eclipse.wst.validation/plugin.xml
@@ -10,7 +10,8 @@
    <extension-point id="validationHelper" name="validationHelper" schema="xsds/validationHelper.exsd"/>
    <extension-point id="validatorDelegates" name="%ValidatorDelegates" schema="xsds/validatorDelegates.exsd"/>   
    <extension-point id="validatorGroup" name="Validator Group" schema="xsds/validatorgroup.exsd"/>   
-   <extension-point id="exclude" name="Validator Exclusions" schema="xsds/exclude.exsd"/>   
+   <extension-point id="exclude" name="Validator Exclusions" schema="xsds/exclude.exsd"/>
+   <extension-point id="removeV2Validator" name="%removeV2Validator" schema="xsds/removeV2Validator.exsd"/>   
    
 <!--============================-->
 <!-- Validation Contributions   -->
diff --git a/plugins/org.eclipse.wst.validation/property_files/org/eclipse/wst/validation/internal/messages.properties b/plugins/org.eclipse.wst.validation/property_files/org/eclipse/wst/validation/internal/messages.properties
index a5062b8..c57608c 100644
--- a/plugins/org.eclipse.wst.validation/property_files/org/eclipse/wst/validation/internal/messages.properties
+++ b/plugins/org.eclipse.wst.validation/property_files/org/eclipse/wst/validation/internal/messages.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2005, 2008 IBM Corporation and others.
+# Copyright (c) 2005, 2010 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
@@ -10,7 +10,7 @@
 ###############################################################################
 ErrConfig=IWAE0100E Extension configuration error. An internal error has happened, the validator {0} has incorrectly configured the validation extension point.
 ErrGroupName=IWAE0101E Invalid element, expect either the element "include" or "exclude".
-ErrFilterRule=IWAE0102E An invalid filter rule has been encountered.
+ErrFilterRule=IWAE0102E An invalid filter rule has been encountered. Contributing plug-in: {0}, element name: {1}
 
 ErrGroupNoType=IWAE0103E Groups must have a valid type, no type was returned
 ErrGroupInvalidType=IWAE0104E Groups must have a valid type, the following invalid type was returned: {0}
@@ -28,6 +28,7 @@
 
 DecodeError1=IWAE0019E There was a problem deserializing a string. A boolean was expected but not found. 
 Error20=IWAE0020E Internal error, the incoming validator must be a v2 validator
+Error21=The following dependency could not be restored because the following resource {0} could no longer be found.
 GroupInclude=Include Group
 GroupExclude=Exclude Group
 
@@ -35,6 +36,7 @@
 TypeExclude=exclude
 
 JobName=Validation
+JobNameWithProjectName=Validating {0}
 JobNameMonitor=Validation Monitor
 JobIndexSave=Index Save
 
@@ -47,6 +49,7 @@
 RuleFacet=Facet
 RuleFolder=Folder
 RuleFull=Qualified File
+RulePattern=Pattern
 
 FileExtWithCase={0}: {1} (case sensitive)
 FileExtWithoutCase={0}: {1}
@@ -71,3 +74,5 @@
 TimeSec={0} seconds
 TimeMin={0} minutes
 
+RogueValidator=Rogue validator delegate from contributor {0}
+
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ConfigurationConstants.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ConfigurationConstants.java
index 18e6d44..16aef08 100644
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ConfigurationConstants.java
+++ b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ConfigurationConstants.java
@@ -35,8 +35,7 @@
 	String ELEMENT_SEPARATOR = ";"; //$NON-NLS-1$ // separates the name of one IValidator from the next in the list of enabled validators for a project or preference
 	String DELEGATES_SEPARATOR = "="; //$NON-NLS-1$ // Separates the delegating validator id from the delegate validator id in the list of delegates
 
-	// The following values must match the attributes in the preference marker as shown in
-	// plugin.xml
+	// The following values must match the attributes in the preference marker as shown in plugin.xml
 	// Even though the plugin.xml values are not used to create new Preference or Project markers,
 	// maintaining one local name ensures that there's no confusion writing the migration code.
 	// These are the QualifiedNames used to persist the user's settings.
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ConfigurationManager.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ConfigurationManager.java
index 0c0c0be..2baad42 100644
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ConfigurationManager.java
+++ b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ConfigurationManager.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * Copyright (c) 2001, 2009 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
@@ -15,8 +15,8 @@
 import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.Preferences;
 import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
 
 
@@ -47,10 +47,7 @@
 			if (!marker.getType().equals(VALIDATION_MARKER))return null;
 
 			Object attrib = marker.getAttribute(VALIDATION_MARKER_OWNER);
-			if (attrib == null) {
-				// owner not set
-				return null;
-			}
+			if (attrib == null)return null;
 			return attrib.toString();
 		} catch (CoreException e) {
 			ValidationPlugin.getPlugin().handleException(e);
@@ -93,7 +90,7 @@
 	 * This method returns the global preferences for the workspace.
 	 */
 	public GlobalConfiguration getGlobalConfiguration() throws InvocationTargetException {
-		IWorkspaceRoot root = ValidationConfiguration.getRoot();
+		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
 		GlobalConfiguration gp = null;
 		try {
 			gp = (GlobalConfiguration) root.getSessionProperty(USER_PREFERENCE);
@@ -110,10 +107,8 @@
 			gp = (GlobalConfiguration) root.getSessionProperty(USER_PREFERENCE);
 			if (gp == null) {
 				gp = new GlobalConfiguration(root);
-				Preferences prefs = ValidationPlugin.getPlugin().getPluginPreferences();
-				if( prefs != null ){
-					prefs.addPropertyChangeListener(gp);
-				}
+//				PreferencesWrapper prefs = PreferencesWrapper.getPreferences(null, null);
+//				prefs.addPropertyChangeListener(gp);
 				
 				gp.getVersion(); // initialize the configuration's version attribute
 				gp.load(); // initialize this instance from the stored values
@@ -170,8 +165,7 @@
 		try {
 			if (isMigrated(project)) {
 				ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
-				if(!prjp.useGlobalPreference())
-					prjp.store();
+				if(!prjp.useGlobalPreference())prjp.store();
 			}
 		} catch (InvocationTargetException e) {
 			ValidationPlugin.getPlugin().handleException(e);
@@ -180,9 +174,17 @@
 		}
 	}
 
+	/**
+	 * @deprecated this method does not do anything.
+	 * @param project
+	 */
 	public void deleting(IProject project) {
 	}
 
+	/**
+	 * @deprecated this method does not do anything.
+	 * @param project
+	 */
 	public void opening(IProject project) {
 		// Do not load or migrate the project in this method; let the getConfiguration(IProject)
 		// method do that. Do not load the project before it's necessary.
@@ -193,9 +195,7 @@
 	 */
 	public boolean isGlobalMigrated() throws InvocationTargetException {
 		IWorkspaceRoot root = ValidationConfiguration.getRoot();
-		if (root == null) {
-			return false;
-		}
+		if (root == null)return false;
 
 		try {
 			GlobalConfiguration gp = (GlobalConfiguration) root.getSessionProperty(USER_PREFERENCE);
@@ -220,20 +220,17 @@
 	 * Return true if the given project has the current level of metadata, false otherwise.
 	 */
 	public boolean isMigrated(IProject project) throws InvocationTargetException {
-		if (project == null) {
-			return false;
-		}
+		if (project == null)return false;
+		
 		try {
 			if (project.isAccessible()) {
 				ProjectConfiguration prjp = (ProjectConfiguration) project.getSessionProperty(USER_PREFERENCE);
-				if (prjp != null) {
-					return prjp.isVersionCurrent();
-				}
+				if (prjp != null)return prjp.isVersionCurrent();
+				
 				String serializedPrjp = project.getPersistentProperty(USER_PREFERENCE);
 				if (serializedPrjp != null) {
 					prjp = new ProjectConfiguration(project);
-					prjp.getVersion(); // initialize the configuration's
-					// version attribute
+					prjp.getVersion(); 
 					return prjp.isVersionCurrent();
 				}
 			}
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/EventManager.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/EventManager.java
index de77ba9..d603b8d 100644
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/EventManager.java
+++ b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/EventManager.java
@@ -11,8 +11,8 @@
 package org.eclipse.wst.validation.internal;
 
 import java.lang.reflect.InvocationTargetException;
-import java.util.HashSet;
 import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
 
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
@@ -39,7 +39,7 @@
 	private IResourceDeltaVisitor _postAutoBuildVisitor;
 	private boolean _isActive; // has the registry been read?
 	
-	private Set<IProjectChangeListener> _listeners = new HashSet<IProjectChangeListener>(4);
+	private Set<IProjectChangeListener> _listeners = new CopyOnWriteArraySet<IProjectChangeListener>();
 
 	private EventManager() {
 	}
@@ -80,7 +80,7 @@
 		signal(project, IProjectChangeListener.ProjectOpened);
 
 		// When the project is opened, check for any orphaned tasks or tasks whose owners need to be updated.
-		ConfigurationManager.getManager().opening(project);
+//		ConfigurationManager.getManager().opening(project);
 	}
 
 	public void closing(IProject project) {
@@ -163,7 +163,7 @@
 					}
 				}
 
-				ConfigurationManager.getManager().deleting(project);
+//				ConfigurationManager.getManager().deleting(project);
 			}
 		} catch (InvocationTargetException e) {
 			ValidationPlugin.getPlugin().handleException(e);
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/FilterUtil.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/FilterUtil.java
index fb2a80d..39a36bc 100644
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/FilterUtil.java
+++ b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/FilterUtil.java
@@ -613,7 +613,7 @@
 
 					IResource resource = subdelta.getResource();
 
-					if (Tracing.isLogging()) {
+					if (Tracing.isLogging(2)) {
 						StringBuffer buffer = new StringBuffer("FilterUtil-01: subdelta of "); //$NON-NLS-1$
 						buffer.append(resource.getName());
 						buffer.append(" has resource delta kind: "); //$NON-NLS-1$
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/GlobalConfiguration.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/GlobalConfiguration.java
index 318de6d..20c044f 100644
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/GlobalConfiguration.java
+++ b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/GlobalConfiguration.java
@@ -47,7 +47,7 @@
 	 * without persisting them (i.e., if the user presses Cancel then nothing needs to be done.)
 	 */
 	public GlobalConfiguration(GlobalConfiguration original) throws InvocationTargetException {
-		super();
+		super(original.getResource());
 		original.copyTo(this);
 	}
 
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ProjectConfiguration.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ProjectConfiguration.java
index b91a777..5f39ecf 100644
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ProjectConfiguration.java
+++ b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ProjectConfiguration.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * Copyright (c) 2001, 2009 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
@@ -11,15 +11,15 @@
 package org.eclipse.wst.validation.internal;
 
 import java.lang.reflect.InvocationTargetException;
+import java.util.HashSet;
 import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
 
 import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ProjectScope;
 import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.IScopeContext;
 import org.eclipse.wst.validation.internal.delegates.ValidatorDelegateDescriptor;
 import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
 import org.osgi.service.prefs.BackingStoreException;
@@ -45,22 +45,21 @@
 		// global list.
 		super(project, extractProjectValidators(convertToArray(ValidationRegistryReader.getReader().getAllValidators()), project));
 
-		// Can't put the call to load() and passivate() in the ValidationConfiguration constructor
-		// due
+		// Can't put the call to load() and passivate() in the ValidationConfiguration constructor due
 		// to the order of initialization.
-		//    1. First the ValidationConfiguration constructor is called, and that loads the stored
-		// values.
+		//    1. First the ValidationConfiguration constructor is called, and that loads the stored values.
 		//    2. Then this class's <init> method is called, and that initializes the "override" field
-		// to the default,
-		//       which may be different than the stored value.
+		//       to the default, which may be different than the stored value.
 	}
 
 	/**
 	 * This constructor is provided only for the Properties page, so that the page can store values
 	 * without persisting them (i.e., if the user presses Cancel then nothing needs to be done.)
+	 * 
+	 * @deprecated
 	 */
 	public ProjectConfiguration(ProjectConfiguration original) throws InvocationTargetException {
-		super();
+		super(original.getResource());
 		original.copyTo(this);
 	}
 
@@ -87,6 +86,10 @@
 			return false;
 		}
 	}
+	
+	public boolean getDoesProjectOverride(){
+		return _doesProjectOverride;
+	}
 
 	public boolean doesProjectOverride() {
 		// If the global preference doesn't allow projects to override, it doesn't matter what the
@@ -478,7 +481,7 @@
 				String disableAllValidation = storedConfiguration.substring(disableAllValidationIndex + ConfigurationConstants.DISABLE_ALL_VALIDATION_SETTING.length(), versionIndex);
 				setDisableAllValidation(Boolean.valueOf(disableAllValidation).booleanValue());
 			} else {
-				setDisableAllValidation(false);;
+				setDisableAllValidation(false);
 			}
 			// project doesn't override the global
 			if (disableAllValidationIndex != -1) {
@@ -582,34 +585,75 @@
   
   public void store() throws InvocationTargetException {
 		IProject project = (IProject) getResource();
-		IScopeContext projectContext = new ProjectScope(project);
-		final IEclipsePreferences pref = projectContext.getNode(ValidationPlugin.PLUGIN_ID);
+		final PreferencesWrapper pref = PreferencesWrapper.getPreferences(project, null);
 		if (pref != null) {
 			try {
-				pref.put(USER_PREFERENCE, serialize());
-				pref.put(USER_MANUAL_PREFERENCE, serializeManualSetting());
-				pref.put(USER_BUILD_PREFERENCE, serializeBuildSetting());
-				pref.put(DELEGATES_PREFERENCE, serializeDelegatesSetting());
+				pref.put(ValidationConfiguration.UserPreference, serialize());
+				pref.put(ValidationConfiguration.UserManualPreference, serializeManualSetting());
+				pref.put(ValidationConfiguration.UserBuildPreference, serializeBuildSetting());
+				pref.put(ValidationConfiguration.DelegatesPreference, serializeDelegatesSetting());
 				pref.flush();
 			} catch (BackingStoreException e) {
-				ValidationPlugin.getPlugin().handleException(e);
+				// A common error is that the project has been closed, in which case there
+				// is nothing that we can do.
+				if (project.isAccessible())ValidationPlugin.getPlugin().handleException(e);
 			}
 		}
 	}
   
   protected void loadPreference() throws InvocationTargetException {
 		IProject project = (IProject) getResource();
-		IScopeContext projectContext = new ProjectScope(project);
-		final IEclipsePreferences prefs = projectContext.getNode(ValidationPlugin.PLUGIN_ID);
-		if (prefs != null) {
-			String storedConfig = prefs.get(USER_PREFERENCE, DefaultValue);
+		final PreferencesWrapper prefs = PreferencesWrapper.getPreferences(project, null);
+		if (prefs.nodeExists()) { 
+			String storedConfig = prefs.get(ValidationConfiguration.UserPreference, DefaultValue);
 			deserialize(storedConfig);
-			String storedManualConfig = prefs.get(USER_MANUAL_PREFERENCE, DefaultValue);
+			String storedManualConfig = prefs.get(ValidationConfiguration.UserManualPreference, DefaultValue);
 			deserializeManual(storedManualConfig);
-			String storedBuildConfig = prefs.get(USER_BUILD_PREFERENCE, DefaultValue);
+			String storedBuildConfig = prefs.get(ValidationConfiguration.UserBuildPreference, DefaultValue);
 			deserializeBuild(storedBuildConfig);
-			String storedDelegatesConfiguration = prefs.get(DELEGATES_PREFERENCE, DefaultValue);
+			String storedDelegatesConfiguration = prefs.get(ValidationConfiguration.DelegatesPreference, DefaultValue);
 			deserializeDelegates(storedDelegatesConfiguration);
 		}
 	}
+  
+  /**
+   * Answer the validator id's that have been enabled for manual validation.
+   * @return null if they are all enabled
+   */
+  Set<String> getEnabledManualValidators(){
+	  return getIds(ValidationConfiguration.UserManualPreference, ConfigurationConstants.ENABLED_MANUAL_VALIDATORS);
+  }
+  
+  /**
+   * Answer the validator id's that have been enabled for build validation.
+   * @return null if they are all enabled
+   */
+  Set<String> getEnabledBuildlValidators(){
+	  return getIds(ValidationConfiguration.UserBuildPreference, ConfigurationConstants.ENABLED_BUILD_VALIDATORS);
+  }
+  
+  /**
+   * A helper method to extract some validator id's from a preference store field.
+   * 
+   * @return null if all the validators are enabled.
+   */
+  private Set<String> getIds(String prefKey, String enabledPhrase){
+	IProject project = (IProject) getResource();
+	final PreferencesWrapper prefs = PreferencesWrapper.getPreferences(project, null);
+	if (prefs == null)return null;
+	
+	String storedConfig = prefs.get(prefKey, DefaultValue);
+	if (storedConfig == null || storedConfig.length() == 0 || storedConfig.equals(DefaultValue))return null;
+	int validationIndex = storedConfig.indexOf(enabledPhrase);
+
+	String ids = storedConfig.substring(validationIndex + enabledPhrase.length(),storedConfig.length());
+
+	StringTokenizer tokenizer = new StringTokenizer(ids, ConfigurationConstants.ELEMENT_SEPARATOR);
+	Set<String> set = new HashSet<String>(20);
+	while (tokenizer.hasMoreTokens())set.add(tokenizer.nextToken());
+	if (set.size() == 0)return null;
+	  
+	return set;
+	  
+  }
 }
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/RegistryConstants.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/RegistryConstants.java
index 81a78b4..140240a 100644
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/RegistryConstants.java
+++ b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/RegistryConstants.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2007 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 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
@@ -54,6 +54,9 @@
 	 * only one validator may use an aggregate of that type. */
 	String TAG_AGGREGATE_VALIDATORS = "aggregateValidator"; //$NON-NLS-1$ 
 
+	/** runStrategy - identifies the run strategy of  Validator*/
+	String TAG_RUN_STRATEGY = "runStrategy"; //$NON-NLS-1$
+	
 	/** objectClass - identifies a type */ 
 	String ATT_OBJECT_CLASS = "objectClass"; //$NON-NLS-1$
 	
@@ -119,6 +122,16 @@
 	/** false - The "can validator run asynchronously" default. In the future this may be changed to true. */
 	boolean ATT_ASYNC_DEFAULT = false;
 
+	/** 
+	 * project - identifies whether or not the validator is called per project. 
+	 * Default is false (i.e. the validator is called per resource). 
+	 */
+	String ATT_PROJECT = "project"; //$NON-NLS-1$
+	
+	/** false - The project default. */
+	boolean ATT_PROJECT_DEFAULT = false;
+	
+	
 	/** migrate - the "migrate" section of the validator */
 	String TAG_MIGRATE = "migrate"; //$NON-NLS-1$
 	
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/TaskListUtility.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/TaskListUtility.java
index 7da60d7..1cae3c1 100644
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/TaskListUtility.java
+++ b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/TaskListUtility.java
@@ -225,44 +225,43 @@
 	private static IMarker[] getValidationTasks(IResource resource, int severity, int depth) {
 		IMarker[] tempMarkers = null;
 		int validCount = 0;
+		IMarker[] allMarkers = null;
 		try {
-			IMarker[] allMarkers = null;
-			try {
-				allMarkers = resource.findMarkers(VALIDATION_MARKER, true, depth); // false means
-				// only consider PROBLEM_MARKER, not variants of PROBLEM_MARKER.
-				// Since addTask only adds PROBLEM_MARKER, we don't need
-				// to consider its subtypes.
-			} catch (CoreException e) {
-				if (Tracing.isLogging())ValidationPlugin.getPlugin().handleException(e);
-				return NO_MARKERS;
-			}
+			allMarkers = resource.findMarkers(VALIDATION_MARKER, true, depth);
+		} catch (CoreException e) {
+			if (Tracing.isLogging())ValidationPlugin.getPlugin().handleException(e);
+			return NO_MARKERS;
+		}
 
-			// Now filter in the markers, based on severity type.
-			if (allMarkers.length != 0) {
-				tempMarkers = new IMarker[allMarkers.length];
-				for (int i = 0; i < allMarkers.length; i++) {
-					IMarker marker = allMarkers[i];
-					Integer filterSeverity = (Integer) marker.getAttribute(VALIDATION_MARKER_SEVERITY);
-					if (filterSeverity == null) {
-						// odd...marker wasn't created correctly. How could this happen?
-						// Default to the current severity and add it to the list.
-						try {
-							// 226541 - I was seeing markers with valid severities being reset, so I added this
-							// additional test.
-							if (marker.getAttribute(IMarker.SEVERITY, -1) == -1)
-								marker.setAttribute(IMarker.SEVERITY, getSeverity(severity));
-						} catch (Exception e) {
-							ValidationPlugin.getPlugin().handleException(e);
-							continue;
-						}
-					} else if ((severity & filterSeverity.intValue()) == 0) {
+		// Now filter in the markers, based on severity type.
+		if (allMarkers.length != 0) {
+			tempMarkers = new IMarker[allMarkers.length];
+			for (IMarker marker : allMarkers) {
+				Integer filterSeverity = null;
+				try {
+					filterSeverity = (Integer) marker.getAttribute(VALIDATION_MARKER_SEVERITY);
+				}
+				catch (CoreException e){
+					// Someone may have deleted the marker on us. All we can do is skip it.
+					continue;
+				}
+				if (filterSeverity == null) {
+					// odd...marker wasn't created correctly. How could this happen?
+					// Default to the current severity and add it to the list.
+					try {
+						// 226541 - I was seeing markers with valid severities being reset, so I added this
+						// additional test.
+						if (marker.getAttribute(IMarker.SEVERITY, -1) == -1)
+							marker.setAttribute(IMarker.SEVERITY, getSeverity(severity));
+					} catch (Exception e) {
+						ValidationPlugin.getPlugin().handleException(e);
 						continue;
 					}
-					tempMarkers[validCount++] = marker;
+				} else if ((severity & filterSeverity.intValue()) == 0) {
+					continue;
 				}
+				tempMarkers[validCount++] = marker;
 			}
-		} catch (CoreException e) {
-			ValidationPlugin.getPlugin().handleException(e);
 		}
 
 		if (validCount == 0) {
@@ -284,34 +283,32 @@
 
 	private static IMarker[] getValidationTasks(IResource resource, String[] messageOwners, int depth) {
 		IMarker[] markers = getValidationTasks(resource, IMessage.ALL_MESSAGES, depth);
-		if (markers.length == 0) {
-			return NO_MARKERS;
-		}
+		if (markers.length == 0)return NO_MARKERS;
 
 		IMarker[] temp = new IMarker[markers.length];
 		int validCount = 0;
-		for (int i = 0; i < markers.length; i++) {
-			IMarker marker = markers[i];
-
+		for (IMarker marker : markers) {
+			Object owner = null;
 			try {
-				Object owner = marker.getAttribute(VALIDATION_MARKER_OWNER);
-				if ((owner == null) || !(owner instanceof String)) {
-					// The ValidationMigrator will remove any "unowned" validation markers.
-					continue;
-				}
-
-				for (int j = 0; j < messageOwners.length; j++) {
-					String messageOwner = messageOwners[j];
-					if (((String) owner).equals(messageOwner)) {
-						temp[validCount++] = marker;
-						break;
-					}
-				}
+				owner = marker.getAttribute(VALIDATION_MARKER_OWNER);
 			} catch (CoreException e) {
-				ValidationPlugin.getPlugin().handleException(e);
-				return NO_MARKERS;
+				// eat it -- if it no longer exists there is nothing we can do about it
+			}
+			
+			if ((owner == null) || !(owner instanceof String)) {
+				// The ValidationMigrator will remove any "unowned" validation markers.
+				continue;
+			}
+
+			for (String messageOwner : messageOwners) {
+				if (((String) owner).equals(messageOwner)) {
+					temp[validCount++] = marker;
+					break;
+				}
 			}
 		}
+		
+		if (validCount == 0)return NO_MARKERS;
 
 		IMarker[] result = new IMarker[validCount];
 		System.arraycopy(temp, 0, result, 0, validCount);
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidationConfiguration.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidationConfiguration.java
index 3c5e616..3ddb087 100644
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidationConfiguration.java
+++ b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidationConfiguration.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * Copyright (c) 2001, 2009 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
@@ -10,9 +10,6 @@
  *******************************************************************************/
 package org.eclipse.wst.validation.internal;
 
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
 import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.HashMap;
@@ -34,6 +31,7 @@
 import org.eclipse.wst.validation.internal.delegates.ValidatorDelegateDescriptor;
 import org.eclipse.wst.validation.internal.delegates.ValidatorDelegatesRegistry;
 import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
+import org.osgi.service.prefs.BackingStoreException;
 
 /**
  * This class represents the user's preference or project settings.
@@ -42,7 +40,7 @@
  * property while the resource is open.
  */
 public abstract class ValidationConfiguration implements IPropertyChangeListener {
-	private IResource 	_resource;
+	private final IResource 	_resource;
 	private boolean 	disableAllValidation = getDisableAllValidation();
 	private String 		_version;
 	
@@ -50,20 +48,26 @@
 	 * Map of all validators configured on the project or installed globally. The value of true
 	 * means that the VMD is enabled, and a value of false means that the VMD is disabled.
 	 */
-	private Map<ValidatorMetaData, Boolean>		_validators;
+	private Map<ValidatorMetaData, Boolean>		_validators = new HashMap<ValidatorMetaData, Boolean>();
 	protected Map<ValidatorMetaData, Boolean> 	manualValidators;
 	protected Map<ValidatorMetaData, Boolean> 	buildValidators;
 	
-	protected String USER_PREFERENCE 		= "USER_PREFERENCE"; //$NON-NLS-1$
-	protected String USER_MANUAL_PREFERENCE = "USER_MANUAL_PREFERENCE"; //$NON-NLS-1$
-	protected String USER_BUILD_PREFERENCE 	= "USER_BUILD_PREFERENCE"; //$NON-NLS-1$
-	protected String DELEGATES_PREFERENCE 	= "DELEGATES_PREFERENCE"; //$NON-NLS-1$
+	protected static final String UserPreference = "USER_PREFERENCE"; //$NON-NLS-1$
+	protected static final String UserBuildPreference = "USER_BUILD_PREFERENCE"; //$NON-NLS-1$
+	protected static final String UserManualPreference = "USER_MANUAL_PREFERENCE"; //$NON-NLS-1$
+	protected static final String DelegatesPreference = "DELEGATES_PREFERENCE"; //$NON-NLS-1$
+	
+	// GRK - I am keeping these "constants" in the off chance that they were used somewhere outside the framework
+	protected String USER_PREFERENCE 		= UserPreference;
+	protected String USER_MANUAL_PREFERENCE = UserManualPreference;
+	protected String USER_BUILD_PREFERENCE 	= UserBuildPreference;
+	protected String DELEGATES_PREFERENCE 	= DelegatesPreference;
 	
 	/**
 	 * The key is the target id, that is the id of the place holder validator. The value is the id 
 	 * of the real validator. 
 	 */
-	private Map<String, String> _delegatesByTarget;
+	private Map<String, String> _delegatesByTarget = new HashMap<String, String>();
 	
 	private static final String DefaultValue = "default_value"; //$NON-NLS-1$
 
@@ -124,29 +128,47 @@
 
 		return result;
 	}
+	
+	/**
+	 * Answer the validators
+	 * @return
+	 */
+	public static Set<String> getValidatorIdsManual(){
+		PreferencesWrapper prefs = PreferencesWrapper.getPreferences(null, null);
+		String config = prefs.get(UserManualPreference, null);
+		return getValidatorIds(config);
+	}
+	
+	public static Set<String> getValidatorIdsBuild(){
+		PreferencesWrapper prefs = PreferencesWrapper.getPreferences(null, null);
+		String config = prefs.get(UserBuildPreference, null);
+		return getValidatorIds(config);
+	}
+	
+	private static Set<String> getValidatorIds(String elements){
+		Set<String> set = new HashSet<String>(50);
+		if (elements != null){
+			StringTokenizer tokenizer = new StringTokenizer(elements, ConfigurationConstants.ELEMENT_SEPARATOR);
+			while (tokenizer.hasMoreTokens())set.add(tokenizer.nextToken());
+		}
+		return set;
+	}
 
 	public static IWorkspaceRoot getRoot() {
 		return ResourcesPlugin.getWorkspace().getRoot();
 	}
-
-	protected ValidationConfiguration() throws InvocationTargetException {
-		_validators = new HashMap<ValidatorMetaData, Boolean>();
-		_delegatesByTarget = new HashMap<String, String>();
+	
+	protected ValidationConfiguration(IResource resource){
+		_resource = resource;
 	}
 
 	protected ValidationConfiguration(IResource resource, ValidatorMetaData[] validators) throws InvocationTargetException {
-		this();
-
 		if (resource == null) {
 			throw new InvocationTargetException(null, ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_NULLCREATE));
 		}
 
-		setResource(resource);
-		setValidators(validators);
-	}
-
-	private void setResource(IResource resource) {
 		_resource = resource;
+		setValidators(validators);
 	}
 	
 	public boolean isDisableAllValidation() throws InvocationTargetException {
@@ -183,8 +205,9 @@
 		ValidatorMetaData[] result = null;
 		 
 		if( !isDisableAllValidation() ){
-			ValidatorMetaData[] temp = new ValidatorMetaData[numberOfValidators()];
-			for (ValidatorMetaData vmd : getBuildEnabledValidatorsMap().keySet()) {
+			Set<ValidatorMetaData> set = getBuildEnabledValidatorsMap().keySet();
+			ValidatorMetaData[] temp = new ValidatorMetaData[set.size()];
+			for (ValidatorMetaData vmd : set) {
 				Boolean bvalue = getBuildEnabledValidatorsMap().get(vmd);
 				if (bvalue) {
 					// If the validator is enabled
@@ -437,6 +460,7 @@
 
 	/**
 	 * This preference has been migrated; change the version to the current version.
+	 * @deprecated dead code.
 	 */
 	public void markVersionCurrent() {
 		// The version should not be marked current until the migration is complete
@@ -536,27 +560,28 @@
 		System.arraycopy(c, 0, result, 0, length);
 		return result;
 	}
-
+	
 	/**
 	 * Save the values of these fields before the project or workspace is closed.
 	 */
 	public void store() throws InvocationTargetException {
-		Preferences pref = ValidationPlugin.getPlugin().getPluginPreferences();
-		if (pref != null) {
-			try {
-				OutputStream os = new ByteArrayOutputStream();
-				pref.setValue(USER_PREFERENCE, serialize());
-				pref.store(os, USER_PREFERENCE);
-				pref.setValue(USER_MANUAL_PREFERENCE, serializeManualSetting());
-				pref.store(os, USER_MANUAL_PREFERENCE);
-				pref.setValue(USER_BUILD_PREFERENCE, serializeBuildSetting());
-				pref.store(os, USER_BUILD_PREFERENCE);
-				pref.setValue(DELEGATES_PREFERENCE, serializeDelegatesSetting());
-				pref.store(os, DELEGATES_PREFERENCE);
-			} catch (IOException e) {
-				ValidationPlugin.getPlugin().handleException(e);
-			}
+		store(null);
+	}
 
+	/**
+	 * Save the values of these fields before the project or workspace is closed.
+	 */
+	public void store(Boolean persist) throws InvocationTargetException {
+		PreferencesWrapper pref = PreferencesWrapper.getPreferences(null, persist);
+		pref.put(ValidationConfiguration.UserPreference, serialize());
+		pref.put(ValidationConfiguration.UserManualPreference, serializeManualSetting());
+		pref.put(ValidationConfiguration.UserBuildPreference, serializeBuildSetting());
+		pref.put(ValidationConfiguration.DelegatesPreference, serializeDelegatesSetting());
+		try {
+			pref.flush();
+		}
+		catch (BackingStoreException e){
+			throw new InvocationTargetException(e);
 		}
 	}
 
@@ -688,24 +713,22 @@
 		// 1. This is a new workspace and no preferences exist.
 		// 2. This is a migrated workspace and the old preferences have already been created as
 		// persistent properties.
-		Preferences prefs = ValidationPlugin.getPlugin().getPluginPreferences();
-		if (prefs != null) {
-			deserializeAllPrefs(prefs);
-		}
+		PreferencesWrapper prefs = PreferencesWrapper.getPreferences(null, null);
+		deserializeAllPrefs(prefs);
 	}
 
 	/**
 	 * @param prefs
 	 * @throws InvocationTargetException
 	 */
-	private void deserializeAllPrefs(Preferences prefs) throws InvocationTargetException {
-		String storedConfig = prefs.getString(USER_PREFERENCE);
+	private void deserializeAllPrefs(PreferencesWrapper prefs) throws InvocationTargetException {
+		String storedConfig = prefs.get(ValidationConfiguration.UserPreference, null);
 		deserialize(storedConfig);
-		String storedManualConfig = prefs.getString(USER_MANUAL_PREFERENCE);
+		String storedManualConfig = prefs.get(ValidationConfiguration.UserManualPreference, null);
 		deserializeManual(storedManualConfig);
-		String storedBuildConfig = prefs.getString(USER_BUILD_PREFERENCE);
+		String storedBuildConfig = prefs.get(ValidationConfiguration.UserBuildPreference, null);
 		deserializeBuild(storedBuildConfig);
-		String storedDelegatesConfiguration = prefs.getString(DELEGATES_PREFERENCE);
+		String storedDelegatesConfiguration = prefs.get(ValidationConfiguration.DelegatesPreference, null);
 		deserializeDelegates(storedDelegatesConfiguration);
 	}
 	
@@ -723,13 +746,13 @@
 
 	private void deserializeAllPrefs(PropertyChangeEvent event) throws InvocationTargetException {
 		String storedConfig = (String)event.getNewValue();
-		if( event.getProperty().equals(USER_PREFERENCE) ){
+		if( event.getProperty().equals(ValidationConfiguration.UserPreference) ){
 			deserialize(storedConfig);
-		}else if(event.getProperty().equals(USER_MANUAL_PREFERENCE)){
+		}else if(event.getProperty().equals(ValidationConfiguration.UserManualPreference)){
 			deserializeManual(storedConfig);
-		}else if(event.getProperty().equals(USER_BUILD_PREFERENCE)){
+		}else if(event.getProperty().equals(ValidationConfiguration.UserBuildPreference)){
 			deserializeBuild(storedConfig);
-		}else if(event.getProperty().equals(DELEGATES_PREFERENCE)){
+		}else if(event.getProperty().equals(ValidationConfiguration.DelegatesPreference)){
 			deserializeDelegates(storedConfig);
 		}
 	}
@@ -787,7 +810,6 @@
 
 	protected void copyTo(ValidationConfiguration up) throws InvocationTargetException {
 		up.setVersion(getVersion());
-		up.setResource(getResource());
 		up.setValidators(getValidators());
 		up.setDisableAllValidation(isDisableAllValidation());
 		up.setEnabledValidators(getEnabledValidators());
@@ -970,7 +992,7 @@
 				String disableAllValidation = storedConfiguration.substring(disableAllValidationIndex + ConfigurationConstants.DISABLE_ALL_VALIDATION_SETTING.length(),versionIndex);
 				setDisableAllValidation(Boolean.valueOf(disableAllValidation).booleanValue());
 		} else {
-				setDisableAllValidation(false);;
+				setDisableAllValidation(false);
 		}
 		
 	}
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidationRegistryReader.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidationRegistryReader.java
index d9ed1a8..7a4d5f1 100644
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidationRegistryReader.java
+++ b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidationRegistryReader.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 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
@@ -54,36 +54,40 @@
  * ValidatorManager's loadValidatorMetaData(IProject) method. ValidatorManager delegates the load
  * call to this class, and if this class is null, the singleton is new'ed up, and the registry is
  * read.
- * 
+ * <p>
  * No Validator should need to know about this class. The only class which should call
  * ValidationRegistryReader is ValidatorManager.
- * 
+ * </p>
+ * <p>
  * The Validator itself is initialized in the "initializeValidator" method.
- * 
- * <extension point="org.eclipse.wst.validation.internal.provisional.core.core.validator" id="EJBValidator" name="EJB
- * Validator"> <validator><projectNature id="com.ibm.etools.j2ee.EJBNature" include="false"/>
- * <filter objectClass="org.eclipse.core.resources.IFile" nameFilter = "ejb-jar.xml"/> <filter
- * objectClass="org.eclipse.core.resources.IFile" nameFilter = "*.java"/> <helper
- * class="org.eclipse.wst.validation.internal.provisional.core.core.ejb.workbenchimpl.EJBHelper"/> <run
- * class="org.eclipse.wst.validation.internal.provisional.core.core.ejb.EJBValidator" incremental="false" enabled="false"
- * pass="fast,full" async="false"/> <aggregateValidator class="my.aggregate.ValidatorClass"/>
- * <migrate><validator from="old.class.name" to="new.class.name"/> </migrate> </validator>
- * </extension>
+ * </p>
  */
 public final class ValidationRegistryReader implements RegistryConstants {
-	private static ValidationRegistryReader inst;
+	
+	 /* <extension point="org.eclipse.wst.validation.internal.provisional.core.core.validator" id="EJBValidator" name="EJB
+		 * Validator"> <validator><projectNature id="com.ibm.etools.j2ee.EJBNature" include="false"/>
+		 * <filter objectClass="org.eclipse.core.resources.IFile" nameFilter = "ejb-jar.xml"/> <filter
+		 * objectClass="org.eclipse.core.resources.IFile" nameFilter = "*.java"/> <helper
+		 * class="org.eclipse.wst.validation.internal.provisional.core.core.ejb.workbenchimpl.EJBHelper"/> <run
+		 * class="org.eclipse.wst.validation.internal.provisional.core.core.ejb.EJBValidator" incremental="false" enabled="false"
+		 * pass="fast,full" async="false"/> <aggregateValidator class="my.aggregate.ValidatorClass"/>
+		 * <migrate><validator from="old.class.name" to="new.class.name"/> </migrate> </validator>
+		 * </extension>
+		 */
+	
+	private static ValidationRegistryReader _inst = new ValidationRegistryReader();
 	
 	/** list of all validators registered, with their associated ValidatorMetaData, indexed by project nature id */
-	private Map<String,Set<ValidatorMetaData>> _validators;
+	private final Map<String,Set<ValidatorMetaData>> _validators;
 	
 	// list of all validators, indexed by validator class name,
 	// with the validator's ValidatorMetaData as the value.
 	// Needed by the WorkbenchReporter, because sometimes the
 	// IValidator is not enough to remove all messages from the
 	// task list.
-	private Map<String, ValidatorMetaData> _indexedValidators; 
+	private final Map<String, ValidatorMetaData> _indexedValidators; 
 	
-	private Set<ValidatorMetaData> _defaultEnabledValidators;
+	private final Set<ValidatorMetaData> _defaultEnabledValidators;
 	
 	// Since IProject's contents are all instances of IResource, every type filter for a validator
 	// must be an instance of IResource. This applies to both the rebuildCache pass and to the
@@ -93,18 +97,18 @@
 	private static final String UNKNOWN_PROJECT = "UNKNOWN"; //$NON-NLS-1$ // This 'project nature id' is used as a key to get the validators which can run on a project type which hasn't been explicitly filtered in or out by any validator.
 	private static final String EXCLUDED_PROJECT = "EXCLUDED"; //$NON-NLS-1$ // This 'project nature id' is used as a key to get the validators which are excluded on certain projects.
 	
-	public HashMap<IProject, Set<ValidatorMetaData>> projectValidationMetaData;
+	/** @deprecated this instance variable should not be public. */
+	public HashMap<IProject, Set<ValidatorMetaData>> projectValidationMetaData = new HashMap<IProject, Set<ValidatorMetaData>>();
 
 	/**
 	 * The registry is read once - when this class is instantiated.
 	 */
 	private ValidationRegistryReader() {
-		super();
 
+		_validators = new HashMap<String,Set<ValidatorMetaData>>();
+		_indexedValidators = new HashMap<String, ValidatorMetaData>();
+		_defaultEnabledValidators = new HashSet<ValidatorMetaData>();
 		try {
-			_validators = new HashMap<String,Set<ValidatorMetaData>>();
-			_indexedValidators = new HashMap<String, ValidatorMetaData>();
-			_defaultEnabledValidators = new HashSet<ValidatorMetaData>();
 
 			// Read the registry and build a map of validators. The key into
 			// the map is the IValidator instance and the value is the ValidatorMetaData
@@ -643,7 +647,7 @@
 		return result;
 	}
 
-	private ValidatorMetaData.MigrationMetaData getMigrationMetaData(IConfigurationElement element, ValidatorMetaData vmd) {
+	private ValidatorMetaData.MigrationMetaData getMigrationMetaData(IConfigurationElement element) {
 		IConfigurationElement[] runChildren = element.getChildren(TAG_MIGRATE);
 		if ((runChildren == null) || (runChildren.length == 0)) {
 			return null;
@@ -658,7 +662,7 @@
 			return null;
 		}
 
-		ValidatorMetaData.MigrationMetaData mmd = vmd.new MigrationMetaData();
+		ValidatorMetaData.MigrationMetaData mmd = new ValidatorMetaData.MigrationMetaData();
 		for (int i = 0; i < migrateChildren.length; i++) {
 			IConfigurationElement migrateChild = migrateChildren[i];
 			String from = migrateChild.getAttribute(ATT_FROM);
@@ -717,12 +721,7 @@
 	 * Returns the singleton ValidationRegistryReader.
 	 */
 	public static ValidationRegistryReader getReader() {
-		if (inst == null) {
-			inst = new ValidationRegistryReader();
-
-			EventManager.getManager().setActive(true);
-		}
-		return inst;
+		return _inst;
 	}
 
 	public static boolean isActivated() {
@@ -738,7 +737,7 @@
 	 */
 	private IExtensionPoint getValidatorExtensionPoint() {
 		IExtensionRegistry registry = Platform.getExtensionRegistry();
-		IExtensionPoint extensionPoint = registry.getExtensionPoint(PLUGIN_ID, VALIDATOR_EXT_PT_ID);
+		IExtensionPoint extensionPoint = registry.getExtensionPoint(ValidationPlugin.PLUGIN_ID, VALIDATOR_EXT_PT_ID);
 		if (extensionPoint == null) {
 			// If this happens it means that someone removed the "validator" extension point
 			// declaration from our plugin.xml file.
@@ -1044,19 +1043,27 @@
 	}
 
 	public boolean isConfiguredOnProject(ValidatorMetaData vmd, IProject project) {
-		if (projectValidationMetaData == null)
-			projectValidationMetaData = new HashMap<IProject, Set<ValidatorMetaData>>();
-
-		Set<ValidatorMetaData> vmds = projectValidationMetaData.get(project);
+		Set<ValidatorMetaData> vmds = null;
+		synchronized(projectValidationMetaData){
+			vmds = projectValidationMetaData.get(project);
+		}
 		if (vmds != null) {
 			return vmds.contains(vmd);
 		} else {
 			Set<ValidatorMetaData> prjVmds = getValidatorMetaData(project);
 			if (prjVmds == null || prjVmds.size() == 0)return false;
-			projectValidationMetaData.put(project, prjVmds);
+			synchronized(projectValidationMetaData){
+				projectValidationMetaData.put(project, prjVmds);
+			}
 			return prjVmds.contains(vmd);
 		}
 	}
+	
+	public void clearCachedMaps(){
+		synchronized(projectValidationMetaData){
+			projectValidationMetaData.clear();
+		}
+	}
 
 	/**
 	 * Return a set of ValidatorMetaData which are configured on all projects or which run on any
@@ -1207,28 +1214,15 @@
 		//
 		// To load a String into the constants space, call intern() on the String.
 		//
-		ValidatorMetaData vmd = new ValidatorMetaData();
-		vmd.addFilters(getFilters(element)); // validator may, or may not, have filters
-		vmd.addProjectNatureFilters(getProjectNatureFilters(element)); // validator may, or may not, specify a project nature
-		vmd.addFacetFilters(getFacetIds(element));//validator may or may not specify the facet
-		vmd.setEnablementElement(getEnablementElement(element));
-		vmd.addAggregatedValidatorNames(getAggregateValidatorsNames(element)); // if a validator
-		// aggregated another validator, it should identify
-		// the sub-validator(s)' class name
-		vmd.setValidatorDisplayName(validatorName.intern()); // validator must have a display name.
-		vmd.setValidatorUniqueName(validatorImplName.intern());
-		vmd.setPluginId(pluginId);
-		vmd.setIncremental(getIncremental(element));
-		vmd.setFullBuild(getFullBuild(element));
-		vmd.setAsync(getAsync(element));
-		vmd.setRuleGroup(getRuleGroup(element));
-		vmd.setEnabledByDefault(getEnabledByDefault(element));
-		vmd.setMigrationMetaData(getMigrationMetaData(element, vmd));
-		vmd.setHelperClass(element, helperImplName);
-		vmd.setValidatorClass(runChildren[0]); // associate the above attributes with the validator
-		vmd.addDependentValidator(getDependentValidatorValue(element));
-		vmd.setContentTypeIds(getContentTypeBindings(element));
-		initializeValidatorCustomMarkers(element, pluginId, vmd);
+		
+		boolean async = getAsync(element);
+		String[] markerIds = initializeValidatorCustomMarkers(element, pluginId);
+		ValidatorMetaData vmd = new ValidatorMetaData(async, getAggregateValidatorsNames(element), getEnabledByDefault(element),
+				getIncremental(element), getFullBuild(element), element, helperImplName, getMigrationMetaData(element),
+				pluginId, getRuleGroup(element), runChildren[0], validatorName.intern(), validatorImplName.intern(),
+				getContentTypeBindings(element), getDependentValidatorValue(element), getEnablementElement(element),
+				getFacetIds(element), getFilters(element), getProjectNatureFilters(element), markerIds, getRunStragety(element));
+		
 		
 		if (Tracing.isTraceV1()) {
 			Tracing.log("ValidationRegistryReader-10: validator loaded: " + validatorImplName); //$NON-NLS-1$
@@ -1242,10 +1236,11 @@
 	 * @param pluginId
 	 * @param vmd
 	 */
-	private void initializeValidatorCustomMarkers(IConfigurationElement element, String pluginId, ValidatorMetaData vmd) {
+	private String[] initializeValidatorCustomMarkers(IConfigurationElement element, String pluginId) {
+		String[] qualifiedMarkerIds = null;
 		String[] customMarkerIds = getMarkerIdsValue(element);
 		if (customMarkerIds != null && customMarkerIds.length > 0) {
-			String[] qualifiedMarkerIds = new String[customMarkerIds.length];
+			qualifiedMarkerIds = new String[customMarkerIds.length];
 			for (int i = 0; i < customMarkerIds.length; i++) {
 				String markerid = customMarkerIds[i];
 				if (markerid.lastIndexOf(".") != -1) { //$NON-NLS-1$
@@ -1258,8 +1253,8 @@
 				} else
 					qualifiedMarkerIds[i] = pluginId + "." + customMarkerIds[i]; //$NON-NLS-1$
 			}
-			vmd.setMarkerIds(qualifiedMarkerIds);
 		}
+		return qualifiedMarkerIds;
 	}
 
 	private Expression getEnablementElement(IConfigurationElement element) {
@@ -1310,12 +1305,14 @@
 				// The PropertyPage, and other status messages, need to have a displayable name for
 				// the validator.
 				String pluginId = extension.getContributor().getName();
-				ValidatorMetaData vmd = initializeValidator(element, label, pluginId);
-
-				if (vmd != null) {
-					// Add this validator to the list of validators; if vmd is null, the validator
-					// couldn't be created.
-					add(vmd);
+				if (Tracing.isEnabled(extension.getUniqueIdentifier())){
+					ValidatorMetaData vmd = initializeValidator(element, label, pluginId);
+	
+					if (vmd != null) {
+						// Add this validator to the list of validators; if vmd is null, the validator
+						// couldn't be created.
+						add(vmd);
+					}
 				}
 			}
 		}
@@ -1352,5 +1349,22 @@
 			return vmd.getValidator();
 		return null;
 	}
+	/**
+	 * Given an IConfigurationElement from plugin.xml, return whether or not the validator is called by project
+	 * 
+	 * <p>If no project attribute is specified, the default is false (validator is called by resource)
+	 */
+	private boolean getRunStragety(IConfigurationElement element) {
+		
+		IConfigurationElement[] runChildren = element.getChildren(TAG_RUN_STRATEGY);
+		
+		if (runChildren == null || runChildren.length < 1) return RegistryConstants.ATT_PROJECT_DEFAULT;
+		String project = runChildren[0].getAttribute(ATT_PROJECT);
+		if (project == null)return RegistryConstants.ATT_PROJECT_DEFAULT;
+
+		return Boolean.valueOf(project.trim()); 
+	
+	}
+	
 
 }
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidatorMetaData.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidatorMetaData.java
index ceb7425..4fef8a4 100644
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidatorMetaData.java
+++ b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/ValidatorMetaData.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 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
@@ -18,6 +18,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
 
 import org.eclipse.core.expressions.Expression;
 import org.eclipse.core.resources.IContainer;
@@ -43,68 +44,72 @@
  * ValidatorMetaData; it is for use by the base framework only.
  */
 public class ValidatorMetaData {
-	private ValidatorFilter[] 		_filters;
-	private ValidatorNameFilter[] 	_projectNatureFilters;
-	private String[] 				_facetFilters;
-	private IValidator 				_validator;
-	private IWorkbenchContext 		_helper;
-	private String 					_validatorDisplayName;
-	private String 			_validatorUniqueName;
-	private String[] 		_aggregatedValidators;
-    private String[] 		_contentTypeIds = null;
-	private String[] 		_validatorNames;
-	private String 			_pluginId;
-	private boolean 		_supportsIncremental = RegistryConstants.ATT_INCREMENTAL_DEFAULT;
-	private boolean 		_supportsFullBuild = RegistryConstants.ATT_FULLBUILD_DEFAULT;
-	private boolean 		_isEnabledByDefault = RegistryConstants.ATT_ENABLED_DEFAULT;
-	private MigrationMetaData _migrationMetaData;
-	private int 			_ruleGroup = RegistryConstants.ATT_RULE_GROUP_DEFAULT;
-	private boolean 		_async = RegistryConstants.ATT_ASYNC_DEFAULT;
-	private boolean 		_dependentValidator = RegistryConstants.DEP_VAL_VALUE_DEFAULT;
-	private String[] 		_markerIds;
-	private String 			_helperClassName;
-	private IConfigurationElement _helperClassElement;
-	private IConfigurationElement _validatorClassElement;
-	private boolean 		_cannotLoad;
-	private boolean 		_manualValidation = true;
-	private boolean 		_buildValidation = true;
-	private Map<IValidatorJob, IWorkbenchContext> _helpers = 
-		Collections.synchronizedMap( new HashMap<IValidatorJob, IWorkbenchContext>() );
-	private Expression 		_enablementExpression;
-
-	ValidatorMetaData() {
-	}
-
+	private final ValidatorFilter[] _filters;
+	private final ValidatorNameFilter[] 	_projectNatureFilters;
+	private final String[]			_facetFilters;
+	private final AtomicReference<IValidator>	_validator = new AtomicReference<IValidator>();
+	private final AtomicReference<IWorkbenchContext> 		_helper = new AtomicReference<IWorkbenchContext>();
+	private final String 			_validatorDisplayName;
+	private final String 			_validatorUniqueName;
+	
 	/**
-	 * Add to the list of class names of every validator which this validator aggregates. For
+	 * The list of class names of every validator which this validator aggregates. For
 	 * example, if the EJB Validator instantiated another validator, and started its validate
 	 * method, then that instantiated class' name should be in this list.
 	 */
-	void addAggregatedValidatorNames(String[] val) {
-		_aggregatedValidators = val;
-	}
+	private final String[] 	_aggregatedValidators;
+    private final String[] 	_contentTypeIds;
+	private final String[] 	_validatorNames;
+	private final String 	_pluginId;
+	private final boolean	_supportsIncremental;
+	private final boolean 	_supportsFullBuild;
+	private final boolean 	_isEnabledByDefault;
+	private final MigrationMetaData _migrationMetaData;
+	private final int 		_ruleGroup;
+	private final boolean 	_async;
+	private final boolean 	_dependentValidator;
+	private final String[]	_markerIds;
+	private final String 	_helperClassName;
+	private final IConfigurationElement _helperClassElement;
+	private final IConfigurationElement _validatorClassElement;
+	private volatile boolean 	_cannotLoad;
+	private volatile boolean 	_manualValidation = true;
+	private volatile boolean	_buildValidation = true;
+	private final Map<IValidatorJob, IWorkbenchContext> _helpers = 
+		Collections.synchronizedMap( new HashMap<IValidatorJob, IWorkbenchContext>() );
+	private final Expression 		_enablementExpression;
+	private boolean _validateByProject = true;
 
-	/**
-	 * Add the name/type filter pair(s).
-	 */
-	void addFilters(ValidatorFilter[] filters) {
+	ValidatorMetaData(boolean async, String[] aggregatedValidators, boolean isEnabledByDefault, boolean supportsIncremental,
+			boolean supportsFullBuild, IConfigurationElement helperClassElement, String helperClassName, 
+			MigrationMetaData migrationMetaData, String pluginId, int ruleGroup, IConfigurationElement validatorClassElement,
+			String validatorDisplayName, String validatorUniqueName, String[] contentTypeIds, boolean dependentValidator,
+			Expression enablementExpression, String[] facetFilters, ValidatorFilter[] filters,
+			ValidatorNameFilter[] projectNatureFilters, String[] markerIds, boolean validateByProject) {
+		_async = async;
+		_aggregatedValidators = aggregatedValidators;
+		_isEnabledByDefault = isEnabledByDefault;
+		_supportsIncremental = supportsIncremental;
+		_supportsFullBuild = supportsFullBuild;
+		_helperClassElement = helperClassElement;
+		_helperClassName = helperClassName;
+		_migrationMetaData = migrationMetaData;
+		_pluginId = pluginId;
+		_ruleGroup = ruleGroup;
+		_validatorClassElement = validatorClassElement;
+		_validatorDisplayName = validatorDisplayName;
+		_validatorUniqueName = validatorUniqueName;
+		_contentTypeIds = contentTypeIds;
+		_dependentValidator = dependentValidator;
+		_enablementExpression = enablementExpression;
+		_facetFilters = facetFilters;
 		_filters = filters;
+		_projectNatureFilters = projectNatureFilters;
+		_markerIds = markerIds;
+		_validatorNames = buildValidatorNames();
+		_validateByProject = validateByProject;
 	}
-
-	/**
-	 * Add the project nature filter(s).
-	 */
-	void addProjectNatureFilters(ValidatorNameFilter[] filters) {
-		_projectNatureFilters = filters;
-	}
-	
-	/**
-	 * Add the facet  filter(s).
-	 */
-	protected void addFacetFilters(String[] filters) {
-		_facetFilters = filters;
-	}
-	
+		
 	protected String[] getFacetFilters() {
 		return _facetFilters;
 	}
@@ -126,16 +131,18 @@
 	 * Return the list of class names of the primary validator and its aggregates.
 	 */
 	public String[] getValidatorNames() {
-		if (_validatorNames == null) {
-			int aLength = (_aggregatedValidators == null) ? 0 : _aggregatedValidators.length;
-			_validatorNames = new String[aLength + 1]; // add 1 for the primary validator name
-			_validatorNames[0] = getValidatorUniqueName();
-			if (_aggregatedValidators != null) {
-				System.arraycopy(_aggregatedValidators, 0, _validatorNames, 1, aLength);
-			}
-		}
 		return _validatorNames;
 	}
+	
+	private String[] buildValidatorNames() {
+		int aLength = (_aggregatedValidators == null) ? 0 : _aggregatedValidators.length;
+		String [] validatorNames = new String[aLength + 1]; // add 1 for the primary validator name
+		validatorNames[0] = getValidatorUniqueName();
+		if (_aggregatedValidators != null) {
+			System.arraycopy(_aggregatedValidators, 0, validatorNames, 1, aLength);
+		}
+		return validatorNames;
+	}
 
 	/**
 	 * Return the list of class names of every validator which this validator aggregates. For
@@ -191,30 +198,25 @@
 	//TODO just want to remember to figure out the many-temporary-objects problem if this method
 	// continues to new an IValidationContext every time - Ruth
 	public IWorkbenchContext getHelper(IProject project) throws InstantiationException {
-		if (_helper == null) {
-			_helper = ValidationRegistryReader.createHelper(_helperClassElement, _helperClassName);
-			if (_helper == null) {
-				_helper = new WorkbenchContext();
-				//setCannotLoad();
-				//throw new InstantiationException(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_DISABLEH, new String[]{_helperClassName, getValidatorUniqueName()}));
-			}
-			// Won't be using the element & name again, so clear them.
-			//_helperClassElement = null;
-			//_helperClassName = null;
+		IWorkbenchContext helper = _helper.get();
+		if (helper != null){
+			IProject oldProject = helper.getProject();
+			if ((oldProject == null) || !(oldProject.equals(project)))helper.setProject(project);
+			return helper;
 		}
-		if ((_helper.getProject() == null) || !(_helper.getProject().equals(project))) {
-			// Initialize helper with the new project
-			_helper.setProject(project);
+		
+		helper = ValidationRegistryReader.createHelper(_helperClassElement, _helperClassName);
+		if (helper == null)helper = new WorkbenchContext();
+		
+		if ((helper.getProject() == null) || !(helper.getProject().equals(project))) {
+			helper.setProject(project);
 		}
-		return _helper;
+		if (_helper.compareAndSet(null, helper))return helper;
+		return _helper.get();
 	}
 
 	/**
 	 * cannotLoad is false if both the IValidator and IWorkbenchContext instance can be instantiated.
-	 * This method should be called only by the validation framework, and only if an
-	 * InstantiationException was thrown.
-	 * 
-	 * @param can
 	 */
 	private void setCannotLoad() {
 		_cannotLoad = true;
@@ -251,23 +253,19 @@
 	 * This method returns the validator if it can be loaded; if the validator cannot be loaded,
 	 * e.g., if its plugin is disabled for some reason, then this method throws an
 	 * InstantiationException. Before the CoreException is thrown, this validator is disabled.
-	 * 
-	 * @return IValidator
-	 * @throws InstantiationException
 	 */
 	public IValidator getValidator() throws InstantiationException {
-		if (_validator == null) {
-			_validator = ValidationRegistryReader.createValidator(_validatorClassElement, getValidatorUniqueName());
+		IValidator val = _validator.get();
+		if (val != null)return val;
+		
+		val = ValidationRegistryReader.createValidator(_validatorClassElement, getValidatorUniqueName());
 
-			// Since the element won't be used any more, clear it.
-			//_validatorClassElement = null;
-
-			if (_validator == null) {
-				setCannotLoad();
-				throw new InstantiationException(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_DISABLEV, new String[]{getValidatorUniqueName()}));
-			}
+		if (val == null) {
+			setCannotLoad();
+			throw new InstantiationException(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_EXC_DISABLEV, new String[]{getValidatorUniqueName()}));
 		}
-		return _validator;
+		if (_validator.compareAndSet(null, val))return val;
+		return _validator.get();
 	}
 
 	public String getValidatorDisplayName() {
@@ -297,8 +295,9 @@
 	 */
 	public boolean isApplicableTo(IResource resource, int resourceDelta) {
 		// If no filters are specified, then every type of resource should be validated/trigger a
-		// rebuild of the model cache
-		if (_filters == null)return true;
+		// rebuild of the model cache.
+		// Also make sure no content type id is specified (BUG 193816)
+		if (_filters == null  && getContentTypeIds() == null)return true;
 
 		return isApplicableTo(resource, resourceDelta, _filters);
 	}
@@ -308,15 +307,14 @@
 	 */
 	boolean isApplicableTo(IResource resource, int resourceDelta, ValidatorFilter[] filters) {
 		// Are any of the filters satisfied? (i.e., OR them, not AND them.)
-		if (checkIfValidSourceFile(resource)) {
-			for (int i = 0; i < filters.length; i++) {
-				ValidatorFilter filter = filters[i];
+		// make sure filters is not null (BUG 193816)
+		if (filters != null && checkIfValidSourceFile(resource)) {
+			for (ValidatorFilter filter : filters) {
 				if (filter.isApplicableType(resource)
 						&& filter.isApplicableName(resource)
 						&& filter.isApplicableAction(resourceDelta)) {
 					return true;
 				}
-
 			}
 		}
 		if (getContentTypeIds() != null) {
@@ -327,10 +325,8 @@
 			} catch (CoreException e) {
 				//Resource exceptions
 			}
-			if (description == null)
-				return false;
-			if (isApplicableContentType(description))
-				return true;
+			if (description == null)return false;
+			if (isApplicableContentType(description))return true;
 		}
 		return false;
 	}
@@ -343,6 +339,7 @@
 				return true;
 			IContainer[] outputContainers = helper.getOutputContainers(project);
 			IContainer[] sourceContainers = helper.getSourceContainers(project);
+			if(outputContainers != null && sourceContainers != null){
 			for (int i=0; i<outputContainers.length; i++) {
 				String outputPath = outputContainers[i].getProjectRelativePath().makeAbsolute().toString();
                 String filePath = file.getProjectRelativePath().makeAbsolute().toString();
@@ -358,6 +355,7 @@
 				}
 			}
 		}
+		}
 		return true;
 	}
 		
@@ -415,57 +413,11 @@
 		return _async;
 	}
 
-	void setHelperClass(IConfigurationElement element, String helperClassName) {
-		_helperClassElement = element;
-		_helperClassName = helperClassName;
-	}
-
-	void setEnabledByDefault(boolean enabledByDefault) {
-		_isEnabledByDefault = enabledByDefault;
-	}
-
-	void setIncremental(boolean isIncremental) {
-		_supportsIncremental = isIncremental;
-	}
-
-	void setFullBuild(boolean fullBuild) {
-		_supportsFullBuild = fullBuild;
-	}
-
-	void setAsync(boolean isAsync) {
-		_async = isAsync;
-	}
-
-	void setMigrationMetaData(MigrationMetaData mmd) {
-		_migrationMetaData = mmd;
-	}
-
-	void setRuleGroup(int ruleGroup) {
-		_ruleGroup = ruleGroup;
-	}
-
-	void setValidatorClass(IConfigurationElement element) {
-		_validatorClassElement = element;
-		// validator class name == validatorUniqueName
-	}
-
-	void setValidatorDisplayName(String validatorName) {
-		_validatorDisplayName = validatorName;
-	}
-
-	void setValidatorUniqueName(String validatorUniqueName) {
-		_validatorUniqueName = validatorUniqueName;
-	}
-
-	void setPluginId(String validatorPluginId) {
-		_pluginId = validatorPluginId;
-	}
-
 	public String toString() {
 		return getValidatorUniqueName();
 	}
 
-	public class MigrationMetaData {
+	public final static class MigrationMetaData {
 		private Set<String[]> _ids;
 
 		public MigrationMetaData() {
@@ -485,10 +437,6 @@
 		}
 	}
 
-	public void addDependentValidator(boolean b) {
-		_dependentValidator = b;
-	}
-
 	public boolean isDependentValidator() {
 		return _dependentValidator;
 	}
@@ -500,20 +448,12 @@
 		return _markerIds;
 	}
 
-	/**
-	 * @param markerId
-	 *            The markerId to set.
-	 */
-	public void setMarkerIds(String[] markerId) {
-		this._markerIds = markerId;
-	}
-
 	public boolean isBuildValidation() {
 		return _buildValidation;
 	}
 
 	public void setBuildValidation(boolean buildValidation) {
-		this._buildValidation = buildValidation;
+		_buildValidation = buildValidation;
 	}
 
 	public boolean isManualValidation() {
@@ -521,7 +461,7 @@
 	}
 
 	public void setManualValidation(boolean manualValidation) {
-		this._manualValidation = manualValidation;
+		_manualValidation = manualValidation;
 	}
   
 	/**
@@ -589,18 +529,10 @@
 		return _enablementExpression;
 	}
 
-   public void setEnablementElement(Expression enablementElement) {
-	 _enablementExpression = enablementElement;
-	}
-
 public String[] getContentTypeIds() {
 	return _contentTypeIds;
 }
 
-public void setContentTypeIds(String[] contentTypeIds) {
-	this._contentTypeIds = contentTypeIds;
-}
-
  
 private boolean isApplicableContentType(IContentDescription desc){
 	
@@ -614,5 +546,9 @@
 	}
 	return false;
 }
+
+public boolean isValidateByProject() {
+	return _validateByProject;
+}
    
 }
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/delegates/ValidatorDelegatesRegistry.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/delegates/ValidatorDelegatesRegistry.java
index 09bc63f..3ea034f 100644
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/delegates/ValidatorDelegatesRegistry.java
+++ b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/delegates/ValidatorDelegatesRegistry.java
@@ -12,10 +12,17 @@
 package org.eclipse.wst.validation.internal.delegates;
 
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
 
+import org.eclipse.core.runtime.preferences.DefaultScope;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.wst.validation.internal.ConfigurationConstants;
 import org.eclipse.wst.validation.internal.core.ValidationException;
+import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
 import org.eclipse.wst.validation.internal.provisional.core.IValidator;
 
 /**
@@ -40,19 +47,57 @@
    */
   public static ValidatorDelegatesRegistry getInstance() {
     if (_instance == null) {
-      _instance = new ValidatorDelegatesRegistry();
-      ValidatorDelegatesRegistryReader reader = new ValidatorDelegatesRegistryReader(_instance);
-      reader.readRegistry();
+    	ValidatorDelegatesRegistry instance = new ValidatorDelegatesRegistry();
+    	ValidatorDelegatesRegistryReader reader = new ValidatorDelegatesRegistryReader(instance);
+    	reader.readRegistry();
+    	instance.initDefaults();
+    	_instance = instance;
     }
 
     return _instance;
   }
 
   /**
+   * Determine if the product defined any default delegate validators, by setting the old
+   * DELEGATES_PREFERENCE preference in the default preference scope. If they did, we remember
+   * them, so that if we every need to return a default for the delegating validator, we can return the one
+   * that the product requested.
+   */
+  private void initDefaults() {
+	  	// This code was copied from the ValidationConfiguration#deserializeDelegates() method. The code was copied because this
+	  	// change is part of a patch and I didn't want to disturb the ValidationConfiguration class.
+	  
+		IEclipsePreferences prefs = new DefaultScope().getNode(ValidationPlugin.PLUGIN_ID);
+		String delegatePref = prefs.get("DELEGATES_PREFERENCE", null); //$NON-NLS-1$
+		if (delegatePref == null)return;
+
+		int delegatesIndex = delegatePref.indexOf(ConfigurationConstants.DELEGATE_VALIDATORS);
+		String delegates = delegatePref.substring(delegatesIndex + ConfigurationConstants.DELEGATE_VALIDATORS.length(), delegatePref.length());
+
+		if (delegates == null)return;
+
+		_defaultDelegates = new HashSet<String>(10);
+		StringTokenizer tokenizer = new StringTokenizer(delegates, ConfigurationConstants.ELEMENT_SEPARATOR);
+		while (tokenizer.hasMoreTokens()) {
+			String delegateConfiguration = tokenizer.nextToken();
+			int separatorIndex = delegateConfiguration.indexOf(ConfigurationConstants.DELEGATES_SEPARATOR);
+//			String targetID = delegateConfiguration.substring(0, separatorIndex);
+			String delegateID = delegateConfiguration.substring(separatorIndex + 1);
+			_defaultDelegates.add(delegateID);
+		}
+
+	}
+
+/**
    * The map of target validator id to Map of delegates by id.
    */
   private Map<String, Map<String,ValidatorDelegateDescriptor>> _delegatesByTarget = 
 	  new HashMap<String, Map<String,ValidatorDelegateDescriptor>>();
+  
+  /**
+   * Validator ids that have been defined by the product to be the default validators, for some of the delegating validtors.
+   */
+  private Set<String> _defaultDelegates;
 
   /**
    * Adds a descriptor to the registry.
@@ -88,12 +133,19 @@
 
     if (delegates == null)return null;
 
+    if (_defaultDelegates != null){
+    	for (ValidatorDelegateDescriptor vdd : delegates.values()){
+    		String id = vdd.getId();
+    		if (_defaultDelegates.contains(id))return id;
+    	}
+    }
+    
     // TODO: Implement a default attribute and use that to get the default?
     // What happens if two or more delegates claim to be the default one?
     // For now, just pick the first one in the list.
 
     Iterator<ValidatorDelegateDescriptor> delegatesIterator = delegates.values().iterator();
-
+    
     if (!delegatesIterator.hasNext())return null;
 
     return delegatesIterator.next().getId();
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/delegates/ValidatorDelegatesRegistryReader.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/delegates/ValidatorDelegatesRegistryReader.java
index 264e26e..c6bafe9 100644
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/delegates/ValidatorDelegatesRegistryReader.java
+++ b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/delegates/ValidatorDelegatesRegistryReader.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2006, 2007 IBM Corporation and others.
+ * Copyright (c) 2006, 2008 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
@@ -12,103 +12,109 @@
 package org.eclipse.wst.validation.internal.delegates;
 
 import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IContributor;
 import org.eclipse.core.runtime.IExtensionPoint;
 import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Platform;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.wst.validation.internal.ValMessages;
+import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
 
 /**
- * This class reads the plugin extension registry and registers each delegating
+ * This class reads the plug-in extension registry and registers each delegating
  * validator descriptor with the delegates registry.
  * 
  * @see ValidatorDelegatesRegistry
  */
-class ValidatorDelegatesRegistryReader
-{
-  /**
-   * The delegate class attribute. Must be visible in the package because it is
-   * used by other classes in the package.
-   */
-  static final String CLASS_ATTRIBUTE = "class"; //$NON-NLS-1$
+class ValidatorDelegatesRegistryReader {
+	/**
+	 * The delegate class attribute.
+	 */
+	static final String CLASS_ATTRIBUTE = "class"; //$NON-NLS-1$
 
-  /**
-   * The delegate element name.
-   */
-  private static final String DELEGATE_ELEMENT = "delegate"; //$NON-NLS-1$
+	/**
+	 * The delegate element name.
+	 */
+	private static final String DELEGATE_ELEMENT = "delegate"; //$NON-NLS-1$
 
-  /**
-   * The validator delegates extension point id.
-   */
-  private static final String EXTENSION_POINT_ID = "validatorDelegates"; //$NON-NLS-1$
+	/**
+	 * The validator delegates extension point id.
+	 */
+	private static final String EXTENSION_POINT_ID = "validatorDelegates"; //$NON-NLS-1$
 
-  /**
-   * The delegate name attribute.
-   */
-  private static final String NAME_ATTRIBUTE = "name"; //$NON-NLS-1$
+	/**
+	 * The delegate name attribute.
+	 */
+	private static final String NAME_ATTRIBUTE = "name"; //$NON-NLS-1$
 
-  /**
-   * Plugin id.
-   */
-  private static final String PLUGIN_ID = "org.eclipse.wst.validation"; //$NON-NLS-1$
+	private static final String PLUGIN_ID = "org.eclipse.wst.validation"; //$NON-NLS-1$
 
-  /**
-   * The target id attribute name.
-   */
-  private static final String TARGET_ATTRIBUTE = "target"; //$NON-NLS-1$
+	/**
+	 * The target id attribute name.
+	 */
+	private static final String TARGET_ATTRIBUTE = "target"; //$NON-NLS-1$
 
-  /**
-   * The validator registry where the descriptors being read will be placed.
-   */
-  private ValidatorDelegatesRegistry registry;
+	/**
+	 * The validator registry where the descriptors being read will be placed.
+	 */
+	private ValidatorDelegatesRegistry registry;
 
-  /**
-   * Constructor.
-   * 
-   * @param registry
-   *          the registry where the descriptors being read will be placed.
-   */
-  public ValidatorDelegatesRegistryReader(ValidatorDelegatesRegistry registry)
-  {
-    this.registry = registry;
-  }
+	/**
+	 * Constructor.
+	 * 
+	 * @param registry
+	 *            The registry where the descriptors being read will be placed.
+	 */
+	public ValidatorDelegatesRegistryReader(ValidatorDelegatesRegistry registry) {
+		this.registry = registry;
+	}
 
-  /**
-   * Reads a configuration element.
-   * 
-   * @param element
-   *          the platform configuration element being read.
-   */
-  private void readElement(IConfigurationElement element)
-  {
-    String elementName = element.getName();
+	/**
+	 * Reads a configuration element.
+	 * 
+	 * @param element
+	 *            The platform configuration element being read.
+	 */
+	private void readElement(IConfigurationElement element) {
+		String elementName = element.getName();
 
-    if (elementName.equals(DELEGATE_ELEMENT))
-    {
-      String delegateID = element.getAttribute(CLASS_ATTRIBUTE);
-      String delegateName = element.getAttribute(NAME_ATTRIBUTE);
-      String targetValidatorID = element.getAttribute(TARGET_ATTRIBUTE);
+		if (elementName.equals(DELEGATE_ELEMENT)) {
+			String delegateID = element.getAttribute(CLASS_ATTRIBUTE);
+			String delegateName = element.getAttribute(NAME_ATTRIBUTE);
+			String targetValidatorID = element.getAttribute(TARGET_ATTRIBUTE);
 
-      ValidatorDelegateDescriptor descriptor = new ValidatorDelegateDescriptor(delegateID, element, delegateName, targetValidatorID);
+			ValidatorDelegateDescriptor descriptor = new ValidatorDelegateDescriptor(
+					delegateID, element, delegateName, targetValidatorID);
 
-      registry.add(descriptor);
-    }
-  }
+			registry.add(descriptor);
+		}
+	}
 
-  /**
-   * Read from the extensions registry and parse it.
-   */
-  void readRegistry()
-  {
-    IExtensionRegistry pluginRegistry = Platform.getExtensionRegistry();
-    IExtensionPoint point = pluginRegistry.getExtensionPoint(PLUGIN_ID, EXTENSION_POINT_ID);
+	/**
+	 * Read from the extensions registry and parse it.
+	 */
+	void readRegistry() {
+		IExtensionRegistry pluginRegistry = Platform.getExtensionRegistry();
+		IExtensionPoint point = pluginRegistry.getExtensionPoint(PLUGIN_ID,
+				EXTENSION_POINT_ID);
 
-    if (point != null)
-    {
-      IConfigurationElement[] elements = point.getConfigurationElements();
-
-      for (int index = 0; index < elements.length; index++)
-      {
-        readElement(elements[index]);
-      }
-    }
-  }
+		if (point != null) {
+			IConfigurationElement[] elements = point.getConfigurationElements();
+			for (IConfigurationElement configurationElement : elements) {
+				try {
+					readElement(configurationElement);
+				} catch (Exception e) {
+					// we don't want all the validators to be rendered helpless
+					// by some
+					// rogue contribution, so, we catch any exception that
+					// occurs during
+					// initialization, log it, and continue on.
+					IContributor contributor = configurationElement.getContributor();
+					String msg = NLS.bind(ValMessages.RogueValidator, contributor);
+					ValidationPlugin.getPlugin().logMessage(IStatus.ERROR, msg);
+				}
+			}
+		}
+	}
 }
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/EnabledIncrementalValidatorsOperation.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/EnabledIncrementalValidatorsOperation.java
index df5a832..f36e48b 100644
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/EnabledIncrementalValidatorsOperation.java
+++ b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/EnabledIncrementalValidatorsOperation.java
@@ -22,6 +22,7 @@
 import org.eclipse.wst.validation.internal.InternalValidatorManager;
 import org.eclipse.wst.validation.internal.ProjectConfiguration;
 import org.eclipse.wst.validation.internal.RegistryConstants;
+import org.eclipse.wst.validation.internal.ValidatorMetaData;
 import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
 
 /**
@@ -57,7 +58,7 @@
 	 *             EnabledIncrementalValidatorsOperation(IProject, IResourceDelta, int, boolean)
 	 *             instead.
 	 */
-	public EnabledIncrementalValidatorsOperation(IProject project, Set validators, IResourceDelta delta, int ruleGroup) {
+	public EnabledIncrementalValidatorsOperation(IProject project, Set<ValidatorMetaData> validators, IResourceDelta delta, int ruleGroup) {
 		this(project, delta, ruleGroup, DEFAULT_ASYNC);
 		setEnabledValidators(validators);
 	}
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ManualValidatorsOperation.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ManualValidatorsOperation.java
index 4f22ced..03a0bf2 100644
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ManualValidatorsOperation.java
+++ b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ManualValidatorsOperation.java
@@ -20,11 +20,13 @@
  * ValidationOperation, because some initialization of the validator, and handling of error
  * conditions, is done in the operation. The initialization is separated because some of the
  * information needed to initialize the validator (i.e., the project) isn't known until runtime.
- * 
+ * <p>
  * Instances of this operation run every enabled validator (both full and incremental) on the
  * project.
- * 
+ * </p>
+ * <p>
  * This operation is not intended to be subclassed outside of the validation framework.
+ * </p>
  */
 public class ManualValidatorsOperation extends ValidatorSubsetOperation {
 
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidationBuilder.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidationBuilder.java
index 51da556..5bb1c28 100644
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidationBuilder.java
+++ b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidationBuilder.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * Copyright (c) 2001, 2009 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
@@ -12,6 +12,7 @@
 
 import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -22,15 +23,16 @@
 import org.eclipse.core.resources.IncrementalProjectBuilder;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
 import org.eclipse.wst.validation.ValidationFramework;
 import org.eclipse.wst.validation.internal.ConfigurationManager;
 import org.eclipse.wst.validation.internal.InternalValidatorManager;
 import org.eclipse.wst.validation.internal.ProjectConfiguration;
 import org.eclipse.wst.validation.internal.ResourceConstants;
 import org.eclipse.wst.validation.internal.ResourceHandler;
+import org.eclipse.wst.validation.internal.Tracing;
 import org.eclipse.wst.validation.internal.ValBuilderJob;
 import org.eclipse.wst.validation.internal.ValManager;
-import org.eclipse.wst.validation.internal.ValOperationManager;
 import org.eclipse.wst.validation.internal.ValidatorMetaData;
 import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
 
@@ -49,13 +51,22 @@
  * </p>
  */
 public class ValidationBuilder extends IncrementalProjectBuilder {
+	/*
+	 * GRK - This class serves as a main entry point into the framework. There is one instance of this class for every
+	 * project that has a validation builder configured for it. Typically if you had ten projects in your workspace you would have
+	 * ten of these objects. They are created early in the life cycle of the workbench, and then are reused. 
+	 * 
+	 * My observation was that they are run serially by the same thread.
+	 */
 	public static final int NO_DELTA_CHANGE = -1;
 	protected List<IProject> referencedProjects;
 	protected IWorkbenchContext workbenchContext = null;
 	
-	/** All the jobs that the validation framework spawns will belong to this family. */
+	/** 
+	 * All the jobs that the validation framework spawns will belong to this family. 
+	 */
 	public static final Object FAMILY_VALIDATION_JOB = new Object();
-
+	
 	public ValidationBuilder() {
 	}
 
@@ -100,8 +111,10 @@
 	}
 
 	protected void clean(IProgressMonitor monitor) throws CoreException {
-		newClean(monitor);
 		IProject currentProject = getProject();
+		Tracing.log("ValidationBuilder-02 clean ", currentProject); //$NON-NLS-1$
+
+		newClean(monitor);
 		if (currentProject == null || !currentProject.isAccessible())return;
 		try {
 			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(currentProject);
@@ -125,9 +138,15 @@
 		return referencedProjects.toArray(refProjArray);
 	}
 	
+	@SuppressWarnings("unchecked")
 	public IProject[] build(int kind, Map parameters, IProgressMonitor monitor) {
 		IResourceDelta delta = null;
 		IProject project = getProject();
+		Tracing.log("ValidationBuilder-01 build ", kind, project);  //$NON-NLS-1$
+		if (Tracing.isLogging(1)){
+			Tracing.logResourceDeltas(getDelta(project), 50);
+		}
+		
 		// GRK I wonder why this builder needs to know about all the other referenced projects?
 		// won't they have builders of their own.
 		IProject[] referenced = getAllReferencedProjects(project, null);
@@ -159,11 +178,14 @@
 				return referenced;
 			}
 			if (doFullBuild) {
+				cleanupReferencedProjectsMarkers(prjp, referenced);
 				performFullBuild(monitor, prjp);
 			} else {
 				if (delta.getAffectedChildren().length == 0) {
-					if (isReferencedProjectInDelta(referenced))
+					if (isReferencedProjectInDelta(referenced)){
+						cleanupReferencedProjectsMarkers(prjp, referenced);
 						performFullBuildForReferencedProjectChanged(monitor, prjp);
+					}
 					return referenced;
 				}
 				EnabledIncrementalValidatorsOperation operation = new EnabledIncrementalValidatorsOperation(project, delta, true);
@@ -181,6 +203,39 @@
 			referencedProjects = null;
 		}
 	}
+	
+	private void cleanupReferencedProjectsMarkers(final ProjectConfiguration prjp, IProject[] referenced){
+		//When a project references one or more project, performing a clean build on referenced
+		//causes delta to be invoked on referencee, aka, parent. This causes following code to
+		//be invoked.
+		//The following code is trying to fix a case where Ejb project references a utility project,
+		//and the clean build on utility project causes the code to come here, the ejb validator runs
+		//on the ejb  project due to performFullBuildForReferencedProjectChanged() below, but it also
+		//causes marker to be generated for the util project, but the markers for util project are not
+		//cleaned up.   
+		
+		if( referenced == null || referenced.length == 0 )return;
+		
+		try{
+			ValidatorMetaData[] enabledValidators = prjp.getEnabledFullBuildValidators(true, false);
+ 
+			Set<ValidatorMetaData>  set = new HashSet<ValidatorMetaData>();
+			set.addAll( Arrays.asList( enabledValidators ) );
+			for (IProject p : referenced) {
+				if (!p.isAccessible())continue;
+				ProjectConfiguration refProjectCfg = ConfigurationManager.getManager().getProjectConfiguration(p);
+		
+				ValidatorMetaData[] refEnabledValidators = refProjectCfg.getEnabledFullBuildValidators(true, false);
+				
+				//remove from the set the validators which are also in child
+				for(ValidatorMetaData vmd : refEnabledValidators)set.remove(vmd);
+				
+				for(ValidatorMetaData vmd : set)WorkbenchReporter.removeAllMessages(p, vmd.getValidator());		
+			}	
+		}catch (Exception exc) {
+			ValidationPlugin.getPlugin().logMessage(IStatus.ERROR, exc.toString());
+	}
+}
 
 	private boolean isReferencedProjectInDelta(IProject[] referenced) {
 		IProject p = null;
@@ -204,7 +259,7 @@
 	private void performFullBuild(IProgressMonitor monitor, ProjectConfiguration prjp, boolean onlyDependentValidators) throws InvocationTargetException {
 		ValidatorMetaData[] enabledValidators = prjp.getEnabledFullBuildValidators(true, onlyDependentValidators);
 		if ((enabledValidators != null) && (enabledValidators.length > 0)) {
-			Set enabledValidatorsSet = InternalValidatorManager.wrapInSet(enabledValidators);
+			Set<ValidatorMetaData> enabledValidatorsSet = InternalValidatorManager.wrapInSet(enabledValidators);
 			EnabledValidatorsOperation op = new EnabledValidatorsOperation(getProject(), enabledValidatorsSet, true);
 			op.run(monitor);
 		}
@@ -233,7 +288,7 @@
 				break;
 		}
 		
-		ValBuilderJob.validateProject(project, delta, kind, ValOperationManager.getDefault().getOperation());		
+		ValBuilderJob.validateProject(project, delta, kind);		
 	}
 	
 	
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidationOperation.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidationOperation.java
index 8682222..c9f7b53 100644
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidationOperation.java
+++ b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidationOperation.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * Copyright (c) 2001, 2009 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
@@ -17,6 +17,7 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Queue;
 import java.util.Set;
 
 import org.eclipse.core.resources.IFile;
@@ -62,11 +63,12 @@
 import org.eclipse.wst.validation.internal.provisional.core.IValidatorJob;
 
 /**
- * Implemented Validators methods must not be called directly by anyone other than this class, since
+ * Validators must not be called directly by anyone other than this class, since
  * some initialization of the validator is done here (via the getProject() method). The
  * initialization is separated because the IProject isn't known until runtime.
  * <p>
  * This operation is not intended to be subclassed outside of the validation framework.
+ * </p>
  */
 public abstract class ValidationOperation implements IWorkspaceRunnable, IHeadlessRunnableWithProgress {
 	// Since IResourceConstants don't have a "no delta" flag, let this constant be the flag.
@@ -79,21 +81,49 @@
 	
 	protected static final boolean DEFAULT_FORCE = true;
 	
-	class ValidationLauncherJob extends Job {
-	    private Job validationJob;
-	    public ValidationLauncherJob(Job validationJob) {
+	private static ValidationLauncherJob launcherJob = new ValidationLauncherJob();
+	
+	private static final int jobsPerProcessor = 3;
+	
+	private final static class ValidationLauncherJob extends Job {
+	    private Queue<Job> _validationJobs = new LinkedList<Job>();
+	    
+	    public ValidationLauncherJob() {
             super(ResourceHandler.getExternalizedMessage(ResourceConstants.VBF_VALIDATION_JOB_MSG));
-            
             setSystem(true);
             setRule(ResourcesPlugin.getWorkspace().getRoot());
-            this.validationJob= validationJob;
 	    }
 	    
 	    protected IStatus run(IProgressMonitor monitor) {
-    		validationJob.schedule();
+			int processors = Runtime.getRuntime().availableProcessors();
+			int totalInitialJobs = processors * jobsPerProcessor;
+    		synchronized (_validationJobs) {
+    			// never schedule more than 3 validation jobs per processor at a time
+    			for (int i=0; i< totalInitialJobs; i++) {
+    				Job validationJob = _validationJobs.poll();
+    				if (validationJob == null) break;
+    				addJobChangeAdapter(validationJob);
+    				validationJob.schedule();
+    			}
+    		}
             return Status.OK_STATUS;
 	    }
 	    
+	    private void addJobChangeAdapter(Job job) {
+	    	job.addJobChangeListener(new JobChangeAdapter(){
+	    		// when done, see if there is another validation job to schedule
+				public void done(IJobChangeEvent event) {
+					synchronized (_validationJobs) {
+						Job validationJob = _validationJobs.poll();
+						if (validationJob != null) {
+							addJobChangeAdapter(validationJob);
+							validationJob.schedule();
+						}
+					}
+				}
+			});
+	    }
+	    
 	    @Override
 	    public boolean belongsTo(Object family) {
 			if (family == ResourcesPlugin.FAMILY_MANUAL_BUILD)return true;
@@ -102,6 +132,16 @@
 			}
 			return super.belongsTo(family);
 	    }
+	    
+	    public void addValidationJob(Job validationJob) {
+	    	synchronized (_validationJobs) {
+	    		_validationJobs.add(validationJob);
+	    		// schedule the job if we were empty
+	    		if (_validationJobs.size() == 1) {
+	    			this.schedule();
+	    		}
+	    	}
+	    }
 	}
 	
 	/**
@@ -879,10 +919,7 @@
 	}
 
 	private void releaseCachedMaps() {
-		if (ValidationRegistryReader.getReader().projectValidationMetaData != null) {
-			ValidationRegistryReader.getReader().projectValidationMetaData.clear();
-			ValidationRegistryReader.getReader().projectValidationMetaData = null;
-		}
+		ValidationRegistryReader.getReader().clearCachedMaps();
 		IProjectValidationHelper helper = ValidationHelperRegistryReader.getInstance().getValidationHelper();
 		if (helper != null)
 			helper.disposeInstance();
@@ -1074,15 +1111,22 @@
 	 * <code>process</code> also sends output to the <code>IProgressMonitor</code>, and calls
 	 * the current Validator to validate the resource.
 	 * 
-	 * To process a resource, there are several steps: 1. check if the resource is registered for
+	 * <p>To process a resource, there are several steps:</p> 
+	 * <p>1. check if the resource is registered for
 	 * this validator (i.e., the validator has either specified it in a filter, or has not filtered
-	 * it out explicitly) 2. call <code>isValidationSource</code> on the current validator with
+	 * it out explicitly)</p>
+	 * 
+	 * <p>2. call <code>isValidationSource</code> on the current validator with
 	 * the current resource. This method performs further filtering by the Validator itself, in
 	 * addition to the static filtering done by the framework, based on the information in
-	 * plugin.xml. 3. If the resource passes both filters, call <code>validate</code> on the
-	 * validator, with the resource. 4. When complete (either by failing to pass a filter, or by the
+	 * plugin.xml.</p> 
+	 * 
+	 * <p>3. If the resource passes both filters, call <code>validate</code> on the
+	 * validator, with the resource.</p> 
+	 * 
+	 * <p>4. When complete (either by failing to pass a filter, or by the
 	 * completion of the <code>validate</code>), increment the IProgressMonitor's status by one
-	 * (i.e., one resource has been processed.)
+	 * (i.e., one resource has been processed.)</p>
 	 */
 	private final void launchValidator(WorkbenchReporter reporter, IValidator validator, ValidatorMetaData vmd, IWorkbenchContext helper, IFileDelta[] delta) {
 		if (reporter == null)return;
@@ -1227,12 +1271,17 @@
 	 * (hProject.getName().indexOf("fork") > -1)) { Thread.dumpStack(); } System.err.println(prefix +
 	 * "End ValidationOperation"); }
 	 */
+	
+	/**
+	 * @deprecated This class is no longer used by the framework.
+	 */
 	public class ProjectRunnable implements Runnable {
 		private WorkbenchReporter _reporter;
 		private IValidator _validator;
 		private ValidatorMetaData _vmd;
 		private IFileDelta[] _delta;
 
+		@SuppressWarnings("unchecked")
 		public ProjectRunnable(WorkbenchReporter reporter, IValidator validator, 
 			ValidatorMetaData vmd, IWorkbenchContext helper, IFileDelta[] delta, Iterator iterator) {
 			_reporter = reporter;
@@ -1405,9 +1454,7 @@
 			}
 		);
 		validatorjob.setPriority(Job.DECORATE);
-
-		ValidationLauncherJob validationLauncherJob = new ValidationLauncherJob(validatorjob);
-		validationLauncherJob.schedule();
+		launcherJob.addValidationJob(validatorjob);
 	}
 		
 }
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidatorManager.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidatorManager.java
index 86bbbf3..553538b 100644
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidatorManager.java
+++ b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/operations/ValidatorManager.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * Copyright (c) 2001, 2009 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
@@ -16,7 +16,6 @@
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -52,12 +51,11 @@
 	private static IResourceUtil _resourceUtil; // a common utility, different whether or not
 	// WSAD is running in headless or UI mode, which can retrieve the line number of some MOF objects.
 	private static final Class RESOURCEUTIL_DEFAULTCLASS = org.eclipse.wst.validation.internal.operations.DefaultResourceUtil.class;
-	private static Class _resourceUtilClass = RESOURCEUTIL_DEFAULTCLASS;
-		
-	// an empty set, provided for convenience, so that we only construct one empty set once.
-	private static final Set<ValidatorMetaData> EMPTY_SET = new HashSet<ValidatorMetaData>();
-	
+	private static Class _resourceUtilClass = RESOURCEUTIL_DEFAULTCLASS;		
 	private static Class 	_messageLimitOwner;
+	
+	private static final Set<ValidatorMetaData> EmptySet = Collections.emptySet();
+		
 	private String[] 		_internalOwners;
 	private Map<IValidatorJob, List<MessageInfo>> _validatorMsgs = 
 		Collections.synchronizedMap( new HashMap<IValidatorJob, List<MessageInfo>>() );	
@@ -75,7 +73,7 @@
 	 */
 	public void disableAllValidators(IProject currentProject, IProgressMonitor monitor) {
 		// Disable the individual validators
-		setEnabledValidators(currentProject, EMPTY_SET, monitor);
+		setEnabledValidators(currentProject, EmptySet, monitor);
 	}
 
 	public void enableValidator(String validatorId) {
@@ -121,15 +119,10 @@
 		try {
 			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
 			prjp.setDoesProjectOverride(true);
-			ValidatorMetaData vmd = ValidationRegistryReader.getReader()
-					.getValidatorMetaData(validatorId);
+			ValidatorMetaData vmd = ValidationRegistryReader.getReader().getValidatorMetaData(validatorId);
 			
-			if(manualValidation){
-				prjp.disableSingleManualValidator(vmd);
-			} 
-			if (buildValidation){
-				prjp.disableSingleBuildValidator(vmd);
-			}
+			if(manualValidation)prjp.disableSingleManualValidator(vmd);
+			if (buildValidation)prjp.disableSingleBuildValidator(vmd);
 			prjp.store();
 			
 		} catch (InvocationTargetException e) {
@@ -262,14 +255,14 @@
 	 * Return a collection of incremental ValidatorMetaData configured on a certain type of IProject
 	 * (e.g. EJB Project vs. Web Project).
 	 */
-	public Set getProjectConfiguredIncrementalValidators(IProject project) {
+	public Set<ValidatorMetaData> getProjectConfiguredIncrementalValidators(IProject project) {
 		try {
 			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
 			return InternalValidatorManager.wrapInSet(prjp.getIncrementalValidators());
 		} catch (InvocationTargetException e) {
 			ValidationPlugin.getPlugin().handleException(e);
 			ValidationPlugin.getPlugin().handleException(e.getTargetException());
-			return Collections.EMPTY_SET;
+			return EmptySet;
 		}
 	}
 
@@ -281,14 +274,14 @@
 	 * 
 	 * If the collection has not been calculated before, calculate it now, and cache the result.
 	 */
-	public Set getProjectConfiguredValidatorMetaData(IProject project) {
+	public Set<ValidatorMetaData> getProjectConfiguredValidatorMetaData(IProject project) {
 		try {
 			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
 			return InternalValidatorManager.wrapInSet(prjp.getValidators());
 		} catch (InvocationTargetException e) {
 			ValidationPlugin.getPlugin().handleException(e);
 			ValidationPlugin.getPlugin().handleException(e.getTargetException());
-			return Collections.EMPTY_SET;
+			return EmptySet;
 		}
 	}
 
@@ -301,14 +294,14 @@
 	 * true, return incremental validators. If the parameter is false, return nonincremental
 	 * validators.
 	 */
-	public Set getProjectEnabledIncrementalValidators(IProject project) {
+	public Set<ValidatorMetaData> getProjectEnabledIncrementalValidators(IProject project) {
 		try {
 			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
 			return InternalValidatorManager.wrapInSet(prjp.getEnabledIncrementalValidators(true));
 		} catch (InvocationTargetException e) {
 			ValidationPlugin.getPlugin().handleException(e);
 			ValidationPlugin.getPlugin().handleException(e.getTargetException());
-			return Collections.EMPTY_SET;
+			return EmptySet;
 		}
 	}
 
@@ -321,14 +314,14 @@
 	 * true, return incremental validators. If the parameter is false, return nonincremental
 	 * validators.
 	 */
-	public Collection getProjectEnabledNonIncrementalValidators(IProject project) {
+	public Collection<ValidatorMetaData> getProjectEnabledNonIncrementalValidators(IProject project) {
 		try {
 			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
 			return InternalValidatorManager.wrapInSet(prjp.getEnabledIncrementalValidators(false));
 		} catch (InvocationTargetException e) {
 			ValidationPlugin.getPlugin().handleException(e);
 			ValidationPlugin.getPlugin().handleException(e.getTargetException());
-			return Collections.EMPTY_SET;
+			return EmptySet;
 		}
 	}
 
@@ -339,7 +332,7 @@
 	 * and who are also enabled by this project. If the list of enabled validators hasn't been
 	 * loaded into the cache, load it now. Otherwise, just return it.
 	 */
-	public Set getProjectEnabledValidators(IProject project) {
+	public Set<ValidatorMetaData> getProjectEnabledValidators(IProject project) {
 		return getEnabledValidators(project);
 	}
 
@@ -405,16 +398,12 @@
 	/**
 	 * @deprecated For use by the validation framework only.
 	 */
-	public Set<ValidatorMetaData> getIncrementalValidators(Collection vmds) {
+	public Set<ValidatorMetaData> getIncrementalValidators(Collection<ValidatorMetaData> vmds) {
 		if (vmds == null)return new HashSet<ValidatorMetaData>();
 
 		Set<ValidatorMetaData> result = new HashSet<ValidatorMetaData>();
-		Iterator iterator = vmds.iterator();
-		while (iterator.hasNext()) {
-			ValidatorMetaData vmd = (ValidatorMetaData) iterator.next();
-			if (vmd.isIncremental()) {
-				result.add(vmd);
-			}
+		for (ValidatorMetaData vmd : vmds) {
+			if (vmd.isIncremental())result.add(vmd);
 		}
 		return result;
 	}
@@ -525,7 +514,7 @@
 	/**
 	 * @deprecated For use by the validation framework only.
 	 */
-	public Set getEnabledIncrementalValidators(IProject project) {
+	public Set<ValidatorMetaData> getEnabledIncrementalValidators(IProject project) {
 		try {
 			ProjectConfiguration prjp = ConfigurationManager.getManager().getProjectConfiguration(project);
 			ValidatorMetaData[] vmds = prjp.getEnabledIncrementalValidators(true);
@@ -533,7 +522,7 @@
 		} catch (InvocationTargetException e) {
 			ValidationPlugin.getPlugin().handleException(e);
 			ValidationPlugin.getPlugin().handleException(e.getTargetException());
-			return Collections.EMPTY_SET;
+			return EmptySet;
 		}
 	}
 
@@ -590,14 +579,14 @@
 		} catch (InvocationTargetException e) {
 			ValidationPlugin.getPlugin().handleException(e);
 			ValidationPlugin.getPlugin().handleException(e.getTargetException());
-			return Collections.EMPTY_SET;
+			return EmptySet;
 		}
 	}
 
 	private ValidatorMetaData[] getStateOfProjectLevelValidatorsFromGlobal(ProjectConfiguration prjp) throws InvocationTargetException {
 		List<ValidatorMetaData> enabledGlobalValidatorsForProject = new ArrayList<ValidatorMetaData>();
 		GlobalConfiguration gf = ConfigurationManager.getManager().getGlobalConfiguration();
-		List allProjectValidator = getAllValidatorUniqueNames(prjp.getValidators());
+		List<String> allProjectValidator = getAllValidatorUniqueNames(prjp.getValidators());
 		for(ValidatorMetaData vmd : gf.getBuildEnabledValidators()) {
 			if(allProjectValidator.contains(vmd.getValidatorUniqueName())) {
 				enabledGlobalValidatorsForProject.add(vmd);
@@ -624,7 +613,7 @@
 		} catch (InvocationTargetException e) {
 			ValidationPlugin.getPlugin().handleException(e);
 			ValidationPlugin.getPlugin().handleException(e.getTargetException());
-			return Collections.EMPTY_SET;
+			return EmptySet;
 		}
 	}	
 	
@@ -636,7 +625,7 @@
 		} catch (InvocationTargetException e) {
 			ValidationPlugin.getPlugin().handleException(e);
 			ValidationPlugin.getPlugin().handleException(e.getTargetException());
-			return Collections.EMPTY_SET;
+			return EmptySet;
 		}
 	}	
 	
diff --git a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/plugin/ValidationPlugin.java b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/plugin/ValidationPlugin.java
index 7adcc49..4713fd2 100644
--- a/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/plugin/ValidationPlugin.java
+++ b/plugins/org.eclipse.wst.validation/validate/org/eclipse/wst/validation/internal/plugin/ValidationPlugin.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2001, 2008 IBM Corporation and others.
+ * Copyright (c) 2001, 2010 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
@@ -10,20 +10,23 @@
  *******************************************************************************/
 package org.eclipse.wst.validation.internal.plugin;
 
+import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResourceChangeEvent;
 import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ProjectScope;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Plugin;
 import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.core.runtime.preferences.IScopeContext;
 import org.eclipse.wst.validation.ValidationFramework;
 import org.eclipse.wst.validation.internal.DependencyIndex;
 import org.eclipse.wst.validation.internal.EventManager;
 import org.eclipse.wst.validation.internal.ProjectUnavailableError;
 import org.eclipse.wst.validation.internal.ResourceUnavailableError;
 import org.eclipse.wst.validation.internal.Tracing;
-import org.eclipse.wst.validation.internal.ValOperationManager;
 import org.eclipse.wst.validation.internal.core.Message;
 import org.eclipse.wst.validation.internal.provisional.core.IMessage;
 import org.osgi.framework.Bundle;
@@ -100,15 +103,16 @@
 		DependencyIndex di = (DependencyIndex)ValidationFramework.getDefault().getDependencyIndex();
 		IWorkspace ws = ResourcesPlugin.getWorkspace();
 		ws.addSaveParticipant(this, di);
-		ws.addResourceChangeListener(ValOperationManager.getDefault(), 
-			IResourceChangeEvent.POST_BUILD | IResourceChangeEvent.PRE_BUILD);
+//		ws.addResourceChangeListener(ValOperationManager.getDefault(), 
+//			IResourceChangeEvent.POST_BUILD | IResourceChangeEvent.PRE_BUILD);
 
 	}
 
 	public void stop(BundleContext context) throws Exception {
 		super.stop(context);
 		ResourcesPlugin.getWorkspace().removeResourceChangeListener( EventManager.getManager() );		
-		ResourcesPlugin.getWorkspace().removeResourceChangeListener( ValOperationManager.getDefault() );		
+		ValidationFramework.getDefault().join(null);
+//		ResourcesPlugin.getWorkspace().removeResourceChangeListener( ValOperationManager.getDefault() );		
 		EventManager.getManager().shutdown();
 	}
 
@@ -121,6 +125,11 @@
 		return PLUGIN_ID;
 	}
 	
+	public static IEclipsePreferences getPreferences(IProject project){
+		IScopeContext projectContext = new ProjectScope(project);
+		return projectContext.getNode(PLUGIN_ID);
+	}
+	
 	/**
 	 * Write this exception to the log.
 	 * <p>
@@ -130,8 +139,21 @@
 	 * @param e the throwable, this can be null in which case it is a nop.
 	 */
 	public void handleException(Throwable e){
+		handleException(e, IStatus.ERROR);
+	}
+	
+	/**
+	 * Write this exception to the log.
+	 * <p>
+	 * We are in the transition of moving to a new approach for localized messages. This is the new 
+	 * approach for exceptions.
+	 * 
+	 * @param e the throwable, this can be null in which case it is a nop.
+	 * @param severity the severity of the message. This must be one of the IStatus severities. 
+	 */
+	public void handleException(Throwable e, int severity){
 		if (e == null)return;
-		Status status = new Status(IStatus.ERROR, PLUGIN_ID, e.getLocalizedMessage(), e);
+		Status status = new Status(severity, PLUGIN_ID, e.getLocalizedMessage(), e);
 		getLog().log(status);
 	}
 	
diff --git a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/ValidatorLauncher.java b/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/ValidatorLauncher.java
index f053410..40ca89c 100644
--- a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/ValidatorLauncher.java
+++ b/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/core/ValidatorLauncher.java
@@ -10,7 +10,6 @@
  *******************************************************************************/
 package org.eclipse.wst.validation.internal.core;
 
-import java.util.Iterator;
 import java.util.List;
 
 import org.eclipse.core.runtime.CoreException;
@@ -83,13 +82,11 @@
 			//the  validators who have implemented IValidatorJob but are running synchronously
 			//would log messages now ...
 			ValidatorManager mgr = ValidatorManager.getManager();
-			final List list = mgr.getMessages((IValidatorJob)validator);
+			final List<MessageInfo> list = mgr.getMessages((IValidatorJob)validator);
 
-	    	Iterator it = list.iterator();
-			while( it.hasNext() ){
-				MessageInfo info = (MessageInfo)it.next();
+			for(MessageInfo info : list){
 				try {
-				TaskListUtility.addTask( info.getMessageOwnerId(), info.getResource(),
+					TaskListUtility.addTask( info.getMessageOwnerId(), info.getResource(),
 							info.getLocation(), info.getMsg().getId(), info.getText(),
 							info.getMsg().getSeverity(), info.getMarkerId(), 
 							info.getTargetObjectName(),
diff --git a/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/provisional/core/IValidatorExtender.java b/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/provisional/core/IValidatorExtender.java
new file mode 100644
index 0000000..581a6b0
--- /dev/null
+++ b/plugins/org.eclipse.wst.validation/validate_core/org/eclipse/wst/validation/internal/provisional/core/IValidatorExtender.java
@@ -0,0 +1,11 @@
+package org.eclipse.wst.validation.internal.provisional.core;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.wst.validation.ValidationState;
+
+public interface IValidatorExtender {
+
+	void validationFinishing(IProject project, ValidationState state, IProgressMonitor monitor);
+
+}
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/AbstractValidator.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/AbstractValidator.java
index 3d884d9..83c1d55 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/AbstractValidator.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/AbstractValidator.java
@@ -32,8 +32,10 @@
 	
 	/**
 	 * Validate the resource. The validator is called from a WorkspaceJob, so
-	 * the validator itself does not need to establish it's own
-	 * IWorkspaceRunnable.
+	 * the validator itself does not need to establish it's own IWorkspaceRunnable.
+	 * <p>
+	 * If you override this method then you should not override the other validate method.
+	 * </p>
 	 * 
 	 * @param resource
 	 * 		The resource to be validated.
@@ -56,7 +58,43 @@
 	 * 
 	 * @return the result of the validation. This may be, but usually isn't, null.
 	 */
-	public abstract ValidationResult validate(IResource resource, int kind, ValidationState state, IProgressMonitor monitor);
+	public ValidationResult validate(IResource resource, int kind, ValidationState state, IProgressMonitor monitor){
+		return null;
+	}
+	
+	/**
+	 * Validate the resource. The validator is called from a WorkspaceJob, so
+	 * the validator itself does not need to establish it's own
+	 * IWorkspaceRunnable.
+	 * <p>
+	 * If you override this method then you should not override the other
+	 * validate method.
+	 * </p>
+	 * 
+	 * @param event
+	 *            An object that describes the resource to be validated and why
+	 *            it should be validated.
+	 * 
+	 * @param state
+	 *            A way to pass arbitrary, validator specific, data from one
+	 *            invocation of a validator to the next, during the validation
+	 *            phase. At the end of the validation phase, this object will be
+	 *            cleared, thereby allowing any of this state information to be
+	 *            garbaged collected.
+	 * 
+	 * @param monitor
+	 *            A monitor that you can use to report your progress. To be a
+	 *            well behaved validator you need to check the isCancelled()
+	 *            method at appropriate times.
+	 * 
+	 * @return the result of the validation. Null should never be returned. If
+	 *         null is returned then the other validate method will be called as
+	 *         well.
+	 */
+	public ValidationResult validate(ValidationEvent event, ValidationState state, IProgressMonitor monitor){
+		return null;
+	}
+	
 	
 	/**
 	 * A call back method that lets the validator know that the project is being
@@ -122,6 +160,23 @@
 	 */
 	public void validationFinishing(IProject project, ValidationState state, IProgressMonitor monitor){		
 	}
+	
+	/**
+	 * Should the validation framework first clear the markers that this
+	 * validator has placed on this resource? This method can be overridden by
+	 * validator implementors to provide a validator specific behavior.
+	 * 
+	 * @param event
+	 *            The validation event that triggered the validation.
+	 * @return true if the validation framework should first clear all the
+	 *         markers that this validator produced. This is the default
+	 *         behavior. Return false to leave the markers unchanged. It then
+	 *         becomes the responsibility of the validator to manage it's own
+	 *         markers for this resource, for this validation event.
+	 */
+	public boolean shouldClearMarkers(ValidationEvent event){
+		return true;
+	}
 		
 	/**
 	 * Answer the validator that you belong to. The validator controls the
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/Friend.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/Friend.java
index 54f84d7..4146636 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/Friend.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/Friend.java
@@ -47,8 +47,11 @@
 	public static boolean shouldValidate(Validator validator, IResource resource, ValType valType, 
 		ContentTypeWrapper contentTypeWrapper){
 		
-		return validator.shouldValidate(resource, valType, contentTypeWrapper);
-		
+		return validator.shouldValidate(resource, valType, contentTypeWrapper);		
+	}
+	
+	public static void setMigrated(Validator validator, boolean migrated){
+		validator.setMigrated(migrated);
 	}
 
 }
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/IMutableValidator.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/IMutableValidator.java
new file mode 100644
index 0000000..bbb6627
--- /dev/null
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/IMutableValidator.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.validation;
+
+/**
+ * A validator that has fields that can be updated.
+ * <p>
+ * The following procedure is used to change a Validator's settings.
+ * <ol>
+ * <li>An IMutableValidator is retrieved.</li>
+ * <li>The IMutableValidator is changed.</li>
+ * <li>The IMutableValidator is "activated".</li>
+ * </ol>
+ * </p>
+ * <p>The methods {@link ValidationFramework#getProjectSettings(org.eclipse.core.resources.IProject)} and 
+ * {@link ValidationFramework#getWorkspaceSettings()} can be used to retrieve IMutableValidator's.
+ * <p>
+ * <b>Provisional API:</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>
+ * @noextend This interface is not intended to be extended by clients.
+ * @noimplement This interface is not intended to be implemented by clients.
+
+ * @author karasiuk
+ *
+ */
+public interface IMutableValidator {
+	
+	/**
+	 * Answer the validator's id.
+	 * @return
+	 */
+	String getId();
+	
+	/**
+	 * Answer the validator's name.
+	 * @return
+	 */
+	String getName();
+	
+	/**
+	 * Answer the validator's class name.
+	 * @return
+	 */
+	String getValidatorClassname();
+	
+	/**
+	 * Answer if the validator is enabled for build based validation.
+	 */
+	boolean isBuildValidation();
+	
+	/**
+	 * Answer if the validator is enabled for manual based validation.
+	 */
+	boolean isManualValidation();
+	
+	/**
+	 * Set whether the validator should be enabled for build based validation.
+	 */
+	void setBuildValidation(boolean build);
+	
+	/**
+	 * Set whether the validator should be enabled for manual based validation.
+	 */	
+	void setManualValidation(boolean manual);
+
+}
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/IPerformanceMonitor.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/IPerformanceMonitor.java
index fe7c15b..b951270 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/IPerformanceMonitor.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/IPerformanceMonitor.java
@@ -20,7 +20,8 @@
  * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken 
  * (repeatedly) as the API evolves.
  * </p>
- * @noimplement
+ * @noextend This interface is not intended to be extended by clients.
+ * @noimplement This interface is not intended to be implemented by clients.
  * @author karasiuk
  *
  */
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/MutableProjectSettings.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/MutableProjectSettings.java
new file mode 100644
index 0000000..73bf21c
--- /dev/null
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/MutableProjectSettings.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.validation;
+
+import org.eclipse.core.resources.IProject;
+
+/**
+ * This class holds the overall project validation settings.
+ * <p>
+ * The following procedure is used to change a project's Validation settings.
+ * <ol>
+ * <li>The MutableProjectSettings are retrieved.</li>
+ * <li>The MutableProjectSettings are changed.</li>
+ * <li>The MutableProjectSettings are "applied".</li>
+ * </ol>
+ * </p>
+ * <p>In order for a project's validation setting to be effective, both 
+ * {@link #getOverride()} and {@link MutableWorkspaceSettings#getOverride()}
+ * must be true.
+ * </p>
+ * <p>
+ * These settings can be retrieved with {@link ValidationFramework#getProjectSettings(IProject)}.
+ * </p>
+ * <p>
+ * <b>Provisional API:</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>
+
+ * @author karasiuk
+ *
+ */
+public final class MutableProjectSettings {
+	private final IProject	_project;
+
+	private boolean _override;
+	private boolean	_suspend;
+	private final IMutableValidator[] _validators;
+	
+	public IMutableValidator[] getValidators() {
+		return _validators;
+	}
+
+	public MutableProjectSettings(IProject project, IMutableValidator[] validators){
+		_project = project;
+		_validators = validators;
+	}
+
+	/**
+	 * Can this project override the workspace level validation settings?
+	 */
+	public boolean getOverride() {
+		return _override;
+	}
+
+	/**
+	 * Change whether this project can override workspace level validation settings.
+	 * @param override Set to true if the project is allowed to override workspace level validation settings.
+	 */
+	public void setOverride(boolean override) {
+		_override = override;
+	}
+
+	/**
+	 * Is validation suspended for this project?
+	 */
+	public boolean getSuspend() {
+		return _suspend;
+	}
+
+	/**
+	 * Change whether this project is suspending it's validation.
+	 * @param suspend Set to true, to suspend validation for this project.
+	 */
+	public void setSuspend(boolean suspend) {
+		_suspend = suspend;
+	}
+
+	/**
+	 * Answer the project that these settings are for.
+	 */
+	public IProject getProject() {
+		return _project;
+	}
+
+
+}
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/MutableWorkspaceSettings.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/MutableWorkspaceSettings.java
new file mode 100644
index 0000000..80d18f1
--- /dev/null
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/MutableWorkspaceSettings.java
@@ -0,0 +1,96 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.validation;
+
+import org.eclipse.wst.validation.internal.model.GlobalPreferencesValues;
+
+
+/**
+ * This class holds the overall workspace validation settings.
+ * <p>
+ * The following procedure is used to change a project's Validation settings.
+ * <ol>
+ * <li>The MutableWorkspaceSettings are retrieved.</li>
+ * <li>The MutableWorkspaceSettings are changed.</li>
+ * <li>The MutableWorkspaceSettings are "applied".</li>
+ * </ol>
+ * </p>
+ * <p>
+ * These settings can be retrieved with {@link ValidationFramework#getWorkspaceSettings()}.
+ * </p>
+ * <p>
+ * <b>Provisional API:</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>
+
+ * @author karasiuk
+ *
+ */
+public final class MutableWorkspaceSettings {
+
+	private final GlobalPreferencesValues _values;
+	
+	private final IMutableValidator[] _validators;
+	
+	public IMutableValidator[] getValidators() {
+		return _validators;
+	}
+
+	public MutableWorkspaceSettings(IMutableValidator[] validators, GlobalPreferencesValues values){
+		_validators = validators;
+		_values = values;
+	}
+	
+	public GlobalPreferencesValues getGlobalPreferencesValues(){
+		return _values;
+	}
+	
+	public boolean getAutoSave() {
+		return _values.saveAutomatically;
+	}
+
+	public void setAutoSave(boolean autoSave) {
+		_values.saveAutomatically = autoSave;
+	}
+
+	/**
+	 * Can this project override the workspace level validation settings?
+	 */
+	public boolean getOverride() {
+		return _values.override;
+	}
+
+	/**
+	 * Change whether this project can override workspace level validation settings.
+	 * @param override Set to true if the project is allowed to override workspace level validation settings.
+	 */
+	public void setOverride(boolean override) {
+		_values.override = override;
+	}
+
+	/**
+	 * Is validation suspended for this project?
+	 */
+	public boolean getSuspend() {
+		return _values.disableAllValidation;
+	}
+
+	/**
+	 * Change whether this project is suspending it's validation.
+	 * @param suspend Set to true, to suspend validation for this project.
+	 */
+	public void setSuspend(boolean suspend) {
+		_values.disableAllValidation = suspend;
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/ValidationEvent.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/ValidationEvent.java
new file mode 100644
index 0000000..528e58e
--- /dev/null
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/ValidationEvent.java
@@ -0,0 +1,75 @@
+/*******************************************************************************
+ * Copyright (c) 2008 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.validation;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceDelta;
+
+/**
+ * An object that describes which object should be validated and what triggered its validation.
+ * <p>
+ * <b>Provisional API:</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>
+ * @author karasiuk
+ *
+ */
+
+public final class ValidationEvent {
+	
+	private IResource 		_resource;
+	private int				_kind;
+	private IResourceDelta 	_dependsOn;
+	
+	/**
+	 * Create an object that describes what should be validated.
+	 * 
+	 * @param resource
+	 *            The resource to be validated.
+	 * @param kind
+	 *            The way the resource changed. It uses the same values as the
+	 *            kind parameter in IResourceDelta.
+	 * @param dependsOn
+	 *            If the resource is being validated because one of it's
+	 *            dependencies has changed, that change is described here. This
+	 *            can be null.
+	 */
+	public ValidationEvent(IResource resource, int kind, IResourceDelta dependsOn){
+		_resource = resource;
+		_kind = kind;
+		_dependsOn = dependsOn;
+	}
+
+	/**
+	 * The resource to be validated.
+	 */
+	public IResource getResource() {
+		return _resource;
+	}
+
+	/**
+	 * The way the resource changed. It uses the same values as the kind
+	 * parameter in IResourceDelta.
+	 */
+	public int getKind() {
+		return _kind;
+	}
+
+	/**
+	 * If the resource is being validated because one of it's dependencies has changed, that change is described here.
+	 * This method will return null when the trigger is not because of a dependency change.
+	 */
+	public IResourceDelta getDependsOn() {
+		return _dependsOn;
+	}
+}
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/ValidationFramework.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/ValidationFramework.java
index fe62b40..17cc455 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/ValidationFramework.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/ValidationFramework.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
+ * Copyright (c) 2007, 2009 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
@@ -10,6 +10,7 @@
  *******************************************************************************/
 package org.eclipse.wst.validation;
 
+import java.lang.reflect.InvocationTargetException;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -18,6 +19,7 @@
 import java.util.Map;
 import java.util.Set;
 
+import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IResourceVisitor;
@@ -29,19 +31,32 @@
 import org.eclipse.core.runtime.jobs.Job;
 import org.eclipse.core.runtime.preferences.IEclipsePreferences;
 import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.wst.validation.Validator.V1;
+import org.eclipse.wst.validation.internal.ConfigurationManager;
 import org.eclipse.wst.validation.internal.ContentTypeWrapper;
 import org.eclipse.wst.validation.internal.DebugConstants;
 import org.eclipse.wst.validation.internal.DependencyIndex;
 import org.eclipse.wst.validation.internal.DisabledResourceManager;
 import org.eclipse.wst.validation.internal.DisabledValidatorManager;
+import org.eclipse.wst.validation.internal.GlobalConfiguration;
 import org.eclipse.wst.validation.internal.MarkerManager;
 import org.eclipse.wst.validation.internal.Misc;
 import org.eclipse.wst.validation.internal.PerformanceMonitor;
+import org.eclipse.wst.validation.internal.ProjectUnavailableError;
 import org.eclipse.wst.validation.internal.ValManager;
 import org.eclipse.wst.validation.internal.ValOperation;
+import org.eclipse.wst.validation.internal.ValPrefManagerGlobal;
+import org.eclipse.wst.validation.internal.ValPrefManagerProject;
 import org.eclipse.wst.validation.internal.ValType;
 import org.eclipse.wst.validation.internal.ValidationRunner;
+import org.eclipse.wst.validation.internal.ValidatorMetaData;
+import org.eclipse.wst.validation.internal.ValidatorMutable;
+import org.eclipse.wst.validation.internal.ValManager.UseProjectPreferences;
+import org.eclipse.wst.validation.internal.model.GlobalPreferences;
+import org.eclipse.wst.validation.internal.model.GlobalPreferencesValues;
+import org.eclipse.wst.validation.internal.model.ProjectPreferences;
 import org.eclipse.wst.validation.internal.operations.ValidationBuilder;
+import org.eclipse.wst.validation.internal.operations.ValidatorManager;
 import org.eclipse.wst.validation.internal.operations.WorkbenchReporter;
 import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
 import org.eclipse.wst.validation.internal.provisional.core.IReporter;
@@ -62,25 +77,33 @@
  */
 public final class ValidationFramework {
 	
-	private IDependencyIndex 			_dependencyIndex;
+	private volatile IDependencyIndex 	_dependencyIndex;
 	private IPerformanceMonitor			_performanceMonitor;
 	
 	private Set<IProject> 				_suspendedProjects;
 	private boolean 					_suspendAllValidation;
 
-	private static ValidationFramework 	_me;
-	
 	/** 
 	 * Answer the singleton, default instance of this class.
 	 */
 	public static ValidationFramework getDefault(){
-		if (_me == null)_me = new ValidationFramework();
-		return _me;
+		return Singleton.vf;
 	}
 	
 	private ValidationFramework(){}
 	
 	/**
+	 * Add the validation builder to the project, so that the project can support
+	 * build time validation. It is safe to call this method, if the builder was
+	 * previously added to the project. It will not be added more than once.
+	 * 
+	 * @param project The project that the builder is added to.
+	 */
+	public void addValidationBuilder(IProject project){
+		ValidatorManager.addProjectBuildValidationSupport(project);
+	}
+	
+	/**
 	 * Clear any validation markers that may have been set by this validator.
 	 * 
 	 * @param resource
@@ -131,15 +154,15 @@
 	 * other resources.
 	 */
 	public IDependencyIndex getDependencyIndex(){
-		if (_dependencyIndex != null)return _dependencyIndex;
-		return getDependencyIndex2();
-	}
-
-	private synchronized IDependencyIndex getDependencyIndex2() {
-		if (_dependencyIndex == null)_dependencyIndex = new DependencyIndex();
+		// note how the _dependencyIndex is volatile so that this double checking approach can be used.
+		if (_dependencyIndex == null){
+			synchronized(this){
+				if (_dependencyIndex == null)_dependencyIndex = new DependencyIndex();
+			}
+		}
 		return _dependencyIndex;
 	}
-	
+
 	/**
 	 * Answer a performance monitor for the validators.
 	 */
@@ -155,7 +178,7 @@
 	}
 	
 	/**
-	 * Answer the preference store that holds the global validation settings.
+	 * Answer the preference store that holds the persisted global validation settings.
 	 */
 	public IEclipsePreferences getPreferenceStore(){
 		return new InstanceScope().getNode(ValidationPlugin.PLUGIN_ID);
@@ -254,6 +277,112 @@
 	}
 	
 	/**
+	 * Answer copies of all the registered validators.
+	 * 
+	 * @return Answer an empty array if there are no validators.
+	 */
+	public Validator[] getValidators(){
+		return ValManager.getDefault().getValidatorsCopy();
+	}
+		
+	/**
+	 * Answer the validation settings that have been defined on the
+	 * project. To "activate" any changes to these settings, the
+	 * {@link #applyChanges(MutableProjectSettings, boolean)} method needs to be
+	 * called.
+	 * 
+	 * @param project The project who's settings you wish to examine or change.
+	 * @return Validation settings that apply to the given project.
+	 */
+	public MutableProjectSettings getProjectSettings(IProject project){
+		ProjectPreferences pp = ValManager.getDefault().getProjectPreferences(project);
+		Validator[] vals = pp.getValidators();
+		ValidatorMutable[] vms = new ValidatorMutable[vals.length];
+		for (int i=0; i<vals.length; i++)vms[i] = new ValidatorMutable(vals[i]);
+
+		MutableProjectSettings mps = new MutableProjectSettings(project, vms);
+		mps.setOverride(pp.getOverride());
+		mps.setSuspend(pp.getSuspend());
+		return mps;
+	}
+	
+	/**
+	 * Answer the validation settings that have been defined at the workspace level.
+	 * To "activate" any changes to these settings, the
+	 * {@link #applyChanges(MutableWorkspaceSettings, boolean)} method needs to be
+	 * called.
+	 * 
+	 * @return Validation settings that apply to the entire workspace.
+	 */
+	public MutableWorkspaceSettings getWorkspaceSettings() throws InvocationTargetException{
+		
+		ValManager vm = ValManager.getDefault();
+		GlobalPreferences gp = vm.getGlobalPreferences();
+		
+		Validator[] vals = vm.getValidators();		
+		ValidatorMutable[] vms = new ValidatorMutable[vals.length];
+		for (int i=0; i<vals.length; i++)vms[i] = new ValidatorMutable(vals[i]);
+
+		MutableWorkspaceSettings mws = new MutableWorkspaceSettings(vms, gp.asValues());
+		return mws;
+	}
+		
+	/**
+	 * Apply the changes that have been been to the validation settings.
+	 * 
+	 * @param settings
+	 *            The project settings.
+	 * @param persist
+	 *            If true then the changes are persisted to the property files.
+	 *            If false the changes are applied to the validators, but are
+	 *            not persisted.
+	 */
+	public void applyChanges(MutableProjectSettings settings, boolean persist){
+		ValPrefManagerProject vpm = new ValPrefManagerProject(settings.getProject());
+		vpm.savePreferences(settings, persist);
+	}
+	
+	/**
+	 * Apply the changes that have been been to the validation settings.
+	 * 
+	 * @param settings
+	 *            The workspace settings.
+	 * @param persist
+	 *            If true then the changes are persisted to the property files.
+	 *            If false the changes are applied to the validators, but are
+	 *            not persisted.
+	 */
+	public void applyChanges(MutableWorkspaceSettings settings, boolean persist){
+		
+		ValManager vm = ValManager.getDefault();
+		GlobalPreferencesValues gpv = settings.getGlobalPreferencesValues();
+		vm.replace(gpv);
+		
+		IMutableValidator[] mvs = settings.getValidators();
+		ValidatorMutable[] vals = new ValidatorMutable[mvs.length];
+		for (int i=0; i<mvs.length; i++)vals[i] = (ValidatorMutable)mvs[i];
+		ValPrefManagerGlobal.getDefault().savePreferences(vm.getGlobalPreferences(), vals, persist);
+		ValPrefManagerGlobal.saveV1Preferences(vals, persist);		
+	}
+	
+	/**
+	 * Validators can use project level settings (Project natures and facets) to
+	 * determine if they are applicable to the project or not.
+	 * 
+	 * @param project
+	 *            The project that the configuration is based on.
+	 * @return The copies of the validators that are configured to run on this project based
+	 *         on the project level settings.
+	 * @throws ProjectUnavailableError
+	 */
+	public Validator[] getValidatorsConfiguredForProject(IProject project) throws ProjectUnavailableError {
+		Validator[] orig = ValManager.getDefault().getValidatorsConfiguredForProject(project, UseProjectPreferences.Normal);
+		Validator[] copy = new Validator[orig.length];
+		for (int i=0; i<orig.length; i++)copy[i] = orig[i].copy();
+		return copy;
+	}
+	
+	/**
 	 * Answer all the validators that are applicable for the given resource.
 	 * 
 	 * @param resource the resource that determines which validators are applicable.
@@ -288,6 +417,21 @@
 	}
 	
 	/**
+	 * Answer whether or not the validator has been activated, i.e. has the
+	 * bundle that defines the validator been loaded. We do not want to cause
+	 * unnecessary bundle loading, so this check can be performed by third party
+	 * callers, to prevent making other calls that will force the validator to
+	 * be loaded.
+	 * 
+	 * @param validator
+	 *            The validator that is being tested.
+	 * @return true if the validator has already been loaded.
+	 */
+	public boolean isLoaded(Validator validator){
+		return validator.isLoaded();
+	}
+	
+	/**
 	 * Waits until all validation jobs are finished. This method will block the
 	 * calling thread until all such jobs have finished executing, or until this
 	 * thread is interrupted. If there are no validation jobs that are
@@ -350,6 +494,55 @@
 		if (_suspendedProjects == null)_suspendedProjects = Collections.synchronizedSet(new HashSet<IProject>(20));
 		return _suspendedProjects;
 	}
+	
+	/**
+	 * Save the validators settings into the persistent store, there by making their settings the active settings.
+	 * <p>
+	 * A common use of this method would be to change whether particular validators are enabled or not. For example
+	 * if you only wanted the JSP validator enabled, you could use code similar to this:
+	 * <pre>
+	 * ValidationFramework vf = ValidationFramework.getDefault();
+	 * Validator[] vals = vf.getValidators();
+	 * for (Validator v : vals){
+	 *   boolean enabled = false;
+	 *   if (v.getValidatorClassname().equals("org.eclipse.jst.jsp.core.internal.validation.JSPBatchValidator"))enabled = true;
+	 *     v.setBuildValidation(enabled);
+	 *     v.setManualValidation(enabled);
+	 *  }
+	 * vf.saveValidators(vals);
+	 * </pre>
+	 * </p> 
+	 * 
+	 * @param validators The validators that you are saving.
+	 * 
+	 * @throws InvocationTargetException
+	 */
+	public void saveValidators(Validator[] validators) throws InvocationTargetException{
+		
+		
+		ValPrefManagerGlobal gp = ValPrefManagerGlobal.getDefault();
+		gp.saveAsPrefs(validators);	
+		
+		GlobalConfiguration gc = ConfigurationManager.getManager().getGlobalConfiguration();
+		
+		List<ValidatorMetaData> manual = new LinkedList<ValidatorMetaData>();
+		List<ValidatorMetaData> build = new LinkedList<ValidatorMetaData>();
+		for (Validator v : validators){
+			V1 v1 = v.asV1Validator();
+			if (v1 == null)continue;
+			if (v1.isManualValidation())manual.add(v1.getVmd());
+			if (v1.isBuildValidation())build.add(v1.getVmd());
+		}
+		
+		ValidatorMetaData[] array = new ValidatorMetaData[manual.size()];
+		gc.setEnabledManualValidators(manual.toArray(array));
+		
+		array = new ValidatorMetaData[build.size()];
+		gc.setEnabledBuildValidators(build.toArray(array));
+
+		gc.passivate();
+		gc.store();		
+	}
 
 	/**
 	 * Suspends, or undoes the suspension of, validation on all projects in the
@@ -424,7 +617,21 @@
 		ValOperation vo = ValidationRunner.validate(createMap(projects), type, monitor, true);
 		return vo.getResults();
 	}
-	
+
+	/**
+	 * Validate a specific file resource.
+	 * 
+	 * @param file
+	 *            The file to be validated.
+	 * @param monitor
+	 *            Progress monitor.
+	 * @return the result of validating the file.
+	 */
+  public ValidationResults validate(IFile file, IProgressMonitor monitor) throws CoreException{
+      ValOperation vo = ValidationRunner.validate(file, ValType.Manual, monitor, true);
+      return vo.getResults();
+    }
+	  
 	/**
 	 * Answer all the resources in the projects as a map.
 	 * @param projects
@@ -461,5 +668,16 @@
 		}
 		
 	}
+	
+	/**
+	 * Store the singleton for the ValidationFramework. This approach is used to avoid having to synchronize the
+	 * ValidationFramework.getDefault() method.
+	 * 
+	 * @author karasiuk
+	 *
+	 */
+	private static class Singleton {
+		static ValidationFramework vf = new ValidationFramework();
+	}
 
 }
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/ValidationResult.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/ValidationResult.java
index 1e54b7c..c1714e1 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/ValidationResult.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/ValidationResult.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
+ * Copyright (c) 2007, 2009 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
@@ -34,9 +34,9 @@
  */
 public final class ValidationResult {
 	
-	private List<ValidatorMessage> _messages;
+	private final List<ValidatorMessage> _messages = new LinkedList<ValidatorMessage>();
 	
-	private static ValidatorMessage[] _noMessages = new ValidatorMessage[0];
+	private final static ValidatorMessage[] _noMessages = new ValidatorMessage[0];
 	
 	private boolean		_canceled;
 	
@@ -78,12 +78,14 @@
 	 * one type of message, and those messages can be either be directly used by
 	 * the caller, or automatically converted into IMarkers by the validation
 	 * framework.
+	 * </p>
 	 * <p>
 	 * To make matters even more complicated there is a third way to return
 	 * messages. To make it easier for old validators to port to the new
 	 * framework, they can continue to use an IReporter. If a validator calls
 	 * the getReporter() method then it is assumed by the framework that that is
 	 * the approach that they have chosen.
+	 * </p>
 	 * 
 	 * @see #getReporter(IProgressMonitor)
 	 * 
@@ -91,7 +93,7 @@
 	 * 		A validation message.
 	 */
 	public void add(ValidatorMessage message){
-		getMessageList().add(message);
+		_messages.add(message);
 	}
 	
 	/**
@@ -163,6 +165,19 @@
 		_messages.toArray(msgs);
 		return msgs;
 	}
+		
+	/**
+	 * Answer a copy of any validation messages that were added by the validator. The array is a new
+	 * array, and each message is a copy. 
+	 * @return an array is returned even if there are no messages.
+	 */
+	public synchronized ValidatorMessage[] getMessagesAsCopy(){
+		if (_messages == null)return _noMessages;
+		ValidatorMessage[] msgs = new ValidatorMessage[_messages.size()];
+		int i = 0;
+		for (ValidatorMessage msg : _messages)msgs[i++] = msg.asCopy();
+		return msgs;
+	}
 
 	/**
 	 * Update the resources that the validated resource depends on. This can be
@@ -179,11 +194,6 @@
 		_dependsOn = dependsOn;
 	}
 	
-	private List<ValidatorMessage> getMessageList(){
-		if (_messages == null)_messages = new LinkedList<ValidatorMessage>();
-		return _messages;
-	}
-
 	/**
 	 * @return All the resources that were validated as a side-effect of
 	 * 	validating the main resource, or null if none were.
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/ValidationResults.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/ValidationResults.java
index f614121..ba947f8 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/ValidationResults.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/ValidationResults.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
+ * Copyright (c) 2007, 2009 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
@@ -10,6 +10,7 @@
  *******************************************************************************/
 package org.eclipse.wst.validation;
 
+
 /**
  * The combined results of validating multiple resources.
  * <p>
@@ -21,11 +22,26 @@
  * @author karasiuk
  *
  */
-public class ValidationResults {
-	private ValidationResult _result;
+public final class ValidationResults {
+	
+	private final ValidatorMessage[] _messages;
+	private final int 	_error;
+	private final int	_warn;
+	private final int	_info;
 	
 	public ValidationResults(ValidationResult result){
-		_result = result;
+		if (result == null){
+			_messages = new ValidatorMessage[0];
+			_error = 0;
+			_warn = 0;
+			_info = 0;
+		}
+		else {
+			_messages = result.getMessagesAsCopy();
+			_error = result.getSeverityError();
+			_warn = result.getSeverityWarning();
+			_info = result.getSeverityInfo();
+		}
 	}
 	
 	/**
@@ -33,32 +49,28 @@
 	 * @return an array is returned even if there are no messages.
 	 */
 	public ValidatorMessage[] getMessages(){
-		if (_result == null)return new ValidatorMessage[0];
-		return _result.getMessages();
+		return _messages;
 	}
 
 	/**
 	 * Answer the number of error messages that were generated as part of this validation operation.
 	 */
 	public int getSeverityError() {
-		if (_result == null)return 0;
-		return _result.getSeverityError();
+		return _error;
 	}
 
 	/**
 	 * Answer the number of informational messages that were generated as part of this validation operation.
 	 */
 	public int getSeverityInfo() {
-		if (_result == null)return 0;
-		return _result.getSeverityInfo();
+		return _info;
 	}
 	
 	/**
 	 * Answer the number of warning messages that were generated as part of this validation operation.
 	 */
 	public int getSeverityWarning() {
-		if (_result == null)return 0;
-		return _result.getSeverityWarning();
+		return _warn;
 	}
 
 }
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/ValidationState.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/ValidationState.java
index 3c194ac..8097de4 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/ValidationState.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/ValidationState.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
+ * Copyright (c) 2007, 2008 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
@@ -35,7 +35,7 @@
  * @author karasiuk
  *
  */
-public class ValidationState {
+public final class ValidationState {
 	
 	/**
 	 * This is a special id.
@@ -45,10 +45,16 @@
 	 * resource that actually changed, is placed into the ValidationState using
 	 * this id.
 	 * </p>
+	 * @deprecated This approach is not thread safe, the longer form of the AbstractValidator validate method should be used instead.
+	 * @see AbstractValidator#validate(ValidationEvent, ValidationState, org.eclipse.core.runtime.IProgressMonitor)
 	 */
 	public static final String TriggerResource = ValidationPlugin.PLUGIN_ID + ".Trigger"; //$NON-NLS-1$
 
-	private Map<String, Object> _map = new HashMap<String, Object>(50);
+	// I can't use a ConncurrentHashMap because some of the clients store nulls.
+	private final Map<String, Object> _map = new HashMap<String, Object>(50);
+	
+	public ValidationState(){
+	}
 	
 	/**
 	 * Save some state information.
@@ -62,7 +68,7 @@
 	 * 		validation framework doesn't do anything with this object except
 	 * 		pass it along during the validation process.
 	 */
-	public void put(String id, Object value){
+	public synchronized void put(String id, Object value){
 		_map.put(id, value);
 	}
 	
@@ -76,7 +82,7 @@
 	 * @return any arbitrary data that the validator might find useful,
 	 * 	including null.
 	 */
-	public Object get(String id){
+	public synchronized Object get(String id){
 		return _map.get(id);
 	}
 
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/Validator.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/Validator.java
index 124f8a5..88f5ec5 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/Validator.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/Validator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
+ * Copyright (c) 2007, 2010 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
@@ -13,10 +13,13 @@
 import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.eclipse.core.resources.IMarker;
 import org.eclipse.core.resources.IProject;
@@ -41,7 +44,6 @@
 import org.eclipse.wst.validation.internal.ValManager;
 import org.eclipse.wst.validation.internal.ValMessages;
 import org.eclipse.wst.validation.internal.ValOperation;
-import org.eclipse.wst.validation.internal.ValOperationManager;
 import org.eclipse.wst.validation.internal.ValPrefManagerGlobal;
 import org.eclipse.wst.validation.internal.ValPrefManagerProject;
 import org.eclipse.wst.validation.internal.ValType;
@@ -57,6 +59,7 @@
 import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
 import org.eclipse.wst.validation.internal.provisional.core.IMessage;
 import org.eclipse.wst.validation.internal.provisional.core.IValidator;
+import org.eclipse.wst.validation.internal.provisional.core.IValidatorExtender;
 
 /**
  * Represents a validator. This gets instantiated through one of the validator extension points.
@@ -114,6 +117,17 @@
 	/** How many times has a message field in this validator been changed since it was created (or copied)? */
 	protected transient int _changeCountMessages;
 	
+	/** Has the validator been migrated from an earlier version in this session, but not yet saved? */
+	private boolean _migrated;
+	
+	public Validator(IProject project){
+		_project = project;
+	}
+		
+	void setMigrated(boolean migrated){
+		_migrated = migrated;
+	}
+	
 	/**
 	 * Create a new validator based on a abstract validator.
 	 * 
@@ -137,8 +151,7 @@
 	 *            means that you are a global validator.
 	 */
 	public static Validator create(ValidatorMetaData vmd, ValidationConfiguration config, IProject project){
-		V1 v1 = new V1(vmd, config);
-		v1._project = project;
+		V1 v1 = new V1(vmd, config, project);
 		return v1;
 	}
 	
@@ -163,14 +176,14 @@
 	 * @param project the project being built.
 	 * @param monitor the monitor that should be used for reporting progress if the clean takes a long time.
 	 */
-	public void clean(IProject project, IProgressMonitor monitor){
+	public void clean(IProject project, ValOperation operation, IProgressMonitor monitor){
 	}	
 	
 	/**
 	 * Compare yourself based on Validator name.
 	 */
 	public int compareTo(Validator validator) {
-			return getName().compareTo(validator.getName());			
+		return getName().compareTo(validator.getName());			
 	}
 	
 	/** Answer a deep copy of yourself. */
@@ -189,9 +202,9 @@
 		_manualValidation = v._manualValidation;
 		_markerId = v._markerId;
 		_messageSettings = v._messageSettings;
-		_project = v._project;
 		_sourceId = v._sourceId;
 		_version = v._version;
+		_migrated = v._migrated;
 		
 		if (includeChangeCounts){
 			_changeCountGlobal = v._changeCountGlobal;
@@ -200,6 +213,23 @@
 	}
 	
 	/**
+	 * Should the validation framework first clear the markers that this
+	 * validator has placed on this resource? This method can be overridden by
+	 * validator implementors to provide a validator specific behavior.
+	 * 
+	 * @param event
+	 *            The validation event that triggered the validation.
+	 * @return true if the validation framework should first clear all the
+	 *         markers that this validator produced. This is the default
+	 *         behavior. Return false to leave the markers unchanged. It then
+	 *         becomes the responsibility of the validator to manage it's own
+	 *         markers for this resource, for this validation event.
+	 */
+	public boolean shouldClearMarkers(ValidationEvent event){
+		return true;
+	}
+	
+	/**
 	 * Answer true if this validator, based on it's filters, should validate
 	 * this resource. This method does not check to see if global validation or
 	 * project validation has been suspended or not.
@@ -331,17 +361,49 @@
 		}
 		return result;
 	}
+	
 	/**
 	 * Validate the resource.
 	 * 
-	 * @param resource the resource to be validated
-	 * @param kind the kind of resource change, see IResourceDelta for values.
-	 * @param operation the operation that this validation is running under. This can be null.
-	 * @param monitor a way to report progress. This can be null.
+	 * @param resource
+	 *            The resource to be validated.
+	 * @param kind
+	 *            The kind of resource change, see IResourceDelta for values.
+	 * @param operation
+	 *            The operation that this validation is running under. This can
+	 *            be null.
+	 * @param monitor
+	 *            A way to report progress. This can be null.
 	 * 
-	 * @return the result of doing the validation, it can be, but usually isn't null.
+	 * @return the result of doing the validation, it can be, but usually isn't
+	 *         null.
 	 */
-	public abstract ValidationResult validate(IResource resource, int kind, ValOperation operation, IProgressMonitor monitor);	
+	public abstract ValidationResult validate(IResource resource, int kind, ValOperation operation, IProgressMonitor monitor);
+	
+	/**
+	 * Validate the resource.
+	 * 
+	 * @param resource
+	 *            The resource to be validated.
+	 * @param kind
+	 *            The kind of resource change, see IResourceDelta for values.
+	 * @param operation
+	 *            The operation that this validation is running under. This can
+	 *            be null.
+	 * @param monitor
+	 *            A way to report progress. This can be null.
+	 * @param event
+	 *            An event that describes in more detail what should be
+	 *            validated and why it should be validated. This can be null.
+	 * 
+	 * @return the result of doing the validation, it can be, but usually isn't
+	 *         null.
+	 */
+	public ValidationResult validate(IResource resource, int kind, ValOperation operation, IProgressMonitor monitor, ValidationEvent event){
+		// The reason that the resource and kind are still specified, is that I didn't want to remove a public method in the service
+		// stream. 
+		return validate(resource, kind, operation, monitor);		
+	}
 
 	/**
 	 * This method will be called before any validation takes place. It allows validators to perform any
@@ -471,16 +533,20 @@
 	 * Set whether this validator should be triggered as part of a manual validation.
 	 * 
 	 * @param manualValidation
+	 * @return true if the setting changed.
 	 */
-	public void setManualValidation(boolean manualValidation) {
-		setManualValidation2(manualValidation);
+	public boolean setManualValidation(boolean manualValidation) {
+		return setManualValidation2(manualValidation);
 	}
 	
-	protected final void setManualValidation2(boolean manualValidation) {
+	protected final boolean setManualValidation2(boolean manualValidation) {
+		boolean changed = false;
 		if (_manualValidation != manualValidation){
 			bumpChangeCountGlobal();
+			changed = true;
 			_manualValidation = manualValidation;
 		}
+		return changed;
 	}
 
 	/**
@@ -491,10 +557,10 @@
 	}
 	
 	/**
-	 * Has the validator changed since it was last created or copied?
+	 * Has the validator changed since it was last created or copied? Or was it migrated from an earlier version. 
 	 */
 	public boolean isChanged(){
-		if (_changeCountGlobal > 0 || _changeCountMessages > 0)return true;
+		if (_changeCountGlobal > 0 || _changeCountMessages > 0 || _migrated)return true;
 		return false;
 	}
 	
@@ -509,16 +575,20 @@
 	 * Set whether this validator should be triggered by the build process.
 	 * 
 	 * @param buildValidation
+	 * @return true if the setting changed.
 	 */
-	public void setBuildValidation(boolean buildValidation) {
-		setBuildValidation2(buildValidation);
+	public boolean setBuildValidation(boolean buildValidation) {
+		return setBuildValidation2(buildValidation);
 	}
 	
-	protected final void setBuildValidation2(boolean buildValidation) {
+	protected final boolean setBuildValidation2(boolean buildValidation) {
+		boolean changed = false;
 		if (_buildValidation != buildValidation){
 			bumpChangeCountGlobal();
+			changed = true;
 			_buildValidation = buildValidation;
 		}
+		return changed;
 	}
 
 	/**
@@ -571,7 +641,8 @@
 	 * @param vmd
 	 * @param config this is used to set the global enablement options. In some case this can be null.
 	 */
-	public V1(ValidatorMetaData vmd, ValidationConfiguration config){
+	public V1(ValidatorMetaData vmd, ValidationConfiguration config, IProject project){
+		super(project);
 		_vmd = vmd;
 		if (config != null){
 			setBuildValidation(config.isBuildEnabled(vmd));
@@ -583,6 +654,17 @@
 	}
 	
 	@Override
+	public void validationFinishing(IProject project, ValidationState state, IProgressMonitor monitor) {
+		if (project != null) {
+			IValidator v = asIValidator();
+			if (v instanceof IValidatorExtender) {
+				IValidatorExtender vExt = (IValidatorExtender) v;
+				vExt.validationFinishing(project, state, monitor);
+			}	
+		}
+	}
+
+	@Override
 	public IValidator asIValidator() {
 		IValidator v = null;
 		try {
@@ -598,17 +680,9 @@
 	public V1 asV1Validator() {
 		return this;
 	}
-	
-	@Override
-	public void become(Validator val) {
-		super.become(val);
-		V1 v1 = val.asV1Validator();
-		if (v1 == null)throw new IllegalArgumentException("Internal error, the incoming validator must be a v1 validator"); //$NON-NLS-1$
-		_vmd = v1._vmd;
-	}
-		
+			
 	public Validator copy(boolean includeChangeCounts) {
-		V1 v = new V1Copy(_vmd, null);
+		V1 v = new V1Copy(_vmd, null, _project);
 		v.copyLocal(this, includeChangeCounts);
 				
 		return v;
@@ -642,15 +716,17 @@
 	}
 	
 	@Override
-	public void setBuildValidation(boolean buildValidation) {
-		super.setBuildValidation(buildValidation);
+	public boolean setBuildValidation(boolean buildValidation) {
+		boolean changed = super.setBuildValidation(buildValidation);
 		_vmd.setBuildValidation(buildValidation);
+		return changed;
 	}
 	
 	@Override
-	public void setManualValidation(boolean manualValidation) {
-		super.setManualValidation(manualValidation);
+	public boolean setManualValidation(boolean manualValidation) {
+		boolean changed = super.setManualValidation(manualValidation);
 		_vmd.setManualValidation(manualValidation);
+		return changed;
 	}
 
 	@Override
@@ -674,6 +750,8 @@
 		IValidator v = asIValidator();
 		if (v == null)return null;
 		
+		if (shouldSkipValidator(resource, operation))return null;
+		
 		try {
 			IProject project = resource.getProject();
 			SummaryReporter reporter = new SummaryReporter(project, monitor);
@@ -686,7 +764,17 @@
 				files.add(wc.getPortableName(resource));
 				wc.setValidationFileURIs(files);
 			}
-			ValidatorLauncher.getLauncher().start(helper, v, reporter);
+			try {
+				ValidatorLauncher.getLauncher().start(helper, v, reporter);
+			}
+			finally {
+				try {
+					v.cleanup(reporter);
+				}
+				finally {
+					helper.cleanup(reporter);
+				}
+			}
 			
 			vr.incrementError(reporter.getSeverityHigh());
 			vr.incrementWarning(reporter.getSeverityNormal());
@@ -699,33 +787,49 @@
 		return vr;
 	}
 	
+
+	private static final String VALIDATE_PROJECT_ONCE = "ValidateProjectOnce"; //$NON-NLS-1$
+
+		@SuppressWarnings("unchecked")	
+		private boolean shouldSkipValidator(IResource resource, ValOperation operation) {
+
+			if (_vmd.isValidateByProject())
+			{
+				ValidationState validationState = operation.getState();
+				Set<String> projectsNameSet = (Set<String>)validationState.get(VALIDATE_PROJECT_ONCE);
+				String projectName = resource.getProject().getName();
+
+				if (projectsNameSet == null) {
+					projectsNameSet = new HashSet<String>();
+					validationState.put(VALIDATE_PROJECT_ONCE, projectsNameSet);
+				}
+
+				if (projectsNameSet.contains(projectName))return true;
+				else projectsNameSet.add(projectName);
+			}
+			return false;
+		}
+
 	/*
 	 * GRK - Because I didn't want to try to make a true copy of the V1 validator, (because I didn't
 	 * want to copy the vmd object), I came up with this approach to only copy the fields that
 	 * the preference page was worried about. 
 	 */
-	public static class V1Copy extends V1 {
-		public V1Copy(ValidatorMetaData vmd, ValidationConfiguration vc){
-			super(vmd, vc);
+	public final static class V1Copy extends V1 {
+		public V1Copy(ValidatorMetaData vmd, ValidationConfiguration vc, IProject project){
+			super(vmd, vc, project);
 		}
 		
 		@Override
-		public void setManualValidation(boolean bool) {
-			setManualValidation2(bool);
+		public boolean setManualValidation(boolean bool) {
+			return setManualValidation2(bool);
 		}
 		
 		@Override
-		public void setBuildValidation(boolean bool) {
-			setBuildValidation2(bool);
+		public boolean setBuildValidation(boolean bool) {
+			return setBuildValidation2(bool);
 		}
-		
-		@Override
-		public void become(Validator val) {
-			super.become(val);
-			super.setBuildValidation(val.isBuildValidation());
-			super.setManualValidation(val.isManualValidation());
-		}
-		
+				
 	}
 		
 }
@@ -771,11 +875,22 @@
 		
 	private Level _level;
 	
+	/**
+	 * Do we still need to invoke the validateStarting method for this validator, for the null project?
+	 * 
+	 * Because we do not want to activate a validator's plug-in too soon, we do not activate the validator
+	 * as a reaction to the global validation starting event. Instead we mark it pending, and wait until
+	 * we are sure that we have something to validate.
+	 * 
+	 * If this flag is true, it means that the validateStarting method still needs to be called for this validator.
+	 */
+	private AtomicBoolean _pendingValidationStarted = new AtomicBoolean();
+	
 	V2(IConfigurationElement configElement, IProject project){
+		super(project);
 		assert configElement != null;
 		_validatorConfigElement = configElement;
 		_validatorClassName = configElement.getAttribute(ExtensionConstants.AttribClass);
-		_project = project;
 
 		IConfigurationElement[] groupReferenceElements = configElement.getChildren(ExtensionConstants.Group.elementGroup);
 		List<String> validatorGroupIDs = new ArrayList<String>();
@@ -789,9 +904,9 @@
 	}
 	
 	private V2(IProject project, String validatorClassName, AbstractValidator validator){
+		super(project);
 		assert validator != null;
 		
-		_project = project;
 		_validatorClassName = validatorClassName;
 		_validator = validator;
 		init();
@@ -823,6 +938,7 @@
 		return super.asIValidator();
 	}
 	
+	@Override
 	public V2 asV2Validator() {
 		return this;
 	}
@@ -832,11 +948,14 @@
 	 * 
 	 * @param project the project that is being cleaned. This can be null which means that the workspace
 	 * is being cleaned (in which case a separate call will be made for each open project).
+	 * 
 	 */
-	public void clean(IProject project, IProgressMonitor monitor) {
-		getDelegatedValidator().clean(project, ValOperationManager.getDefault().getOperation().getState(), monitor);
+	@Override
+	public void clean(IProject project, ValOperation operation, IProgressMonitor monitor) {
+		getDelegatedValidator().clean(project, operation.getState(), monitor);
 	}
 	
+	@Override
 	public Validator copy(boolean includeChangeCounts) {
 		V2 v = null;
 		if (_validatorConfigElement != null)v = new V2(_validatorConfigElement, _project);
@@ -848,13 +967,14 @@
 		FilterGroup[] groups = getGroups();
 		v._groupsArray = new FilterGroup[groups.length];
 		for (int i=0; i<groups.length; i++){
-			v._groupsArray[i] = groups[i].copy();
-			v._groups.add(v._groupsArray[i]);
+			v._groupsArray[i] = groups[i];
+			v._groups.add(groups[i]);
 		}
 
 		v._id = _id;
 		v._name = _name;
 		v._validatorGroupIds = _validatorGroupIds;
+		v._pendingValidationStarted = _pendingValidationStarted;
 				
 		return v;
 	}
@@ -900,6 +1020,7 @@
 		return delegated;
 	}
 		
+	@Override
 	public String getId() {
 		return _id;
 	}
@@ -918,6 +1039,7 @@
 		return groups;
 	}
 	
+	@Override
 	public String getName() {
 		return _name;
 	}
@@ -941,6 +1063,7 @@
 		return _validator;
 	}
 	
+	@Override
 	public String getValidatorClassname(){
 		return _validatorClassName;
 	}
@@ -969,13 +1092,22 @@
 	boolean isLoaded() {
 		return _validator != null;
 	}
+	
+	@Override
+	public boolean shouldClearMarkers(ValidationEvent event) {
+		return getValidator().shouldClearMarkers(event);
+	}
 		
 	/**
 	 * Answer true if this validator, based on it's filters, should validate this resource.
 	 * 
 	 * @return true if the resource should be validated.
 	 */
+	@Override
 	protected boolean shouldValidate(IResource resource, ContentTypeWrapper contentTypeWrapper) {
+	    if (resource.isDerived()){
+	      return false;
+	    }
 		FilterGroup[] groups = getGroups();
 		IProject project = resource.getProject();
 		for (FilterGroup group : groups){
@@ -1012,12 +1144,19 @@
 	}
 	
 	@Override
-	public ValidationResult validate(IResource resource, int kind, ValOperation operation, IProgressMonitor monitor) {
+	public ValidationResult validate(IResource resource, int kind, ValOperation operation, IProgressMonitor monitor){
+		return validate(resource, kind, operation, monitor, null);
+	}
+	
+	@Override
+	public ValidationResult validate(IResource resource, int kind, ValOperation operation, IProgressMonitor monitor, ValidationEvent event) {
 		ValidationResult vr = null;
 		if (operation == null)operation = new ValOperation();
 		if (monitor == null)monitor = new NullProgressMonitor();
 		try {
-			vr = getDelegatedValidator().validate(resource, kind, operation.getState(), monitor);
+			if (event == null)event = new ValidationEvent(resource, kind, null);
+			vr = getDelegatedValidator().validate(event, operation.getState(), monitor);
+			if (vr == null)vr = getDelegatedValidator().validate(resource, kind, operation.getState(), monitor);
 		}
 		catch (Exception e){
 			try {
@@ -1066,7 +1205,6 @@
 	 * @return true if the test passed
 	 */
 //	private boolean sanityTest(int numberofMessages, IResource resource) {
-//		//FIXME make this more general and configurable
 //		if (numberofMessages < 201)return true;
 //		
 //		String resName = ""; //$NON-NLS-1$
@@ -1142,12 +1280,22 @@
 	
 	@Override
 	public void validationStarting(IProject project, ValidationState state, IProgressMonitor monitor) {
-		getDelegatedValidator().validationStarting(project, state, monitor);
+		if (project == null)_pendingValidationStarted.set(true);
+		else {
+			AbstractValidator val = getDelegatedValidator();
+			if (_pendingValidationStarted.getAndSet(false)){
+				val.validationStarting(null, state, monitor);
+			}
+			val.validationStarting(project, state, monitor);
+		}
 	}
 	
 	@Override
 	public void validationFinishing(IProject project, ValidationState state, IProgressMonitor monitor) {
-		getDelegatedValidator().validationFinishing(project, state, monitor);
+		if (project == null){
+			if (!_pendingValidationStarted.getAndSet(false))getDelegatedValidator().validationFinishing(null, state, monitor);
+		}
+		else getDelegatedValidator().validationFinishing(project, state, monitor);
 	}
 
 	@SuppressWarnings("unchecked")
@@ -1177,21 +1325,9 @@
 		return true;
 	}
 	
-	@Override
-	public void become(Validator val) {
-		super.become(val);
-		V2 v2 = val.asV2Validator();
-		if (v2 == null)throw new IllegalArgumentException(ValMessages.Error20);
-		_changeCountGroups = v2._changeCountGroups;
-		_delegated = v2._delegated;
-		_groups = v2._groups;
-		_groupsArray = v2._groupsArray;
-		_id = v2._id;
-		_name = v2._name;
-		_validator = v2._validator;
-		_validatorConfigElement = v2._validatorConfigElement;
-		_validatorClassName = v2._validatorClassName;
-		_validatorGroupIds = v2._validatorGroupIds;
+	public synchronized void replaceFilterGroup(FilterGroup existing, FilterGroup merged) {
+		remove(existing);
+		add(merged);
 	}
 
 }
@@ -1207,22 +1343,6 @@
 	}
 }
 
-/**
- * Take the instance variables from the incoming validator and set them to yourself.
- * @param validator
- */
-public void become(Validator validator) {
-	_buildValidation = validator._buildValidation;
-	_delegatingId = validator._delegatingId;
-	_manualValidation = validator._manualValidation;
-	_markerId = validator._markerId;
-	_messageSettings = validator._messageSettings;
-	_project = validator._project;
-	_sourceId = validator._sourceId;
-	_version = validator._version;
-	_changeCountGlobal = validator._changeCountGlobal;
-	_changeCountMessages = validator._changeCountMessages;
-}
 
 void setMessages(Map<String, MessageSeveritySetting> map) {
 	_messageSettings = map;
@@ -1233,6 +1353,10 @@
 	return _changeCountGlobal;
 }
 
+public boolean hasGlobalChanges(){
+	return _migrated || _changeCountGlobal > 0;
+}
+
 public int getChangeCountMessages() {
 	return _changeCountMessages;
 }
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/ValidatorMessage.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/ValidatorMessage.java
index 70bdd90..a16c26e 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/ValidatorMessage.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/ValidatorMessage.java
@@ -45,7 +45,7 @@
 	public static final String ValidationId = "ValidationId"; //$NON-NLS-1$
 	
 	/** Associate some arbitrary attributes with a message. */
-	private Map<String, Object>	_map = new HashMap<String, Object>(5);
+	private final Map<String, Object>	_map = new HashMap<String, Object>(5);
 	
 	private IResource	_resource;
 	
@@ -73,6 +73,17 @@
 	private ValidatorMessage(){}
 	
 	/**
+	 * Answer a copy of yourself.
+	 */
+	public ValidatorMessage asCopy(){
+		ValidatorMessage msg = new ValidatorMessage();
+		msg._resource = _resource;
+		msg._type = _type;
+		msg._map.putAll(_map);
+		return msg;
+	}
+	
+	/**
 	 * Returns the attribute with the given name. The result is an instance of
 	 * one of the following classes: <code>String</code>, <code>Integer</code>,
 	 * or <code>Boolean</code>. Returns <code>null</code> if the attribute is
@@ -267,7 +278,8 @@
 	 * table. The values must be an instance of one of the following classes:
 	 * <code>String</code>, <code>Integer</code>, or <code>Boolean</code>.
 	 * Attributes previously set on the marker but not included in the given map
-	 * are considered to be removals. Setting the given map to be
+	 * are considered to be removals. This includes the text of the message.
+	 * Setting the given map to be
 	 * <code>null</code> is equivalent to removing all marker attributes.
 	 * 
 	 * @param attributes
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/doc-files/faq.html b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/doc-files/faq.html
new file mode 100644
index 0000000..8096d0a
--- /dev/null
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/doc-files/faq.html
@@ -0,0 +1,40 @@
+<html>
+<head>
+<title>Validation Framework - Frequently Asked Questions</title>
+</head>
+<body>
+<h1>Validation Framework - Frequently Asked Questions</h1>
+<h3>How do I create Problem Markers?</h3>
+<p>There are three different ways to create problem markers.</p>
+<ol>
+	<li>Use the native support in the validation framework.</li>
+	<li>Manage your own markers.</li>
+	<li>Use the support in the previous version of the validation framework.</li>
+</ol>
+<p>The first approach, is the recommended approach.</p>
+
+<h4>1. Use the native support in the validation framework</h4>
+<p>After you have finished performing your validation, and are returning control back to
+the validation framework, add your messages into the 
+<a href="../ValidationResult.html">ValidationResult</a> by using
+the <a href="../ValidationResult.html#add(org.eclipse.wst.validation.ValidatorMessage)">add(ValidatorMessage message)</a> method.
+
+<h4>2. Manage your own markers</h4>
+
+<p>Create and remove your own markers. So that summary information can still be displayed, set the counts of any newly
+created markers in the <a href="../ValidationResult.html">ValidationResult</a> by using the setSeverityXXX() methods.
+For example, if this validation pass generated two error markers, you would call 
+<a href="../ValidationResult.html#setSeverityError(int)">setSeverityError(2)</a>. 
+</p>
+
+<h4>3. Use the support in the previous version of the validation framework</h4>
+
+<p>If you are porting a validator that used the previous version of the validation framework, and you wish to continue to use an
+<A HREF="../../../../../org/eclipse/wst/validation/internal/provisional/core/IReporter.html">IReporter</a> to
+report your markers, you can continue to do so.</p>
+<p>For this approach, use the
+<a href="../ValidationResult.html#getReporter(IProgressMonitor)">getReporter(IProgressMonitor&nbsp;monitor)</a> method,
+and return your messages through the IReporter. If this method is called it is assumed by the framework, 
+that this IReporter will be used as the only way of passing messages back to the framework. 
+</body>
+</html>
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ContentTypeWrapper.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ContentTypeWrapper.java
index 2436c84..53dd045 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ContentTypeWrapper.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ContentTypeWrapper.java
@@ -1,3 +1,13 @@
+/*******************************************************************************
+ * Copyright (c) 2008 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.validation.internal;
 
 import org.eclipse.core.resources.IFile;
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/DebugConstants.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/DebugConstants.java
index 53a020d..a466241 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/DebugConstants.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/DebugConstants.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
+ * Copyright (c) 2007, 2009 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
@@ -39,5 +39,17 @@
 	 * For example, if you wanted more detail on the XML validator you would use org.eclipse.wst.xml.core.xml 
 	 */
 	String ExtraValDetail = ValidationPlugin.PLUGIN_ID+"/extraValDetail"; //$NON-NLS-1$
+	
+	/** 
+	 * filter/allExcept - If supplied, it is as if this is the only validator that gets defined via
+	 * the extension point. All the other validators are ignored.
+	 */
+	String FilterAllExcept = ValidationPlugin.PLUGIN_ID+"/filter/allExcept"; //$NON-NLS-1$
+	
+	/**
+	 * trace/level - The tracing level. If not supplied a default of zero is used. The higher the number the
+	 * more verbose the tracing.
+	 */
+	String TraceLevel = ValidationPlugin.PLUGIN_ID+"/trace/level"; //$NON-NLS-1$
 
 }
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/DependencyIndex.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/DependencyIndex.java
index 6e4026e..fe1db15 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/DependencyIndex.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/DependencyIndex.java
@@ -12,6 +12,7 @@
 
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
+import java.io.EOFException;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
@@ -76,6 +77,7 @@
 
 	public synchronized void add(String id, IResource dependent, IResource dependsOn) {
 		init();
+		if (dependsOn == null || dependent == null)return;
 		Depends d = getOrCreateDepends(dependent, dependsOn);
 		if (d.getValidators().add(id))_dirty = true;
 	}
@@ -83,7 +85,7 @@
 	private Depends getOrCreateDepends(IResource dependent, IResource dependsOn) {
 		Set<Depends> set = getSet(_dependents, dependent);
 		for (Depends d : set){
-			if (d.getDependsOn() == dependsOn)return d;
+			if (d.getDependsOn() != null && d.getDependsOn().equals(dependsOn)) return d;
 		}
 		Depends d = new Depends(dependent, dependsOn);
 		_dirty = true;
@@ -118,8 +120,7 @@
 			_dependents = new HashMap<IResource,Set<Depends>>(100);
 		}
 		else {
-			String errorMessage = "The following dependency could not be restored " + //$NON-NLS-1$
-				"because the following resource {0} could no longer be found."; //$NON-NLS-1$
+			String errorMessage = ValMessages.Error21; 
 			DataInputStream in = null;
 			try {
 				IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
@@ -137,9 +138,8 @@
 				for (int i=0; i<numDependsOn; i++){
 					String v = in.readUTF();
 					IResource dependsOn = root.findMember(v);
-					if (v == null){
+					if (dependsOn == null){
 						Tracing.log(NLS.bind(errorMessage, v));
-						continue;
 					}
 					int numDependents = in.readInt();
 					for (int j=0; j<numDependents; j++){
@@ -147,16 +147,18 @@
 						IResource dependent = root.findMember(v);
 						if (dependent == null){
 							Tracing.log(NLS.bind(errorMessage, v));
-							continue;
 						}
 						int numVal = in.readInt();
 						for (int k=0; k<numVal; k++){
 							String id = in.readUTF();
-							add(id, dependent, dependsOn);
+							if (dependent != null && dependsOn != null)add(id, dependent, dependsOn);
 						}
 					}					
 				}				
 			}
+			catch (EOFException e){
+				Tracing.log("Unable to read the dependency index file because of EOF exception"); 
+			}
 			catch (IOException e){
 				error = true;
 				ValidationPlugin.getPlugin().handleException(e);
@@ -248,10 +250,11 @@
 	public synchronized void saving(ISaveContext context) throws CoreException {
 		if (!_dirty)return;
 		_dirty = false;
-		
+		boolean error = false;
 		DataOutputStream out = null;
+		File f = null;
 		try {
-			File f = getIndexLocation();
+			f = getIndexLocation();
 			out = new DataOutputStream(new FileOutputStream(f));
 			out.writeInt(CurrentVersion);
 			Map<String, Set<DependsResolved>> map = compress(_dependsOn);
@@ -270,10 +273,12 @@
 			}
 		}
 		catch (IOException e){
+			error = true;
 			ValidationPlugin.getPlugin().handleException(e);
 		}
-		finally {
+		finally {		
 			Misc.close(out);
+			if (error)f.delete();
 		}
 	}
 
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/DisabledResourceManager.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/DisabledResourceManager.java
index 1b522fa..120180f 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/DisabledResourceManager.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/DisabledResourceManager.java
@@ -15,11 +15,8 @@
 
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ProjectScope;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.IScopeContext;
 import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
 import org.osgi.service.prefs.BackingStoreException;
 
@@ -31,11 +28,8 @@
  */
 public class DisabledResourceManager implements IProjectChangeListener {
 	
-	private static DisabledResourceManager _me;
-	
 	public static DisabledResourceManager getDefault(){
-		if (_me == null)_me = new DisabledResourceManager();
-		return _me;
+		return Singleton.disabledResourceManager;
 	}
 	
 	private Set<IResource> _disabled = new HashSet<IResource>(100);
@@ -66,12 +60,7 @@
 		save(copy, resource.getProject());
 		_disabled = copy;		
 	}
-	
-	private IEclipsePreferences getPreferences(IProject project){
-		IScopeContext projectContext = new ProjectScope(project);
-		return projectContext.getNode(ValidationPlugin.PLUGIN_ID);
-	}
-	
+		
 	private void save(Set<IResource> disabled, IProject project) {
 		Serializer ser = new Serializer(200);
 		for (IResource resource : disabled){
@@ -79,7 +68,7 @@
 				ser.put(resource.getProjectRelativePath().toPortableString());
 			}
 		}
-		IEclipsePreferences prefs = getPreferences(project);
+		PreferencesWrapper prefs = PreferencesWrapper.getPreferences(project, null);
 		prefs.put(PrefConstants.disabled, ser.toString());
 		try {
 			prefs.flush();
@@ -92,7 +81,7 @@
 	private void load(IProject project){
 		Set<IResource> copy = new HashSet<IResource>(_disabled.size()+10);
 		copy.addAll(_disabled);
-		IEclipsePreferences prefs = getPreferences(project);
+		PreferencesWrapper prefs = PreferencesWrapper.getPreferences(project, null);
 		String disabled = prefs.get(PrefConstants.disabled, ""); //$NON-NLS-1$
 		if (disabled.length() > 0){
 			Deserializer des = new Deserializer(disabled);
@@ -153,5 +142,17 @@
 		}
 		_disabled = copy;
 	}
+	
+	/**
+	 * Store the singleton for the DisabledResourceManager. This approach is used to avoid having to synchronize the
+	 * DisabledResourceManager.getDefault() method.
+	 * 
+	 * @author karasiuk
+	 *
+	 */
+	private static class Singleton {
+		static DisabledResourceManager disabledResourceManager = new DisabledResourceManager();
+	}
+
 
 }
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/DisabledValidatorManager.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/DisabledValidatorManager.java
index 4afe15e..8a141c5 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/DisabledValidatorManager.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/DisabledValidatorManager.java
@@ -1,3 +1,13 @@
+/*******************************************************************************
+ * Copyright (c) 2008 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.validation.internal;
 
 import java.util.Collections;
@@ -5,6 +15,7 @@
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
@@ -18,20 +29,15 @@
  * @author karasiuk
  *
  */
-public class DisabledValidatorManager implements IValChangedListener {
+public final class DisabledValidatorManager implements IValChangedListener {
 	
-	private static DisabledValidatorManager _me;
-	private static int _counter;
+	private static final AtomicInteger _counter = new AtomicInteger();
 	private static final int CacheSize = 5;
 	
-	private Map<IResource, LRUSet> _map = Collections.synchronizedMap(new HashMap<IResource, LRUSet>(5));
+	private final Map<IResource, LRUSet> _map = Collections.synchronizedMap(new HashMap<IResource, LRUSet>(5));
 	
 	public static DisabledValidatorManager getDefault(){
-		DisabledValidatorManager me = _me;
-		if (me != null)return me;
-		me = new DisabledValidatorManager();
-		_me = me;
-		return me;
+		return Singleton.disabledValidatorManager;
 	}
 	
 	private DisabledValidatorManager(){
@@ -48,7 +54,7 @@
 	public Set<Validator> getDisabledValidatorsFor(IResource resource) {
 		LRUSet set = _map.get(resource);
 		if (set != null){
-			set.counter = _counter++;
+			set.counter = _counter.getAndIncrement();
 			return set.validators;
 		}
 		
@@ -71,18 +77,18 @@
 			_map.remove(oldest);
 		}
 		LRUSet set = new LRUSet();
-		set.counter = _counter++;
+		set.counter = _counter.getAndIncrement();
 		set.validators = vset;
 		_map.put(resource, set);		
 	}
 
 
-	private static class LRUSet {
+	private final static class LRUSet {
 		int counter;
 		Set<Validator> validators;
 	}
 	
-	private static class DisabledValidationFinder implements IValidatorVisitor {
+	private final static class DisabledValidationFinder implements IValidatorVisitor {
 		
 		private Map<String, Validator> _validators;
 
@@ -112,5 +118,18 @@
 	public void validatorsForProjectChanged(IProject project, boolean configSettingChanged) {
 		_map.clear();
 	}
+	
+	
+	/**
+	 * Store the singleton for the DisabledValidatorManager. This approach is used to avoid having to synchronize the
+	 * DisabledValidatorManager.getDefault() method.
+	 * 
+	 * @author karasiuk
+	 *
+	 */
+	private final static class Singleton {
+		final static DisabledValidatorManager disabledValidatorManager = new DisabledValidatorManager();
+	}
+
 
 }
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ExtensionConstants.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ExtensionConstants.java
index 9073cdb..6649d59 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ExtensionConstants.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ExtensionConstants.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
+ * Copyright (c) 2005, 2010 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
@@ -67,6 +67,10 @@
 	/** rules - extension point to declare a validator group */
 	String group = "validatorGroup"; //$NON-NLS-1$
 	
+	/** removeV2Validator - extension point to remove a V2 validator */
+	String removedValidatorExtension = "removeV2Validator"; //$NON-NLS-1$
+	
+
 	interface Group {
 		/*
 		 * The group sub-element for either the validatorGroup or validator
@@ -98,6 +102,9 @@
 		
 		/** contentType - filter by content type. */
 		String contentType = "contentType"; //$NON-NLS-1$
+		
+		/** pattern - filter paths by regular expression. */
+		String pattern = "pattern"; //$NON-NLS-1$
 	}
 	
 	/** Rule attributes */
@@ -121,6 +128,9 @@
 		/** name - a file name. */
 		String name = "name"; //$NON-NLS-1$
 		
+		/** regex - a Java regular expression. */
+		String regex = "regex"; //$NON-NLS-1$
+		
 		/** 
 		 * type - the type of file to be matched:
 		 * <ul>
@@ -130,6 +140,9 @@
 		 * </ul>
 		 */
 		String fileType = "type"; //$NON-NLS-1$
+		
+		/** version - facet version expression. See the facet framework for the exact syntax of this expression. */
+		String version = "version"; //$NON-NLS-1$
 	}
 	
 	interface FileType {
@@ -166,6 +179,10 @@
 		String id = "id"; //$NON-NLS-1$
 	}
 	
+	interface RemovedValidator {
+		/** validatorId - the validator ID. The String represents the validator that will be removed */
+		String validatorIDAttr = "validatorId"; //$NON-NLS-1$
+	}
 	/** true */
 	String True = "true"; //$NON-NLS-1$
 	
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ExtensionValidators.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ExtensionValidators.java
index 5b74568..090f4af 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ExtensionValidators.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ExtensionValidators.java
@@ -12,6 +12,8 @@
 
 import java.lang.reflect.InvocationTargetException;
 import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 
 import org.eclipse.core.resources.IProject;
@@ -23,29 +25,26 @@
  * @author karasiuk
  *
  */
-public class ExtensionValidators {
+public final class ExtensionValidators {
 	private static ExtensionValidators _me;
 	
 	/** All the registered validators. The key is the validator id and the value is the validator. */
-	private Map<String, Validator> _map;
+	private final Map<String, Validator> _map;
 	
 	public synchronized static ExtensionValidators instance(){
 		if (_me == null){
 			_me = new ExtensionValidators();
-			_me.load();
 		}
 		return _me;
 	}
 
-	private ExtensionValidators(){};
-	
-	private void load() {
+	private ExtensionValidators(){
 		_map = new HashMap<String, Validator>(100);
 		for (Validator v : ValidatorExtensionReader.getDefault().process()){
 			_map.put(v.getId(), v);
-		}
+		}		
 	}
-
+	
 	/**
 	 * Answer all the v2 validators that have been defined by the extension point. This is the real
 	 * map (not a copy).
@@ -81,19 +80,31 @@
 		Map<String, Validator> map = new HashMap<String, Validator>();
 		map.putAll(_map);
 		
+		for (Validator v : getV1Validators(project))map.put(v.getId(), v);
+		
+		return map;
+	}
+	
+	/**
+	 * Answer the v1 validators that have been defined just on this project.
+	 * @param project
+	 * @return
+	 */
+	List<Validator> getV1Validators(IProject project){
+		List<Validator> list = new LinkedList<Validator>();
 		try {
 			ProjectConfiguration pc = new ProjectConfiguration(project);
 			pc.resetToDefault();
 			for (ValidatorMetaData vmd : pc.getValidators()){
 				Validator v = Validator.create(vmd, pc, project);
-				map.put(v.getId(), v);
+				list.add(v);
 			}
 		}
 		catch (InvocationTargetException e){
 			ValidationPlugin.getPlugin().handleException(e);
 		}
 
-		return map;
+		return list;
 	}
 
 }
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/MarkerManager.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/MarkerManager.java
index 03722be..8776525 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/MarkerManager.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/MarkerManager.java
@@ -31,13 +31,10 @@
  */
 public class MarkerManager {
 	
-	private static MarkerManager _me;
-	
 	private Set<String> _markers = new HashSet<String>(50);
 	
 	public static MarkerManager getDefault(){
-		if (_me == null)_me = new MarkerManager();
-		return _me;
+		return Singleton.markerManager;
 	}
 	
 	private MarkerManager(){
@@ -60,7 +57,12 @@
 		
 		String id = validator.getMarkerId();
 		if (id != null){
-			resource.deleteMarkers(id, true, IResource.DEPTH_ZERO);
+			try {
+				resource.deleteMarkers(id, true, IResource.DEPTH_ZERO);
+			}
+			catch (CoreException e){
+				// Nothing that we can do. This is not worth logging.
+			}
 			return;
 		}
 				
@@ -106,11 +108,26 @@
 		try {
 			hook(resource); 
 			IMarker[] markers = resource.findMarkers(null, true, depth);
+			String markerType;
 			for (IMarker marker : markers){
-				if (_markers.contains(marker.getType())){
+				try {
+					markerType = marker.getType();
+				}
+				catch (CoreException e)
+				{
+					//ignore the marker
+					return;
+				}
+				if (_markers.contains(markerType)){
 					long createTime = marker.getCreationTime();
-//					long diff = createTime - operationStartTime;
-					if (createTime < operationStartTime)marker.delete();
+					if (createTime < operationStartTime){
+						try {
+							marker.delete();
+						}
+						catch (CoreException e){
+							// eat it - there is nothing we can do about this.
+						}
+					}
 				}
 			}
 		}
@@ -172,5 +189,17 @@
 	public Set<String> getMarkers() {
 		return _markers;
 	}
+	
+	/**
+	 * Store the singleton for the MarkerManager. This approach is used to avoid having to synchronize the
+	 * MarkerManager.getDefault() method.
+	 * 
+	 * @author karasiuk
+	 *
+	 */
+	private static class Singleton {
+		static MarkerManager markerManager = new MarkerManager();
+	}
+
 
 }
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/Misc.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/Misc.java
index bf9beeb..ceafc41 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/Misc.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/Misc.java
@@ -29,7 +29,7 @@
  * @author karasiuk
  *
  */
-public class Misc {
+public final class Misc {
 	
 	public static void close(InputStream in){
 		if (in == null)return;
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/PreferencesWrapper.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/PreferencesWrapper.java
new file mode 100644
index 0000000..0f3a5e7
--- /dev/null
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/PreferencesWrapper.java
@@ -0,0 +1,431 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.validation.internal;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.wst.validation.ValidationFramework;
+import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
+import org.osgi.service.prefs.BackingStoreException;
+import org.osgi.service.prefs.Preferences;
+
+/**
+ * The subset of the IEclipsePreferences interface that the framework needs to
+ * be able to persist preferences.
+ * @author karasiuk
+ *
+ */
+public abstract class PreferencesWrapper {
+	
+	private static final WrapperManger _manager = new WrapperManger();
+	
+	/**
+	 * Answer the preferences for the project. If project is null answer the global preferences.
+	 * @param project
+	 * @param persistent if null the default preferences are returned, if True the persisted 
+	 * preferences are return and if False the transient preferences are returned.
+	 * @return
+	 */
+	public static PreferencesWrapper getPreferences(IProject project, Boolean persistent){
+		return _manager.get(project, persistent);
+	}
+		
+	/**
+	 * These are the names of the node entries.
+	 * @return
+	 * @throws BackingStoreException
+	 */
+	public abstract String[] childrenNames() throws BackingStoreException;
+	
+	public void flush() throws BackingStoreException {
+	}
+	
+	public abstract boolean getBoolean(String key, boolean def);
+	
+	public abstract String get(String key, String def);
+	
+	public abstract int getInt(String key, int def);
+	
+	public abstract long getLong(String key, long def);
+
+	public abstract String[] keys() throws BackingStoreException;
+
+	public boolean isPersistent(){
+		return false;
+	}
+
+	public boolean isTransient(){
+		return false;
+	}
+	
+	public abstract void put(String key, String value);
+	
+	public abstract void putBoolean(String key, boolean value);
+	
+	public abstract void putLong(String key, long value);
+	
+	public abstract void putInt(String key, int value);
+	
+	/**
+	 * Unlike the more sophisticated org.osgi.service.prefs.Preferences support, 
+	 * this is currently limited to simple node names.
+	 */
+	public abstract PreferencesWrapper node(String nodeName);
+	
+	public abstract boolean nodeExists();
+	
+	public abstract boolean nodeExists(String pathName)  throws BackingStoreException;
+	
+	public abstract void removeNode()  throws BackingStoreException;
+
+
+public final static class PreferencesWrapperPersistent extends PreferencesWrapper {
+	
+	private final Preferences _preferences;
+	
+	public PreferencesWrapperPersistent(Preferences preferences){
+		_preferences = preferences;
+	}
+	
+	@Override
+	public String[] childrenNames() throws BackingStoreException {
+		return _preferences.childrenNames();
+	}
+	
+	public void flush() throws BackingStoreException {
+		_preferences.flush();
+	}
+	
+	@Override
+	public String get(String key, String def) {
+		return _preferences.get(key, def);
+	}
+	
+	@Override
+	public boolean getBoolean(String key, boolean def) {
+		return _preferences.getBoolean(key, def);
+	}
+	
+	@Override
+	public int getInt(String key, int def) {
+		return _preferences.getInt(key, def);
+	}
+	
+	@Override
+	public long getLong(String key, long def) {
+		return _preferences.getLong(key, def);
+	}
+	
+	@Override
+	public String[] keys() throws BackingStoreException {
+		return _preferences.keys();
+	}
+	
+	@Override
+	public boolean isPersistent() {
+		return true;
+	}
+	
+	@Override
+	public void put(String key, String value) {
+		_preferences.put(key, value);
+	}
+	
+	@Override
+	public PreferencesWrapper node(String path) {
+		Preferences prefs = _preferences.node(path);
+		return new PreferencesWrapperPersistent(prefs);
+	}
+	
+	@Override
+	public boolean nodeExists() {
+		try {
+			return nodeExists(""); //$NON-NLS-1$
+		}
+		catch (BackingStoreException e){
+		
+		}
+		return false;
+	}
+	
+	@Override
+	public boolean nodeExists(String pathName) throws BackingStoreException  {
+		return _preferences.nodeExists(pathName);
+	}
+	
+	public void putBoolean(String key, boolean value) {
+		_preferences.putBoolean(key, value);	
+	}
+	
+	public void putLong(String key, long value){
+		_preferences.putLong(key, value);
+	}
+	
+	@Override
+	public void putInt(String key, int value) {
+		_preferences.putInt(key, value);
+	}
+	
+	@Override
+	public void removeNode() throws BackingStoreException {
+		_preferences.removeNode();
+	}
+}
+
+public final static class PreferencesWrapperTransient extends PreferencesWrapper {
+	
+	private final PreferencesWrapperTransient _parent;
+	private final Map<String, String> _children = Collections.synchronizedMap(new HashMap<String, String>(10));
+	private final Map<String, PreferencesWrapperTransient> _nodes = Collections.synchronizedMap(new HashMap<String, PreferencesWrapperTransient>(10));
+	
+	public PreferencesWrapperTransient(PreferencesWrapperTransient parent){
+		_parent = parent;
+	}
+	
+	public PreferencesWrapperTransient(PreferencesWrapper pw, PreferencesWrapperTransient parent) {
+		_parent = parent;
+		try {
+			for (String key : pw.keys()){
+				put(key, pw.get(key, null));
+			}
+			
+			
+			for (String nodeName : pw.childrenNames()){
+				PreferencesWrapper p = pw.node(nodeName);
+				PreferencesWrapperTransient pwt = new PreferencesWrapperTransient(p, this);
+				_nodes.put(nodeName, pwt);
+			}
+		}
+		catch (BackingStoreException e){
+			
+		}
+	}
+
+	@Override
+	public String[] childrenNames() throws BackingStoreException {
+		Set<String> keys = _nodes.keySet();
+		String names[] = new String[keys.size()];
+		keys.toArray(names);
+		return names;
+	}
+	
+	@Override
+	public String get(String key, String def) {
+		String value = _children.get(key);
+		if (value != null)return value;
+		return def;
+	}
+	
+	@Override
+	public boolean getBoolean(String key, boolean def) {
+		String value = _children.get(key);
+		if (value == null)return def;
+		value = value.toLowerCase();
+		if ("true".equals(value))return true; //$NON-NLS-1$
+		if ("false".equals(value))return false; //$NON-NLS-1$
+		return def;
+	}
+	
+	@Override
+	public int getInt(String key, int def) {
+		String value = _children.get(key);
+		if (value == null)return def;
+		try {
+			return Integer.parseInt(value);
+		}
+		catch (NumberFormatException e){
+		}
+		return def;
+	}
+	
+	@Override
+	public long getLong(String key, long def) {
+		String value = _children.get(key);
+		if (value == null)return def;
+		try {
+			return Long.parseLong(value);
+		}
+		catch (NumberFormatException e){
+		}
+		return def;
+	}
+	
+	@Override
+	public boolean isTransient() {
+		return true;
+	}
+	
+	@Override
+	public synchronized String[] keys() throws BackingStoreException {
+		String[] keys = new String[_children.size()];
+		_children.keySet().toArray(keys);
+		return keys;
+	}
+	
+	@Override
+	public synchronized PreferencesWrapper node(String name) {
+		PreferencesWrapperTransient pw  = _nodes.get(name);
+		if (pw != null)return pw;
+		pw = new PreferencesWrapperTransient(this);
+		_nodes.put(name, pw);
+		return pw;
+	}
+	
+	@Override
+	public boolean nodeExists() {
+		return true;
+	}
+	
+	@Override
+	public boolean nodeExists(String key) throws BackingStoreException {
+		PreferencesWrapperTransient pw = _nodes.get(key);
+		if (pw != null)return true;
+		return false;
+	}
+	
+	@Override
+	public void put(String key, String value) {
+		_children.put(key, value);
+	}
+	
+	@Override
+	public void putBoolean(String key, boolean bool) {
+		String value = bool ? "true" : "false";  //$NON-NLS-1$//$NON-NLS-2$
+		_children.put(key, value);
+	}
+	
+	@Override
+	public void putInt(String key, int value) {
+		_children.put(key, String.valueOf(value));
+	}
+	
+	@Override
+	public void putLong(String key, long value) {
+		_children.put(key, String.valueOf(value));
+	}
+	
+	@Override
+	public void removeNode() throws BackingStoreException {
+		if (_parent == null)return;
+		_parent.removeNode(this);
+	}
+	
+	private synchronized void removeNode(PreferencesWrapperTransient node){
+		String key = null;
+		for (Map.Entry<String, PreferencesWrapperTransient> me : _nodes.entrySet()){
+			if (me.getValue().equals(node)){
+				key = me.getKey();
+				break;
+			}
+		}
+		if (key != null)_nodes.remove(key);
+	}
+}
+
+private final static class WrapperManger implements IProjectChangeListener {
+	
+	private final Map<IProject, PreferencesWrapper> _map = new HashMap<IProject, PreferencesWrapper>(20); 
+	private final AtomicReference<PreferencesWrapper> _global = new AtomicReference<PreferencesWrapper>();
+	
+	private WrapperManger(){
+		EventManager.getManager().addProjectChangeListener(this);
+	}
+	
+	/**
+	 * Currently this object never goes away, but if that was ever to change then we would need to dispose it.
+	 */
+	@Override
+	protected void finalize() throws Throwable {
+		dispose();
+	}
+	
+	public void dispose(){
+		EventManager.getManager().removeProjectChangeListener(this);
+	}
+
+	public PreferencesWrapper get(IProject project, Boolean persistent) {
+		if (project == null)return globalPreferences(persistent);
+		PreferencesWrapper pw = null;
+		synchronized(_map){
+			pw = _map.get(project);
+		}
+		
+		if (pw != null && (persistent == null || persistent == pw.isPersistent()))return pw;
+		
+		if (pw == null)pw = new PreferencesWrapperPersistent(ValidationPlugin.getPreferences(project));
+		if (persistent != null && persistent && pw.isTransient())pw = new PreferencesWrapperPersistent(ValidationPlugin.getPreferences(project));
+		if (persistent != null && !persistent && pw.isPersistent())pw = new PreferencesWrapperTransient(pw, null);
+		
+		synchronized(_map){
+			_map.put(project, pw);
+		}
+		
+		return pw;
+	}
+
+	/**
+		 * Answer the appropriate global preferences.
+		 * 
+		 * @param persistent
+		 *            If null then answer the current saved global preferences,
+		 *            creating a new persistent one if there is none. If True,
+		 *            then ensure that the preferences are persistent. If False,
+		 *            ensure that the preferences are transient.
+		 * @return
+		 */
+	private PreferencesWrapper globalPreferences(Boolean persistent) {
+		PreferencesWrapper pw = _global.get();
+		
+		while(pw == null){
+			PreferencesWrapper newPW = createGlobal(persistent);
+			if (_global.compareAndSet(null, newPW))pw = newPW;
+			else pw = _global.get();
+		}
+		
+		while (persistent != null && !persistent && !pw.isTransient()){
+			PreferencesWrapper newPW = new PreferencesWrapperTransient(pw, null);
+			if (_global.compareAndSet(pw, newPW))pw = newPW;
+			else pw = _global.get();
+		}
+		
+		while (persistent != null && persistent && !pw.isPersistent()){
+			PreferencesWrapper newPW = new PreferencesWrapperPersistent(ValidationFramework.getDefault().getPreferenceStore());
+			if (_global.compareAndSet(pw, newPW))pw = newPW;
+			else pw = _global.get();			
+		}
+		return pw;
+	}
+	
+	private PreferencesWrapper createGlobal(Boolean persistent){
+		PreferencesWrapper pw = new PreferencesWrapperPersistent(ValidationFramework.getDefault().getPreferenceStore());
+		if (persistent == null || persistent)return pw;
+		return new PreferencesWrapperTransient(pw, null);
+	}
+
+	public void projectChanged(IProject project, int type) {
+		int interested = IProjectChangeListener.ProjectClosed | IProjectChangeListener.ProjectDeleted;
+		if ((type & interested) != 0){
+			synchronized (_map) {
+				_map.remove(project);
+			}
+		}
+		
+	}
+	
+}
+
+
+}
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/Tracing.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/Tracing.java
index cb7dded..77e49cb 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/Tracing.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/Tracing.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
+ * Copyright (c) 2005, 2009 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
@@ -14,6 +14,9 @@
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
 
@@ -22,41 +25,73 @@
  * @author karasiuk
  *
  */
-public class Tracing {
+public final class Tracing {
 	
-	private static DateFormat 	_df = new SimpleDateFormat("HH:mm:ss.SSSS"); //$NON-NLS-1$
-	private static boolean		_forceLogging;
-	private static Boolean		_traceMatches;
-	private static Boolean		_traceV1;
-	private static String		_extraValDetail;
+	private final static DateFormat _df = new SimpleDateFormat("HH:mm:ss.SSSS"); //$NON-NLS-1$
+	private final static boolean	_isLogging = ValidationPlugin.getPlugin().isDebugging();
+	private final static boolean	_traceMatches = Misc.debugOptionAsBoolean(DebugConstants.TraceMatches);
+	private final static boolean	_traceV1 = Misc.debugOptionAsBoolean(DebugConstants.TraceV1);
+	private final static String		_extraValDetail = Platform.getDebugOption(DebugConstants.ExtraValDetail);
+	private final static int 		_tracingLevel;
+	
+	private final static String		_filter = Platform.getDebugOption(DebugConstants.FilterAllExcept);
+	
+	static {
+		String traceLevel = Platform.getDebugOption(DebugConstants.TraceLevel);
+		int level = 0;
+		if (traceLevel != null){
+			try {
+				level = Integer.parseInt(traceLevel);
+			}
+			catch (Exception e){
+			}
+		}
+		_tracingLevel = level;
+	}
+	
+	/**
+	 * Answer true if the filters allow this validator to be enabled. Normally this method will answer true.
+	 * It is only when filters are activated via the debugging options, that this method might return false.
+	 * This is used to aid in debugging by making it look like only one validator has been registered.
+	 * 
+	 * @param validatorId the validator id.
+	 * @return true if the validator should be registered via an extension point.
+	 */
+	public static boolean isEnabled(String validatorId){
+		if (_filter == null || _filter.length() == 0)return true;
+		return (_filter.equals(validatorId));		
+	}
 	
 	/**
 	 * Are we in logging/debugging mode?
 	 */
 	public static boolean isLogging(){
-		return _forceLogging || ValidationPlugin.getPlugin().isDebugging();
+		return _isLogging;
+	}
+	
+	/**
+	 * Answer true if we are in logging mode, and if the current logging level is greater than or
+	 * equal to level.
+	 * @param level The logging level that we are testing. The higher the level the more verbose
+	 * the tracing.
+	 */
+	public static boolean isLogging(int level){
+		if (_isLogging){
+			return _tracingLevel >= level;
+		}
+		return false;
 	}
 	
 	public static boolean isTraceMatches(){
-		if (_traceMatches == null){
-			_traceMatches = Misc.debugOptionAsBoolean(DebugConstants.TraceMatches);
-		}
 		return _traceMatches;
 	}
 	
 	public static boolean isTraceV1(){
-		if (_traceV1 == null){
-			_traceV1 = Misc.debugOptionAsBoolean(DebugConstants.TraceV1);
-		}
 		return _traceV1;
 	}
 	
 	public static boolean matchesExtraDetail(String validatorId){
-		if (_extraValDetail == null){
-			_extraValDetail = Platform.getDebugOption(DebugConstants.ExtraValDetail);
-			if (_extraValDetail == null)_extraValDetail = ""; //$NON-NLS-1$
-		}
-		if (_extraValDetail.length() == 0)return false;
+		if (_extraValDetail == null)return false;
 		return _extraValDetail.equals(validatorId);
 	}
 
@@ -86,7 +121,7 @@
 
 	public static String timestampIt(String line){
 		Date date = new Date();
-		long thread = Thread.currentThread().getId();
+		String thread = Thread.currentThread().getName();
 		return _df.format(date) + " " + thread + " " + line;  //$NON-NLS-1$//$NON-NLS-2$		
 	}
 
@@ -99,14 +134,75 @@
 	}
 
 	/**
-	 * Force the logging to be turned on. Normally logging is turned on via -debug options. However
-	 * the logging can be forced to be on by setting this to true. (Setting this to false doesn't force
-	 * the logging to be turned off).
+	 * This method doesn't do anything, and will be removed.
 	 * 
-	 * @param forceLogging
+	 * @deprecated
 	 */
 	public static void setForceLogging(boolean forceLogging) {
-		_forceLogging = forceLogging;
+	}
+	
+	/**
+	 * Log up to maxNumber deltas to the log.
+	 * @param delta The deltas to log.
+	 * @param maxNumber The maximum number of deltas to log.
+	 */
+	public static void logResourceDeltas(IResourceDelta delta, int maxNumber){
+		if (!isLogging())return;
+		if (delta == null)Tracing.log("  ResourceDelta: null"); //$NON-NLS-1$
+		else {
+			DeltaLogger logger = new DeltaLogger(maxNumber);
+			try {
+				delta.accept(logger);
+				if (logger.getCount() == 0)Tracing.log("  ResourceDelta: no deltas"); //$NON-NLS-1$
+			}
+			catch (CoreException e){
+				// eat it
+			}
+		}
+	}
+	
+	/**
+	 * A debugging class that prints out some resource delta's.
+	 * @author karasiuk
+	 *
+	 */
+	private final static class DeltaLogger implements IResourceDeltaVisitor {
+		
+		private final int 	_max;
+		private int 		_count;
+		public int getCount() {
+			return _count;
+		}
+
+		private StringBuffer _b = new StringBuffer(200);
+		
+		public DeltaLogger(int max){
+			_max = max;
+		}
+
+		public boolean visit(IResourceDelta delta) throws CoreException {
+			if (_count++ > _max)return false;
+			int kind = delta.getKind();
+			String type = "unknown"; //$NON-NLS-1$
+			switch (kind){
+			case IResourceDelta.ADDED:
+				type = "Added"; //$NON-NLS-1$
+				break;
+			case IResourceDelta.CHANGED:
+				type = "Changed"; //$NON-NLS-1$
+				break;
+			case IResourceDelta.REMOVED:
+				type = "Removed"; //$NON-NLS-1$
+				break;				
+			}
+			_b.append("  ResourceDelta "); //$NON-NLS-1$
+			_b.append(type);
+			_b.append(' ');
+			_b.append(delta.getResource());
+			Tracing.log(_b);
+			return true;
+		}
+		
 	}
 
 }
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValBuilderJob.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValBuilderJob.java
index b8be3ac..9fd45a7 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValBuilderJob.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValBuilderJob.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
+ * Copyright (c) 2007, 2010 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
@@ -10,6 +10,7 @@
  *******************************************************************************/
 package org.eclipse.wst.validation.internal;
 
+import java.text.MessageFormat;
 import java.util.LinkedList;
 import java.util.Queue;
 
@@ -30,8 +31,11 @@
 import org.eclipse.wst.validation.DependentResource;
 import org.eclipse.wst.validation.Friend;
 import org.eclipse.wst.validation.IDependencyIndex;
+import org.eclipse.wst.validation.ValidationEvent;
 import org.eclipse.wst.validation.ValidationFramework;
 import org.eclipse.wst.validation.ValidationState;
+import org.eclipse.wst.validation.Validator;
+import org.eclipse.wst.validation.internal.model.IValidatorVisitor;
 import org.eclipse.wst.validation.internal.operations.ValidationBuilder;
 import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
 
@@ -41,27 +45,23 @@
  * <p>
  * This is the main class for supporting build based validation. When triggered it looks at all of the
  * resource changes and determines what needs to be validated. 
+ * </p>
  * @author karasiuk
  *
  */
-public class ValBuilderJob extends WorkspaceJob implements IResourceDeltaVisitor, IResourceVisitor {
+public final class ValBuilderJob extends WorkspaceJob {
 	
 	private static ValBuilderJob _job;
 	private static Queue<ValidationRequest> _work = new LinkedList<ValidationRequest>();
 	
-	/** The monitor to use while running the build. */
-	private IProgressMonitor	_monitor;
-	
-	private SubMonitor			_subMonitor;
-	
-	private ValidationRequest	_request;
-	
+	private final ValOperation _operation = new ValOperation();
+		
 	/** The types of changes we are interested in. */
 	private final static int	InterestedFlags = IResourceDelta.CONTENT | IResourceDelta.ENCODING |
 		IResourceDelta.MOVED_FROM | IResourceDelta.MOVED_TO;
 	
-	public static synchronized void validateProject(IProject project, IResourceDelta delta, int buildKind, ValOperation operation){
-		ValidationRequest request = new ValidationRequest(project, delta, buildKind, operation);
+	public static synchronized void validateProject(IProject project, IResourceDelta delta, int buildKind){
+		ValidationRequest request = new ValidationRequest(project, delta, buildKind);
 		if (_job == null){
 			_job = new ValBuilderJob();
 			_job.add(request);
@@ -104,6 +104,7 @@
 		_work.add(request);
 	}
 	
+	@Override
 	public boolean belongsTo(Object family) {
 		if (family == ResourcesPlugin.FAMILY_MANUAL_BUILD)return true;
 		if (family == ValidationBuilder.FAMILY_VALIDATION_JOB){
@@ -113,26 +114,70 @@
 		return super.belongsTo(family);
 	}
 
+	@Override
 	public IStatus runInWorkspace(IProgressMonitor monitor) {
 		Tracing.log("ValBuilderJob-01: Starting"); //$NON-NLS-1$
-		_monitor = monitor;
 		
-		ValidationRequest request = getRequest();
-		while(request != null){
-			_request = request;
-			run();
-			request = getRequest();
+		try {
+			startingValidation(monitor);
+			
+			ValidationRequest request = getRequest();
+			while(request != null){
+				run(request, monitor);
+				request = getRequest();
+			}
+		}
+		finally {
+			finishingValidation(monitor);
 		}
 		
 		Tracing.log("ValBuilderJob-02: Finished"); //$NON-NLS-1$
 		return Status.OK_STATUS;
 	}
+
+	private void startingValidation(IProgressMonitor monitor) {
+        IValidatorVisitor startingVisitor = new IValidatorVisitor(){
+
+            public void visit(Validator validator, IProject project, ValType valType, 
+                ValOperation operation, IProgressMonitor monitor) {
+                
+                validator.validationStarting(project, operation.getState(), monitor);                   
+            }               
+        };
+
+        ValManager.getDefault().accept(startingVisitor, null, ValType.Build, getOperation(), monitor);
+	}
 	
-	private void run(){
-		setName(ValMessages.JobName + " " + _request.getProject().getName()); //$NON-NLS-1$
+	private void finishingValidation(IProgressMonitor monitor) {
+		
+		IValidatorVisitor finishedVisitor = new IValidatorVisitor(){
+
+		    public void visit(Validator validator, IProject project, ValType valType,
+		      ValOperation operation, IProgressMonitor monitor) {
+
+		      validator.validationFinishing(project, operation.getState(), monitor);              
+		    }           
+		  };
+		  ValManager.getDefault().accept(finishedVisitor, null, ValType.Build, getOperation(), monitor);
+	}
+
+	private void run(ValidationRequest request, IProgressMonitor monitor){
+		setName(MessageFormat.format(ValMessages.JobNameWithProjectName,new Object[] { request.getProject().getName() })); 
 		try {		
-			if (_request.getDelta() == null)fullBuild();
-			else deltaBuild();
+	        IValidatorVisitor startingVisitor = new IValidatorVisitor(){
+
+	            public void visit(Validator validator, IProject project, ValType valType, 
+	                ValOperation operation, IProgressMonitor monitor) {
+	                
+	                validator.validationStarting(project, operation.getState(), monitor);                   
+	            }               
+	        };
+
+	        ValManager.getDefault().accept(startingVisitor, request.getProject(), ValType.Build, getOperation(), monitor);
+		  
+			if (request.getDelta() == null)fullBuild(request, monitor);
+			else deltaBuild(request, monitor);
+
 			
 		}
 		catch (ProjectUnavailableError e){
@@ -144,72 +189,42 @@
 		catch (CoreException e){
 			ValidationPlugin.getPlugin().handleException(e);
 		}
+		finally {
+		  IValidatorVisitor finishedVisitor = new IValidatorVisitor(){
+
+		    public void visit(Validator validator, IProject project, ValType valType,
+		      ValOperation operation, IProgressMonitor monitor) {
+
+		      validator.validationFinishing(project, operation.getState(), monitor);              
+		    }           
+		  };
+          ValManager.getDefault().accept(finishedVisitor, request.getProject(), ValType.Build, getOperation(), monitor);
+		}
 		
 	}
 
-	private void deltaBuild() throws CoreException {
+	private void deltaBuild(ValidationRequest request, IProgressMonitor monitor) throws CoreException {
 		ResourceCounter counter = new ResourceCounter();
-		_request.getDelta().accept(counter);
-		_subMonitor = SubMonitor.convert(_monitor, counter.getCount());
-		_request.getDelta().accept(this);		
+		request.getDelta().accept(counter);
+		SubMonitor subMonitor = SubMonitor.convert(monitor, counter.getCount());
+		Visitor vistitor = new Visitor(request, subMonitor, monitor, getOperation());
+		request.getDelta().accept(vistitor);		
 	}
 
-	private void fullBuild() throws CoreException {
+	private void fullBuild(ValidationRequest request, IProgressMonitor monitor) throws CoreException {
 		ResourceCounter counter = new ResourceCounter();
-		_request.getProject().accept(counter, 0);
-		_subMonitor = SubMonitor.convert(_monitor, counter.getCount());
-		_request.getProject().accept(this);
+		request.getProject().accept(counter, 0);
+		SubMonitor subMonitor = SubMonitor.convert(monitor, counter.getCount());
+		Visitor vistitor = new Visitor(request, subMonitor, monitor, getOperation());
+		request.getProject().accept(vistitor);
 		
 	}
-
-	public boolean visit(IResourceDelta delta) throws CoreException {
-		IResource resource = delta.getResource();
-		if (DisabledResourceManager.getDefault().isDisabled(resource)){
-			MarkerManager.getDefault().deleteMarkers(resource, _request.getOperation().getStarted(), IResource.DEPTH_INFINITE);
-			return false;
-		}
-		int kind = delta.getKind();
-		boolean isChanged = (kind & IResourceDelta.CHANGED) != 0;
-		if (isChanged &&  (delta.getFlags() & InterestedFlags) == 0)return true;
-		
-		if ((kind & (IResourceDelta.ADDED | IResourceDelta.CHANGED)) != 0){
-			ValManager.getDefault().validate(_request.getProject(), resource, delta.getKind(), ValType.Build, 
-				_request.getBuildKind(), _request.getOperation(), _subMonitor.newChild(1));
-		}
-				
-		IDependencyIndex index = ValidationFramework.getDefault().getDependencyIndex();
-		if (index.isDependedOn(resource)){
-			MarkerManager mm = MarkerManager.getDefault();
-			for (DependentResource dr : index.get(resource)){
-				if (Friend.shouldValidate(dr.getValidator(), dr.getResource(), ValType.Build, new ContentTypeWrapper())){
-					mm.clearMarker(dr.getResource(), dr.getValidator()); 
-					_request.getOperation().getState().put(ValidationState.TriggerResource, resource);
-					ValManager.getDefault().validate(dr.getValidator(), _request.getOperation(), dr.getResource(), 
-						IResourceDelta.NO_CHANGE, _monitor);
-				}
-			}
-		}
-				
-		return true;
-	}
-
-	public boolean visit(IResource resource) throws CoreException {
-		try {
-			if (DisabledResourceManager.getDefault().isDisabled(resource)){
-				MarkerManager.getDefault().deleteMarkers(resource, _request.getOperation().getStarted(), IResource.DEPTH_INFINITE);
-				return false;
-			}
-			ValManager.getDefault().validate(_request.getProject(), resource, IResourceDelta.NO_CHANGE, ValType.Build, 
-				_request.getBuildKind(), _request.getOperation(), _subMonitor.newChild(1));
-		}
-		catch (ResourceUnavailableError e){
-			if (Tracing.isLogging())Tracing.log("ValBuilderJob-02: " + e.toString()); //$NON-NLS-1$
-			return false;
-		}
-		return true;
-	}
 	
-	static class ResourceCounter implements IResourceProxyVisitor, IResourceDeltaVisitor {
+	private ValOperation getOperation(){
+		return _operation;
+	}
+
+	static final class ResourceCounter implements IResourceProxyVisitor, IResourceDeltaVisitor {
 		
 		private int _count;
 
@@ -228,27 +243,24 @@
 		}		
 	}
 	
-	static class ValidationRequest {
+	static final class ValidationRequest {
 		/** The project that is being built. */
-		private IProject 			_project;
+		private final IProject 			_project;
 		
 		/** The resource delta that triggered the build, it will be null for a full build. */
-		private IResourceDelta		_delta;
-		
-		private ValOperation		_operation;
+		private final IResourceDelta	_delta;
 		
 		/** 
 		 * The kind of build.
 		 * 
 		 *  @see org.eclipse.core.resources.IncrementalProjectBuilder
 		 */
-		private int					_buildKind;
+		private final int					_buildKind;
 		
-		public ValidationRequest(IProject project, IResourceDelta delta, int buildKind, ValOperation operation){
+		public ValidationRequest(IProject project, IResourceDelta delta, int buildKind){
 			_project = project;
 			_delta = delta;
 			_buildKind = buildKind;
-			_operation = operation;
 		}
 
 		public IProject getProject() {
@@ -259,13 +271,76 @@
 			return _delta;
 		}
 
-		public ValOperation getOperation() {
-			return _operation;
-		}
-
 		public int getBuildKind() {
 			return _buildKind;
 		}
 	}
+	
+	private final static class Visitor implements IResourceDeltaVisitor, IResourceVisitor{
+		
+		private final ValidationRequest 	_request;
+		private final SubMonitor 			_subMonitor;
+		private final IProgressMonitor 		_monitor;
+		private final ValOperation			_operation;
+		
+		public Visitor(ValidationRequest request, SubMonitor subMonitor, IProgressMonitor monitor, ValOperation operation){
+			_request = request;
+			_subMonitor = subMonitor;
+			_monitor = monitor;
+			_operation = operation;
+		}
+		
+		public boolean visit(IResource resource) throws CoreException {
+			try {
+				if (DisabledResourceManager.getDefault().isDisabled(resource)){
+					MarkerManager.getDefault().deleteMarkers(resource, _operation.getStarted(), IResource.DEPTH_INFINITE);
+					return false;
+				}
+				ValManager.getDefault().validate(_request.getProject(), resource, IResourceDelta.NO_CHANGE, ValType.Build, 
+					_request.getBuildKind(), _operation, _subMonitor.newChild(1));
+			}
+			catch (ResourceUnavailableError e){
+				if (Tracing.isLogging())Tracing.log("ValBuilderJob-02: " + e.toString()); //$NON-NLS-1$
+				return false;
+			}
+			return true;
+		}
+		
+		@SuppressWarnings("deprecation")
+		public boolean visit(IResourceDelta delta) throws CoreException {
+			IResource resource = delta.getResource();
+			if (DisabledResourceManager.getDefault().isDisabled(resource)){
+				MarkerManager.getDefault().deleteMarkers(resource, _operation.getStarted(), IResource.DEPTH_INFINITE);
+				return false;
+			}
+			int kind = delta.getKind();
+			boolean isChanged = (kind & IResourceDelta.CHANGED) != 0;
+			if (isChanged &&  (delta.getFlags() & InterestedFlags) == 0)return true;
+			
+			if ((kind & (IResourceDelta.ADDED | IResourceDelta.CHANGED)) != 0){
+				ValManager.getDefault().validate(_request.getProject(), resource, delta.getKind(), ValType.Build, 
+					_request.getBuildKind(), _operation, _subMonitor.newChild(1));
+			}
+					
+			IDependencyIndex index = ValidationFramework.getDefault().getDependencyIndex();
+			if (index.isDependedOn(resource)){
+				MarkerManager mm = MarkerManager.getDefault();
+				for (DependentResource dr : index.get(resource)){
+					Validator val = dr.getValidator();
+					if (Friend.shouldValidate(val, dr.getResource(), ValType.Build, new ContentTypeWrapper())){
+						_operation.getState().put(ValidationState.TriggerResource, resource);
+						ValidationEvent event = new ValidationEvent(dr.getResource(), IResourceDelta.NO_CHANGE, delta);
+						if (val.shouldClearMarkers(event))mm.clearMarker(dr.getResource(), val); 
+						ValManager.getDefault().validate(val, _operation, dr.getResource(), 
+							IResourceDelta.NO_CHANGE, _monitor, event);
+					}
+				}
+			}
+					
+			return true;
+		}
+
+		
+	}
 
 }
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValManager.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValManager.java
index 92c0bae..a46fdf4 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValManager.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValManager.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
+ * Copyright (c) 2007, 2010 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
@@ -20,10 +20,15 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
 
 import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceStatus;
 import org.eclipse.core.resources.IResourceVisitor;
 import org.eclipse.core.resources.IWorkspaceRoot;
 import org.eclipse.core.resources.ResourcesPlugin;
@@ -43,13 +48,16 @@
 import org.eclipse.wst.validation.IPerformanceMonitor;
 import org.eclipse.wst.validation.IValidatorGroupListener;
 import org.eclipse.wst.validation.PerformanceCounters;
+import org.eclipse.wst.validation.ValidationEvent;
 import org.eclipse.wst.validation.ValidationFramework;
 import org.eclipse.wst.validation.ValidationResult;
 import org.eclipse.wst.validation.ValidationState;
 import org.eclipse.wst.validation.Validator;
 import org.eclipse.wst.validation.internal.model.GlobalPreferences;
+import org.eclipse.wst.validation.internal.model.GlobalPreferencesValues;
 import org.eclipse.wst.validation.internal.model.IValidatorVisitor;
 import org.eclipse.wst.validation.internal.model.ProjectPreferences;
+import org.eclipse.wst.validation.internal.operations.ManualValidatorsOperation;
 import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
 import org.osgi.service.prefs.BackingStoreException;
 
@@ -58,36 +66,34 @@
  * @author karasiuk
  *
  */
-public class ValManager implements IValChangedListener, IFacetedProjectListener, IProjectChangeListener {
+public final class ValManager implements IValChangedListener, IFacetedProjectListener, IProjectChangeListener {
 	
-	private static ValManager _me;
-		
 	/**
 	 * Projects may be allowed to override the global validation settings. If that is the case then those
 	 * project specific settings are saved here. If the key exists, but the value is null, then that
 	 * means that the project has been checked and it does not have any specific settings.
 	 */
-	private Map<IProject, ProjectPreferences> _projectPreferences = 
+	private final Map<IProject, ProjectPreferences> _projectPreferences = 
 		Collections.synchronizedMap(new HashMap<IProject, ProjectPreferences>(50));
 	
-	private GlobalPreferences _globalPreferences;
+	private final AtomicReference<GlobalPreferences> _globalPreferences = new AtomicReference<GlobalPreferences>();
 		
 	/**
 	 * This number increases each time any of the validation configurations change. It is used to determine
 	 * if information that we have cached in the ValProperty is stale or not. This starts off at zero, each time
 	 * the workbench is started.
 	 */
-	private int _configNumber;
-	private ValidatorIdManager _idManager = new ValidatorIdManager();
+	private final AtomicInteger _configNumber = new AtomicInteger();
 	
-	private ValidatorProjectManager _projectManager = new ValidatorProjectManager();
-	
+	private final ValidatorIdManager _idManager = new ValidatorIdManager();
+	private final ValidatorCache 	_cache = new ValidatorCache();
+		
 	private static final QualifiedName StatusBuild = new QualifiedName(ValidationPlugin.PLUGIN_ID, "sb"); //$NON-NLS-1$
 	private static final QualifiedName StatusManual = new QualifiedName(ValidationPlugin.PLUGIN_ID, "sm"); //$NON-NLS-1$
-			
-	public static synchronized ValManager getDefault(){
-		if (_me == null)_me = new ValManager();
-		return _me;
+
+	
+	public static ValManager getDefault(){
+		return Singleton.valManager;
 	}
 	
 	private ValManager(){
@@ -115,7 +121,7 @@
 	 * Because if you make changes to the original validators, and since we only save differences,
 	 * there won't be any differences. 
 	 * 
-	 * @return Answer an empty array if there are no validators.
+	 * @return Answer the validators in name sorted order. Answer an empty array if there are no validators.
 	 * 
 	 * @see #getValidatorsCopy()
 	 */
@@ -137,23 +143,6 @@
 	}
 	
 	/**
-	 * Answer all the validators that are in effect for the given project.
-	 * <p>
-	 * Individual projects may override the global validation preference settings. If this is allowed and if
-	 * the project has it's own settings, then those validators are returned via this method.
-	 * </p>
-	 * <p>
-	 * The following approach is used. For version 1 validators, the validator is only returned if it
-	 * is defined to operate on this project type. This is the way that the previous version of the framework
-	 * did it. For version 2 validators, they are all returned.
-	 * </p>
-	 * @param project this may be null, in which case the global preferences are returned.
-	 */
-	public Validator[] getValidators(IProject project) throws ProjectUnavailableError {
-		return getValidators(project, true);
-	}
-	
-	/**
 	 * Answer all the validators for the given project.
 	 * <p>
 	 * Individual projects may override the global validation preference
@@ -176,17 +165,80 @@
 	 *            preferences do not allow project overrides then none of the
 	 *            project settings are used. Normal validation would set this to true.
 	 *            The properties page would set this to false.
+	 *            
+	 * @deprecated Use {@link #getValidatorsNotCached(IProject)} instead            
 	 */
-	public synchronized Validator[] getValidators(IProject project, boolean respectOverrideSettings) throws ProjectUnavailableError {
-		Map<String,Validator> v2Vals = getV2Validators(project);
+	public Validator[] getValidators(IProject project, boolean respectOverrideSettings) throws ProjectUnavailableError {
+		return getValidators(project);
+	}
+	
+	/**
+	 * Answer a cached copy of the the validators for a given project. This is a front end method, 
+	 * for the getValidatorsNotCached() method.
+	 * <p>
+	 * Individual projects may override the global validation preference
+	 * settings. If the project has it's own settings, then those validators are
+	 * returned via this method.
+	 * </p>
+	 * <p>
+	 * The following approach is used. For version 1 validators, the validator
+	 * is only returned if it is defined to operate on this project type. This
+	 * is the way that the previous version of the framework did it. For version
+	 * 2 validators, they are all returned.
+	 * </p>
+	 * 
+	 * @param project
+	 *            This may be null, in which case the global preferences are
+	 *            returned.
+	 * 
+	 * @return The validators in name sorted order.
+	 */
+	public Validator[] getValidators(IProject project) throws ProjectUnavailableError {
+		return _cache.getValidatorsCached(project);
+	}
+	
+	/**
+	 * Answer all the validators for the given project.
+	 * <p>
+	 * Individual projects may override the global validation preference
+	 * settings. If the project has it's own settings, then those validators are
+	 * returned via this method.
+	 * </p>
+	 * <p>
+	 * The following approach is used. For version 1 validators, the validator
+	 * is only returned if it is defined to operate on this project type. This
+	 * is the way that the previous version of the framework did it. For version
+	 * 2 validators, they are all returned.
+	 * </p>
+	 * 
+	 * @param project
+	 *            This may be null, in which case the global preferences are
+	 *            returned.
+	 * 
+	 * @return The validators in name sorted order.
+	 */
+	private Validator[] getValidatorsNotCached(IProject project) throws ProjectUnavailableError {
+		Map<String,Validator> v2Vals = getV2Validators(project, UseProjectPreferences.Normal);
 		TreeSet<Validator> sorted = new TreeSet<Validator>();
-		for (Validator v : v2Vals.values())sorted.add(v);
+		sorted.addAll(v2Vals.values());
 		
 		try {
 			ValidationConfiguration vc = ConfigurationManager.getManager().getConfiguration(project);
-			for (ValidatorMetaData vmd : vc.getValidators()){
-				Validator v = Validator.create(vmd, vc, project);
-				sorted.add(v);
+			if (project == null){
+				// If the project is null we need to use this approach, since you can not use new ManualValidatorsOperation(null)
+				ValidatorMetaData[] vmds = vc.getValidators();
+				for (ValidatorMetaData vmd : vmds){
+					Validator v = Validator.create(vmd, vc, project);
+					sorted.add(v);
+				}
+			}
+			else {
+				ManualValidatorsOperation mvo = new ManualValidatorsOperation(project);
+				Set<ValidatorMetaData> vmds = mvo.getEnabledValidators();
+				for (ValidatorMetaData vmd : vmds){
+					Validator v = Validator.create(vmd, vc, project);
+					sorted.add(v);
+				}
 			}
 		}
 		catch (InvocationTargetException e){
@@ -197,31 +249,114 @@
 		sorted.toArray(vals);
 		return vals;
 	}
+	/**
+	 * Validators can use project level settings (Project natures and facets) to
+	 * determine if they are applicable to the project or not.
+	 * 
+	 * @param project
+	 *            The project that the configuration is based on.
+	 * @param mustUseProjectSettings
+	 *            Force the project properties to be used. There is a case where the user has toggled the
+	 *            Enable project specific settings checkbox in the dialog, but has not yet committed the
+	 *            changes. This allows that setting to be passed through.
+	 * @return The validators that are configured to run on this project based
+	 *         on the project level settings. These are the "live" validators, they are not copies.
+	 * @throws ProjectUnavailableError
+	 * 
+	 * @deprecated Use getValidatorsConfiguredForProject(IProject project, UseProjectPreferences useProject)
+	 */
+	public Validator[] getValidatorsConfiguredForProject(IProject project, boolean mustUseProjectSettings) throws ProjectUnavailableError {
+		UseProjectPreferences useProject = UseProjectPreferences.Normal;
+		return getValidatorsConfiguredForProject(project, useProject);
+	}
 	
 	/**
-	 * Answer the V2 validators that are in effect for this project. The following approach is used:
+	 * Validators can use project level settings (Project natures and facets) to
+	 * determine if they are applicable to the project or not.
+	 * 
+	 * @param project
+	 *            The project that the configuration is based on.
+	 * @param useProject
+	 *            Specifies how to use the project preferences. This can be used
+	 *            to force the project properties to be used. There is a case
+	 *            where the user has toggled the Enable project specific
+	 *            settings checkbox in the dialog, but has not yet committed the
+	 *            changes. This allows that setting to be passed through.
+	 * @return The validators that are configured to run on this project based
+	 *         on the project level settings. These are the "live" validators,
+	 *         they are not copies.
+	 * @throws ProjectUnavailableError
+	 */
+	public Validator[] getValidatorsConfiguredForProject(IProject project, UseProjectPreferences useProject) throws ProjectUnavailableError {
+		Map<String,Validator> v2Vals = getV2Validators(project, useProject);
+		TreeSet<Validator> sorted = new TreeSet<Validator>();
+		sorted.addAll(v2Vals.values());
+		
+		if (useProject == UseProjectPreferences.MustNotUse){
+			sorted.addAll(ExtensionValidators.instance().getV1Validators(project));
+		}
+		else {
+			try {
+				ValidationConfiguration vc = ConfigurationManager.getManager().getProjectConfiguration(project);
+				ValidatorMetaData[] vmds = vc.getValidators();
+				for (ValidatorMetaData vmd : vmds) {
+					Validator v = Validator.create(vmd, vc, project);
+					sorted.add(v);
+				}
+			}
+			catch (InvocationTargetException e){
+				ValidationPlugin.getPlugin().handleException(e);
+			}
+		}
+				
+		List<Validator> list = new LinkedList<Validator>();
+		for (Validator v : sorted){
+			if (v.shouldValidateProject(project, false, false))list.add(v);
+		}
+		
+		Validator[]vals = new Validator[list.size()];
+		list.toArray(vals);
+		return vals;
+	}
+	
+	/**
+	 * Answer the V2 validators that are in effect for this project. The
+	 * following approach is used:
 	 * <ol>
 	 * <li>The validators that are defined by the extension point are loaded.</li>
 	 * <li>They are customized by any global preferences.</li>
-	 * <li>If project customizations are allowed, they are customized by the project preferences.
+	 * <li>If project customizations are allowed, they are customized by the
+	 * project preferences.
 	 * </ol>
 	 * 
 	 * @param project
-	 *            This may be null, in which case only the global preferences are used.
+	 *            This may be null, in which case only the global preferences
+	 *            are used.
+	 * @param useProject
+	 *            Specifies how to use the project preferences. This can be used
+	 *            to force the project properties to be used. There is a case
+	 *            where the user has toggled the Enable project specific
+	 *            settings checkbox in the dialog, but has not yet committed the
+	 *            changes. This allows that setting to be passed through.
+	 *            
 	 * @return
 	 */
-	private Map<String,Validator> getV2Validators(IProject project){
+	private Map<String,Validator> getV2Validators(IProject project, UseProjectPreferences useProject){
 		Map<String,Validator> extVals = ExtensionValidators.instance().getMapV2Copy();
 		try {
 			List<Validator> vals = ValPrefManagerGlobal.getDefault().getValidators();
 			for (Validator v : vals)extVals.put(v.getId(), v);
 			
-			if (!mustUseGlobalValidators(project)){
-				//TODO should probably cache this vpm
-				ValPrefManagerProject vpm = new ValPrefManagerProject(project);
-				vals = vpm.getValidators(extVals);
-				for (Validator v : vals)extVals.put(v.getId(), v);
-			}		
+			if (useProject != UseProjectPreferences.MustNotUse){
+				if (useProject == UseProjectPreferences.MustUse || !mustUseGlobalValidators(project)){
+					//TODO should probably cache this vpm
+					ValPrefManagerProject vpm = new ValPrefManagerProject(project);
+					vals = vpm.getValidators(extVals);
+					for (Validator v : vals)extVals.put(v.getId(), v);
+					
+					for (Validator v : getProjectPreferences(project).getValidators())extVals.put(v.getId(), v);
+				}	
+			}
 		}
 		catch (BackingStoreException e){
 			ValidationPlugin.getPlugin().handleException(e);
@@ -240,14 +375,11 @@
 	public boolean mustUseGlobalValidators(IProject project){
 		if (project == null)return true;
 		if (!getGlobalPreferences().getOverride())return true;
-		ProjectPreferences pp = getProjectPreferences2(project);
-		if (pp == null){
-			ValPrefManagerProject vpm = new ValPrefManagerProject(project);
-			pp = new ProjectPreferences(project); 
-			vpm.loadProjectPreferencesShallow(pp);
-		}
+		ProjectPreferences pp = _projectPreferences.get(project);
+		if (pp != null)return !pp.getOverride();
 		
-		return !pp.getOverride();
+		ValPrefManagerProject vpm = new ValPrefManagerProject(project);
+		return !vpm.getOverride();
 	}
 	
 	/**
@@ -317,7 +449,7 @@
 		GlobalPreferences gp = getGlobalPreferences();
 		if (!gp.getOverride() || project == null)return gp.getDisableAllValidation();
 		
-		ProjectPreferences pp = getProjectPreferences2(project);
+		ProjectPreferences pp = _projectPreferences.get(project);
 		if (pp == null)return gp.getDisableAllValidation();
 		return pp.getSuspend();		
 	}
@@ -408,26 +540,46 @@
 	 * This method needs to be called whenever the validation configuration has changed.
 	 */
 	private void configHasChanged(){
-		_configNumber++;
-		_projectManager.reset();
+		_configNumber.incrementAndGet();
+		ValidatorProjectManager.reset();
+		_cache.reset();
 	}
 		
 	/**
 	 * Answer the global validation preferences.
 	 */
-	public synchronized GlobalPreferences getGlobalPreferences(){
-		GlobalPreferences gp = _globalPreferences;
+	public GlobalPreferences getGlobalPreferences(){
+		GlobalPreferences gp = _globalPreferences.get();
 		if (gp == null){
 			ValPrefManagerGlobal vpm = ValPrefManagerGlobal.getDefault();
-			gp = new GlobalPreferences();
-			vpm.loadGlobalPreferences(gp);
-			_globalPreferences = gp;
+			gp = vpm.loadGlobalPreferences();
+			if (!_globalPreferences.compareAndSet(null, gp))gp = _globalPreferences.get();
 		}
-		return gp;		
+		return gp;
 	}
 	
+	/**
+	 * Update the global preferences, but only if something has actually changed.
+	 * @param values The global settings.
+	 * @return a bit mask of the changes between the old values and the new values. See the GlobalPreferences
+	 * constants for the bit mask values. If a zero is return there were no changes.
+	 */
+	public int replace(GlobalPreferencesValues values){
+		GlobalPreferences gp = new GlobalPreferences(values);
+		GlobalPreferences old = getGlobalPreferences();
+		int changes = old.compare(gp);
+		if (changes != 0){
+			_globalPreferences.set(gp);
+		}
+		return changes;
+	}
+		
+	/**
+	 * Answer the project preferences for this project.
+	 * @param project The project, this may be null.
+	 */
 	public ProjectPreferences getProjectPreferences(IProject project) {
-		ProjectPreferences pp = getProjectPreferences2(project);
+		ProjectPreferences pp = _projectPreferences.get(project);
 		if (pp != null)return pp;
 		
 		/* hopefully we rarely get this far */
@@ -445,34 +597,22 @@
 		return pp;
 	}
 
-	
+	/**
+	 * 
+	 * @param project The project, this may be null.
+	 * @param baseValidators
+	 */
 	private ProjectPreferences getProjectPreferences(IProject project, Map<String, Validator> baseValidators) 
 		throws BackingStoreException {
-		if (_projectPreferences.containsKey(project)){
-			return _projectPreferences.get(project);
-		}
+		ProjectPreferences pp = _projectPreferences.get(project);
+		if (pp != null)return pp;
 		
 		ValPrefManagerProject vpm = new ValPrefManagerProject(project);
-		ProjectPreferences pp = new ProjectPreferences(project); 
-		vpm.loadProjectPreferences(pp, baseValidators);
+		pp = vpm.loadProjectPreferences(project, baseValidators);
 		_projectPreferences.put(project, pp);
 		return pp;		
 	}
-	
-	/**
-	 * Answer the project specific validation preferences from the cache
-	 * 
-	 * @param project
-	 * 
-	 * @return null if the project is not in the cache.
-	 */
-	private ProjectPreferences getProjectPreferences2(IProject project){
-		if (_projectPreferences.containsKey(project)){
-			return _projectPreferences.get(project);
-		}
-		return null;
-	}
-	
+		
 	/**
 	 * Restore all the validation defaults, as defined by the individual validators via the
 	 * validation extension point.
@@ -520,7 +660,9 @@
 				SubMonitor subMonitor = SubMonitor.convert(monitor);
 				String task = NLS.bind(ValMessages.LogValStart, validator.getName(), resource.getName());
 				subMonitor.beginTask(task, 1);
-				validate(validator, operation, resource, kind, subMonitor.newChild(1));
+
+				if (project.isOpen())
+					validate(validator, operation, resource, kind, subMonitor.newChild(1), null);
 			}			
 		};
 		SubMonitor sm = SubMonitor.convert(monitor, getValidators(project).length);
@@ -541,7 +683,7 @@
 	 * @param monitor
 	 */
 	public void validate(Validator validator, ValOperation operation, IResource resource, int kind, 
-			IProgressMonitor monitor){
+			IProgressMonitor monitor, ValidationEvent event){
 		if (operation.isValidated(validator.getId(), resource))return;
 		long time = 0;
 		long cpuTime = -1;
@@ -556,28 +698,33 @@
 		if (Tracing.matchesExtraDetail(validator.getId())){
 			Tracing.log("ValManager-03: validating ", resource); //$NON-NLS-1$
 		}
-		ValidationResult vr = validator.validate(resource, kind, operation, monitor);
-		if (pm.isCollecting()){
-			if (cpuTime != -1){
-				cpuTime = Misc.getCPUTime() - cpuTime;
+	
+		if (resource.exists())
+		{	
+			ValidationResult vr = validator.validate(resource, kind, operation, monitor, event);
+	
+			if (pm.isCollecting()){
+				if (cpuTime != -1){
+					cpuTime = Misc.getCPUTime() - cpuTime;
+				}
+				int num = 0;
+				if (vr != null)num = vr.getNumberOfValidatedResources();
+				PerformanceCounters pc = new PerformanceCounters(validator.getId(), 
+					validator.getName(), resource.getName(),
+					num, System.currentTimeMillis()-time, cpuTime);
+				pm.add(pc);
 			}
-			int num = 0;
-			if (vr != null)num = vr.getNumberOfValidatedResources();
-			PerformanceCounters pc = new PerformanceCounters(validator.getId(), 
-				validator.getName(), resource.getName(),
-				num, System.currentTimeMillis()-time, cpuTime);
-			pm.add(pc);
-		}
-		if (ValidationPlugin.getPlugin().isDebugging() && !pm.isCollecting()){
-			String msg = time != 0 ? 
-				NLS.bind(ValMessages.LogValEndTime,	new Object[]{validator.getName(), 
-					validator.getId(), resource, Misc.getTimeMS(System.currentTimeMillis()-time)}) :
-				NLS.bind(ValMessages.LogValEnd, validator.getName(), resource);
-			Tracing.log("ValManager-01: " + msg); //$NON-NLS-1$
-		}
-		if (vr != null){
-			operation.getResult().mergeResults(vr);
-			if (vr.getSuspendValidation() != null)operation.suspendValidation(vr.getSuspendValidation(), validator);
+			if (ValidationPlugin.getPlugin().isDebugging() && !pm.isCollecting()){
+				String msg = time != 0 ? 
+					NLS.bind(ValMessages.LogValEndTime,	new Object[]{validator.getName(), 
+						validator.getId(), resource, Misc.getTimeMS(System.currentTimeMillis()-time)}) :
+					NLS.bind(ValMessages.LogValEnd, validator.getName(), resource);
+				Tracing.log("ValManager-01: " + msg); //$NON-NLS-1$
+			}
+			if (vr != null){
+				operation.mergeResults(vr);
+				if (vr.getSuspendValidation() != null)operation.suspendValidation(vr.getSuspendValidation(), validator);
+			}
 		}
 	}
 	
@@ -597,7 +744,7 @@
 		
 		for (Validator val : getValidators(project)){
 			if (monitor.isCanceled())return;
-			if (!_projectManager.shouldValidate(val, project, valType))continue;
+			if (!ValidatorProjectManager.get().shouldValidate(val, project, valType))continue;
 			if (operation.isSuspended(val, project))continue;
 			try {
 				visitor.visit(val, project, valType, operation, monitor);
@@ -621,12 +768,13 @@
 		
 		Map<String,IValidatorGroupListener[]> groupListeners = new HashMap<String,IValidatorGroupListener[]>();
 		
-		ValProperty vp = getValProperty(resource, valType, _configNumber);
+		ValProperty vp = getValProperty(resource, valType, _configNumber.get());
 		if (vp != null){
 			BitSet bs = vp.getConfigSet();
 			for (Validator val : getValidators(project)){
 				if (!monitor.isCanceled()) {
 					if (!bs.get(_idManager.getIndex(val.getId())))continue;
+					if (operation.isSuspended(val, project))continue;
 					Validator.V2 v2 = val.asV2Validator();
 					if (v2 != null) {
 						notifyGroupListenersStarting(resource, operation.getState(), monitor, groupListeners, v2);
@@ -644,11 +792,11 @@
 		}
 		
 		vp = new ValProperty();
-		vp.setConfigNumber(_configNumber);
+		vp.setConfigNumber(_configNumber.get());
 		ContentTypeWrapper ctw = new ContentTypeWrapper();
 		for (Validator val : getValidators(project)){
 			if (!monitor.isCanceled()) {
-				if (!_projectManager.shouldValidate(val, project, valType))continue;
+				if (!ValidatorProjectManager.get().shouldValidate(val, project, valType))continue;
 				if (Friend.shouldValidate(val, resource, valType, ctw)){
 					vp.getConfigSet().set(_idManager.getIndex(val.getId()));
 					// we do the suspend check after figuring out if it needs to be validated, because we save
@@ -746,7 +894,7 @@
 			// don't care about this one
 		}
 		if (vp == null)return null;
-		if (vp.getConfigNumber() != _configNumber)return null;
+		if (vp.getConfigNumber() != _configNumber.get())return null;
 		return vp;
 	}
 	
@@ -756,7 +904,9 @@
 	 * @param project The project that has been opened, created, or had it's description change.
 	 */
 	public void projectChanged(IProject project){
-		_projectManager.change(project);		
+		ValidatorProjectManager.reset();
+		_projectPreferences.remove(project);
+		_cache.reset(project);
 	}
 	
 	/**
@@ -766,16 +916,24 @@
 	 * 
 	 */
 	public void projectRemoved(IProject project){
-		_projectManager.remove(project);
+		ValidatorProjectManager.reset();
+		_projectPreferences.remove(project);
+		_cache.reset(project);
 	}
 	
 	private void putValProperty(ValProperty vp, IResource resource, ValType valType) {
 		try {
+			if (!(resource.isAccessible())) return;
 			if (valType == ValType.Build)resource.setSessionProperty(StatusBuild, vp);
 			else if (valType == ValType.Manual)resource.setSessionProperty(StatusManual, vp);
-		}
-		catch (CoreException e){
-			ValidationPlugin.getPlugin().handleException(e);
+		} 
+		catch (CoreException e) {
+	        // If the resource is not found, it is likely just been deleted 
+	        // and there is no need to do anything. 
+	        // See https://bugs.eclipse.org/bugs/show_bug.cgi?id=269022
+	        if (!e.getStatus().equals(IResourceStatus.RESOURCE_NOT_FOUND)) {
+	                ValidationPlugin.getPlugin().handleException(e, IStatus.WARNING);
+	        }
 		}
 	}
 
@@ -790,7 +948,7 @@
 
 			public void visit(Validator validator, IProject project, ValType valType,
 				ValOperation operation, IProgressMonitor monitor) {
-				validator.clean(project, monitor);					
+				validator.clean(project, operation, monitor);					
 			}
 			
 		};
@@ -808,7 +966,7 @@
 
 			public void visit(Validator validator, IProject project, ValType valType,
 				ValOperation operation, IProgressMonitor monitor) {
-				validator.clean(project, monitor);					
+				validator.clean(project, operation, monitor);					
 			}
 			
 		};
@@ -824,11 +982,11 @@
 		}
 	}
 	
-	private class HasValidatorVisitor implements IResourceVisitor {
+	private final class HasValidatorVisitor implements IResourceVisitor {
 		
-		private boolean 	_hasValidator;
-		private boolean		_isManual;
-		private boolean		_isBuild;
+		private boolean 			_hasValidator;
+		private final boolean		_isManual;
+		private final boolean		_isBuild;
 		
 		public HasValidatorVisitor(boolean isManual, boolean isBuild){
 			_isManual = isManual;
@@ -861,13 +1019,13 @@
 	 * @author karasiuk
 	 *
 	 */
-	private static class ValidatorIdManager {
+	private final static class ValidatorIdManager {
 		
 		/**
 		 * Map validator id's to Integers. The integers correspond to bits in the ValProperty instances.
 		 */
-		private HashMap<String, Integer> _map = new HashMap<String, Integer>(100);
-		private HashMap<Integer, String> _reverseMap = new HashMap<Integer, String>(100);
+		private final Map<String, Integer> _map = new HashMap<String, Integer>(100);
+		private final Map<Integer, String> _reverseMap = new HashMap<Integer, String>(100);
 		
 		/** Next available bit. */
 		private int _next;
@@ -877,7 +1035,7 @@
 		 * @param id validator id.
 		 * @return index into the validator bit mask.
 		 */
-		public int getIndex(String id){
+		public synchronized int getIndex(String id){
 			Integer i = _map.get(id);
 			if (i != null)return i;
 			
@@ -893,11 +1051,11 @@
 		 * @param index
 		 * @return null if the index number has not been set.
 		 */
-		public String getId(Integer index){
+		public synchronized String getId(Integer index){
 			return _reverseMap.get(index);
 		}
 		
-		public void reset(){
+		public synchronized void reset(){
 			_map.clear();
 			_reverseMap.clear();
 			_next = 0;
@@ -907,7 +1065,7 @@
 		 * Answer the ids for the bit in the bitset. This is used for debugging. 
 		 * @param bs
 		 */
-		public String[] getIds(BitSet bs){
+		public synchronized String[] getIds(BitSet bs){
 			List<String> list = new LinkedList<String>();
 			for(int i=bs.nextSetBit(0); i>=0; i=bs.nextSetBit(i+1)) {
 				String id = getId(i);
@@ -921,14 +1079,59 @@
 	/**
 	 * This is used to keep track of which validators are enabled with which projects. We want to ensure
 	 * that we don't activate a validator (and it's plug-in) if it has nothing to validate in the workspace.
-	 * The ValManager keeps a single instance of this class. 
+	 * This is an immutable object.
 	 * @author karasiuk
 	 *
 	 */
-	private static class ValidatorProjectManager {
+	private final static class ValidatorProjectManager {
 		
-		private ValProjectMap _manual = new ValProjectMap(ValType.Manual);
-		private ValProjectMap _build = new ValProjectMap(ValType.Build);
+		private final static AtomicReference<ValidatorProjectManager> _me = new AtomicReference<ValidatorProjectManager>();
+		private final static AtomicInteger _counter = new AtomicInteger();
+		
+		private final ValProjectMap _manual = new ValProjectMap(ValType.Manual);
+		private final ValProjectMap _build = new ValProjectMap(ValType.Build);
+		private final int _sequence;
+		
+		/**
+		 * Answer the most current ValidatorProjectManager creating a new one if you have to.
+		 * @return
+		 */
+		public static ValidatorProjectManager get(){
+			ValidatorProjectManager vpm = _me.get();
+			if (vpm != null)return vpm;
+			
+			int next = _counter.incrementAndGet();
+			ValidatorProjectManager newVpm = null;
+			boolean looking = true;
+			while(looking){
+				vpm = _me.get();
+				if (vpm == null || next > vpm.getSequence()){
+					if (newVpm == null)newVpm = new ValidatorProjectManager(next);
+					if (_me.compareAndSet(vpm, newVpm))return newVpm;
+				}
+				else looking = false;
+			}
+			return vpm;
+		}
+		
+		/**
+		 * Reset the ValidatorProjectManager to null, which will force a newer one to be created the next time
+		 * that it is requested.
+		 */
+		public static void reset(){
+			int next = _counter.incrementAndGet();
+			ValidatorProjectManager vpm = _me.get();
+			if ( vpm == null)return;
+			if (next > vpm.getSequence())_me.compareAndSet(vpm, null);
+		}
+		
+		private ValidatorProjectManager(int sequence){
+			_sequence = sequence;
+		}
+		
+		int getSequence(){
+			return _sequence;
+		}
 		
 		/**
 		 * Should this validator attempt to validate any resources in this project?
@@ -942,55 +1145,41 @@
 		 *            The type of validation operation.
 		 * @return true if the validator should attempt to validate.
 		 */
-		public synchronized boolean shouldValidate(Validator validator, IProject project, ValType type){
+		public boolean shouldValidate(Validator validator, IProject project, ValType type){
 			if (type == ValType.Build)return _build.shouldValidate(validator, project);
 			if (type == ValType.Manual)return _manual.shouldValidate(validator, project);
 				
 			return false;
-		}
-		
-		/**
-		 * A project has been created, opened, or had it's description changed.
-		 * @param project
-		 */
-		public void change(IProject project) {
-			reset();
-		}
-		
-		public void remove(IProject project) {
-			reset();
-		}
-		
-		
-		public synchronized void reset(){
-			_build.reset();
-			_manual.reset();
-		}
-		
+		}		
+				
 		/**
 		 * This is used to keep track of which validators are enabled for which projects. We want to ensure
 		 * that we don't activate a validator (and it's plug-in) if it has nothing to validate in the workspace.
+		 * <p>
+		 * There are two reasons why a validator may not be enabled. It's current project level filters may not match
+		 * the project. Or the entire validator may have been turned off for the project. 
+		 * </p>
 		 * @author karasiuk
 		 *
 		 */
-		private static class ValProjectMap {
+		private final static class ValProjectMap {
 			/**
-			 * Map a validator to the projects that it validates. 
+			 * Map a validator to the projects that it validates. This is an immutable object.
 			 * <p>
 			 * I've gone back and forth on whether the key should
 			 * be a Validator or the validator id. I'm back to it being the id because I was
-			 * running into cases where because of copying I wasn't getting the matches that I expected. If I run into
+			 * running into cases where because of copying I wasn't getting the matches that I expected and I
+			 * want to ensure that I don't leak validators. If I run into
 			 * false matches, it is probably because reset isn't being called when it should be.
+			 * </p>
 			 */
-			private Map<String, Set<IProject>> _map = new HashMap<String, Set<IProject>>(50);
+			private final Map<String, Set<IProject>> _map;
 			
-			private ValType _type;
-			
-			/** Have we been initialized yet? */
-			private boolean	_initialized;
-			
+			private final ValType _type;
+						
 			public ValProjectMap(ValType type){
 				_type = type;
+				_map = load();
 			}
 			
 			/**
@@ -1005,8 +1194,7 @@
 			 *            
 			 * @return true if the validator should attempt to validate.
 			 */
-			public synchronized boolean shouldValidate(Validator validator, IProject project){
-				if (!_initialized)load();
+			public boolean shouldValidate(Validator validator, IProject project){
 				String vid = validator.getId();
 				Set<IProject> projects = _map.get(vid);
 				if (projects == null)return false;
@@ -1014,7 +1202,11 @@
 				return projects.contains(project);
 			}
 			
-			private void load() {
+			/**
+			 * For each of the projects in the workspace, load which validators are currently prepared to validate things.
+			 */
+			private Map<String, Set<IProject>> load() {
+				Map<String, Set<IProject>> map = new HashMap<String, Set<IProject>>(50);
 				ValManager vm = ValManager.getDefault();
 				IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
 				Tracing.log("ValManager-02: loading " + projects.length + " projects");  //$NON-NLS-1$//$NON-NLS-2$
@@ -1023,27 +1215,24 @@
 					Validator[] vals = vm.getValidators(project);
 					for (Validator v : vals){
 						String vid = v.getId();
-						Set<IProject> set = _map.get(vid);
+						Set<IProject> set = map.get(vid);
 						if (set == null){
 							set = new HashSet<IProject>(50);
-							_map.put(vid, set);
+							map.put(vid, set);
 						}
 						
 						if (v.shouldValidateProject(project, _type))set.add(project);
 					}					
 				}
-				_initialized = true;
+				return map;
 			}
 			
-			public synchronized void reset(){
-				_initialized = false;
-				_map.clear();
-			}
 		}
 		
 	}
 
 	public void handleEvent(IFacetedProjectEvent event) {
+		_configNumber.incrementAndGet();
 		projectChanged(event.getProject().getProject());
 	}
 
@@ -1058,7 +1247,54 @@
 		case IProjectChangeListener.ProjectAdded:
 			projectChanged(project);
 			break;
+		}		
+	}
+	
+	/**
+	 * Store the singleton for the ValManager. This approach is used to avoid having to synchronize the
+	 * ValManager.getDefault() method.
+	 * 
+	 * @author karasiuk
+	 *
+	 */
+	private static class Singleton {
+		static ValManager valManager = new ValManager();
+	}
+	
+	private final class ValidatorCache {
+		private final ConcurrentMap<IProject, Validator[]> _cache = new ConcurrentHashMap<IProject, Validator[]>(50);
+		private final AtomicReference<Validator[]> _global = new AtomicReference<Validator[]>();
+		
+		public Validator[] getValidatorsCached(IProject project) throws ProjectUnavailableError {
+			Validator[] vals = null;
+			if (project == null){
+				vals = _global.get();
+				if (vals == null){				
+					vals = getValidatorsNotCached(project);
+					_global.set(vals);
+				}
+			}
+			else {
+				vals = _cache.get(project);
+				if (vals == null){
+					vals = getValidatorsNotCached(project);
+					_cache.put(project, vals);
+				}
+			}
+			return vals;
 		}
 		
+		public void reset(){
+			_cache.clear();
+			_global.set(null);
+		}
+		
+		public void reset(IProject project){
+			if (project != null)_cache.remove(project);
+		}
+
 	}
+	
+	public enum UseProjectPreferences {Normal, MustUse, MustNotUse}
+
 }
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValMessages.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValMessages.java
index 02aabe1..d2383c1 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValMessages.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValMessages.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
+ * Copyright (c) 2007, 2010 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
@@ -20,6 +20,7 @@
 	
 	public static String DecodeError1;
 	public static String Error20;
+	public static String Error21;
 	
 	public static String ErrConfig;	
 	public static String ErrFilterRule;	  
@@ -42,6 +43,7 @@
 	public static String GroupExclude;
 	
 	public static String JobName;
+	public static String JobNameWithProjectName;
 	public static String JobNameMonitor;
 	
 	public static String JobIndexSave;
@@ -55,6 +57,8 @@
 	
 	public static String MigrationJobName;
 	
+	public static String RogueValidator;
+	
 	public static String RuleProjectNature;
 	public static String RuleFileExt;
 	public static String RuleFile;
@@ -62,6 +66,7 @@
 	public static String RuleFull;
 	public static String RuleContentType;
 	public static String RuleFacet;
+	public static String RulePattern;
 	
 	public static String ContentTypeExact;
 	public static String ContentTypeNotExact;
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValOperation.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValOperation.java
index e5d8696..44c78ec 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValOperation.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValOperation.java
@@ -10,7 +10,6 @@
  *******************************************************************************/
 package org.eclipse.wst.validation.internal;
 
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
@@ -36,45 +35,65 @@
  * @author karasiuk
  *
  */
-public class ValOperation {
+public final class ValOperation {
 	
-	private ValidationState 	_state = new ValidationState();
-	private ValidationResult	_result = new ValidationResult();
-	private Map<IProject, Set<Validator>> _suspended = 
-		Collections.synchronizedMap(new HashMap<IProject, Set<Validator>>(40));
+	private final ValidationState 	_state = new ValidationState();
+	private final ValidationResult	_result = new ValidationResult();
+	
+	/**
+	 * Each project can have a set of validators that are suspended for the duration of the validation operation.
+	 * The set contains the validator's id.
+	 */
+	private final Map<IProject, Set<String>> _suspended = new HashMap<IProject, Set<String>>(40);
 	
 	/** The time that the operation started. */
-	private long	_started = System.currentTimeMillis();
+	private final long	_started = System.currentTimeMillis();
 	
 	/** 
-	 * Are we in a multi project validation? This can be triggered by either clean all or 
+	 * Are we in a multi project validation? That is, could we be validating several
+	 * projects at the same time? This can be triggered by either clean all or 
 	 * if auto build is turned off, a build all. 
 	 */
-	private boolean	_multiProject;
+	private final boolean	_multiProject;
 	
 	/** 
 	 * Holds all the resources that have been validated as a side-effect of running other validations.
 	 * The key is the validator id and the value is a Set of IResources.
 	 */
-	private Map<String, Set<IResource>> 	_validated = new HashMap<String, Set<IResource>>(20);
+	private final Map<String, Set<IResource>> 	_validated = new HashMap<String, Set<IResource>>(20);
 	
 	public ValOperation(){
+		_multiProject = false;
+	}
+	
+	/**
+	 * 
+	 * @param multiProject Set to true if we could be validating several projects at the same time.
+	 */
+	public ValOperation(boolean multiProject){
+		_multiProject = multiProject;
 	}
 	
 	public ValidationState getState() {
 		return _state;
 	}
-	public void setState(ValidationState state) {
-		_state = state;
-	}
-	public ValidationResult getResult() {
-		return _result;
-	}
 	
-	public void setResult(ValidationResult result) {
-		_result = result;
+	/**
+	 * Answer a summary of the validation results.
+	 * @return
+	 */
+	public ValidationResultSummary getResult() {
+		synchronized(_result){
+			ValidationResultSummary vrs = new ValidationResultSummary(_result.getSeverityError(), 
+				_result.getSeverityWarning(), _result.getSeverityInfo());
+			return vrs;
+		}
 	}
-	
+		
+	/**
+	 * Answer a copy of the ValidationResult.
+	 * @return
+	 */
 	public ValidationResults getResults(){
 		return new ValidationResults(_result);
 	}
@@ -86,12 +105,14 @@
 	 * @param resource resource that has been validated.
 	 */
 	public void addValidated(String id, IResource resource){
-		Set<IResource> set = _validated.get(id);
-		if (set == null){
-			set = new HashSet<IResource>(20);
-			_validated.put(id, set);
+		synchronized(_validated){
+			Set<IResource> set = _validated.get(id);
+			if (set == null){
+				set = new HashSet<IResource>(20);
+				_validated.put(id, set);
+			}
+			set.add(resource);
 		}
-		set.add(resource);
 	}
 	
 	/**
@@ -102,30 +123,36 @@
 	 * @param resource
 	 */
 	public boolean isValidated(String id, IResource resource){
-		Set<IResource> set = _validated.get(id);
-		if (set == null)return false;
-		
-		return set.contains(resource);
+		synchronized(_validated){
+			Set<IResource> set = _validated.get(id);
+			if (set == null)return false;
+			
+			return set.contains(resource);
+		}
 	}
 
 	/**
-	 * Has this validator been suspended for the duration of this operation?
-	 *   
-	 * @param val
-	 * @param project can be null, in which case we return false
+	 * Has this validator been suspended for the duration of this operation on this project?
 	 * 
-	 * @return true if we already know that this validator should not run on this project.
+	 * @param val
+	 *            The validator that is being checked.
+	 * @param project
+	 *            Can be null, in which case we return false.
+	 * 
+	 * @return true if this validator should not run on this project.
 	 */
 	public boolean isSuspended(Validator val, IProject project) {
 		if (project == null)return false;
-		Set<Validator> set = getSuspended(project);		
-		return set.contains(val);
+		synchronized(_suspended){
+			Set<String> set = getSuspended(project);		
+			return set.contains(val.getId());
+		}
 	}
 	
-	private Set<Validator> getSuspended(IProject project){
-		Set<Validator> set = _suspended.get(project);
+	private Set<String> getSuspended(IProject project){
+		Set<String> set = _suspended.get(project);
 		if (set == null){
-			set = new HashSet<Validator>(5);
+			set = new HashSet<String>(5);
 			_suspended.put(project, set);
 		}
 		return set;
@@ -133,7 +160,8 @@
 
 	void suspendValidation(IProject project, Validator validator) {
 		if (project == null)return;
-		getSuspended(project).add(validator);
+		if (validator == null)return;
+		getSuspended(project).add(validator.getId());
 	}
 
 	public long getStarted() {
@@ -144,12 +172,34 @@
 		return _multiProject;
 	}
 
-	/** 
-	 * Are we in a multi project validation? That is, could we be validating several
-	 * projects at the same time? This can be triggered by either clean all or 
-	 * if auto build is turned off, a build all. 
+	/**
+	 * Indicate if the operation was canceled.
+	 * 
+	 * @param canceled
+	 * 		Set to true if it was canceled and false if it was not canceled.
 	 */
-	public void setMultiProject(boolean multiProject) {
-		_multiProject = multiProject;
-	}	
+	public void setCanceled(boolean canceled) {
+		synchronized (_result) {
+			_result.setCanceled(canceled);
+		}
+		
+	}
+
+	/**
+	 * Was the operation canceled before it completed? For example if the validation is being run through the
+	 * user interface, the end user can cancel the operation through the progress monitor.
+	 * 
+	 * @return true if the operation was canceled
+	 */
+	public boolean isCanceled() {
+		synchronized (_result) {
+			return _result.isCanceled();
+		}
+	}
+
+	public void mergeResults(ValidationResult vr) {
+		synchronized (_result) {
+			_result.mergeResults(vr);
+		}
+	}
 }
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValOperationJob.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValOperationJob.java
deleted file mode 100644
index 9414c02..0000000
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValOperationJob.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 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.validation.internal;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.wst.validation.ValidationFramework;
-import org.eclipse.wst.validation.Validator;
-import org.eclipse.wst.validation.internal.model.IValidatorVisitor;
-
-/**
- * This is used to signal when the entire validation operation is complete. This needs to be done in a job
- * because the operation isn't done, until all the validation jobs have finished.  
- * @author karasiuk
- *
- */
-public class ValOperationJob extends Job {
-	
-	private ValOperation _operation;
-	
-	public ValOperationJob(ValOperation operation){
-		super(ValMessages.JobNameMonitor);
-		_operation = operation;
-	}
-
-	@Override
-	protected IStatus run(IProgressMonitor monitor) {
-		boolean ok = true;
-		try {
-			ValidationFramework.getDefault().join(monitor);
-		}
-		catch (InterruptedException e){
-			ok = false;
-		}
-		finished(monitor);
-		return ok ? Status.OK_STATUS : Status.CANCEL_STATUS;
-	}
-	
-	private void finished(IProgressMonitor monitor){
-		IValidatorVisitor visitor = new IValidatorVisitor(){
-
-			public void visit(Validator validator, IProject project, ValType valType, 
-				ValOperation operation, IProgressMonitor monitor) {
-				
-				validator.validationFinishing(project, operation.getState(), monitor);					
-			}
-			
-		};
-		ValManager.getDefault().accept(visitor, null, ValType.Build, _operation, monitor);
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValOperationManager.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValOperationManager.java
deleted file mode 100644
index 1877a33..0000000
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValOperationManager.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 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.validation.internal;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.wst.validation.Validator;
-import org.eclipse.wst.validation.internal.model.IValidatorVisitor;
-
-/**
- * Keep track of a validation operation when it is triggered as part of a build.
- * @author karasiuk
- *
- */
-public class ValOperationManager implements IResourceChangeListener {
-	
-	/*
-	 * I tried various tests to see what sort of change events I would get. This is what I 
-	 * observed using Eclipse 3.4:
-	 * 
-	 * Auto Build On
-	 * 
-	 *   Clean All
-	 *     - workspace, clean, pre
-	 *     - workspace, clean post
-	 *     - workspace, auto, post
-	 *     
-	 *   Clean Some
-	 *     - project1, clean, pre
-	 *     - project1, clean, post
-	 *     - project2, clean, pre
-	 *     - project2, clean, post
-	 *     - workspace, Auto, post
-	 *     
-	 *   Build Working Set - NA
-	 *   Build Project - NA
-	 *   Build All - NA
-	 *   
-	 *   Ctrl-S
-	 *     - workspace, auto, pre
-	 *     - workspace, auto, post
-	 *     
-	 * Auto build Off
-	 * 
-	 *   Clean All
-	 *     - same as (auto build on), but no workspace,auto,post event
-	 *     
-	 *   Clean Some 
-	 *     - same as (auto build on), but no workspace,auto,post event
-	 *     
-	 *   Build Working Set
-	 *     - project1, incremental, pre
-	 *     - project1, incremental, post
-	 *     - project2, incremental, pre
-	 *     - project2, incremental, post
-	 *     
-	 *   Build Project
-	 *     - same as above
-	 *     
-	 *   Build All
-	 *     - workspace, incremental, pre
-	 *     - workspace, incremental, post
-	 *     
-	 *   Ctrl-S - NA
-	 *   
-	 * For the case where a subset of the projects are built there is no way to guess whether they are part of the
-	 * same operation or not. Eclipse threats them as independent events, and so will the validation framework.
-	 * 
-	 * So for example, if the user selected two projects (p1 and p2) and built them, the framework would call the
-	 * validators like this:
-	 * 
-	 * validation starting on null
-	 * validation starting on P1
-	 *  - individual events per resource
-	 * validation finished on P1
-	 * validation finished on null 
-	 * 
-	 * validation starting on null
-	 * validation starting on P2
-	 *  - individual events per resource
-	 * validation finished on P2
-	 * validation finished on null 
-	 */
-	
-	private static ValOperationManager _me;
-
-	/**
-	 * This operation is in affect for a build cycle. At the end of the build it is reinitialized.
-	 */
-	private ValOperation 	_operation;
-	
-	
-	/**
-	 * In the very common case of doing a clean all (with auto build turned on), Eclipse signals two 
-	 * workspace, auto build, post events. One at the end of the clean and one at the end of the
-	 * real build.
-	 * 
-	 * If we are doing a clean all, with auto build turned on, we increment this by one, 
-	 * so that we know to throw away the first workspace, auto build, post event.
-	 */
-	private int _discardAutoPost;
-
-	public static synchronized ValOperationManager getDefault(){
-		if (_me == null)_me = new ValOperationManager();
-		return _me;
-	}
-	
-	private ValOperationManager(){}
-				
-	public void resourceChanged(IResourceChangeEvent event) {
-		int type = event.getType();
-		int kind = event.getBuildKind();
-		
-		if (kind == IncrementalProjectBuilder.CLEAN_BUILD && ((type & IResourceChangeEvent.PRE_BUILD) != 0)){
-			processClean(event);
-		}
-		
-		if (isBuildStarting(event)){
-			_operation = new ValOperation();
-			_operation.setMultiProject(true);
-			IValidatorVisitor visitor = new IValidatorVisitor(){
-
-				public void visit(Validator validator, IProject project, ValType valType, 
-					ValOperation operation, IProgressMonitor monitor) {
-					
-					validator.validationStarting(project, operation.getState(), monitor);					
-				}				
-			};
-			ValManager.getDefault().accept(visitor, null, ValType.Build, _operation, new NullProgressMonitor());
-			
-		}
-		
-		if (isBuildFinished(event)){
-			ValOperationJob finished = new ValOperationJob(getOperation());
-			finished.schedule();
-			_operation = null;
-		}
-		
-		
-		if (Tracing.isLogging()){
-			String kindName = null;
-			if (kind == IncrementalProjectBuilder.AUTO_BUILD)kindName = "Auto"; //$NON-NLS-1$
-			else if (kind == IncrementalProjectBuilder.CLEAN_BUILD)kindName = "Clean"; //$NON-NLS-1$
-			else if (kind == IncrementalProjectBuilder.FULL_BUILD)kindName = "Full"; //$NON-NLS-1$
-			else if (kind == IncrementalProjectBuilder.INCREMENTAL_BUILD)kindName = "Incremental"; //$NON-NLS-1$
-			else kindName = String.valueOf(kind);
-			
-			StringBuffer b = new StringBuffer(100);
-			
-			String sourceName = "unknown"; //$NON-NLS-1$
-			if (event.getSource() instanceof IResource) {
-				IResource res = (IResource) event.getSource();
-				sourceName = res.getName();
-			}
-			else if (event.getSource() instanceof IWorkspace) {
-				sourceName = "Workspace";			 //$NON-NLS-1$
-			}
-			b.append("ValOperationManager-01: A resource has changed, source="+sourceName+", kind="+kindName+", event type=("+type); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
-			if ((type & IResourceChangeEvent.POST_BUILD) != 0)b.append(", post build"); //$NON-NLS-1$
-			if ((type & IResourceChangeEvent.PRE_BUILD) != 0){
-				b.append(", pre build"); //$NON-NLS-1$
-			}
-			b.append(')');
-			IResourceDelta rd = event.getDelta();
-			if (rd == null)b.append(", there was no resource delta"); //$NON-NLS-1$
-			
-			Tracing.log(b);
-		}
-		
-	}
-	
-	/**
-	 * Determine if we are starting a new build cycle.
-	 * @param event
-	 * @return
-	 */
-	private boolean isBuildStarting(IResourceChangeEvent event) {
-		int type = event.getType();
-		int kind = event.getBuildKind();
-		boolean isWorkspace = event.getSource() instanceof IWorkspace;
-		boolean preBuild = (type & IResourceChangeEvent.PRE_BUILD) != 0;
-		
-		if (ResourcesPlugin.getWorkspace().isAutoBuilding()){
-			if (isWorkspace && preBuild && kind == IncrementalProjectBuilder.CLEAN_BUILD){
-				_discardAutoPost = 1;
-				return true;
-			}
-			
-			if (isWorkspace && preBuild && kind == IncrementalProjectBuilder.AUTO_BUILD)return true;
-		}
-		else {
-			if (isWorkspace && preBuild && kind == IncrementalProjectBuilder.INCREMENTAL_BUILD)return true;
-		}
-		return false;
-	}
-
-	/**
-	 * Determine if we are at the end of a build cycle. This will give callers the ability to
-	 * clear caches etc.
-	 *  
-	 * @param event
-	 * @return return true if we are just finishing a build.
-	 */
-	private boolean isBuildFinished(IResourceChangeEvent event) {
-		
-		if (_operation == null)return false;
-		
-		int type = event.getType();
-		int kind = event.getBuildKind();
-		boolean isWorkspace = event.getSource() instanceof IWorkspace;
-		boolean postBuild = (type & IResourceChangeEvent.POST_BUILD) != 0;
-
-		
-		if (ResourcesPlugin.getWorkspace().isAutoBuilding()){
-			if (isWorkspace && postBuild && kind == IncrementalProjectBuilder.AUTO_BUILD){
-				if (_discardAutoPost == 1)_discardAutoPost = 0;
-				else return true;
-			}
-		}
-		else {
-			if (isWorkspace && postBuild && kind == IncrementalProjectBuilder.INCREMENTAL_BUILD)return true;
-		}
-		
-		return false;
-	}
-	
-	private void processClean(IResourceChangeEvent event){
-		// Originally I was using this to monitor IProject build requests as well, but that is not not needed
-		// since these will be handled by the IncrementalProjectBuilder.clean() method.
-		IProgressMonitor monitor = new NullProgressMonitor();
-		Object source = event.getSource();
-		if (source instanceof IWorkspace) {
-			ValManager.getDefault().clean(null, getOperation(), monitor);
-		}
-		
-	}
-
-	/**
-	 * Answer the current validation operation. If we are not in a multiple project validation
-	 * we will return a new one. 
-	 */
-	public ValOperation getOperation() {
-		/*
-		 * If we don't have a current operation, we create a new one. The only time we save
-		 * the operation is when we are sure that we are in a multi project validation.
-		 */
-		if (_operation == null)return new ValOperation();
-		return _operation;
-	}
-
-}
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValPrefManagerGlobal.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValPrefManagerGlobal.java
index a187cfa..344ed0f 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValPrefManagerGlobal.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValPrefManagerGlobal.java
@@ -10,28 +10,31 @@
  *******************************************************************************/
 package org.eclipse.wst.validation.internal;
 
+import java.lang.reflect.InvocationTargetException;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.atomic.AtomicReference;
 
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
+import org.eclipse.wst.validation.Friend;
 import org.eclipse.wst.validation.MessageSeveritySetting;
-import org.eclipse.wst.validation.ValidationFramework;
 import org.eclipse.wst.validation.Validator;
 import org.eclipse.wst.validation.Validator.V2;
 import org.eclipse.wst.validation.internal.model.FilterGroup;
 import org.eclipse.wst.validation.internal.model.GlobalPreferences;
+import org.eclipse.wst.validation.internal.model.GlobalPreferencesValues;
 import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
 import org.osgi.service.prefs.BackingStoreException;
-import org.osgi.service.prefs.Preferences;
 
 /**
  * A class that knows how to manage the global persisted validation settings.
  * @author karasiuk
  */
-public class ValPrefManagerGlobal {
+public final class ValPrefManagerGlobal {
 	
 	/** 
 	 * Version of the framework properties.
@@ -43,20 +46,17 @@
 	 */
 	public final static int frameworkVersion = 3;
 	
-	private List<IValChangedListener> _listeners = new LinkedList<IValChangedListener>();
-	private static ValPrefManagerGlobal _me;
+	private final Set<IValChangedListener> _listeners = new CopyOnWriteArraySet<IValChangedListener>();
 	
-	private List<Validator> _validators;
+	private final AtomicReference<List<Validator>> _validators = new AtomicReference<List<Validator>>();
 	
 	private ValPrefManagerGlobal(){}
 	
 	public static ValPrefManagerGlobal getDefault(){
-		if (_me == null)_me = new ValPrefManagerGlobal();
-		return _me;
+		return Singleton.valPrefManagerGlobal;
 	}
 	
 	public void addListener(IValChangedListener listener){
-		if (_listeners.contains(listener))return;
 		_listeners.add(listener);
 	}
 	
@@ -106,10 +106,10 @@
 	 * Answer the v2 validators that have been overridden by the global preferences.
 	 */
 	public List<Validator> getValidators() throws BackingStoreException {
-		List<Validator> vals = _validators;
-		if (vals == null){
+		List<Validator> vals = _validators.get();
+		while (vals == null){
 			vals = loadValidators();
-			_validators = vals;
+			if (!_validators.compareAndSet(null, vals))vals = _validators.get();
 		}
 		return vals;
 	}
@@ -120,9 +120,9 @@
 	 */
 	private List<Validator> loadValidators() throws BackingStoreException {
 		LinkedList<Validator> list = new LinkedList<Validator>();
-		IEclipsePreferences pref = ValidationFramework.getDefault().getPreferenceStore();
+		PreferencesWrapper pref = PreferencesWrapper.getPreferences(null, null);
 		if (pref.nodeExists(PrefConstants.vals)){
-			Preferences vals = pref.node(PrefConstants.vals);
+			PreferencesWrapper vals = pref.node(PrefConstants.vals);
 			for (String id : vals.childrenNames()){
 				Validator base = ExtensionValidators.instance().getMapV2().get(id);
 				Validator v = loadValidator(id, vals, base);
@@ -150,10 +150,10 @@
 	 * @return A new validator that is a copy of the extension point validator
 	 *         with the updates from the preference store.
 	 */
-	static Validator loadValidator(String id, Preferences valsNode, Validator base) {
+	static Validator loadValidator(String id, PreferencesWrapper valsNode, Validator base) {
 		if (base == null)return null;
 		
-		Preferences vp = valsNode.node(id);
+		PreferencesWrapper vp = valsNode.node(id);
 		base = base.copy();
 		V2 v2 = base.asV2Validator();
 
@@ -173,6 +173,18 @@
 				while(des.hasNext())list.add(FilterGroup.create(des));
 				v2.setGroups(list);
 			}
+			
+			String settings = vp.get(PrefConstants.msgs, ""); //$NON-NLS-1$
+			if (settings.length() >0)
+			{
+				Map<String, MessageSeveritySetting.Severity> map = Msgs.deserialize(settings);
+				Map<String, MessageSeveritySetting> msg = base.getMessageSettings();
+			
+				for (Map.Entry<String, MessageSeveritySetting.Severity> me : map.entrySet()){
+					MessageSeveritySetting ms = msg.get(me.getKey());
+					if (ms != null)ms.setCurrent(me.getValue());
+				}	
+			}
 		}					
 		return base;
 	}
@@ -182,16 +194,18 @@
 	 * 
 	 * @see ValManager#getGlobalPreferences()
 	 */
-	public void loadGlobalPreferences(GlobalPreferences gp) {
-		IEclipsePreferences pref = ValidationFramework.getDefault().getPreferenceStore();
-		gp.setSaveAutomatically(pref.getBoolean(PrefConstants.saveAuto, GlobalPreferences.DefaultAutoSave));
-		gp.setDisableAllValidation(pref.getBoolean(PrefConstants.suspend, GlobalPreferences.DefaultSuspend));
-		gp.setConfirmDialog(pref.getBoolean(PrefConstants.confirmDialog, GlobalPreferences.DefaultConfirm));
-		gp.setOverride(pref.getBoolean(PrefConstants.override, GlobalPreferences.DefaultOverride));
-		gp.setVersion(pref.getInt(PrefConstants.frameworkVersion, GlobalPreferences.DefaultFrameworkVersion));
-		gp.setStateTimeStamp(pref.getLong(PrefConstants.stateTS, 0));
+	public GlobalPreferences loadGlobalPreferences() {
+		PreferencesWrapper pref = PreferencesWrapper.getPreferences(null, null);
+		GlobalPreferencesValues gp = new GlobalPreferencesValues();
+		gp.saveAutomatically = pref.getBoolean(PrefConstants.saveAuto, GlobalPreferences.DefaultAutoSave);
+		gp.disableAllValidation = pref.getBoolean(PrefConstants.suspend, GlobalPreferences.DefaultSuspend);
+		gp.confirmDialog = pref.getBoolean(PrefConstants.confirmDialog, GlobalPreferences.DefaultConfirm);
+		gp.override = pref.getBoolean(PrefConstants.override, GlobalPreferences.DefaultOverride);
+		gp.version = pref.getInt(PrefConstants.frameworkVersion, GlobalPreferences.DefaultFrameworkVersion);
+		gp.stateTimeStamp = pref.getLong(PrefConstants.stateTS, 0);
 		
-		if (gp.getVersion() != frameworkVersion)migrate(gp.getVersion(), pref);
+		if (gp.version != frameworkVersion)migrate(gp.version, pref);
+		return new GlobalPreferences(gp);
 	}
 	
 	/**
@@ -199,7 +213,7 @@
 	 * @param version The incoming version of the preferences.
 	 * @param pref the root of the preference store
 	 */
-	static void migrate(int version, IEclipsePreferences pref) {
+	static void migrate(int version, PreferencesWrapper pref) {
 		try {
 			boolean update = false;
 			if (version == 2){
@@ -282,20 +296,27 @@
 	 *            validators. If we are updating a project's validators, then
 	 *            this map would be the preference page validators.
 	 */
-	static void save(Validator validator, Preferences root, Map<String, Validator> baseValidators) throws BackingStoreException {
+	static void save(Validator validator, PreferencesWrapper root, Map<String, Validator> baseValidators) throws BackingStoreException {
 		Validator.V2 v2 = validator.asV2Validator();
 		if (v2 == null)return;
 		
-		Preferences vp = root.node(validator.getId());
-		if (validator.sameConfig(baseValidators.get(validator.getId()))){
-			vp.removeNode();
+		final String id = validator.getId();
+		boolean hasNode = root.nodeExists(id);
+		
+		if (validator.sameConfig(baseValidators.get(id))){
+			if (hasNode){
+				PreferencesWrapper vp = root.node(id);
+				vp.removeNode();
+			}
 			return;
 		}
 		if (!validator.isChanged())return;
-		if (validator.getChangeCountGlobal() > 0){
+		PreferencesWrapper vp = root.node(id);
+		if (validator.hasGlobalChanges()){
 			Global g = new Global(validator.isManualValidation(), validator.isBuildValidation(), validator.getVersion(),
 				validator.getDelegatingId());
 			vp.put(PrefConstants.global, g.serialize());
+			Friend.setMigrated(validator, false);
 		}
 		
 		if (validator.getChangeCountMessages() > 0){
@@ -314,15 +335,65 @@
 			}
 		}
 	}
+	/**
+	 * Save the validator into the preference store.
+	 * 
+	 * @param validator
+	 *            The validator being saved.
+	 * 
+	 * @param root
+	 *            The top of the preference tree for validators, i.e.
+	 *            /instance/validator-framework-id/vals for workspace validators
+	 *            and /vals for project validators.
+	 *            
+	 * @param baseValidators
+	 *            A map of the validators that are one level higher in the
+	 *            storage hierarchy. So if we are updating the preference page
+	 *            validators, then this map would be the extension point
+	 *            validators. If we are updating a project's validators, then
+	 *            this map would be the preference page validators.
+	 */
+	static void save(ValidatorMutable validator, PreferencesWrapper root, Map<String, Validator> baseValidators) throws BackingStoreException {
+		if (!validator.isV2Validator())return;
+		
+		PreferencesWrapper vp = root.node(validator.getId());
+		if (validator.sameConfig(baseValidators.get(validator.getId()))){
+			vp.removeNode();
+			return;
+		}
+		if (!validator.isChanged())return;
+		if (validator.hasGlobalChanges()){
+			Global g = new Global(validator.isManualValidation(), validator.isBuildValidation(), validator.getVersion(),
+				validator.getDelegatingId());
+			vp.put(PrefConstants.global, g.serialize());
+//			Friend.setMigrated(validator, false);
+		}
+				
+		if (validator.getChangeCountGroups() > 0){
+			FilterGroup[] groups = validator.getGroups();
+			if (groups.length > 0){
+				Serializer ser = new Serializer(500);
+				for (FilterGroup group : groups)group.save(ser);
+				vp.put(PrefConstants.groups, ser.toString());
+			}
+		}
+		if (validator.getChangeCountMessages() > 0){
+			Collection<MessageSeveritySetting> msgs = validator.getMessageSettings().values();
+			if (msgs.size() > 0){
+				vp.put(PrefConstants.msgs, Msgs.serialize(msgs));
+			}
+		}
+		
+	}
 	
 	public void saveAsPrefs(Validator[] val) {
 		try {
-			IEclipsePreferences pref = ValidationFramework.getDefault().getPreferenceStore();
-			Preferences vals = pref.node(PrefConstants.vals);
+			PreferencesWrapper pref = PreferencesWrapper.getPreferences(null, null);
+			PreferencesWrapper vals = pref.node(PrefConstants.vals);
 			Map<String, Validator> base = ExtensionValidators.instance().getMapV2();
 			for (Validator v : val)save(v, vals, base);
 			pref.flush();
-			_validators = null;
+			_validators.set(null);
 			updateListeners(true);
 		}
 		catch (BackingStoreException e){
@@ -336,14 +407,14 @@
 	 */
 	public synchronized void savePreferences(GlobalPreferences gp, Validator[] validators){
 		try {
-			IEclipsePreferences prefs = ValidationFramework.getDefault().getPreferenceStore();
+			PreferencesWrapper prefs = PreferencesWrapper.getPreferences(null, null);
 			savePreferences(prefs, gp);
-			Preferences vals = prefs.node(PrefConstants.vals);
+			PreferencesWrapper vals = prefs.node(PrefConstants.vals);
 
 			Map<String, Validator> base = ExtensionValidators.instance().getMapV2();
 			for (Validator v : validators)save(v, vals, base);
 			prefs.flush();
-			_validators = null;
+			_validators.set(null);
 			updateListeners(true);
 		}
 		catch (BackingStoreException e){
@@ -354,13 +425,79 @@
 	/**
 	 * Save the global preferences and the validators.
 	 */
-	public synchronized void savePreferences(GlobalPreferences gp){
+	public synchronized void savePreferences(GlobalPreferences gp, ValidatorMutable[] validators, Boolean persist){
 		try {
-			IEclipsePreferences prefs = ValidationFramework.getDefault().getPreferenceStore();
-			boolean isConfigChange = gp.isConfigChange();
+			PreferencesWrapper prefs = PreferencesWrapper.getPreferences(null, persist);
+			savePreferences(prefs, gp);
+			PreferencesWrapper vals = prefs.node(PrefConstants.vals);
+			Map<String, Validator> base = ExtensionValidators.instance().getMapV2();
+			for (ValidatorMutable v : validators)save(v, vals, base);
+
+			prefs.flush();
+			_validators.set(null);
+			updateListeners(true);
+		}
+		catch (BackingStoreException e){
+			ValidationPlugin.getPlugin().handleException(e);
+		}
+	}
+		
+	/**
+	 * Save the V1 preferences, so that the old validators continue to work.
+	 */
+	public static void saveV1Preferences(ValidatorMutable[] validators, Boolean persistent){
+		try {
+			GlobalConfiguration gc = ConfigurationManager.getManager().getGlobalConfiguration();
+			gc.setEnabledManualValidators(getEnabledManualValidators(validators));				
+			gc.setEnabledBuildValidators(getEnabledBuildValidators(validators));
+
+			gc.passivate();
+			gc.store(persistent);
+		}
+		catch (InvocationTargetException e){
+			ValidationPlugin.getPlugin().handleException(e);
+		}			
+	}
+
+	/**
+	 * Answer all the V1 validators that are manually enabled.
+	 * @return
+	 */
+	private static ValidatorMetaData[] getEnabledManualValidators(ValidatorMutable[] validators) {
+		List<ValidatorMetaData> list = new LinkedList<ValidatorMetaData>();
+		for (ValidatorMutable v : validators){
+			if (v.isManualValidation() && v.isV1Validator())list.add(v.getVmd());
+		}
+		ValidatorMetaData[] result = new ValidatorMetaData[list.size()];
+		list.toArray(result);
+		return result;
+	}
+
+	/**
+	 * Answer all the V1 validators that are enabled for build.
+	 * @return
+	 */
+	private static ValidatorMetaData[] getEnabledBuildValidators(ValidatorMutable[] validators) {
+		List<ValidatorMetaData> list = new LinkedList<ValidatorMetaData>();
+		for (ValidatorMutable v : validators){
+			if (v.isBuildValidation() && v.isV1Validator())list.add(v.getVmd());
+		}
+		ValidatorMetaData[] result = new ValidatorMetaData[list.size()];
+		list.toArray(result);
+		return result;
+	}
+
+	
+	/**
+	 * Save the global preferences and the validators.
+	 */
+	public synchronized void savePreferences(){
+		try {
+			GlobalPreferences gp = ValManager.getDefault().getGlobalPreferences();
+			PreferencesWrapper prefs = PreferencesWrapper.getPreferences(null, null);
 			savePreferences(prefs, gp);
 			prefs.flush();
-			updateListeners(isConfigChange);
+			updateListeners(true);
 		}
 		catch (BackingStoreException e){
 			ValidationPlugin.getPlugin().handleException(e);
@@ -370,7 +507,7 @@
 	/**
 	 * Save the global preferences and the validators.
 	 */
-	private void savePreferences(IEclipsePreferences prefs, GlobalPreferences gp){
+	private void savePreferences(PreferencesWrapper prefs, GlobalPreferences gp){
 		prefs.putBoolean(PrefConstants.saveAuto, gp.getSaveAutomatically());
 		prefs.putBoolean(PrefConstants.suspend, gp.getDisableAllValidation());
 		prefs.putLong(PrefConstants.stateTS, gp.getStateTimeStamp());
@@ -385,7 +522,7 @@
 	 * @param settings
 	 */
 	public void loadMessages(Validator validator, Map<String, MessageSeveritySetting> settings) {
-		IEclipsePreferences pref = ValidationFramework.getDefault().getPreferenceStore();
+		PreferencesWrapper pref = PreferencesWrapper.getPreferences(null, null);
 		try {
 			loadMessageSettings(validator, settings, pref);
 		}
@@ -401,14 +538,14 @@
 	 * @param settings
 	 * @param root the root of the preference store
 	 */
-	static void loadMessageSettings(Validator val, Map<String, MessageSeveritySetting> settings, Preferences root) 
+	static void loadMessageSettings(Validator val, Map<String, MessageSeveritySetting> settings, PreferencesWrapper root) 
 		throws BackingStoreException {
 		if (!root.nodeExists(PrefConstants.vals))return;
 		
-		Preferences vals = root.node(PrefConstants.vals); 
+		PreferencesWrapper vals = root.node(PrefConstants.vals); 
 		if (!vals.nodeExists(val.getId()))return;
 		
-		Preferences valPrefs = vals.node(val.getId());
+		PreferencesWrapper valPrefs = vals.node(val.getId());
 		String msgs = valPrefs.get(PrefConstants.msgs, ""); //$NON-NLS-1$
 		if (msgs.length() == 0)return;
 		
@@ -446,18 +583,18 @@
 //		}
 //	}
 	
-	private static class Global {
-		private boolean _manual;
-		private boolean _build;
-		private int		_version;
-		private String	_delegating;
+	private final static class Global {
+		private final boolean 	_manual;
+		private final boolean 	_build;
+		private final int		_version;
+		private final String	_delegating;
 		
 		public Global(String value){
 			Deserializer d = new Deserializer(value);
 			_manual = d.getBoolean();
 			_build = d.getBoolean();
 			_version = d.getInt();
-			if (d.hasNext())_delegating = d.getString();
+			_delegating = d.hasNext() ? d.getString() : null;
 		}
 		
 		public Global(boolean manual, boolean build, int version, String delegating){
@@ -493,7 +630,7 @@
 		}
 	}
 	
-	private static class Msgs {
+	private final static class Msgs {
 		public static String serialize(Collection<MessageSeveritySetting> messages){
 			Serializer s = new Serializer(100);
 			for (MessageSeveritySetting ms : messages){
@@ -520,4 +657,16 @@
 			return map;
 		}
 	}
+	
+	/**
+	 * Store the singleton for the ValPrefManagerGlobal. This approach is used to avoid having to synchronize the
+	 * ValPrefManagerGlobal.getDefault() method.
+	 * 
+	 * @author karasiuk
+	 *
+	 */
+	private final static class Singleton {
+		final static ValPrefManagerGlobal valPrefManagerGlobal = new ValPrefManagerGlobal();
+	}
+
 }
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValPrefManagerProject.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValPrefManagerProject.java
index 706f595..c28b031 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValPrefManagerProject.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValPrefManagerProject.java
@@ -10,6 +10,7 @@
  *******************************************************************************/
 package org.eclipse.wst.validation.internal;
 
+import java.lang.reflect.InvocationTargetException;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedList;
@@ -18,27 +19,31 @@
 import java.util.Set;
 
 import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ProjectScope;
-import org.eclipse.core.runtime.preferences.IEclipsePreferences;
-import org.eclipse.core.runtime.preferences.IScopeContext;
+import org.eclipse.wst.validation.Friend;
+import org.eclipse.wst.validation.IMutableValidator;
 import org.eclipse.wst.validation.MessageSeveritySetting;
+import org.eclipse.wst.validation.MutableProjectSettings;
 import org.eclipse.wst.validation.Validator;
 import org.eclipse.wst.validation.Validator.V2;
 import org.eclipse.wst.validation.internal.model.ProjectPreferences;
 import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
 import org.osgi.service.prefs.BackingStoreException;
-import org.osgi.service.prefs.Preferences;
 
 /**
  * A class that knows how to manage the project level persisted validation settings.
  * @author karasiuk
  *
  */
-public class ValPrefManagerProject {
+public final class ValPrefManagerProject {
 	
-	private IProject	_project;
-	private static List<IValChangedListener> _listeners = new LinkedList<IValChangedListener>();
+	private final IProject	_project;
+	private final static List<IValChangedListener> _listeners = new LinkedList<IValChangedListener>();
 	
+	/**
+	 * The validators that are in the project preference file, but have
+	 * only been configured to the global preference level. That is they have not had
+	 * any project level customizations applied yet.
+	 */
 	private List<Validator> _validators;
 	
 	public ValPrefManagerProject(IProject project){
@@ -66,20 +71,24 @@
 	 * @return true if it has settings. This does not mean that the settings are enabled, only that it
 	 * has settings.
 	 * 
-	 * @see ValManager#hasEnabledProjectPreferences(IProject)
+	 * @deprecated
 	 */
 	public boolean hasProjectSpecificSettings(){
-		IEclipsePreferences pref = getPreferences();
+		PreferencesWrapper pref = getPreferences(null);
 		
 		if (pref == null)return false;
-		int version = pref.getInt(PrefConstants.frameworkVersion, 0);
-		if (version == 0)return false;
-
 		return true;
 	}
 	
 	/**
-	 * Answer the v2 validators that have been overridden by the global preferences.
+	 * Answer the v2 validators that have been overridden by the project
+	 * preferences. The validators will not have the preference store's
+	 * customizations applied yet. The purpose of this method, is to identify the subset of validators 
+	 * that may later be configured.
+	 * 
+	 * @param baseValidators
+	 *            V2 validators from the extension points, and customized by any
+	 *            global preferences.
 	 */
 	public List<Validator> getValidators(Map<String, Validator> baseValidators) throws BackingStoreException {
 		List<Validator> vals = _validators;
@@ -91,14 +100,22 @@
 	}
 	
 	/**
-	 * Load the validators from the preference store.
-	 * @return the validators that have been overridden by the global references.
+	 * Load the validators from the preference store. The validators will not have the preference store's
+	 * customizations applied yet. The purpose of this method, is to identify the subset of validators 
+	 * that may later be configured.
+	 * 
+	 * @param baseValidators
+	 *            V2 validators from the extension points, and customized by any
+	 *            global preferences.
+	 * @return the validators that are in the project preference file, but have
+	 *         only been configured to the global preference level. That is they have not had
+	 *         any project level customizations applied yet.
 	 */
 	private List<Validator> loadValidators(Map<String, Validator> baseValidators) throws BackingStoreException {
-		LinkedList<Validator> list = new LinkedList<Validator>();
-		IEclipsePreferences pref = getPreferences();
+		List<Validator> list = new LinkedList<Validator>();
+		PreferencesWrapper pref = getPreferences(null);
 		if (pref.nodeExists(PrefConstants.vals)){
-			Preferences vals = pref.node(PrefConstants.vals);
+			PreferencesWrapper vals = pref.node(PrefConstants.vals);
 			for (String id : vals.childrenNames()){
 				Validator base = baseValidators.get(id);
 				Validator v = ValPrefManagerGlobal.loadValidator(id, vals, base);
@@ -111,40 +128,93 @@
 		}
 		return list;
 	}
-	
+		
 	/**
-	 * Update the project preferences from the preference store.
-	 * @return false if the project does not have any specific preferences.
+	 * Answer the setting of the getOverride field.
 	 */
-	public boolean loadProjectPreferencesShallow(ProjectPreferences pp) {
-		IEclipsePreferences pref = getPreferences();
+	public boolean getOverride(){
+		PreferencesWrapper pref = getPreferences(null);
 		
-		if (pref == null)return false;
+		if (!pref.nodeExists())return ProjectPreferences.DefaultOverride;
+		
 		int version = pref.getInt(PrefConstants.frameworkVersion, 0);
-		if (version == 0)return false;
-		
-		if (version != ValPrefManagerGlobal.frameworkVersion)ValPrefManagerGlobal.migrate(version, pref);
+		if (version == 0){
+			try {
+				ProjectConfiguration pc = ConfigurationManager.getManager().getProjectConfiguration(_project);
+				return pc.getDoesProjectOverride();
+			}
+			catch (InvocationTargetException e){
+				// eat it, if it fails we just go with the defaults
+			}
+		}
+		return pref.getBoolean(PrefConstants.override, ProjectPreferences.DefaultOverride);
+	}
 
-		pp.setOverride(pref.getBoolean(PrefConstants.override, ProjectPreferences.DefaultOverride));
-		pp.setSuspend(pref.getBoolean(PrefConstants.suspend, ProjectPreferences.DefaultSuspend));
-		return true;
+	private ProjectPreferences migrateFromBeforeWTP30(IProject project, Map<String, Validator> baseValidators) {
+		try {
+			ProjectConfiguration pc = ConfigurationManager.getManager().getProjectConfiguration(project);
+			
+			List<Validator> list = migrateFromBeforeWTP30(baseValidators, pc);
+			Validator[] vals = new Validator[list.size()];
+			list.toArray(vals);
+			return new ProjectPreferences(project, pc.getDoesProjectOverride(), pc.isDisableAllValidation(), vals);
+		}
+		catch (InvocationTargetException e){
+			// eat it, if it fails we just go with the defaults
+		}
+		return new ProjectPreferences(project);
+	}
+
+	private List<Validator> migrateFromBeforeWTP30(Map<String, Validator> baseValidators, ProjectConfiguration pc)
+			throws InvocationTargetException {
+				
+		Set<String> build = pc.getEnabledBuildlValidators();
+		Set<String> manual = pc.getEnabledManualValidators();
+		
+		List<Validator> list = new LinkedList<Validator>();
+		for (Validator v : baseValidators.values()){
+			V2 v2 = v.asV2Validator();
+			if (v2 != null){
+				boolean isBuild = build == null || build.contains(v2.getValidatorClassname());
+				boolean isManual = manual == null || manual.contains(v2.getValidatorClassname());
+				if ((v.isBuildValidation() != isBuild) || (v.isManualValidation() != isManual)){
+					V2 copy = v2.copy().asV2Validator();
+					copy.setBuildValidation(isBuild);
+					copy.setManualValidation(isManual);
+					copy.setLevel(Validator.Level.Project);
+					Friend.setMigrated(copy, true);
+					list.add(copy);
+				}
+			}
+		}
+		return list;
 	}
 	
 	
-	//FIXME I suspect that this method should be removed	
 	/**
-	 * Update the project preferences from the preference store.
-	 * @return false if the project does not have any specific preferences.
+	 * Answer the project preferences from the preference store.
+	 * @return null if the project does not have any specific preferences.
 	 */
-	public boolean loadProjectPreferences(ProjectPreferences pp, Map<String, Validator> baseValidators) 
+	public ProjectPreferences loadProjectPreferences(IProject project, Map<String, Validator> baseValidators) 
 		throws BackingStoreException {
 		
-		if (!loadProjectPreferencesShallow(pp))return false;
+		PreferencesWrapper pref = getPreferences(null);
+
+		if (pref == null)return null;
+		int version = pref.getInt(PrefConstants.frameworkVersion, 0);
+		if (version == 0){
+			// This means that we have a project that is before WTP 3.0
+			return migrateFromBeforeWTP30(project, baseValidators);
+		}
 		
-		IEclipsePreferences pref = getPreferences();
-		if (!pref.nodeExists(PrefConstants.vals))return true;
+		if (version != ValPrefManagerGlobal.frameworkVersion)ValPrefManagerGlobal.migrate(version, pref);
+
+		if (!pref.nodeExists(PrefConstants.vals)){
+			return new ProjectPreferences(project, pref.getBoolean(PrefConstants.override, ProjectPreferences.DefaultOverride),
+				pref.getBoolean(PrefConstants.suspend, ProjectPreferences.DefaultSuspend), new Validator[0]);
+		}
 		
-		Preferences vp = pref.node(PrefConstants.vals);
+		PreferencesWrapper vp = pref.node(PrefConstants.vals);
 		List<Validator> list = new LinkedList<Validator>();
 		for (String id : vp.childrenNames()){
 			Validator base = baseValidators.get(id);
@@ -157,25 +227,25 @@
 		}
 		Validator[] vals = new Validator[list.size()];
 		list.toArray(vals);
-		pp.setValidators(vals);
-		return true;
+		return new ProjectPreferences(project, pref.getBoolean(PrefConstants.override, ProjectPreferences.DefaultOverride),
+			pref.getBoolean(PrefConstants.suspend, ProjectPreferences.DefaultSuspend), vals);
 	}
 
-	private IEclipsePreferences getPreferences() {
-		IScopeContext projectContext = new ProjectScope(_project);
-		IEclipsePreferences pref = projectContext.getNode(ValidationPlugin.PLUGIN_ID);
-		return pref;
+	private PreferencesWrapper getPreferences(Boolean persist) {
+		return PreferencesWrapper.getPreferences(_project, persist);
 	}
 
-	public void savePreferences(ProjectPreferences projectPreferences, Validator[] validators) {
-		IEclipsePreferences pref = getPreferences();
+	public void savePreferences(ProjectPreferences projectPreferences) {
+		Validator[] validators = projectPreferences.getValidators();
+		PreferencesWrapper pref = getPreferences(null);
 		pref.putBoolean(PrefConstants.suspend, projectPreferences.getSuspend());
 		pref.putBoolean(PrefConstants.override, projectPreferences.getOverride());
 		pref.putInt(PrefConstants.frameworkVersion, ValPrefManagerGlobal.frameworkVersion);
-		Preferences vals = pref.node(PrefConstants.vals);
+		PreferencesWrapper vals = pref.node(PrefConstants.vals);
 		try {
 			Validator[] workspaceVals = ValManager.getDefault().getValidators();
 			Map<String, Validator> base = new HashMap<String, Validator>(workspaceVals.length);
+			for (Validator v : workspaceVals)base.put(v.getId(), v);
 			for (Validator v : validators)ValPrefManagerGlobal.save(v, vals, base);
 			pref.flush();
 			ProjectConfiguration pc = ConfigurationManager.getManager()
@@ -190,6 +260,67 @@
 			ValidationPlugin.getPlugin().handleException(e);
 		}		
 	}
+
+	public void savePreferences(ProjectPreferences projectPreferences, ValidatorMutable[] validators) {
+		PreferencesWrapper pref = getPreferences(null);
+		pref.putBoolean(PrefConstants.suspend, projectPreferences.getSuspend());
+		pref.putBoolean(PrefConstants.override, projectPreferences.getOverride());
+		pref.putInt(PrefConstants.frameworkVersion, ValPrefManagerGlobal.frameworkVersion);
+		try {
+			savePreferences(validators, false, null);
+			pref.flush();
+			updateListeners(_project);
+		}
+		catch (Exception e){
+			ValidationPlugin.getPlugin().handleException(e);
+		}		
+	}
+	
+	public void savePreferences(MutableProjectSettings settings, Boolean persist){
+		IProject project = settings.getProject();
+		PreferencesWrapper pref = PreferencesWrapper.getPreferences(project, persist);
+		pref.putBoolean(PrefConstants.suspend, settings.getSuspend());
+		pref.putBoolean(PrefConstants.override, settings.getOverride());
+		pref.putInt(PrefConstants.frameworkVersion, ValPrefManagerGlobal.frameworkVersion);
+		
+		IMutableValidator[] vms = settings.getValidators();
+		ValidatorMutable[] validators = new ValidatorMutable[vms.length];
+		for (int i=0; i<vms.length;i++)validators[i] = (ValidatorMutable)vms[i];
+		
+		try {
+			savePreferences(validators, false, persist);
+			pref.flush();
+			updateListeners(project);
+		}
+		catch (Exception e){
+			if (project.isAccessible())ValidationPlugin.getPlugin().handleException(e);
+		}
+	}
+	
+	public void savePreferences(ValidatorMutable[] validators, boolean flush, Boolean persist){
+		PreferencesWrapper pref = getPreferences(persist);
+		pref.putInt(PrefConstants.frameworkVersion, ValPrefManagerGlobal.frameworkVersion);
+		PreferencesWrapper vals = pref.node(PrefConstants.vals);
+		try {
+			Validator[] workspaceVals = ValManager.getDefault().getValidators();
+			Map<String, Validator> base = new HashMap<String, Validator>(workspaceVals.length);
+			for (Validator v : workspaceVals)base.put(v.getId(), v);
+			for (ValidatorMutable v : validators)ValPrefManagerGlobal.save(v, vals, base);
+			ProjectConfiguration pc = ConfigurationManager.getManager().getProjectConfiguration(_project);
+			pc.setEnabledBuildValidators(getEnabledBuildValidators(validators));
+			pc.setEnabledManualValidators(getEnabledManualValidators(validators));
+			pc.passivate();
+			pc.store();
+			if (flush){
+				pref.flush();
+				updateListeners(_project);
+			}
+		}
+		catch (Exception e){
+			ValidationPlugin.getPlugin().handleException(e);
+		}		
+		
+	}
 	
 	/**
 	 * Answer all the V1 validators that are enabled for build.
@@ -207,6 +338,18 @@
 	}
 	
 	/**
+	 * Answer all the V1 validators that are enabled for build.
+	 * @return
+	 */
+	private Set<ValidatorMetaData> getEnabledBuildValidators(ValidatorMutable[] validators) {
+		Set<ValidatorMetaData> set = new HashSet<ValidatorMetaData>(50);
+		for (ValidatorMutable v : validators){
+			if (v.isBuildValidation() && v.isV1Validator())set.add(v.getVmd());
+		}
+		return set;
+	}
+	
+	/**
 	 * Answer all the V1 validators that are enabled for manual validation.
 	 * @return
 	 */
@@ -221,9 +364,21 @@
 		return set;
 	}
 	
+	/**
+	 * Answer all the V1 validators that are enabled for manual validation.
+	 * @return
+	 */
+	private Set<ValidatorMetaData> getEnabledManualValidators(ValidatorMutable[] validators) {
+		Set<ValidatorMetaData> set = new HashSet<ValidatorMetaData>(50);
+		for (ValidatorMutable v : validators){
+			if (v.isManualValidation() && v.isV1Validator())set.add(v.getVmd());
+		}
+		return set;
+	}
+	
 	public void loadMessages(Validator validator, Map<String, MessageSeveritySetting> settings) {
 		try {
-			ValPrefManagerGlobal.loadMessageSettings(validator, settings, getPreferences());
+			ValPrefManagerGlobal.loadMessageSettings(validator, settings, getPreferences(null));
 		}
 		catch (BackingStoreException e){
 			ValidationPlugin.getPlugin().handleException(e);
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValidationResultSummary.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValidationResultSummary.java
new file mode 100644
index 0000000..9e91217
--- /dev/null
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValidationResultSummary.java
@@ -0,0 +1,42 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2009 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.validation.internal;
+
+/**
+ * An immutable object that holds a summary of the validation.
+ * @author karasiuk
+ *
+ */
+public final class ValidationResultSummary {
+	
+	private final int 	_error;
+	private final int 	_warning;
+	private final int	_info;
+	
+	public ValidationResultSummary(int error, int warning, int info){
+		_error = error;
+		_warning = warning;
+		_info = info;
+	}
+
+	public int getSeverityError() {
+		return _error;
+	}
+
+	public int getSeverityWarning() {
+		return _warning;
+	}
+
+	public int getSeverityInfo() {
+		return _info;
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValidationRunner.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValidationRunner.java
index dd33d82..01bf297 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValidationRunner.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValidationRunner.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
+ * Copyright (c) 2007, 2009 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
@@ -10,9 +10,12 @@
  *******************************************************************************/
 package org.eclipse.wst.validation.internal;
 
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
+import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IResourceDelta;
@@ -27,10 +30,15 @@
 
 /**
  * Run the validators on a selected set of resources.
+ * <p>
+ * This is used to run manual validations (i.e. the user selects the Validate menu item), 
+ * or it is invoked programmatically by a third party through the ValidationFramework API.
+ * It is not used for the build based invocation.
+ * </p> 
  * @author karasiuk
  *
  */
-public class ValidationRunner implements IWorkspaceRunnable {
+public final class ValidationRunner implements IWorkspaceRunnable {
 	
 	private Map<IProject, Set<IResource>>		_projects;
 	private	ValType			_valType;
@@ -61,6 +69,31 @@
 		return me._valOperation;
 	}
 	
+	/**
+	 * Validate the selected file. This is a convenience method, it simply calls the more flexible 
+	 * validate with Map method. 
+	 * 
+	 * @param file
+	 *            The file to be validated.
+	 * 
+	 * @param valType
+	 *            The type of validation that has been requested.
+	 * 
+	 * @param monitor
+	 *            Progress monitor.
+	 * 
+	 * @param atomic
+	 *            Run as an atomic workspace operation?
+	 */
+	public static ValOperation validate(IFile file, ValType valType, IProgressMonitor monitor, boolean atomic) throws CoreException{
+	    final Map<IProject, Set<IResource>> map = new HashMap<IProject, Set<IResource>>(1);
+	      
+	    Set<IResource> set = new HashSet<IResource>(1);
+	    set.add(file);
+	    map.put(file.getProject(), set);
+	    return validate(map, valType, monitor, atomic);		
+	}
+	
 	private ValidationRunner(Map<IProject, Set<IResource>> projects, ValType valType){
 		_projects = projects;
 		_valType = valType;
@@ -91,14 +124,19 @@
 				
 		for (Map.Entry<IProject, Set<IResource>> me : _projects.entrySet()){
 			if (monitor.isCanceled()){
-				_valOperation.getResult().setCanceled(true);
+				_valOperation.setCanceled(true);
 				return _valOperation;
 			}
 			IProject project = me.getKey();
 			manager.accept(startingVisitor, project, _valType, _valOperation, monitor);
 			for (IResource resource : me.getValue()){
-				manager.validate(project, resource, IResourceDelta.NO_CHANGE, _valType, 
-					IncrementalProjectBuilder.AUTO_BUILD, _valOperation, monitor);
+				try {
+					manager.validate(project, resource, IResourceDelta.NO_CHANGE, _valType, 
+							IncrementalProjectBuilder.AUTO_BUILD, _valOperation, monitor);
+				}
+				catch (ResourceUnavailableError error){
+					// if the resource is no longer available, we can't validate it, so we should just move on. 
+				}
 			}
 			manager.accept(finishedVisitor, project, _valType, _valOperation, monitor);
 		}
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValidatorExtensionReader.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValidatorExtensionReader.java
index 3a4975e..0c78ad5 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValidatorExtensionReader.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValidatorExtensionReader.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
+ * Copyright (c) 2007, 2010 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
@@ -42,17 +42,16 @@
  */
 public class ValidatorExtensionReader {
 	
-	private static ValidatorExtensionReader _me;
+	private static ValidatorExtensionReader _me = new ValidatorExtensionReader();
 	
-	public static ValidatorExtensionReader getDefault(){
-		if (_me == null)_me = new ValidatorExtensionReader();
+	public  static ValidatorExtensionReader getDefault(){
 		return _me;
 	}
 	
 	private ValidatorExtensionReader(){}
 	
 	/**
-	 * Read the extensions.
+	 * Process the v2 extensions, returning all the v2 validators.
 	 */
 	Collection<Validator> process() {
 		Map<String,Validator> map = new HashMap<String, Validator>(100);
@@ -61,8 +60,11 @@
 				
 		for (IExtension ext : extensionPoint.getExtensions()){
 			for (IConfigurationElement validator : ext.getConfigurationElements()){
-				Validator v = processValidator(validator, ext.getUniqueIdentifier(), ext.getLabel(), null);
-				if (v != null)map.put(v.getId(),v);
+				String id = ext.getUniqueIdentifier();
+				if (Tracing.isEnabled(id)){
+					Validator v = processValidator(validator, id, ext.getLabel(), null);
+					if (v != null)map.put(v.getId(),v);
+				}
 			}
 		}
 		
@@ -83,7 +85,16 @@
 					}
 					else {
 						for (IConfigurationElement exclude : validator.getChildren()){
-							FilterGroup fg = createFilterGroup(exclude);
+							FilterGroup fg = null;
+							try {
+								fg = createFilterGroup(exclude);
+							}
+							catch (Exception e){
+								ValidationPlugin.getPlugin().handleException(e);
+								IContributor contrib = validator.getContributor();
+								String message = NLS.bind(ValMessages.ErrConfig, contrib.getName());
+								ValidationPlugin.getPlugin().logMessage(IStatus.ERROR, message);								
+							}
 							if (fg != null && fg.isExclude()){
 								mergeExcludeGroup(v2, fg);
 							}
@@ -93,6 +104,13 @@
 			}
 			
 		}
+		
+		for (String removedValidator : getRemovedValidators()){
+			if (removedValidator != null) {
+				map.remove(removedValidator);
+			}
+		}
+
 		return map.values();
 		
 	}
@@ -113,10 +131,16 @@
 		}
 		if (existing == null)v2.add(fg);
 		else {
-			for (FilterRule rule : fg.getRules()){
-				existing.add(rule);
-			}
-			v2.bumpChangeCountGroups();
+			List<FilterRule> rules = new LinkedList<FilterRule>();
+			for (FilterRule rule : existing.getRules())rules.add(rule);
+			
+			for (FilterRule rule : fg.getRules())rules.add(rule);
+			
+			FilterRule[] filterRules = new FilterRule[rules.size()];
+			rules.toArray(filterRules);
+			FilterGroup merged = FilterGroup.create(existing.isExclude(), filterRules);
+			
+			v2.replaceFilterGroup(existing, merged);
 		}
 	}
 	
@@ -183,7 +207,7 @@
 	}
 
 	/**
-	 * Answer the extension point for the validators.
+	 * Answer the extension point for the v2 validators.
 	 * 
 	 * @return null if there is a problem or no extensions.
 	 */
@@ -193,7 +217,8 @@
 	}
 
 	/**
-	 * Answer the extension point for adding exclusion filters.
+	 * Answer the extension point for adding exclusion filters. This is where another validator can
+	 * further restrict an existing validator.
 	 * 
 	 * @return null if there is a problem or no extensions.
 	 */
@@ -202,9 +227,22 @@
 		return registry.getExtensionPoint(ValidationPlugin.PLUGIN_ID, ExtensionConstants.excludeExtension);
 	}
 	
-	
-	
-
+	/**
+	 * Answer the extension point for removing a validator. 
+	 * 
+	 * @return list of validator ID or null if no validator will be removed
+	 */
+	private List<String> getRemovedValidators(){
+		IExtensionRegistry registry = Platform.getExtensionRegistry();
+		IExtensionPoint extensionPoint = registry.getExtensionPoint(ValidationPlugin.PLUGIN_ID, ExtensionConstants.removedValidatorExtension);
+		List<String> val = new LinkedList<String>();
+		for (IExtension ext : extensionPoint.getExtensions()){
+			for (IConfigurationElement validator : ext.getConfigurationElements()){
+				val.add(validator.getAttribute(ExtensionConstants.RemovedValidator.validatorIDAttr));
+			}
+		}
+		return val;
+	}
 	/**
 	 * Process a message element for the validator, by creating a MessageCategory for it.
 	 * 
@@ -245,31 +283,44 @@
 	 *         element.
 	 */
 	private FilterGroup createFilterGroup(IConfigurationElement group){
-		FilterGroup fg = FilterGroup.create(group.getName());
-		if (fg == null)return null;			
+		String name = group.getName();
+		if (!FilterGroup.isKnownName(name))return null; 
+		
 		
 		IConfigurationElement[] rules = group.getChildren(ExtensionConstants.rules);
 		// there should only be one
+		List<FilterRule> list = new LinkedList<FilterRule>();
 		for (int i=0; i<rules.length; i++){
 			IConfigurationElement[] r = rules[i].getChildren();
 			for(int j=0; j<r.length; j++){
-				processRule(fg, r[j]);
+				list.add(processRule(r[j]));
 			}
 		}
-		return fg;
+		FilterRule[] filterRules = new FilterRule[list.size()];
+		list.toArray(filterRules);
+		return FilterGroup.create(name, filterRules);
 	}
 
 	/**
 	 * Process a rule in one of the rule groups.
 	 * 
-	 * @param fg the filter group that we are building up 
 	 * @param rule a rule in the group, like fileext.
 	 */
-	private void processRule(FilterGroup fg, IConfigurationElement rule) {
-		FilterRule fr = FilterRule.create(rule.getName());
-		if (fr == null)throw new IllegalStateException(ValMessages.ErrFilterRule);
-		fr.setData(rule);
-		fg.add(fr);
+	private FilterRule processRule(IConfigurationElement rule) {
+		FilterRule fr = FilterRule.create(rule);
+		if (fr == null){
+			String contributor = ""; //$NON-NLS-1$
+			String name = ""; //$NON-NLS-1$
+			try {
+				contributor = rule.getDeclaringExtension().getContributor().getName();
+				name = rule.getName();
+			}
+			catch (Exception e){
+				// eat it
+			}
+			throw new IllegalStateException(NLS.bind(ValMessages.ErrFilterRule, contributor, name));
+		}
+		return fr;
 	}
 	
 	/**
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValidatorMutable.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValidatorMutable.java
new file mode 100644
index 0000000..5ab29c5
--- /dev/null
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/ValidatorMutable.java
@@ -0,0 +1,262 @@
+package org.eclipse.wst.validation.internal;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.wst.validation.IMutableValidator;
+import org.eclipse.wst.validation.MessageSeveritySetting;
+import org.eclipse.wst.validation.Validator;
+import org.eclipse.wst.validation.Validator.V1;
+import org.eclipse.wst.validation.Validator.V2;
+import org.eclipse.wst.validation.internal.model.FilterGroup;
+
+/**
+ * The mutable fields that a user can change through the preference or property page.
+ * @author karasiuk
+ *
+ */
+public final class ValidatorMutable implements IAdaptable, IMutableValidator {
+	
+	private boolean _build;
+	private boolean	_manual;
+	private String _delegatingId;
+	
+	private int _changeCountGroups;
+	private int _changeCountMessages;
+	
+	private final String	_name;
+	private final String 	_sourceId;
+	private final boolean _isV1;
+	private final boolean _isV2;
+	private final ValidatorMetaData _vmd;
+	private final String _id;
+	private final int	_version;
+
+	private FilterGroup[] _groups;
+	private final Map<String, MessageSeveritySetting> _messageSettings;
+	private final String _validatorClassname;
+	
+	private final boolean 	_origBuild;
+	private final boolean 	_origManual;
+	private final String	_origDelegating;
+
+	public ValidatorMutable(Validator validator) {
+		_name = validator.getName();
+		_sourceId = validator.getSourceId();
+		_manual = validator.isManualValidation();
+		_build = validator.isBuildValidation();
+		V2 v2 = validator.asV2Validator();
+		_isV2 = v2 != null;
+		_delegatingId = validator.getDelegatingId();
+		
+		V1 v1 = validator.asV1Validator();
+		_isV1 = v1 != null;
+		_vmd = _isV1 ? v1.getVmd() : null;
+		_id = validator.getId();
+		
+		_origBuild = _build;
+		_origDelegating = _delegatingId;
+		_origManual = _manual;
+		_version = validator.getVersion();
+		_validatorClassname = validator.getValidatorClassname();
+		_messageSettings = new HashMap<String, MessageSeveritySetting>(10); 
+		for (Map.Entry<String, MessageSeveritySetting> me : validator.getMessageSettings().entrySet()){
+			_messageSettings.put(me.getKey(), me.getValue().copy());
+		}
+		
+		if (v2 != null){
+			FilterGroup[] groups = v2.getGroups();
+			_groups = new FilterGroup[groups.length];
+			System.arraycopy(groups, 0, _groups, 0, groups.length);
+		}
+	}
+
+	public ValidatorMutable(ValidatorMutable val) {
+		_build = val._build;
+		_delegatingId = val._delegatingId;
+		FilterGroup[] groups = val.getGroups();
+		_groups = new FilterGroup[groups.length];
+		System.arraycopy(groups, 0, _groups, 0, groups.length);
+		
+		_id = val._id;
+		_isV1 = val._isV1;
+		_isV2 = val._isV2;
+		_manual = val._manual;
+		_messageSettings = new HashMap<String, MessageSeveritySetting>(10); 
+		for (Map.Entry<String, MessageSeveritySetting> me : val.getMessageSettings().entrySet()){
+			_messageSettings.put(me.getKey(), me.getValue().copy());
+		}
+
+		_name = val._name;
+		_origBuild = val._origBuild;
+		_origDelegating = val._origDelegating;
+		_origManual = val._origManual;
+		_sourceId = val._sourceId;
+		_validatorClassname = val._validatorClassname;
+		_version = val._version;
+		_vmd = val._vmd;
+	}
+
+	public void setBuildValidation(boolean build) {
+		_build = build;		
+	}
+
+	public void setManualValidation(boolean manual) {
+		_manual = manual;
+	}
+
+	public String getName() {
+		return _name;
+	}
+
+	public boolean isManualValidation() {
+		return _manual;
+	}
+
+	public boolean isBuildValidation() {
+		return _build;
+	}
+
+	public boolean isV2Validator() {
+		return _isV2;
+	}
+
+	public String getDelegatingId() {
+		return _delegatingId;
+	}
+
+	/**
+	 * The caller of this method must not change the ValidatorMetaData.
+	 */
+	public ValidatorMetaData getVmd() {
+		return _vmd;
+	}
+
+	public boolean isV1Validator() {
+		return _isV1;
+	}
+
+	public String getId() {
+		return _id;
+	}
+
+	/**
+	 * Answer true if any of your settings have changed.
+	 */
+	public boolean isChanged() {
+		if (hasGlobalChanges())return true;
+		if (_changeCountGroups > 0 || _changeCountMessages > 0)return true;
+		return false;
+	}
+
+	public boolean hasGlobalChanges() {
+		if (_origBuild != _build)return true;
+		if (_origManual != _manual)return true;
+		if (!Misc.same(_origDelegating, _delegatingId))return true;
+		return false;
+	}
+
+	public int getVersion() {
+		return _version;
+	}
+
+	public void replaceFilterGroup(FilterGroup existing, FilterGroup merged) {
+		int i = find(existing);
+		if (i == -1)add(merged);  // this should never happen
+		else {
+			_groups[i] = merged;
+			bumpChangeCountGroups();
+		}
+	}
+	
+	public void remove(FilterGroup group) {
+		int i = find(group);
+		if (i == -1)return;
+		
+		FilterGroup[] groups = new FilterGroup[_groups.length-1];
+		if (i > 0)System.arraycopy(_groups, 0, groups, 0, i);
+		if (i < groups.length)System.arraycopy(_groups, i+1, groups, i, groups.length-i);
+		_groups = groups;
+		bumpChangeCountGroups();
+	}
+	
+	private int find(FilterGroup group) {
+		for (int i=0; i<_groups.length; i++)if (group == _groups[i])return i;
+		return -1;
+	}
+
+	public void add(FilterGroup fg) {
+		assert fg != null;
+		FilterGroup[] groups = new FilterGroup[_groups.length+1];
+		System.arraycopy(_groups, 0, groups, 0, _groups.length);
+		groups[_groups.length] = fg;
+		_groups = groups;
+		bumpChangeCountGroups();
+	}
+	
+	private void bumpChangeCountGroups(){
+		_changeCountGroups++;
+	}
+
+	public int getChangeCountGroups() {
+		return _changeCountGroups;
+	}
+	
+	public FilterGroup[] getGroups(){
+		return _groups;
+	}
+
+	public void setDelegatingId(String id) {
+		_delegatingId = id;	
+	}
+
+	public Map<String, MessageSeveritySetting> getMessageSettings() {
+		return _messageSettings;
+	}
+
+	public int getChangeCountMessages(){
+		return _changeCountMessages;
+	}
+	
+	public void bumpChangeCountMessages(){
+		_changeCountMessages++;
+	}
+
+	public String getValidatorClassname() {
+		return _validatorClassname;
+	}
+
+	@SuppressWarnings("unchecked")
+	public Object getAdapter(Class adapter) {
+		return Platform.getAdapterManager().getAdapter(this, adapter);
+	}
+
+	public boolean sameConfig(Validator validator) {
+		if (validator == null)return false;
+		return hashCodeForConfig() == validator.hashCodeForConfig();
+	}
+
+	private int hashCodeForConfig() {
+		int h = 0;
+		if (_build)h += 101;
+		if (_delegatingId != null)h += _delegatingId.hashCode();
+		if (_manual)h += 201;
+		if (_messageSettings != null){
+			for (MessageSeveritySetting ms : _messageSettings.values())h += ms.hashCode();
+		}
+		if (_sourceId != null)h += _sourceId.hashCode();
+		h += _version;
+		if (_id != null)h += _id.hashCode();
+		for (FilterGroup fg : _groups)h += fg.hashCodeForConfig();
+		return h;
+	}
+
+	@Override
+	public String toString() {
+		return _name;
+	}
+
+
+}
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/model/FilterGroup.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/model/FilterGroup.java
index f544156..6d20dd5 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/model/FilterGroup.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/model/FilterGroup.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2008 IBM Corporation and others.
+ * Copyright (c) 2005, 2009 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
@@ -23,11 +23,14 @@
 import org.eclipse.wst.validation.internal.Serializer;
 import org.eclipse.wst.validation.internal.ValMessages;
 
+/**
+ * An immutable group of filter rules.
+ * @author karasiuk
+ *
+ */
 public abstract class FilterGroup implements IAdaptable {
 	
-	/** A list of FilterRule's for this group. */
-	List<FilterRule> _rules = new LinkedList<FilterRule>();
-	FilterRule[] _rulesArray;
+	private final FilterRule[] _rules;
 	
 	/** The version number of the serialization (in case we ever need to change this) */
 	private static final int SerializationVersion = 1;
@@ -39,9 +42,9 @@
 	 * 
 	 * @return null if the name parameter isn't correct.
 	 */
-	public static FilterGroup create(String name) {
-		if (ExtensionConstants.include.equals(name))return new FilterIncludeGroup();
-		if (ExtensionConstants.exclude.equals(name))return new FilterExcludeGroup();
+	public static FilterGroup create(String name, FilterRule[] rules) {
+		if (ExtensionConstants.include.equals(name))return new FilterIncludeGroup(rules);
+		if (ExtensionConstants.exclude.equals(name))return new FilterExcludeGroup(rules);
 		return null;
 	}
 	
@@ -54,9 +57,14 @@
 	public static FilterGroup create(Deserializer des){
 		des.getInt(); // get the version
 		String type = des.getString();
-		FilterGroup fg = create(type);
-		if (fg != null)fg.load(des);
-		return fg;
+		
+		int numberRules = des.getInt();
+		List<FilterRule> list = new LinkedList<FilterRule>();
+		for (int i=0; i<numberRules; i++)list.add(FilterRule.create(des));
+		FilterRule[] rules = new FilterRule[list.size()];
+		list.toArray(rules);
+
+		return create(type, rules);
 	}
 
 	/**
@@ -64,42 +72,36 @@
 	 * 
 	 * @param exclude if true an exclusion group is returned, otherwise an inclusion group is returned.
 	 */
-	public static FilterGroup create(boolean exclude){
-		if (exclude) return new FilterExcludeGroup();
-		return new FilterIncludeGroup();
+	public static FilterGroup create(boolean exclude, FilterRule[] rules){
+		if (exclude) return new FilterExcludeGroup(rules);
+		return new FilterIncludeGroup(rules);
 	}
 
-	public void add(FilterRule fr) {
-		_rulesArray = null;
-		_rules.add(fr);
-	}
-	
 	/**
-	 * If you can, remove this rule from yourself.
-	 * 
-	 * @param fr the rule that is being removed
-	 * 
-	 * @return true if the rule was removed, and false if it was not. If you didn't include the rule in the
-	 * first place, false would be returned.
+	 * Answer true if this is a supported type of group.
+	 * @param name Type of group that is being tested.
+	 * @return
 	 */
-	public synchronized boolean remove(FilterRule fr){
-		if (_rules.remove(fr)){
-			_rulesArray =  null;
-			return true;
-		}
+	public static boolean isKnownName(String name) {
+		if (ExtensionConstants.include.equals(name))return true;
+		if (ExtensionConstants.exclude.equals(name))return true;
 		return false;
 	}
+
 	
-	public FilterRule[] getRules(){
-		FilterRule[] rules = _rulesArray;
-		if (rules == null){
-			rules = new FilterRule[_rules.size()];
-			_rules.toArray(rules);
-			_rulesArray = rules;
-		}
+	private FilterGroup(FilterRule[] rules){
+		_rules = rules;
+	}
+		
+	/**
+	 * The rules in the group.
+	 */
+	public final FilterRule[] getRules(){
+		FilterRule[] rules = new FilterRule[_rules.length];
+		System.arraycopy(_rules, 0, rules, 0, _rules.length);
 		return rules;
 	}
-	
+		
 	/**
 	 * Answer the internal type of group, e.g. "include" or "exclude".
 	 */
@@ -113,7 +115,11 @@
 		return Platform.getAdapterManager().getAdapter(this, adapter);
 	}
 	
-	public static class FilterIncludeGroup extends FilterGroup {
+	public static final class FilterIncludeGroup extends FilterGroup {
+		
+		private FilterIncludeGroup(FilterRule[] rules){
+			super(rules);
+		}
 
 		public String getType() {
 			return ExtensionConstants.include;
@@ -127,22 +133,18 @@
 			return true;
 		}
 		
-		protected FilterGroup create() {
-			return new FilterIncludeGroup();
-		}
-		
 	}
 	
 	
-	public static class FilterExcludeGroup extends FilterGroup {
+	public static final class FilterExcludeGroup extends FilterGroup {
+		
+		private FilterExcludeGroup(FilterRule[] rules){
+			super(rules);
+		}
 		public String getType() {
 			return ExtensionConstants.exclude;
 		}
 		
-		protected FilterGroup create() {
-			return new FilterExcludeGroup();
-		}
-		
 		public String getDisplayableType() {
 			return ValMessages.GroupExclude;
 		}
@@ -151,12 +153,7 @@
 			return true;
 		}		
 	}
-	
-	protected void load(Deserializer des) {
-		int rules = des.getInt();
-		for (int i=0; i<rules; i++)_rules.add(FilterRule.create(des));
-	}
-	
+		
 	/**
 	 * Save your settings into the serializer.
 	 * @param ser
@@ -164,7 +161,7 @@
 	public void save(Serializer ser){
 		ser.put(SerializationVersion);
 		ser.put(getType());
-		ser.put(_rules.size());
+		ser.put(_rules.length);
 		for (FilterRule rule : _rules)rule.save(ser);		
 	}
 
@@ -176,11 +173,10 @@
 	 * only the project level checks are performed.
 	 */
 	public boolean shouldValidate(IProject project, IResource resource, ContentTypeWrapper contentTypeWrapper) {
-		FilterRule[] rules = getRules();
 		boolean exclude = isExclude();
 		boolean include = isInclude();
 		int count = 0;
-		for (FilterRule rule : rules){
+		for (FilterRule rule : _rules){
 			if (resource != null){
 				Boolean match = rule.matchesResource(resource, contentTypeWrapper);
 				if (match != null)count++;
@@ -214,28 +210,44 @@
 		return false;
 	}
 	
-	protected abstract FilterGroup create();
-
-	/** Answer a deep copy of yourself. */
-	public FilterGroup copy() {
-		FilterGroup fg = create();
-		FilterRule[] rules = getRules();
-		fg._rulesArray = new FilterRule[rules.length];
-		for (int i=0; i<rules.length; i++){
-			fg._rulesArray[i] = rules[i].copy();
-			fg._rules.add(fg._rulesArray[i]);
-		}
-		return fg;
-	}
-
 	public int hashCodeForConfig() {
 		int h = 0;
 		if (isExclude())h += 13;
-		if (_rules != null){
-			for (FilterRule fr : _rules)h += fr.hashCodeForConfig();
-		}
+		for (FilterRule fr : _rules)h += fr.hashCodeForConfig();
 		return h;
 	}
-	
+
+	/**
+	 * Create a new group by adding a rule to an existing group.
+	 * @param baseGroup The group that holds the existing rules.
+	 * @param rule The new rule that is being added
+	 * @return
+	 */
+	public static FilterGroup addRule(FilterGroup baseGroup, FilterRule rule) {
+		List<FilterRule> list = new LinkedList<FilterRule>();
+		for (FilterRule r : baseGroup._rules)list.add(r);
+		list.add(rule);
+		
+		FilterRule[] rules = new FilterRule[list.size()];
+		list.toArray(rules);
+		return FilterGroup.create(baseGroup.isExclude(), rules);
+	}
+
+	/**
+	 * Create a new group by removing a rule from an existing group.
+	 * @param baseGroup The group that holds the existing rules.
+	 * @param rule The rule that is being removed
+	 * @return
+	 */
+	public static FilterGroup removeRule(FilterGroup baseGroup,	FilterRule rule) {
+		List<FilterRule> list = new LinkedList<FilterRule>();
+		for (FilterRule r : baseGroup._rules){
+			if (!r.equals(rule))list.add(r);
+		}
+		
+		FilterRule[] rules = new FilterRule[list.size()];
+		list.toArray(rules);
+		return FilterGroup.create(baseGroup.isExclude(), rules);
+	}	
 
 }
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/model/FilterRule.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/model/FilterRule.java
index 0097cd5..e50df61 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/model/FilterRule.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/model/FilterRule.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
+ * Copyright (c) 2007, 2009 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
@@ -10,6 +10,8 @@
  *******************************************************************************/
 package org.eclipse.wst.validation.internal.model;
 
+import java.util.regex.Pattern;
+
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.resources.IResource;
@@ -23,79 +25,105 @@
 import org.eclipse.wst.validation.internal.ContentTypeWrapper;
 import org.eclipse.wst.validation.internal.Deserializer;
 import org.eclipse.wst.validation.internal.ExtensionConstants;
-import org.eclipse.wst.validation.internal.PrefConstants;
 import org.eclipse.wst.validation.internal.Serializer;
 import org.eclipse.wst.validation.internal.Tracing;
 import org.eclipse.wst.validation.internal.ValMessages;
 import org.eclipse.wst.validation.internal.plugin.ValidationPlugin;
-import org.osgi.service.prefs.Preferences;
 
 /**
  * A rule that is used to filter out (or in) validation on a resource.
+ * The concrete classes are all immutable.
  * @author karasiuk
  *
  */
 public abstract class FilterRule implements IAdaptable {
 	
-	protected String _pattern;
+	protected final String _pattern;
+	
+	protected static final String PortableFileDelim = "/"; //$NON-NLS-1$
 	
 	/**
-	 * Create a rule based on an extension element.
-	 * @param name the extension element, it can be one of projectNature, facet, fileext, file or contentType
+	 * Create a rule based on a configuration element.
+	 * 
+	 * @param rule
+	 *            The configuration element, see the extension point for details.
 	 * @return null if there is a problem.
 	 */
-	public static FilterRule create(String name){
-		if (ExtensionConstants.Rule.fileext.equals(name))return new FileExt();
-		if (ExtensionConstants.Rule.projectNature.equals(name))return new ProjectNature();
-		if (ExtensionConstants.Rule.file.equals(name))return new File();
-		if (ExtensionConstants.Rule.contentType.equals(name))return new ContentType();
-		if (ExtensionConstants.Rule.facet.equals(name))return new Facet();
+	public static FilterRule create(IConfigurationElement rule){
+		String name = rule.getName();
+		if (ExtensionConstants.Rule.fileext.equals(name))return new FileExt(rule);
+		if (ExtensionConstants.Rule.projectNature.equals(name))return new ProjectNature(rule);
+		if (ExtensionConstants.Rule.file.equals(name))return File.createFile(rule);
+		if (ExtensionConstants.Rule.contentType.equals(name))return ContentType.createContentType(rule);
+		if (ExtensionConstants.Rule.facet.equals(name))return new Facet(rule);
+		if (ExtensionConstants.Rule.pattern.equals(name))return FilePattern.createFilePattern(rule);
 		return null;
 	}
 	
-	public static FilterRule create(Deserializer des) {
+	static FilterRule create(Deserializer des) {
 		String type = des.getString();
-		FilterRule fr = create(type);
-		if (fr != null)fr.load(des);
-		return fr;
+		if (ExtensionConstants.Rule.fileext.equals(type)){
+			String pattern = des.getString();
+			boolean caseSensitive = des.getBoolean();
+			return new FileExt(pattern, caseSensitive);
+		}
+		
+		if (ExtensionConstants.Rule.projectNature.equals(type)){
+			String pattern = des.getString();
+			return new ProjectNature(pattern);
+		}
+		
+		if (ExtensionConstants.Rule.file.equals(type)){
+			String pattern = des.getString();
+			boolean caseSensitive = des.getBoolean();
+			int fileType = des.getInt();
+			return new File(pattern, caseSensitive, fileType);
+		}
+		
+		if (ExtensionConstants.Rule.contentType.equals(type)){
+			String pattern = des.getString();
+			boolean exactMatch = des.getBoolean();
+			return new ContentType(pattern, exactMatch);
+		}
+		
+		if (ExtensionConstants.Rule.facet.equals(type)){
+			String pattern = des.getString();
+			return new Facet(pattern, null);
+		}
+		
+		if (ExtensionConstants.Rule.pattern.equals(type)){
+			String pattern = des.getString();
+			boolean caseSensitive = des.getBoolean();
+			return new FilePattern(pattern, caseSensitive);
+		}
+		return null;
 	}
 
 	
 	public static FilterRule createFile(String pattern, boolean caseSensitive, int type){
-		File ext = new File();
-		ext.setData(pattern);
-		ext.setCaseSensitive(caseSensitive);
-		ext.setType(type);
-		return ext;
+		return new File(pattern, caseSensitive, type);
 	}
 	
 	public static FilterRule createFileExt(String pattern, boolean caseSensitive){
-		FileExt ext = new FileExt();
-		ext.setData(pattern);
-		ext.setCaseSensitive(caseSensitive);
+		FileExt ext = new FileExt(pattern, caseSensitive);
 		return ext;
 	}
 	
 	public static FilterRule createFacet(String facetId){
-		Facet facet = new Facet();
-		facet.setData(facetId);
-		return facet;
+		return new Facet(facetId, null);
 	}
 	
 	public static FilterRule createProject(String projectNature){
-		ProjectNature pn = new ProjectNature();
-		pn.setData(projectNature);
-		return pn;
+		return new ProjectNature(projectNature);
 	}
 	
 	public static FilterRule createContentType(String contentType, boolean exactMatch){
-		ContentType ct = new ContentType();
-		ct.setData(contentType);
-		ct.setExactMatch(exactMatch);
-		return ct;
+		return new ContentType(contentType, exactMatch);
 	}
-	
-	public abstract void setData(IConfigurationElement rule);
+		
+	protected FilterRule(String pattern){
+		_pattern = pattern;
+	}
 
 	/** 
 	 * Answer true if the rule matches the resource, false if it doesn't, and
@@ -116,11 +144,7 @@
 	public Boolean matchesProject(IProject project){
 		return null;
 	}
-	
-	public void setData(String data){
-		_pattern = data;
-	}
-	
+		
 	public String toString() {
 		return getDisplayableType() + ": " + _pattern; //$NON-NLS-1$
 	}
@@ -140,7 +164,7 @@
 	/** Answer a type that can be displayed to an end user. */
 	public abstract String getDisplayableType();
 	
-	public boolean asBoolean(String value, boolean aDefault){
+	public static boolean asBoolean(String value, boolean aDefault){
 		if (value == null)return aDefault;
 		if (value.equals(ExtensionConstants.True))return true;
 		if (value.equals(ExtensionConstants.False))return false;
@@ -152,20 +176,45 @@
 		return Platform.getAdapterManager().getAdapter(this, adapter);
 	}
 	
-	public static class ProjectNature extends FilterRule {
-
-		
-		public FilterRule copy() {
-			ProjectNature rule = new ProjectNature();
-			rule._pattern = _pattern;
-			return rule;
+	public static abstract class FilterRuleCaseSensitive extends FilterRule {
+				
+		public FilterRuleCaseSensitive(String pattern, boolean caseSensitive) {
+			super(pattern);
+			_caseSensitive = caseSensitive;
 		}
 		
-		public void setData(IConfigurationElement rule) {
-			_pattern = rule.getAttribute(ExtensionConstants.RuleAttrib.id);
+		private final boolean _caseSensitive;
+				
+		@Override
+		public int hashCodeForConfig() {
+			int h =  super.hashCodeForConfig();
+			if (_caseSensitive)h += 401;
+			return h;
+		}
+				
+		@Override
+		public void save(Serializer ser) {
+			super.save(ser);
+			ser.put(_caseSensitive);
+		}
+						
+		public boolean isCaseSensitive() {
+			return _caseSensitive;
+		}
+				
+	}
+	
+	public static final class ProjectNature extends FilterRule {
+		
+		private ProjectNature(IConfigurationElement rule) {
+			super(rule.getAttribute(ExtensionConstants.RuleAttrib.id));
 			
 		}
 		
+		public ProjectNature(String projectNature) {
+			super(projectNature);
+		}
+
 		public String getDisplayableType() {
 			return ValMessages.RuleProjectNature;
 		}
@@ -185,28 +234,21 @@
 		
 	}
 	
-	public static class FileExt extends FilterRule {
+	public static final class FileExt extends FilterRuleCaseSensitive {
 		
-		private boolean _caseSensitive;
-		
-		public FilterRule copy() {
-			FileExt rule = new FileExt();
-			rule._pattern = _pattern;
-			rule._caseSensitive = _caseSensitive;
-			return rule;
+		private FileExt(IConfigurationElement rule){
+			super(rule.getAttribute(ExtensionConstants.RuleAttrib.ext), 
+				asBoolean(rule.getAttribute(ExtensionConstants.RuleAttrib.caseSensitive), false));
 		}
-		
+				
+		private FileExt(String pattern, boolean caseSensitive) {
+			super(pattern, caseSensitive);
+		}
+
 		public String getType() {
 			return ExtensionConstants.Rule.fileext;
 		}
 		
-		@Override
-		public int hashCodeForConfig() {
-			int h =  super.hashCodeForConfig();
-			if (_caseSensitive)h += 601;
-			return h;
-		}
-		
 		public String getDisplayableType() {
 			return ValMessages.RuleFileExt;
 		}
@@ -214,53 +256,17 @@
 		public String getName() {
 			return toString();
 		}
-
-		public void setData(IConfigurationElement rule) {
-			_pattern = rule.getAttribute(ExtensionConstants.RuleAttrib.ext);
-			_caseSensitive = asBoolean(rule.getAttribute(ExtensionConstants.RuleAttrib.caseSensitive), false);			
-		}
 		
 		public String toString() {
-			if (_caseSensitive)return NLS.bind(ValMessages.FileExtWithCase, getDisplayableType(), _pattern);
+			if (isCaseSensitive())return NLS.bind(ValMessages.FileExtWithCase, getDisplayableType(), _pattern);
 			return NLS.bind(ValMessages.FileExtWithoutCase, getDisplayableType(), _pattern);
 		}
 
 		public Boolean matchesResource(IResource resource, ContentTypeWrapper contentTypeWrapper) {
 			String ext = resource.getFileExtension();
-			if (_caseSensitive)return _pattern.equals(ext);
+			if (isCaseSensitive())return _pattern.equals(ext);
 			return _pattern.equalsIgnoreCase(ext);
 		}
-
-		public boolean isCaseSensitive() {
-			return _caseSensitive;
-		}
-		
-		@Override
-		public void load(Preferences rid) {
-			_caseSensitive = rid.getBoolean(PrefConstants.caseSensitive, false);
-			super.load(rid);
-		}
-		
-		@Override
-		public void save(Preferences rid) {
-			rid.putBoolean(PrefConstants.caseSensitive, _caseSensitive);
-			super.save(rid);
-		}
-		
-		@Override
-		protected void load(Deserializer des) {
-			super.load(des);
-			_caseSensitive = des.getBoolean();
-		}
-		@Override
-		public void save(Serializer ser) {
-			super.save(ser);
-			ser.put(_caseSensitive);
-		}
-
-		public void setCaseSensitive(boolean caseSensitive) {
-			_caseSensitive = caseSensitive;
-		}		
 	}
 	
 	/**
@@ -268,78 +274,60 @@
 	 * @author karasiuk
 	 *
 	 */
-	public static class File extends FilterRule {
+	public static final class File extends FilterRuleCaseSensitive {
 		
-		private boolean _caseSensitive;
-		private String	_patternAsLowercase;
+		private final String	_patternAsLowercase;
 		
 		/** One of the FileTypeXX constants. */
-		private int		_type;
+		private final int		_type;
 		
 		public static final int FileTypeFile = 1;
 		public static final int FileTypeFolder = 2;
 		public static final int FileTypeFull = 3;
 		
-		private static final String PortableFileDelim = "/"; //$NON-NLS-1$
-		
-		public File(){			
+		private static File createFile(IConfigurationElement rule){
+			String pattern = rule.getAttribute(ExtensionConstants.RuleAttrib.name);
+			if (pattern == null)throw new IllegalStateException(ValMessages.ErrPatternAttrib);
+			String type = rule.getAttribute(ExtensionConstants.RuleAttrib.fileType);
+			if (type == null)throw new IllegalStateException(ValMessages.ErrTypeReq);
+			
+			int myType = -1;
+			if (ExtensionConstants.FileType.file.equals(type))myType = FileTypeFile;
+			else if (ExtensionConstants.FileType.folder.equals(type)){
+				myType = FileTypeFolder;
+				if (!pattern.endsWith(PortableFileDelim))pattern += PortableFileDelim;
+			}
+			else if (ExtensionConstants.FileType.full.equals(type))myType = FileTypeFull;
+			else {
+				Object[] parms = {type, ExtensionConstants.FileType.file, ExtensionConstants.FileType.folder, 
+					ExtensionConstants.FileType.full};
+				throw new IllegalStateException(NLS.bind(ValMessages.ErrType, parms));
+			}
+			boolean caseSensitive = asBoolean(rule.getAttribute(ExtensionConstants.RuleAttrib.caseSensitive), false);
+			return new File(pattern, caseSensitive, myType);
 		}
 		
-		public FilterRule copy() {
-			File rule = new File();
-			rule._pattern = _pattern;
-			rule._patternAsLowercase = _patternAsLowercase;
-			rule._caseSensitive = _caseSensitive;
-			rule._type = _type;
-			return rule;
+		private  File(String pattern, boolean caseSensitive, int type){			
+			super(pattern, caseSensitive);
+			_type = type;
+			_patternAsLowercase = pattern == null ? null : pattern.toLowerCase();
 		}
-		
+				
 		public String getType() {
 			return ExtensionConstants.Rule.file;
 		}
 		
-		@Override
-		public int hashCodeForConfig() {
-			int h =  super.hashCodeForConfig();
-			if (_caseSensitive)h += 401;
-			return h;
-		}
-		
 		public String getDisplayableType() {
 			if (_type == FileTypeFolder)return ValMessages.RuleFolder;
 			if (_type == FileTypeFull)return ValMessages.RuleFull;
 			return ValMessages.RuleFile;
 		}
 		
-		@Override
-		public void setData(String pattern) {
-			if (pattern != null)_patternAsLowercase = pattern.toLowerCase();
-			else _patternAsLowercase = null;
-			
-			_pattern = pattern;
-		}
-
 		public void setData(IConfigurationElement rule) {
-			setData(rule.getAttribute(ExtensionConstants.RuleAttrib.name));
-			if (_pattern == null)throw new IllegalStateException(ValMessages.ErrPatternAttrib);
-			_caseSensitive = asBoolean(rule.getAttribute(ExtensionConstants.RuleAttrib.caseSensitive), false);	
-			String type = rule.getAttribute(ExtensionConstants.RuleAttrib.fileType);
-			if (type == null)throw new IllegalStateException(ValMessages.ErrTypeReq);
-			if (ExtensionConstants.FileType.file.equals(type))_type = FileTypeFile;
-			else if (ExtensionConstants.FileType.folder.equals(type)){
-				_type = FileTypeFolder;
-				if (!_pattern.endsWith(PortableFileDelim))setData(_pattern + PortableFileDelim);
-			}
-			else if (ExtensionConstants.FileType.full.equals(type))_type = FileTypeFull;
-			else {
-				Object[] parms = {type, ExtensionConstants.FileType.file, ExtensionConstants.FileType.folder, 
-					ExtensionConstants.FileType.full};
-				throw new IllegalStateException(NLS.bind(ValMessages.ErrType, parms));
-			}
 		}
 		
 		public String toString() {
-			if (_caseSensitive)return NLS.bind(ValMessages.FileExtWithCase, getDisplayableType(), _pattern);
+			if (isCaseSensitive())return NLS.bind(ValMessages.FileExtWithCase, getDisplayableType(), _pattern);
 			return NLS.bind(ValMessages.FileExtWithoutCase, getDisplayableType(), _pattern);
 		}
 		
@@ -360,56 +348,33 @@
 			}
 			
 			if (name == null)return Boolean.FALSE;
-			if (_caseSensitive)return name.startsWith(_pattern);
+			if (isCaseSensitive())return name.startsWith(_pattern);
 			return name.toLowerCase().startsWith(_patternAsLowercase);
 		}
-		
-		@Override
-		public void load(Preferences rid) {
-			_caseSensitive = rid.getBoolean(PrefConstants.caseSensitive, false);
-			_type = rid.getInt(PrefConstants.fileType, -1);
-			super.load(rid);
-		}
-		
-		@Override
-		public void save(Preferences rid) {
-			rid.putBoolean(PrefConstants.caseSensitive, _caseSensitive);
-			rid.putInt(PrefConstants.fileType, _type);
-			super.save(rid);
-		}
-		
-		@Override
-		protected void load(Deserializer des) {
-			super.load(des);
-			_caseSensitive = des.getBoolean();
-			_type = des.getInt();
-		}
-		
+								
 		@Override
 		public void save(Serializer ser) {
 			super.save(ser);
-			ser.put(_caseSensitive);
 			ser.put(_type);
 		}
-
-		public void setCaseSensitive(boolean caseSensitive) {
-			_caseSensitive = caseSensitive;
-		}
-
-		public void setType(int type) {
-			_type = type;
-		}
 		
 	}
 	
-	public static class Facet extends FilterRule {
+	public static final class Facet extends FilterRule {
 		
-		public FilterRule copy() {
-			Facet rule = new Facet();
-			rule._pattern = _pattern;
-			return rule;
+		private final String _versionExpression;
+		
+		private Facet(IConfigurationElement rule){
+			super(rule.getAttribute(ExtensionConstants.RuleAttrib.id));
+			_versionExpression = rule.getAttribute(ExtensionConstants.RuleAttrib.version);
+			
 		}
-		
+				
+		public Facet(String facetId, String versionExpression) {
+			super(facetId);
+			_versionExpression = versionExpression;
+		}
+
 		public String getType() {
 			return ExtensionConstants.Rule.facet;
 		}
@@ -417,15 +382,12 @@
 		public String getDisplayableType() {
 			return ValMessages.RuleFacet;
 		}
-
-		public void setData(IConfigurationElement rule) {
-			_pattern = rule.getAttribute(ExtensionConstants.RuleAttrib.id);
-		}
 		
 		@Override
 		public Boolean matchesProject(IProject project) {
 			try {
-				return FacetedProjectFramework.hasProjectFacet(project, _pattern);
+				if (_versionExpression == null)return FacetedProjectFramework.hasProjectFacet(project, _pattern);
+				return FacetedProjectFramework.hasProjectFacet(project, _pattern, _versionExpression);
 			}
 			catch (CoreException e){
 				if (Tracing.isLogging())ValidationPlugin.getPlugin().handleException(e);
@@ -433,21 +395,43 @@
 			return Boolean.FALSE;
 		}
 		
-	}
-	
-	public static class ContentType extends FilterRule {
-		
-		private transient IContentType 	_type;
-		private boolean			_exactMatch = true;
-		
-		public FilterRule copy() {
-			ContentType rule = new ContentType();
-			rule._pattern = _pattern;
-			rule._type = _type;
-			rule._exactMatch = _exactMatch;
-			return rule;
+		@Override
+		public String toString() {
+			StringBuffer b = new StringBuffer(200);
+			b.append(getDisplayableType());
+			b.append(": "); //$NON-NLS-1$
+			b.append(_pattern);
+			
+			if (_versionExpression !=  null){
+				b.append(" ("); //$NON-NLS-1$
+				b.append(_versionExpression);
+				b.append(")"); //$NON-NLS-1$
+			}
+			return b.toString();
 		}
 		
+	}
+	
+	public static final class ContentType extends FilterRule {
+		
+		private final IContentType 	_type;
+		private final boolean		_exactMatch;
+		
+		private ContentType(String pattern, boolean exactMatch){
+			super(pattern);
+			_type = Platform.getContentTypeManager().getContentType(pattern);
+			_exactMatch = exactMatch;
+		}
+		
+		private static ContentType createContentType(IConfigurationElement rule){
+			String pattern = rule.getAttribute(ExtensionConstants.RuleAttrib.id);
+			boolean exactMatch = true;
+			String exact = rule.getAttribute(ExtensionConstants.RuleAttrib.exactMatch);
+			if (ExtensionConstants.False.equals(exact)) exactMatch = false;
+			
+			return new ContentType(pattern, exactMatch);
+		}
+				
 		public String getType() {
 			return ExtensionConstants.Rule.contentType;
 		}
@@ -462,25 +446,7 @@
 		public String getDisplayableType() {
 			return ValMessages.RuleContentType;
 		}
-		
-		@Override
-		public void load(Preferences rid) {
-			_exactMatch = rid.getBoolean(PrefConstants.exactMatch, true);
-			super.load(rid);
-		}
-		
-		@Override
-		public void save(Preferences rid) {
-			rid.putBoolean(PrefConstants.exactMatch, _exactMatch);
-			super.save(rid);
-		}
-		
-		@Override
-		protected void load(Deserializer des) {
-			super.load(des);
-			_exactMatch = des.getBoolean();
-		}
-		
+								
 		@Override
 		public void save(Serializer ser) {
 			super.save(ser);
@@ -488,19 +454,8 @@
 		}
 
 		public void setData(IConfigurationElement rule) {
-			setData(rule.getAttribute(ExtensionConstants.RuleAttrib.id));
-			boolean exactMatch = true;
-			String exact = rule.getAttribute(ExtensionConstants.RuleAttrib.exactMatch);
-			if (ExtensionConstants.False.equals(exact)) exactMatch = false;
-			setExactMatch(exactMatch);
 		}
-		
-		@Override
-		public void setData(String pattern) {
-			_pattern = pattern;
-			_type = Platform.getContentTypeManager().getContentType(pattern);
-		}
-		
+				
 		public Boolean matchesResource(IResource resource, ContentTypeWrapper contentTypeWrapper) {
 			if (_type == null)return Boolean.FALSE;
 			if (resource instanceof IFile) {
@@ -517,19 +472,6 @@
 			}
 			return Boolean.FALSE;
 		}
-
-		/**
-		 * Should the content type match exactly, or should sub types be
-		 * included as well?
-		 * 
-		 * @param exactMatch
-		 *            If true this rule will only match this specific content
-		 *            type. If false this rule will match this content type and
-		 *            any of it's sub types.
-		 */
-		public void setExactMatch(boolean exactMatch) {
-			_exactMatch = exactMatch;
-		}
 		
 		@Override
 		public String toString() {
@@ -538,30 +480,43 @@
 		}
 		
 	}
+	
+	public static final class FilePattern extends FilterRuleCaseSensitive {
+		
+		private final Pattern _compiledPattern;
+		
+		private static FilePattern createFilePattern(IConfigurationElement rule){
+			String pattern = rule.getAttribute(ExtensionConstants.RuleAttrib.regex);
+			boolean caseSensitive = asBoolean(rule.getAttribute(ExtensionConstants.RuleAttrib.caseSensitive), false);
+			return new FilePattern(pattern, caseSensitive);
+		}
+		
+		private FilePattern(String pattern, boolean caseSensitive){
+			super(pattern, caseSensitive);
+			int flags = 0;
+			if (caseSensitive)flags = Pattern.CASE_INSENSITIVE;
+			Pattern compiledPattern = Pattern.compile(pattern, flags);				
+			_compiledPattern = compiledPattern;
+		}
 
-	/** Answer a deep copy of yourself. */
-	public abstract FilterRule copy();
+		@Override
+		public String getDisplayableType() {
+			return ValMessages.RulePattern;
+		}
 
-	/**
-	 * Save yourself in the preference file.
-	 * @param rid
-	 */
-	public void save(Preferences rid) {
-		rid.put(PrefConstants.ruleType, getType());
-		rid.put(PrefConstants.pattern, getPattern());		
-	}
-
-	/**
-	 * @param rule
-	 */
-	public void load(Preferences rule) {
-		setData(rule.get(PrefConstants.pattern, null));		
+		@Override
+		public String getType() {
+			return ExtensionConstants.Rule.pattern;
+		}
+		
+		@Override
+		public Boolean matchesResource(IResource resource, ContentTypeWrapper wrapper) {
+			String name = PortableFileDelim + resource.getProjectRelativePath().toPortableString();
+			if (name == null)return Boolean.FALSE;
+			return _compiledPattern.matcher(name).matches();
+		}		
 	}
 	
-	protected void load(Deserializer des){
-		setData(des.getString());
-	}
-
 	/**
 	 * Save your settings into the serializer.
 	 * @param ser
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/model/GlobalPreferences.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/model/GlobalPreferences.java
index 274fa20..2989c2c 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/model/GlobalPreferences.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/model/GlobalPreferences.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
+ * Copyright (c) 2007, 2009 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
@@ -12,9 +12,9 @@
 
 /**
  * This class represents the global Preferences as set on the Validation Preferences page. It doesn't
- * hold any of the individual validator settings, just the global check boxes.
+ * hold any of the individual validator settings, just the global check boxes. It is an immutable object.
  */
-public class GlobalPreferences {
+public final class GlobalPreferences {
 	
 	/** false - Default setting for the should all the validation be suspended setting. */ 
 	public static final boolean DefaultSuspend = false;
@@ -30,35 +30,65 @@
 	
 	/** 2 - The version of the framework meta data, if an explicit version isn't found. */
 	public static final int DefaultFrameworkVersion = 2;
+	
+	/** Bit masks for what has changed. */
+	public final static int ConfirmDialogMask = 1;
+	public final static int DisableAllValidationMask = 2;
+	public final static int OverrideMask = 4;
+	public final static int SaveAutomaticallyMask = 8;
+	public final static int StateTimeStampMask = 16;
+	public final static int VersionMask = 32;
+	
+	/**
+	 * The changes that could affect what gets validated.
+	 */
+	public final static int BuildChangeMask = DisableAllValidationMask | OverrideMask;
+	
 
-	private boolean _disableAllValidation = DefaultSuspend;
-	private boolean _saveAutomatically = DefaultAutoSave;
-	private boolean _confirmDialog = DefaultConfirm;
-	private boolean _override = DefaultOverride;
+	private final boolean _confirmDialog;
+	private final boolean _disableAllValidation;
+	private final boolean _override;
+	private final boolean _saveAutomatically;
 	
 	/** The plug-in state time stamp. */
-	private long	_stateTimeStamp;
+	private final long	_stateTimeStamp;
 	
 	/** The incoming version of the framework. This is used to determine if a migration is needed.*/
-	private int		_version;
-	
-	/** Has a setting changed that could effect which validators get called? */
-	private boolean	_configChange;
-	
+	private final int		_version;
+			
 	/**
 	 * The only valid way to get the global preferences is through the ValManager.
 	 * 
 	 * @see org.eclipse.wst.validation.internal.ValManager#getGlobalPreferences()
 	 */
-	public GlobalPreferences(){	}
+	public GlobalPreferences(GlobalPreferencesValues gp) {
+		_confirmDialog = gp.confirmDialog;
+		_disableAllValidation = gp.disableAllValidation;
+		_override = gp.override;
+		_saveAutomatically = gp.saveAutomatically;
+		_stateTimeStamp = gp.stateTimeStamp;
+		_version = gp.version;
+	}
 	
+	/**
+	 * Answer a copy of the values.
+	 * @return
+	 */
+	public GlobalPreferencesValues asValues(){
+		GlobalPreferencesValues gp = new GlobalPreferencesValues();
+		gp.confirmDialog = _confirmDialog;
+		gp.disableAllValidation = _disableAllValidation;
+		gp.override = _override;
+		gp.saveAutomatically = _saveAutomatically;
+		gp.stateTimeStamp = _stateTimeStamp;
+		gp.version = _version;
+		return gp;
+	}
+
 	public boolean getSaveAutomatically() {
 		return _saveAutomatically;
 	}
 
-	public void setSaveAutomatically(boolean saveAutomatically) {
-		_saveAutomatically = saveAutomatically;
-	}
 
 	/**
 	 * Answer if all validation has been disabled.
@@ -67,66 +97,37 @@
 		return _disableAllValidation;
 	}
 
-	public void setDisableAllValidation(boolean disableAllValidation) {
-		if (_disableAllValidation != disableAllValidation){
-			_configChange = true;
-			_disableAllValidation = disableAllValidation;
-		}
-	}
-
-	/**
-	 * Reset all the global preferences to their default settings. This doesn't reset
-	 * the individual validators.
-	 */
-	public void resetToDefault() {
-		setDisableAllValidation(DefaultSuspend);
-		_saveAutomatically = DefaultAutoSave;
-		_confirmDialog = DefaultConfirm;
-		setOverride(DefaultOverride);
-	}
-
 	public boolean getConfirmDialog() {
 		return _confirmDialog;
 	}
 
-	public void setConfirmDialog(boolean confirmDialog) {
-		_confirmDialog = confirmDialog;
-	}
-
 	public long getStateTimeStamp() {
 		return _stateTimeStamp;
 	}
 
-	public void setStateTimeStamp(long stateTimeStamp) {
-		_stateTimeStamp = stateTimeStamp;
-	}
-
 	/** Answer whether or not projects are allowed to override the global preferences. */
 	public boolean getOverride() {
 		return _override;
 	}
 
-	public void setOverride(boolean override) {
-		if (_override != override){
-			_configChange = true;
-			_override = override;
-		}
-	}
-
 	public int getVersion() {
 		return _version;
 	}
 
-	public void setVersion(int version) {
-		_version = version;
-	}
-
-	public boolean isConfigChange() {
-		return _configChange;
-	}
-
-	public void setConfigChange(boolean configChange) {
-		_configChange = configChange;
+	/**
+	 * Compare yourself to the other global preferences and answer a bitmask with the differences.
+	 * @param gp
+	 * @return bit mask of the changes. See the xxxMask constants for the values of the bits. A zero means that they are the same.
+	 */
+	public int compare(GlobalPreferences gp) {
+		int changes = 0;
+		if (_confirmDialog != gp.getConfirmDialog())changes |= ConfirmDialogMask;
+		if (_disableAllValidation != gp.getDisableAllValidation())changes |= DisableAllValidationMask;
+		if (_override != gp.getOverride())changes |= OverrideMask;
+		if (_saveAutomatically != gp.getSaveAutomatically())changes |= SaveAutomaticallyMask;
+		if (_stateTimeStamp != gp.getStateTimeStamp())changes |= StateTimeStampMask;
+		if (_version != gp.getVersion())changes |= VersionMask;
+		return changes;
 	}
 
 }
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/model/GlobalPreferencesValues.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/model/GlobalPreferencesValues.java
new file mode 100644
index 0000000..cdf8345
--- /dev/null
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/model/GlobalPreferencesValues.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (c) 2009 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.validation.internal.model;
+
+/**
+ * A mutable object that is used to initialize a GlobalPreference.
+ * @author karasiuk
+ *
+ */
+public class GlobalPreferencesValues {
+	public boolean disableAllValidation = GlobalPreferences.DefaultSuspend;
+	public boolean saveAutomatically = GlobalPreferences.DefaultAutoSave;
+	public boolean confirmDialog = GlobalPreferences.DefaultConfirm;
+	public boolean override = GlobalPreferences.DefaultOverride;
+	
+	/** The plug-in state time stamp. */
+	public long	stateTimeStamp;
+	
+	/** The incoming version of the framework. This is used to determine if a migration is needed.*/
+	public int		version;
+	
+	public GlobalPreferencesValues(){
+		
+	}
+
+}
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/model/ProjectPreferences.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/model/ProjectPreferences.java
index a571dc6..dd26add 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/model/ProjectPreferences.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/model/ProjectPreferences.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2008 IBM Corporation and others.
+ * Copyright (c) 2007, 2009 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
@@ -18,36 +18,43 @@
  * @author karasiuk
  *
  */
-public class ProjectPreferences {
+public final class ProjectPreferences {
+	/*
+	 * Before this object can be considered immutable, the mutable validators need to be addressed.
+	 */
 	/** false - Default setting for the "should all the validation be suspended" setting. */ 
 	public static final boolean DefaultSuspend = false;
 	
 	/** false - Default setting for letting projects override the global settings. */
 	public static final boolean DefaultOverride = false;
 	
-	private IProject	_project;
+	private final IProject	_project;
 
-	private boolean 	_override = DefaultOverride;
-	private boolean		_suspend = DefaultSuspend;
+	private final boolean 	_override;
+	private final boolean	_suspend;
 	
-	private Validator[]	_validators = new Validator[0];
+	private final Validator[]	_validators;
 	
 	public ProjectPreferences(IProject project){
 		_project = project;
+		_override = DefaultOverride;
+		_suspend  = DefaultSuspend;
+		_validators = new Validator[0];
+	}
+	
+	public ProjectPreferences(IProject project, boolean override, boolean suspend, Validator[] validators){
+		_project = project;
+		_override = override;
+		_suspend = suspend;
+		_validators = validators;
 	}
 	
 	public boolean getOverride() {
 		return _override;
 	}
-	public void setOverride(boolean override) {
-		_override = override;
-	}
 	public boolean getSuspend() {
 		return _suspend;
 	}
-	public void setSuspend(boolean suspend) {
-		_suspend = suspend;
-	}
 	
 	/**
 	 * Answer the validators that have been registered for this project.
@@ -57,10 +64,6 @@
 		return _validators;
 	}
 	
-	public void setValidators(Validator[] validators){
-		_validators = validators;
-	}
-	
 	public IProject getProject() {
 		return _project;
 	}
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/model/ValidatorHelper.java b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/model/ValidatorHelper.java
index c3152b4..288f226 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/model/ValidatorHelper.java
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/internal/model/ValidatorHelper.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2005, 2007 IBM Corporation and others.
+ * Copyright (c) 2005, 2009 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
@@ -10,7 +10,7 @@
  *******************************************************************************/
 package org.eclipse.wst.validation.internal.model;
 
-import org.eclipse.wst.validation.Validator;
+import org.eclipse.wst.validation.internal.ValidatorMutable;
 
 /**
  * Implement some common validator methods, that don't need to be part of the API.
@@ -18,20 +18,13 @@
  * @author karasiuk
  *
  */
-public class ValidatorHelper {
+public final class ValidatorHelper {
 	
 	/**
 	 * Answer true if this validator already has an exclude filter.
-	 * 
-	 * @param v
-	 * @return
 	 */
-	public static boolean hasExcludeGroup(Validator.V2 v){
-		FilterGroup[] groups = v.getGroups();
-		for (int i=0; i<groups.length; i++){
-			if (groups[i].isExclude())return true;
-		}
-		return false;
-		
+	public static boolean hasExcludeGroup(ValidatorMutable v){
+		for (FilterGroup group : v.getGroups())if (group.isExclude())return true;
+		return false;		
 	}
 }
diff --git a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/package.html b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/package.html
index 87823d6..8c3c426 100644
--- a/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/package.html
+++ b/plugins/org.eclipse.wst.validation/vf2/org/eclipse/wst/validation/package.html
@@ -4,13 +4,14 @@
 </head>
 <body>
 <p>A framework for calling validators that are build based.</p>
+<p>Also see <a href="doc-files/faq.html">Frequently Asked Questions</a></p>
 <p>
 There are two main types of validation, <b>build based</b> and 
 <b>as you type</b>. This framework supports build based
 validation. If auto build is turned on then the validators are called
 when the user saves their file. If auto build is not turned on then
 the validators are called when the user starts a build.</p>
-<p>This framework was added to WTP in version 3.4.</p>
+<p>This framework was added to WTP in version 3.0.</p>
 <h3>Dependency Support</h3>
 <p>Sometimes resources depend on other resources, to determine whether they are 
 valid or not. An example would be that an XML resource could depend on a DTD. If at some 
@@ -28,7 +29,7 @@
 product.
 <p>In particular when the validate method returns, a
 <a href="ValidationResult.html">ValidationResult</a> must be returned, inside of 
-this result, all your dependencies need to be specified with the&nbsp;
+this result, all your dependencies need to be specified with the
 <a href="ValidationResult.html#setDependsOn(org.eclipse.core.resources.IResource[])">
 setDependsOn</a> method.<p>In addition to keeping the dependency information 
 up-to-date through the normal course of validation, direct access is also 
@@ -36,5 +37,16 @@
 <a href="ValidationFramework.html#getDependencyIndex()">getDependencyIndex</a> 
 method. The <a href="IDependencyIndex.html">IDependencyIndex</a> allows you to 
 directly manipulate the dependency information for a validator.
+<h3>Entry Points into the Validation Framework</h3>
+<p>Here are some of the points where the platform calls into the framework:</p>
+<ul>
+<li><b>Builder</b> - ValidationBuilder</li>
+<li><b>IFacetedProjectListener</b> - ValManager</li>
+<li><b>IJobChangeListener</b> - ValidationOperation, ValidationOperation.ValidationLauncherJob</li>
+<li><b>IProjectChangeListener</b> - ValManager</li>
+<li><b>IPropertyChangeListener</b> - ValidationConfiguration, DisabledResourceManager</li>
+<li><b>IResourceChangeListener</b> - EventManger</li>
+<li><b>IValChangedListener</b> - ValManager, DisabledValidatorManager</li>
+</ul>
 </body>
 </html>
diff --git a/plugins/org.eclipse.wst.validation/xsds/exclude.exsd b/plugins/org.eclipse.wst.validation/xsds/exclude.exsd
index 3ed9a96..92d7647 100644
--- a/plugins/org.eclipse.wst.validation/xsds/exclude.exsd
+++ b/plugins/org.eclipse.wst.validation/xsds/exclude.exsd
@@ -168,6 +168,7 @@
             <element ref="projectNature" minOccurs="0" maxOccurs="unbounded"/>
             <element ref="facet" minOccurs="0" maxOccurs="unbounded"/>
             <element ref="contentType" minOccurs="0" maxOccurs="unbounded"/>
+            <element ref="pattern" minOccurs="0" maxOccurs="unbounded"/>
          </sequence>
       </complexType>
    </element>
@@ -207,6 +208,30 @@
          </attribute>
       </complexType>
    </element>
+   <element name="pattern">
+      <annotation>
+         <documentation>
+            Holds a regualr expression, that matches the resource&apos;s project relative name.
+         </documentation>
+      </annotation>
+      <complexType>
+         <attribute name="regex" type="string" use="required">
+            <annotation>
+               <documentation>
+                  Holds a Java regular expression. See the class java.util.regex.Pattern for more details. This regular expression is matched against a resource&apos;s project relative path, after that path has been converted into a portable path.
+&lt;p&gt;The path will always start with a forward slash (/) so that folder names can be more easily matched.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="caseSensitive" type="boolean">
+            <annotation>
+               <documentation>
+                  If the file name is not case senstitive, then this needs to be set to false.
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
 
    <annotation>
       <appinfo>
diff --git a/plugins/org.eclipse.wst.validation/xsds/removeV2Validator.exsd b/plugins/org.eclipse.wst.validation/xsds/removeV2Validator.exsd
new file mode 100644
index 0000000..271b82e
--- /dev/null
+++ b/plugins/org.eclipse.wst.validation/xsds/removeV2Validator.exsd
@@ -0,0 +1,123 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.wst.validation" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appInfo>
+         <meta.schema plugin="org.eclipse.wst.validation" id="removeV2Validator" name="Remove V2 Validator"/>
+      </appInfo>
+      <documentation>
+         This is used to remove a V2 validator. By specifying the validator ID, the corresponding validator will be removed as if it hasn&apos;t been registered. The removed validator will not be shown in the Preferences page.
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appInfo>
+            <meta.element />
+         </appInfo>
+      </annotation>
+      <complexType>
+         <sequence>
+            <element ref="remove" 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>
+               <appInfo>
+                  <meta.attribute translatable="true"/>
+               </appInfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="remove">
+      <annotation>
+         <documentation>
+            Define the validator that will be removed.
+         </documentation>
+      </annotation>
+      <complexType>
+         <attribute name="validatorId" type="string" use="required">
+            <annotation>
+               <documentation>
+                  The validator ID that will be removed.
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="since"/>
+      </appInfo>
+      <documentation>
+         WebTools 3.2
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="examples"/>
+      </appInfo>
+      <documentation>
+         An example to remove the XSL validator
+
+&lt;extension
+       point=&quot;org.eclipse.wst.validation.removeV2Validator&quot;&gt;
+    &lt;remove
+          validatorId=&quot;org.eclipse.wst.xml.core.xml&quot;&gt;
+    &lt;/remove&gt;
+ &lt;/extension&gt;
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appInfo>
+         <meta.section type="apiinfo"/>
+      </appInfo>
+      <documentation>
+         Provisional API.
+      </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>
+         Copyright (c) 2010 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.validation/xsds/validator.exsd b/plugins/org.eclipse.wst.validation/xsds/validator.exsd
index 7699671..7af3a74 100644
--- a/plugins/org.eclipse.wst.validation/xsds/validator.exsd
+++ b/plugins/org.eclipse.wst.validation/xsds/validator.exsd
@@ -225,6 +225,7 @@
             <element ref="projectNature" minOccurs="0" maxOccurs="unbounded"/>
             <element ref="facet" minOccurs="0" maxOccurs="unbounded"/>
             <element ref="contentType" minOccurs="0" maxOccurs="unbounded"/>
+            <element ref="pattern" minOccurs="0" maxOccurs="unbounded"/>
          </sequence>
       </complexType>
    </element>
@@ -238,6 +239,13 @@
                </documentation>
             </annotation>
          </attribute>
+         <attribute name="version" type="string">
+            <annotation>
+               <documentation>
+                  A version expression that can be used to futher qualify the match. If not specifed, then versions are not used as a criteria for selecting the facet. The syntax of this expression, is the same syntax that is used by the facet framework.
+               </documentation>
+            </annotation>
+         </attribute>
       </complexType>
    </element>
 
@@ -329,12 +337,37 @@
       </complexType>
    </element>
 
+   <element name="pattern">
+      <annotation>
+         <documentation>
+            Holds a regualr expression, that matches the resource&apos;s project relative name.
+         </documentation>
+      </annotation>
+      <complexType>
+         <attribute name="regex" type="string" use="required">
+            <annotation>
+               <documentation>
+                  Holds a Java regular expression. See the class java.util.regex.Pattern for more details. This regular expression is matched against a resource&apos;s project relative path, after that path has been converted into a portable path.
+&lt;p&gt;The path will always start with a forward slash (/) so that folder names can be more easily matched.
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="caseSensitive" type="boolean">
+            <annotation>
+               <documentation>
+                  If the file name is not case senstitive, then this needs to be set to false.
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
    <annotation>
       <appinfo>
          <meta.section type="since"/>
       </appinfo>
       <documentation>
-         WebTools 3.4.
+         WebTools 3.0.
       </documentation>
    </annotation>
 
@@ -361,15 +394,6 @@
       </documentation>
    </annotation>
 
-   <annotation>
-      <appinfo>
-         <meta.section type="apiInfo"/>
-      </appinfo>
-      <documentation>
-         Provisional API.
-      </documentation>
-   </annotation>
-
 
    <annotation>
       <appinfo>
@@ -384,4 +408,13 @@
       </documentation>
    </annotation>
 
+   <annotation>
+      <appinfo>
+         <meta.section type="apiInfo"/>
+      </appinfo>
+      <documentation>
+         Provisional API.
+      </documentation>
+   </annotation>
+
 </schema>
diff --git a/plugins/org.eclipse.wst.validation/xsds/validatorExtSchema.exsd b/plugins/org.eclipse.wst.validation/xsds/validatorExtSchema.exsd
index faa0a2c..0e9667e 100644
--- a/plugins/org.eclipse.wst.validation/xsds/validatorExtSchema.exsd
+++ b/plugins/org.eclipse.wst.validation/xsds/validatorExtSchema.exsd
@@ -1,6 +1,6 @@
 <?xml version='1.0' encoding='UTF-8'?>

 <!-- Schema file written by PDE -->

-<schema targetNamespace="org.eclipse.wst.validation">

+<schema targetNamespace="org.eclipse.wst.validation" xmlns="http://www.w3.org/2001/XMLSchema">

 <annotation>

       <appInfo>

          <meta.schema plugin="org.eclipse.wst.validation" id="validator" name="Validator"/>

@@ -13,6 +13,11 @@
    <include schemaLocation="schema://org.eclipse.core.expressions/schema/expressionLanguage.exsd"/>

 

    <element name="extension">

+      <annotation>

+         <appInfo>

+            <meta.element />

+         </appInfo>

+      </annotation>

       <complexType>

          <sequence>

             <element ref="validator"/>

@@ -36,6 +41,9 @@
                <documentation>

                   An optional name of the extension instance

                </documentation>

+               <appInfo>

+                  <meta.attribute translatable="true"/>

+               </appInfo>

             </annotation>

          </attribute>

       </complexType>

@@ -46,13 +54,14 @@
          <sequence>

             <element ref="projectNature" minOccurs="0" maxOccurs="unbounded"/>

             <element ref="filter" minOccurs="0" maxOccurs="unbounded"/>

-            <element ref="enablement" minOccurs="0" maxOccurs="unbounded"/>/>

+            <element ref="enablement" minOccurs="0" maxOccurs="unbounded"/>

             <element ref="helper"/>

             <element ref="dependentValidator" minOccurs="0" maxOccurs="1"/>

             <element ref="run"/>

             <element ref="markerId" minOccurs="0" maxOccurs="1"/>

             <element ref="facet" minOccurs="0" maxOccurs="unbounded"/>

             <element ref="contentTypeBinding" minOccurs="0" maxOccurs="unbounded"/>

+            <element ref="runStrategy"/>

          </sequence>

          <attribute name="to" type="string">

             <annotation>

@@ -91,15 +100,14 @@
          </attribute>

       </complexType>

    </element>

-   

-   

+

    <element name="contentTypeBinding">

       <annotation>

          <appInfo>

             <meta.element labelAttribute="contentTypeId"/>

          </appInfo>

          <documentation>

-                        Associates a particular content type with the current validator, and enables the validator to be run on resources of the specified content type.

+            Associates a particular content type with the current validator, and enables the validator to be run on resources of the specified content type.

          </documentation>

       </annotation>

       <complexType>

@@ -112,9 +120,6 @@
          </attribute>

       </complexType>

    </element>

-   

-   

-   

 

    <element name="filter">

       <complexType>

@@ -281,6 +286,19 @@
       </complexType>

    </element>

 

+   <element name="runStrategy">

+      <complexType>

+         <attribute name="project" type="boolean">

+            <annotation>

+               <documentation>

+                  If true then the validator is only called once per project. If false (or missing) then the validator could be called once per resource (based on the other filter rules).

+               </documentation>

+            </annotation>

+         </attribute>

+      </complexType>

+   </element>

+

+

    <annotation>

       <appInfo>

          <meta.section type="since"/>

@@ -290,39 +308,14 @@
       </documentation>

    </annotation>

 

-   <annotation>

-      <appInfo>

-         <meta.section type="examples"/>

-      </appInfo>

-      <documentation>

-         

-      </documentation>

-   </annotation>

 

-   <annotation>

-      <appInfo>

-         <meta.section type="apiInfo"/>

-      </appInfo>

-      <documentation>

-         

-      </documentation>

-   </annotation>

-

-   <annotation>

-      <appInfo>

-         <meta.section type="implementation"/>

-      </appInfo>

-      <documentation>

-         

-      </documentation>

-   </annotation>

 

    <annotation>

       <appInfo>

          <meta.section type="copyright"/>

       </appInfo>

       <documentation>

-         Copyright (c) 2005 IBM Corporation and others.&lt;br&gt;

+         Copyright (c) 2005, 2010 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

diff --git a/plugins/org.eclipse.wst.validation/xsds/validatorgroup.exsd b/plugins/org.eclipse.wst.validation/xsds/validatorgroup.exsd
index ca2fb6f..df05cb1 100644
--- a/plugins/org.eclipse.wst.validation/xsds/validatorgroup.exsd
+++ b/plugins/org.eclipse.wst.validation/xsds/validatorgroup.exsd
@@ -95,7 +95,7 @@
          <meta.section type="since"/>
       </appinfo>
       <documentation>
-         WebTools 3.4
+         WebTools 3.0
       </documentation>
    </annotation>