This commit was manufactured by cvs2svn to create tag 'v20051108'.
diff --git a/plugins/org.eclipse.jst.common.project.facet.core/build.properties b/plugins/org.eclipse.jst.common.project.facet.core/build.properties
index 34d2e4d..ffc172d 100644
--- a/plugins/org.eclipse.jst.common.project.facet.core/build.properties
+++ b/plugins/org.eclipse.jst.common.project.facet.core/build.properties
@@ -1,4 +1,5 @@
 source.. = src/
 output.. = bin/
-bin.includes = META-INF/,\
-               .
+bin.includes = .,\
+               plugin.xml,\
+               META-INF/
diff --git a/plugins/org.eclipse.jst.common.project.facet.core/plugin.xml b/plugins/org.eclipse.jst.common.project.facet.core/plugin.xml
index 590bbd1..16ef38b 100644
--- a/plugins/org.eclipse.jst.common.project.facet.core/plugin.xml
+++ b/plugins/org.eclipse.jst.common.project.facet.core/plugin.xml
@@ -7,7 +7,7 @@
     <factory 
       class="org.eclipse.jst.common.project.facet.core.internal.RuntimeClasspathProvider$Factory" 
       adaptableType="org.eclipse.wst.common.project.facet.core.runtime.IRuntime">
-      <adapter type="org.eclipse.jst.common.project.facet.core.ClasspathProvider"/>
+      <adapter type="org.eclipse.jst.common.project.facet.core.IClasspathProvider"/>
     </factory>
   </extension>
 
diff --git a/plugins/org.eclipse.jst.common.project.facet.core/src/org/eclipse/jst/common/project/facet/core/ClasspathHelper.java b/plugins/org.eclipse.jst.common.project.facet.core/src/org/eclipse/jst/common/project/facet/core/ClasspathHelper.java
index 20dbde1..e5173b5 100644
--- a/plugins/org.eclipse.jst.common.project.facet.core/src/org/eclipse/jst/common/project/facet/core/ClasspathHelper.java
+++ b/plugins/org.eclipse.jst.common.project.facet.core/src/org/eclipse/jst/common/project/facet/core/ClasspathHelper.java
@@ -23,11 +23,14 @@
 import org.eclipse.core.resources.ProjectScope;
 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.Status;
 import org.eclipse.core.runtime.preferences.IEclipsePreferences;
 import org.eclipse.jdt.core.IClasspathEntry;
 import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.osgi.util.NLS;
 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;
@@ -105,6 +108,9 @@
 
 public final class ClasspathHelper
 {
+    private static final String PLUGIN_ID
+        = "org.eclipse.jst.common.project.facet.core";
+    
     private static final Object SYSTEM_OWNER = new Object();
     
     private ClasspathHelper() {}
@@ -216,8 +222,11 @@
         }
         catch( BackingStoreException e )
         {
-            // TODO: throw CoreException here
-            throw new RuntimeException( e );
+            final IStatus st
+                = new Status( IStatus.ERROR, PLUGIN_ID, 0, 
+                              Resources.failedWritingPreferences, e );
+            
+            throw new CoreException( st );
         }
     }
     
@@ -283,8 +292,11 @@
         }
         catch( BackingStoreException e )
         {
-            // TODO: throw CoreException here
-            throw new RuntimeException( e );
+            final IStatus st
+                = new Status( IStatus.ERROR, PLUGIN_ID, 0, 
+                              Resources.failedWritingPreferences, e );
+            
+            throw new CoreException( st );
         }
     }
     
@@ -415,10 +427,7 @@
     private static Preferences getPreferencesNode( final IProject project )
     {
         final ProjectScope scope = new ProjectScope( project );
-        
-        final IEclipsePreferences pluginRoot 
-            = scope.getNode( "org.eclipse.jst.common.project.facet.core" );
-        
+        final IEclipsePreferences pluginRoot = scope.getNode( PLUGIN_ID );
         return pluginRoot.node( "classpath.helper" );
     }
     
@@ -441,5 +450,18 @@
         return new Path( path.replaceAll( "::", "/" ) );
     }
     
+    private static final class Resources
+    
+        extends NLS
+        
+    {
+        public static String failedWritingPreferences;
+        
+        static
+        {
+            initializeMessages( ClasspathHelper.class.getName(), 
+                                Resources.class );
+        }
+    }
 
 }
diff --git a/plugins/org.eclipse.jst.common.project.facet.core/src/org/eclipse/jst/common/project/facet/core/ClasspathHelper.properties b/plugins/org.eclipse.jst.common.project.facet.core/src/org/eclipse/jst/common/project/facet/core/ClasspathHelper.properties
new file mode 100644
index 0000000..cb5aee1
--- /dev/null
+++ b/plugins/org.eclipse.jst.common.project.facet.core/src/org/eclipse/jst/common/project/facet/core/ClasspathHelper.properties
@@ -0,0 +1 @@
+failedWritingPreferences = Failed while writing preferences.
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/plugin.xml b/plugins/org.eclipse.wst.common.project.facet.core/plugin.xml
index bf147f9..b275039 100644
--- a/plugins/org.eclipse.wst.common.project.facet.core/plugin.xml
+++ b/plugins/org.eclipse.wst.common.project.facet.core/plugin.xml
@@ -21,12 +21,4 @@
     </runtime>
   </extension>
 
-  <extension point="org.eclipse.core.runtime.adapters">
-    <factory 
-      class="org.eclipse.wst.common.project.facet.core.runtime.classpath.internal.RuntimeClasspathProvider$Factory" 
-      adaptableType="org.eclipse.wst.common.project.facet.core.runtime.IRuntime">
-      <adapter type="org.eclipse.wst.common.project.facet.core.runtime.classpath.IClasspathProvider"/>
-    </factory>
-  </extension>
-
 </plugin>
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/schemas/facets.exsd b/plugins/org.eclipse.wst.common.project.facet.core/schemas/facets.exsd
index a3ad0c2..8d5981f 100644
--- a/plugins/org.eclipse.wst.common.project.facet.core/schemas/facets.exsd
+++ b/plugins/org.eclipse.wst.common.project.facet.core/schemas/facets.exsd
@@ -18,6 +18,7 @@
             <element ref="category"/>
             <element ref="preset"/>
             <element ref="template"/>
+            <element ref="action"/>
          </choice>
          <attribute name="point" type="string" use="required">
             <annotation>
@@ -313,6 +314,20 @@
                </restriction>
             </simpleType>
          </attribute>
+         <attribute name="facet" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="version" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
       </complexType>
    </element>
 
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/IActionConfig.java b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/IActionConfig.java
new file mode 100644
index 0000000..68bdbfd
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/IActionConfig.java
@@ -0,0 +1,10 @@
+package org.eclipse.wst.common.project.facet.core;
+
+import org.eclipse.core.runtime.IStatus;
+
+public interface IActionConfig
+{
+    void setVersion( IProjectFacetVersion fv );
+    void setProjectName( String pjname );
+    IStatus validate();
+}
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/IProjectFacet.java b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/IProjectFacet.java
index 57c89bd..fb56b42 100644
--- a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/IProjectFacet.java
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/IProjectFacet.java
@@ -15,6 +15,8 @@
 import java.util.List;
 import java.util.Set;
 
+import org.eclipse.core.runtime.CoreException;
+
 /**
  * Contains metadata that describes a project facet. This interface is not 
  * intended to be implemented by clients.
@@ -113,7 +115,7 @@
     
     IProjectFacetVersion getLatestVersion()
     
-        throws VersionFormatException;
+        throws VersionFormatException, CoreException;
 
     /**
      * Returns a sorted list containing the descriptors of all versions of this 
@@ -128,7 +130,7 @@
     
     List getSortedVersions( boolean ascending )
     
-        throws VersionFormatException;
+        throws VersionFormatException, CoreException;
     
     /**
      * Returns the version comparator specified for this project facet. If no 
@@ -138,6 +140,8 @@
      * @return the version comparator specified for this project facet
      */
     
-    Comparator getVersionComparator();
+    Comparator getVersionComparator()
+    
+        throws CoreException;
     
 }
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/IProjectFacetVersion.java b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/IProjectFacetVersion.java
index 71b7323..38e6db9 100644
--- a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/IProjectFacetVersion.java
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/IProjectFacetVersion.java
@@ -67,13 +67,21 @@
      * requires no config.
      * 
      * @param type the type of the action.
+     * @param pjname the name of the project that this action will be executed
+     *   on
      * @return the action config object, or <code>null</code>
      * @throws CoreException if this project facet version does not support the
      *   specified action type or if failed while creating the action config
      *   object
      */
     
-    Object createActionConfig( Action.Type type )
+    Object createActionConfig( Action.Type type,
+                               String pjname )
+    
+        throws CoreException;
+    
+    boolean isSameActionConfig( Action.Type type,
+                                IProjectFacetVersion fv )
     
         throws CoreException;
     
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/ProjectFacetsManager.java b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/ProjectFacetsManager.java
index e55f341..dd75a57 100644
--- a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/ProjectFacetsManager.java
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/ProjectFacetsManager.java
@@ -281,6 +281,17 @@
         return impl.create( name, location, monitor );
     }
     
+    public static IFacetedProject create( final IProject project,
+    								final boolean convertIfNecessary,
+									final IProgressMonitor monitor )
+    
+    	throws CoreException
+    	
+    	{
+    		return impl.create( project, convertIfNecessary, monitor );
+    	}
+    
+    
     /**
      * Checks the validity of applying the specified set of actions to the
      * specified set of base project facets. Returns the union of all validation
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/Constraint.java b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/Constraint.java
index 8cc8b4b..e114a29 100644
--- a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/Constraint.java
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/Constraint.java
@@ -18,6 +18,7 @@
 import java.util.Iterator;
 import java.util.List;
 
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.MultiStatus;
 import org.eclipse.osgi.util.NLS;
@@ -138,7 +139,17 @@
                 final IProjectFacet rf 
                     = ProjectFacetsManager.getProjectFacet( name );
                 
-                final Comparator comp = rf.getVersionComparator();
+                final Comparator comp;
+                
+                try
+                {
+                    comp = rf.getVersionComparator();
+                }
+                catch( CoreException e )
+                {
+                    FacetCorePlugin.log( e );
+                    return result;
+                }
                 
                 boolean found = false;
                 
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/FacetCorePlugin.java b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/FacetCorePlugin.java
index f26ef01..114a80b 100644
--- a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/FacetCorePlugin.java
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/FacetCorePlugin.java
@@ -43,15 +43,27 @@
     public static void log( final Exception e )
     {
         final ILog log = getInstance().getLog();
-        final String msg = e.getMessage();
+        final String msg = e.getMessage() + "";
         
         log.log( new Status( IStatus.ERROR, PLUGIN_ID, IStatus.OK, msg, e ) );
     }
+
+    public static void log( final String msg )
+    {
+        final ILog log = getInstance().getLog();
+        
+        log.log( new Status( IStatus.ERROR, PLUGIN_ID, IStatus.OK, msg, null ) );
+    }
     
     public static IStatus createErrorStatus( final String msg )
     {
-        return new Status( IStatus.ERROR, FacetCorePlugin.PLUGIN_ID, 0, msg, 
-                           null );
+        return createErrorStatus( msg, null );
+    }
+
+    public static IStatus createErrorStatus( final String msg,
+                                             final Exception e )
+    {
+        return new Status( IStatus.ERROR, FacetCorePlugin.PLUGIN_ID, 0, msg, e );
     }
     
 }
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/FacetedProject.java b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/FacetedProject.java
index 491c684..49d799b 100644
--- a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/FacetedProject.java
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/FacetedProject.java
@@ -35,12 +35,15 @@
 import org.eclipse.core.resources.IFolder;
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdapterManager;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.MultiStatus;
+import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.core.runtime.SubProgressMonitor;
 import org.eclipse.osgi.util.NLS;
+import org.eclipse.wst.common.project.facet.core.IActionConfig;
 import org.eclipse.wst.common.project.facet.core.IDelegate;
 import org.eclipse.wst.common.project.facet.core.IFacetedProject;
 import org.eclipse.wst.common.project.facet.core.IProjectFacet;
@@ -72,6 +75,9 @@
     private final IFile f;
     
     FacetedProject( final IProject project )
+    
+        throws CoreException
+        
     {
         this.project = project;
         this.facets = new HashSet();
@@ -180,9 +186,62 @@
                 throw new CoreException( st );
             }
             
+            // Sort the actions into the order of execution.
+            
             final List copy = new ArrayList( actions );
             ProjectFacetsManager.sort( this.facets, copy );
             
+            // Update and check the action configs.
+            
+            for( int i = 0, n = copy.size(); i < n; i++ )
+            {
+                Action action = (Action) copy.get( i );
+                final IProjectFacetVersion fv = action.getProjectFacetVersion();
+                Object config = action.getConfig();
+                
+                if( config == null )
+                {
+                    config = fv.createActionConfig( action.getType(), 
+                                                    this.project.getName() );
+                    
+                    if( config != null )
+                    {
+                        action = new Action( action.getType(), fv, config );
+                        copy.set( i, action );
+                    }
+                }
+                
+                if( config != null )
+                {
+                    IActionConfig cfg = null;
+                    
+                    if( config instanceof IActionConfig )
+                    {
+                        cfg = (IActionConfig) config;
+                    }
+                    else
+                    {
+                        final IAdapterManager m = Platform.getAdapterManager();
+                        cfg = (IActionConfig) m.loadAdapter( config, IActionConfig.class.getName() );
+                    }
+                    
+                    if( cfg != null )
+                    {
+                        cfg.setProjectName( this.project.getName() );
+                        cfg.setVersion( fv );
+                        
+                        final IStatus status = cfg.validate();
+                        
+                        if( status.getSeverity() != IStatus.OK )
+                        {
+                            throw new CoreException( status );
+                        }
+                    }
+                }
+            }
+            
+            // Execute the actions.
+            
             for( Iterator itr = copy.iterator(); itr.hasNext(); )
             {
                 //if( monitor != null && monitor.isCanceled() &&
@@ -213,14 +272,7 @@
                         = monitor == null 
                           ? null : new SubProgressMonitor( monitor, 1 );
                     
-                    Object config = action.getConfig();
-                    
-                    if( config == null )
-                    {
-                        config = fv.createActionConfig( type );
-                    }
-                    
-                    callDelegate( this.project, fv, config,
+                    callDelegate( this.project, fv, action.getConfig(),
                                   IDelegate.Type.get( type ), delegate,
                                   submonitor );
                 }
@@ -344,7 +396,7 @@
             else
             {
                 cause = new Status( IStatus.ERROR, FacetCorePlugin.PLUGIN_ID,
-                                    0, e.getMessage(), e );
+                                    0, e.getMessage() + "", e );
             }
             
             final String msg;
@@ -481,6 +533,9 @@
     }
 
     private void open()
+    
+        throws CoreException
+        
     {
         if( ! this.f.exists() )
         {
@@ -502,25 +557,52 @@
             }
             else if( name.equals( "fixed" ) )
             {
-                // TODO: Handle the case where facet is not defined.
+                final String id = e.getAttribute( "facet" );
                 
-                final String fid = e.getAttribute( "facet" );
+                if( ! ProjectFacetsManager.isProjectFacetDefined( id ) )
+                {
+                    final String msg
+                        = NLS.bind( Resources.facetNotDefined, id );
+                    
+                    final IStatus st = FacetCorePlugin.createErrorStatus( msg );
+                    
+                    throw new CoreException( st );
+                }
                 
                 final IProjectFacet f
-                    = ProjectFacetsManager.getProjectFacet( fid );
+                    = ProjectFacetsManager.getProjectFacet( id );
                 
                 this.fixed.add( f );
             }
             else if( name.equals( "installed" ) )
             {
-                // TODO: Handle the case where facet or version is not defined.
-                
                 final String id = e.getAttribute( "facet" );
                 final String version = e.getAttribute( "version" );
                 
+                if( ! ProjectFacetsManager.isProjectFacetDefined( id ) )
+                {
+                    final String msg
+                        = NLS.bind( Resources.facetNotDefined, id );
+                    
+                    final IStatus st = FacetCorePlugin.createErrorStatus( msg );
+                    
+                    throw new CoreException( st );
+                }
+                
                 final IProjectFacet f
                     = ProjectFacetsManager.getProjectFacet( id );
                 
+                if( ! f.hasVersion( version ) )
+                {
+                    final String msg
+                        = NLS.bind( Resources.facetVersionNotDefined, id,
+                                    version );
+                    
+                    final IStatus st = FacetCorePlugin.createErrorStatus( msg );
+                    
+                    throw new CoreException( st );
+                }
+                
                 final IProjectFacetVersion fv = f.getVersion( version );
                 
                 this.facets.add( fv );
@@ -609,6 +691,8 @@
         public static String failedOnUninstall;
         public static String failedOnVersionChange;
         public static String failedOnRuntimeChanged;
+        public static String facetNotDefined;
+        public static String facetVersionNotDefined;
         
         static
         {
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/FacetedProject.properties b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/FacetedProject.properties
index 848a035..cb9e69e 100644
--- a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/FacetedProject.properties
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/FacetedProject.properties
@@ -1,4 +1,6 @@
 failedOnInstall = Failed while installing {0}.
 failedOnUninstall = Failed while uninstalling {0}.
 failedOnVersionChange = Failed while changing version of {0} to {1}.
-failedOnRuntimeChanged = Failed while {0} was reacting to changed runtime.
\ No newline at end of file
+failedOnRuntimeChanged = Failed while {0} was reacting to changed runtime.
+facetNotDefined = Facet {0} is not defined.
+facetVersionNotDefined = Version {1} of facet {0} is not defined.
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/IVersion.java b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/IVersion.java
new file mode 100644
index 0000000..72b7b8e
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/IVersion.java
@@ -0,0 +1,22 @@
+/******************************************************************************
+ * Copyright (c) 2005 BEA Systems, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the 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:
+ *    Konstantin Komissarchik - initial API and implementation
+ ******************************************************************************/
+
+package org.eclipse.wst.common.project.facet.core.internal;
+
+/**
+ * @author <a href="mailto:kosta@bea.com">Konstantin Komissarchik</a>
+ */
+
+public abstract interface IVersion
+{
+    String getVersionString();
+    Versionable getVersionable();
+}
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/ProjectFacet.java b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/ProjectFacet.java
index d27d872..d399837 100644
--- a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/ProjectFacet.java
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/ProjectFacet.java
@@ -11,10 +11,16 @@
 
 package org.eclipse.wst.common.project.facet.core.internal;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
 
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.wst.common.project.facet.core.ICategory;
+import org.eclipse.wst.common.project.facet.core.IDelegate;
 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.VersionFormatException;
@@ -45,6 +51,7 @@
     private String description;
     private String iconPath;
     private ICategory category;
+    private final List actionDefinitions = new ArrayList();
     
     ProjectFacet() {}
     
@@ -132,7 +139,7 @@
 
     public IProjectFacetVersion getLatestVersion()
     
-        throws VersionFormatException
+        throws VersionFormatException, CoreException
         
     {
         final Comparator comp = getVersionComparator( true, VERSION_ADAPTER );
@@ -146,9 +153,58 @@
         return VERSION_ADAPTER;
     }
     
+    ActionDefinition getActionDefinition( final IProjectFacetVersion fv,
+                                          final IDelegate.Type type )
+    
+        throws CoreException
+        
+    {
+        ActionDefinition result = null;
+        
+        for( Iterator itr = this.actionDefinitions.iterator(); itr.hasNext(); )
+        {
+            final ActionDefinition def = (ActionDefinition) itr.next();
+            
+            if( def.type == type && 
+                def.versionMatchExpr.evaluate( (IVersion) fv ) )
+            {
+                if( result == null )
+                {
+                    result = def;
+                }
+                else
+                {
+                    // TODO: Throw better error.
+                    throw new RuntimeException();
+                }
+            }
+        }
+        
+        return result;
+    }
+    
+    void addActionDefinition( final ActionDefinition actionDefinition )
+    {
+        this.actionDefinitions.add( actionDefinition );
+    }
+    
+    public String createVersionNotFoundErrMsg( final String verstr )
+    {
+        return NLS.bind( ProjectFacetsManagerImpl.Resources.facetVersionNotDefinedNoPlugin,
+                         this.id, verstr );
+    }
+    
     public String toString()
     {
         return this.label;
     }
+    
+    static final class ActionDefinition
+    {
+        public IDelegate.Type type;
+        public VersionMatchExpr versionMatchExpr;
+        public String delegateClassName;
+        public String configFactoryClassName;
+    }
 
 }
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/ProjectFacetVersion.java b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/ProjectFacetVersion.java
index afffd00..5c401e2 100644
--- a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/ProjectFacetVersion.java
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/ProjectFacetVersion.java
@@ -14,14 +14,18 @@
 import java.util.HashMap;
 
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdapterManager;
+import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.osgi.util.NLS;
+import org.eclipse.wst.common.project.facet.core.IActionConfig;
 import org.eclipse.wst.common.project.facet.core.IActionConfigFactory;
 import org.eclipse.wst.common.project.facet.core.IConstraint;
 import org.eclipse.wst.common.project.facet.core.IDelegate;
 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.IFacetedProject.Action;
+import org.eclipse.wst.common.project.facet.core.internal.ProjectFacet.ActionDefinition;
 import org.osgi.framework.Bundle;
 
 /**
@@ -32,15 +36,14 @@
 
 public final class ProjectFacetVersion 
 
-    implements IProjectFacetVersion 
+    implements IProjectFacetVersion, IVersion 
     
 {
-    private IProjectFacet facet;
+    private ProjectFacet facet;
     private String version;
     private IConstraint constraint;
     private String plugin;
     private final HashMap delegates = new HashMap();
-    private final HashMap configFactories = new HashMap();    
     
     ProjectFacetVersion() {}
     
@@ -49,7 +52,7 @@
         return this.facet;
     }
     
-    void setProjectFacet( final IProjectFacet facet )
+    void setProjectFacet( final ProjectFacet facet )
     {
         this.facet = facet;
     }
@@ -63,6 +66,11 @@
     {
         this.version = version;
     }
+    
+    public Versionable getVersionable()
+    {
+        return (Versionable) this.facet;
+    }
 
     public IConstraint getConstraint()
     {
@@ -86,10 +94,19 @@
     
     public boolean supports( final Action.Type type )
     {
-        return this.delegates.containsKey( IDelegate.Type.get( type ) );
+        try
+        {
+            return this.facet.getActionDefinition( this, IDelegate.Type.get( type ) ) != null;
+        }
+        catch( CoreException e )
+        {
+            FacetCorePlugin.log( e );
+            return false;
+        }
     }
     
-    public Object createActionConfig( final Action.Type type )
+    public Object createActionConfig( final Action.Type type,
+                                      final String pjname )
     
         throws CoreException
         
@@ -103,15 +120,16 @@
             throw new CoreException( FacetCorePlugin.createErrorStatus( msg ) );
         }
         
-        final String clname 
-            = (String) this.configFactories.get( IDelegate.Type.get( type ) );
+        final ActionDefinition def
+            = this.facet.getActionDefinition( this, IDelegate.Type.get( type ) );
         
-        if( clname == null )
+        if( def == null || def.configFactoryClassName == null )
         {
             return null;
         }
         else
         {
+            final String clname = def.configFactoryClassName;
             final Object temp = create( clname );
             
             if( ! ( temp instanceof IActionConfigFactory ) )
@@ -123,33 +141,69 @@
                 throw new CoreException( FacetCorePlugin.createErrorStatus( msg ) );
             }
             
-            return ( (IActionConfigFactory) temp ).create();
+            final Object config = ( (IActionConfigFactory) temp ).create();
+            
+            IActionConfig cfg = null;
+            
+            if( config instanceof IActionConfig )
+            {
+                cfg = (IActionConfig) config;
+            }
+            else
+            {
+                final IAdapterManager m = Platform.getAdapterManager();
+                cfg = (IActionConfig) m.loadAdapter( config, IActionConfig.class.getName() );
+            }
+            
+            if( cfg != null )
+            {
+                cfg.setProjectName( pjname );
+                cfg.setVersion( this );
+            }
+            
+            return config;
         }
     }
     
-    void setActionConfigFactory( final IDelegate.Type type,
-                                 final String configFactoryClassName )
+    public boolean isSameActionConfig( final Action.Type type,
+                                       final IProjectFacetVersion fv )
+    
+        throws CoreException
+        
     {
-        this.configFactories.put( type, configFactoryClassName );
+        final IDelegate.Type t = IDelegate.Type.get( type );
+        
+        return this.facet.getActionDefinition( fv, t )
+               == this.facet.getActionDefinition( this, t );
     }
     
     IDelegate getDelegate( final IDelegate.Type type )
+    
+        throws CoreException
+        
     {
         Object delegate = this.delegates.get( type );
         
         if( delegate == null )
         {
-            return null;
-        }
-        else if( delegate instanceof String )
-        {
-            final String clname = (String) delegate;
+            final ActionDefinition def
+                = this.facet.getActionDefinition( this, type );
+            
+            if( def == null )
+            {
+                return null;
+            }
+            
+            final String clname = def.delegateClassName;
             delegate = create( clname );
             
             if( ! ( delegate instanceof IDelegate ) )
             {
-                // TODO: Handle this better.
-                throw new RuntimeException();
+                final String msg
+                    = NLS.bind( Resources.notInstanceOf, clname,
+                                IDelegate.class.getName() );
+                
+                throw new CoreException( FacetCorePlugin.createErrorStatus( msg ) );
             }
             
             this.delegates.put( type, delegate );
@@ -158,13 +212,10 @@
         return (IDelegate) delegate;
     }
     
-    void setDelegate( final IDelegate.Type type,
-                      final String delegateClassName )
-    {
-        this.delegates.put( type, delegateClassName );
-    }
-    
     private Object create( final String clname )
+    
+        throws CoreException
+        
     {
         final Bundle bundle = Platform.getBundle( this.plugin );
         
@@ -175,8 +226,12 @@
         }
         catch( Exception e )
         {
-            // TODO: handle this.
-            return null;
+            final String msg
+                = NLS.bind( Resources.failedToCreate, clname );
+            
+            final IStatus st = FacetCorePlugin.createErrorStatus( msg, e );
+            
+            throw new CoreException( st );
         }
     }
     
@@ -192,6 +247,7 @@
     {
         public static String actionNotSupported;
         public static String notInstanceOf;
+        public static String failedToCreate;
         
         static
         {
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/ProjectFacetVersion.properties b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/ProjectFacetVersion.properties
index 6cdd97c..391e1f9 100644
--- a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/ProjectFacetVersion.properties
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/ProjectFacetVersion.properties
@@ -1,2 +1,3 @@
 actionNotSupported = Project facet {0} does not support action type {1}.
 notInstanceOf = Class {0} is not an instance of {1}.
+failedToCreate = Failed to instantiate class {0}.
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/ProjectFacetsManagerImpl.java b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/ProjectFacetsManagerImpl.java
index 78c159c..22a21e4 100644
--- a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/ProjectFacetsManagerImpl.java
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/ProjectFacetsManagerImpl.java
@@ -25,6 +25,7 @@
 import org.eclipse.core.resources.IWorkspace;
 import org.eclipse.core.resources.ResourcesPlugin;
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdapterManager;
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IExtension;
 import org.eclipse.core.runtime.IExtensionPoint;
@@ -37,6 +38,8 @@
 import org.eclipse.core.runtime.SubProgressMonitor;
 import org.eclipse.core.runtime.preferences.IEclipsePreferences;
 import org.eclipse.core.runtime.preferences.InstanceScope;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.wst.common.project.facet.core.IActionConfig;
 import org.eclipse.wst.common.project.facet.core.ICategory;
 import org.eclipse.wst.common.project.facet.core.IConstraint;
 import org.eclipse.wst.common.project.facet.core.IDelegate;
@@ -47,6 +50,7 @@
 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.IFacetedProject.Action;
+import org.eclipse.wst.common.project.facet.core.internal.ProjectFacet.ActionDefinition;
 import org.osgi.service.prefs.BackingStoreException;
 import org.osgi.service.prefs.Preferences;
 
@@ -293,6 +297,26 @@
         return create( project );
     }
     
+    public IFacetedProject create( final IProject project,
+    								final boolean convertIfNecessary,
+    								final IProgressMonitor monitor)
+    
+    throws CoreException
+    {
+    	if( project.exists() && convertIfNecessary ){
+	  		IProjectDescription description = project.getDescription();
+			String[] prevNatures = description.getNatureIds();
+			String[] newNatures = new String[ prevNatures.length + 1 ];
+			System.arraycopy( prevNatures, 0, newNatures, 0, prevNatures.length );
+			newNatures[ prevNatures.length ] = FacetedProjectNature.NATURE_ID;
+			description.setNatureIds( newNatures );
+			project.setDescription( description, monitor ); 
+    	}
+        project.open( IResource.BACKGROUND_REFRESH,
+                new SubProgressMonitor( monitor, 1 ) );  
+        return create( project );
+    }
+    
     public IStatus check( final Set base,
                           final Set actions )
     {
@@ -777,6 +801,17 @@
                 readProjectFacetVersion( config );
             }
         }
+
+        for( int i = 0, n = cfgels.size(); i < n; i++ )
+        {
+            final IConfigurationElement config
+                = (IConfigurationElement) cfgels.get( i );
+            
+            if( config.getName().equals( "action" ) )
+            {
+                readAction( config );
+            }
+        }
         
         for( int i = 0, n = cfgels.size(); i < n; i++ )
         {
@@ -810,7 +845,8 @@
 
         if( id == null )
         {
-            // TODO: error
+            reportMissingAttribute( config, "id" );
+            return;
         }
 
         category.setId( id );
@@ -845,7 +881,8 @@
 
         if( id == null )
         {
-            // TODO: error
+            reportMissingAttribute( config, "id" );
+            return;
         }
         
         final ProjectFacet descriptor = new ProjectFacet();
@@ -877,7 +914,8 @@
                 
                 if( clname == null )
                 {
-                    // TODO: error
+                    reportMissingAttribute( child, "class" );
+                    return;
                 }
                 
                 descriptor.setVersionComparator( clname );
@@ -891,7 +929,13 @@
                 
                 if( category == null )
                 {
-                    // TODO: error
+                    final String msg
+                        = NLS.bind( Resources.categoryNotDefined, 
+                                    child.getNamespace(), catname );
+                    
+                    FacetCorePlugin.log( msg );
+                    
+                    return;
                 }
                 
                 descriptor.setCategory( category );
@@ -908,21 +952,29 @@
 
         if( fid == null )
         {
-            // TODO: error
+            reportMissingAttribute( config, "facet" );
+            return;
         }
         
         final String ver = config.getAttribute( "version" );
 
         if( ver == null )
         {
-            // TODO: error
+            reportMissingAttribute( config, "version" );
+            return;
         }
         
         final ProjectFacet f = (ProjectFacet) this.facets.get( fid );
         
         if( f == null )
         {
-            // TODO: error
+            final String msg
+                = NLS.bind( Resources.facetNotDefined, 
+                            config.getNamespace(), fid );
+            
+            FacetCorePlugin.log( msg );
+            
+            return;
         }
         
         final ProjectFacetVersion fv
@@ -942,17 +994,29 @@
             if( childName.equals( "constraint" ) )
             {
                 final IConfigurationElement[] ops = child.getChildren();
+                final ArrayList parsed = new ArrayList();
                 
-                if( ops.length == 1 )
+                for( int j = 0; j < ops.length; j++ )
                 {
-                    final IConstraint op
-                        = readConstraint( ops[ 0 ], fv );
+                    final IConstraint op = readConstraint( ops[ j ], fv );
                     
-                    fv.setConstraint( op );
+                    if( op != null )
+                    {
+                        parsed.add( op );
+                    }
                 }
-                else if( ops.length != 0 )  // No-op on empty constraints
+                
+                if( parsed.size() == 1 )
                 {
-                    // TODO: error.
+                    fv.setConstraint( (IConstraint) parsed.get( 0 ) );
+                }
+                else if( parsed.size() > 1 )
+                {
+                    final IConstraint and 
+                        = new Constraint( fv, IConstraint.Type.AND, 
+                                          parsed.toArray() );
+                    
+                    fv.setConstraint( and );
                 }
             }
             else if( childName.equals( "group-member" ) )
@@ -961,7 +1025,8 @@
                 
                 if( id == null )
                 {
-                    // TODO: error
+                    reportMissingAttribute( child, "id" );
+                    return;
                 }
                 
                 Group group = (Group) this.groups.get( id );
@@ -976,44 +1041,106 @@
                 
                 group.addMember( fv );
             }
-            else if( childName.equals( "action" ) )
-            {
-                readAction( child, fv );
-            }
         }
         
         f.addVersion( fv );
+
+        // This has to happen after facet version is registered.
+        
+        for( int i = 0; i < children.length; i++ )
+        {
+            final IConfigurationElement child = children[ i ];
+            final String childName = child.getName();
+            
+            if( childName.equals( "action" ) )
+            {
+                readAction( child, f, ver );
+            }
+        }
+    }
+    
+    private void readAction( final IConfigurationElement config )
+    {
+        final String fid = config.getAttribute( "facet" );
+
+        if( fid == null )
+        {
+            reportMissingAttribute( config, "facet" );
+            return;
+        }
+        
+        final ProjectFacet f = (ProjectFacet) this.facets.get( fid );
+        
+        if( f == null )
+        {
+            final String msg
+                = NLS.bind( Resources.facetNotDefined, 
+                            config.getNamespace(), fid );
+            
+            FacetCorePlugin.log( msg );
+            
+            return;
+        }
+        
+        final String ver = config.getAttribute( "version" );
+
+        if( ver == null )
+        {
+            reportMissingAttribute( config, "version" );
+            return;
+        }
+        
+        readAction( config, f, ver );
     }
 
     private void readAction( final IConfigurationElement config,
-                             final ProjectFacetVersion fv )
+                             final ProjectFacet f,
+                             final String version )
     {
+        final ActionDefinition def = new ActionDefinition();
+        
         final String type = config.getAttribute( "type" );
-        IDelegate.Type t = null;
         
         if( type == null )
         {
-            // TODO: error
+            reportMissingAttribute( config, "type" );
+            return;
         }
         else if( type.equals( "install" ) )
         {
-            t = IDelegate.Type.INSTALL;
+            def.type = IDelegate.Type.INSTALL;
         }
         else if( type.equals( "uninstall" ) )
         {
-            t = IDelegate.Type.UNINSTALL;
+            def.type = IDelegate.Type.UNINSTALL;
         }
         else if( type.equals( "version-change" ) )
         {
-            t = IDelegate.Type.VERSION_CHANGE; 
+            def.type = IDelegate.Type.VERSION_CHANGE; 
         }
         else if( type.equals( "runtime-changed" ) )
         {
-            t = IDelegate.Type.RUNTIME_CHANGED;
+            def.type = IDelegate.Type.RUNTIME_CHANGED;
         }
         else
         {
-            // TODO: error
+            final String msg
+                = NLS.bind( Resources.invalidActionType, config.getNamespace(),
+                            type );
+            
+            FacetCorePlugin.log( msg );
+            
+            return;
+        }
+        
+        try
+        {
+            def.versionMatchExpr = new VersionMatchExpr( f, version );
+        }
+        catch( CoreException e )
+        {
+            FacetCorePlugin.log( e );
+            return;
         }
 
         final IConfigurationElement[] children = config.getChildren();
@@ -1029,10 +1156,11 @@
                 
                 if( clname == null )
                 {
-                    // TODO: error
+                    reportMissingAttribute( child, "class" );
+                    return;
                 }
                 
-                fv.setActionConfigFactory( t, clname );
+                def.configFactoryClassName = clname;
             }
             else if( childName.equals( "delegate" ) )
             {
@@ -1040,16 +1168,15 @@
                 
                 if( clname == null )
                 {
-                    // TODO: error
+                    reportMissingAttribute( config, "class" );
+                    return;
                 }
                 
-                fv.setDelegate( t, clname );
-            }
-            else
-            {
-                // TODO: error
+                def.delegateClassName = clname;
             }
         }
+        
+        f.addActionDefinition( def );
     }
     
     private IConstraint readConstraint( final IConfigurationElement root,
@@ -1077,14 +1204,16 @@
             
             if( fid == null )
             {
-                // TODO: error
+                reportMissingAttribute( root, "facet" );
+                return null;
             }
 
             final String version = root.getAttribute( "version" );
             
             if( version == null )
             {
-                // TODO: error
+                reportMissingAttribute( root, "version" );
+                return null;
             }
             
             final String allowNewerStr = root.getAttribute( "allow-newer" );
@@ -1107,14 +1236,15 @@
         }
         else if( type == IConstraint.Type.CONFLICTS )
         {
-            final String set = root.getAttribute( "group" );
+            final String group = root.getAttribute( "group" );
             
-            if( set == null )
+            if( group == null )
             {
-                // TODO: error
+                reportMissingAttribute( root, "group" );
+                return null;
             }
 
-            operands = new Object[] { set };
+            operands = new Object[] { group };
         }
         else
         {
@@ -1132,7 +1262,8 @@
 
         if( id == null )
         {
-            // TODO: error
+            reportMissingAttribute( config, "id" );
+            return;
         }
 
         template.setId( id );
@@ -1154,12 +1285,19 @@
                 
                 if( fid == null )
                 {
-                    // TODO: error
+                    reportMissingAttribute( child, "facet" );
+                    return;
                 }
                 
                 if( ! isProjectFacetDefined( fid ) )
                 {
-                    // TODO: error
+                    final String msg
+                        = NLS.bind( Resources.facetNotDefined, 
+                                    child.getNamespace(), fid );
+                    
+                    FacetCorePlugin.log( msg );
+                    
+                    return;
                 }
                 
                 template.addFixedProjectFacet( getProjectFacet( fid ) );
@@ -1170,12 +1308,19 @@
                 
                 if( pid == null )
                 {
-                    // TODO: error
+                    reportMissingAttribute( child, "id" );
+                    return;
                 }
                 
                 if( ! isPresetDefined( pid ) )
                 {
-                    // TODO: error
+                    final String msg
+                        = NLS.bind( Resources.presetNotDefined, 
+                                    child.getNamespace(), pid );
+                    
+                    FacetCorePlugin.log( msg );
+                    
+                    return;
                 }
                 
                 template.setInitialPreset( getPreset( pid ) );
@@ -1193,7 +1338,8 @@
 
         if( id == null )
         {
-            // TODO: error
+            reportMissingAttribute( config, "id" );
+            return;
         }
 
         preset.setId( id );
@@ -1215,14 +1361,16 @@
                 
                 if( fid == null )
                 {
-                    // TODO: error
+                    reportMissingAttribute( child, "id" );
+                    return;
                 }
                 
                 final String fver = child.getAttribute( "version" );
                 
                 if( fver == null )
                 {
-                    // TODO: error
+                    reportMissingAttribute( child, "version" );
+                    return;
                 }
                 
                 final IProjectFacetVersion fv
@@ -1235,6 +1383,17 @@
         this.presets.add( id, preset );
     }
     
+    private static void reportMissingAttribute( final IConfigurationElement el,
+                                                final String attribute )
+    {
+        final String[] params 
+            = new String[] { el.getNamespace(), el.getName(), attribute };
+        
+        final String msg = NLS.bind( Resources.missingAttribute, params ); 
+    
+        FacetCorePlugin.log( msg );
+    }
+    
     private void saveUserPresets()
     {
         try
@@ -1359,4 +1518,24 @@
         return pluginRoot.node( "user.presets" );
     }
 
+    public static final class Resources
+    
+        extends NLS
+        
+    {
+        public static String missingAttribute;
+        public static String categoryNotDefined;
+        public static String facetNotDefined;
+        public static String facetVersionNotDefined;
+        public static String facetVersionNotDefinedNoPlugin;
+        public static String presetNotDefined;
+        public static String invalidActionType;
+        
+        static
+        {
+            initializeMessages( ProjectFacetsManagerImpl.class.getName(), 
+                                Resources.class );
+        }
+    }
+    
 }
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/ProjectFacetsManagerImpl.properties b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/ProjectFacetsManagerImpl.properties
new file mode 100644
index 0000000..27270de
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/ProjectFacetsManagerImpl.properties
@@ -0,0 +1,7 @@
+missingAttribute = An extension element <{1}> in plugin {0} is missing a required attribute {2}.
+categoryNotDefined = Category {1} has not been defined. It's used in plugin {0}.
+facetNotDefined = Project facet {1} has not been defined. It's used in plugin {0}.
+facetVersionNotDefined = Version {2} of project facet {1} has not been defined. It's used in plugin {0}.
+facetVersionNotDefinedNoPlugin = Version {1} of project facet {0} has not been defined.
+presetNotDefined = Preset {1} has not been defined. It's used in plugin {0}.
+invalidActionType = "{1}" is an invalid action type. It's used in plugin {0}.
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/VersionMatchExpr.java b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/VersionMatchExpr.java
new file mode 100644
index 0000000..4645553
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/VersionMatchExpr.java
@@ -0,0 +1,217 @@
+/******************************************************************************
+ * Copyright (c) 2005 BEA Systems, Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the 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:
+ *    Konstantin Komissarchik - initial API and implementation
+ ******************************************************************************/
+
+package org.eclipse.wst.common.project.facet.core.internal;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+
+/**
+ * @author <a href="mailto:kosta@bea.com">Konstantin Komissarchik</a>
+ */
+
+public final class VersionMatchExpr
+{
+    private final Versionable versionable;
+    private final List subexprs = new ArrayList();
+    
+    public VersionMatchExpr( final Versionable versionable,
+                             final String expr )
+    
+        throws CoreException
+        
+    {
+        this.versionable = versionable;
+        
+        final String[] subexprs = expr.split( "," );
+        
+        for( int i = 0; i < subexprs.length; i++ )
+        {
+            final String subexpr = subexprs[ i ].trim();
+            final AbstractVersionOperator op;
+            
+            if( subexpr.startsWith( "<=" ) )
+            {
+                op = new LessThanOrEq( parseVersion( subexpr, 2 ) );
+            }
+            else if( subexpr.startsWith( "<" ) )
+            {
+                op = new LessThan( parseVersion( subexpr, 1 ) );
+            }
+            else if( subexpr.startsWith( ">=" ) )
+            {
+                op = new GreaterThanOrEq( parseVersion( subexpr, 2 ) );
+            }
+            else if( subexpr.startsWith( ">" ) )
+            {
+                op = new GreaterThan( parseVersion( subexpr, 1 ) );
+            }
+            else
+            {
+                op = new Equals( parseVersion( subexpr, 0 ) );
+            }
+            
+            this.subexprs.add( op );
+        }
+    }
+    
+    private IVersion parseVersion( final String str,
+                                   final int offset )
+    
+        throws CoreException
+        
+    {
+        final String verstr = str.substring( offset ).trim();
+        
+        if( ! this.versionable.hasVersion( verstr ) )
+        {
+            final String msg 
+                = this.versionable.createVersionNotFoundErrMsg( verstr );
+            
+            final IStatus st = FacetCorePlugin.createErrorStatus( msg );
+            
+            throw new CoreException( st );
+        }
+        else
+        {
+            return this.versionable.getVersionInternal( verstr );
+        }
+    }
+    
+    public boolean evaluate( final IVersion ver )
+    
+        throws CoreException
+        
+    {
+        for( Iterator itr = this.subexprs.iterator(); itr.hasNext(); )
+        {
+            if( ! ( (AbstractVersionOperator) itr.next() ).evaluate( ver ) )
+            {
+                return false;
+            }
+        }
+        
+        return true;
+    }
+    
+    private static abstract class AbstractVersionOperator
+    {
+        private final IVersion param;
+        
+        public AbstractVersionOperator( final IVersion param )
+        {
+            this.param = param;
+        }
+        
+        public boolean evaluate( final IVersion fv )
+        
+            throws CoreException
+            
+        {
+            final Comparator comp 
+                = this.param.getVersionable().getVersionComparator();
+            
+            final int result
+                = comp.compare( fv.getVersionString(), 
+                                param.getVersionString() );
+            
+            return evaluate( result );
+        }
+        
+        protected abstract boolean evaluate( int result );
+    }
+    
+    private static final class Equals
+    
+        extends AbstractVersionOperator
+        
+    {
+        public Equals( final IVersion param )
+        {
+            super( param );
+        }
+        
+        protected boolean evaluate( final int result )
+        {
+            return ( result == 0 );
+        }
+    }
+
+    private static final class LessThan
+    
+        extends AbstractVersionOperator
+        
+    {
+        public LessThan( final IVersion param )
+        {
+            super( param );
+        }
+        
+        protected boolean evaluate( final int result )
+        {
+            return ( result < 0 );
+        }
+    }
+
+    private static final class LessThanOrEq
+    
+        extends AbstractVersionOperator
+        
+    {
+        public LessThanOrEq( final IVersion param )
+        {
+            super( param );
+        }
+        
+        protected boolean evaluate( final int result )
+        {
+            return ( result <= 0 );
+        }
+    }
+
+    private static final class GreaterThan
+    
+        extends AbstractVersionOperator
+        
+    {
+        public GreaterThan( final IVersion param )
+        {
+            super( param );
+        }
+        
+        protected boolean evaluate( final int result )
+        {
+            return ( result > 0 );
+        }
+    }
+
+    private static final class GreaterThanOrEq
+    
+        extends AbstractVersionOperator
+        
+    {
+        public GreaterThanOrEq( final IVersion param )
+        {
+            super( param );
+        }
+        
+        protected boolean evaluate( final int result )
+        {
+            return ( result >= 0 );
+        }
+    }
+
+}
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/Versionable.java b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/Versionable.java
index d698d2d..acdd174 100644
--- a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/Versionable.java
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/Versionable.java
@@ -14,10 +14,15 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Platform;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.wst.common.project.facet.core.DefaultVersionComparator;
 import org.eclipse.wst.common.project.facet.core.VersionFormatException;
 import org.osgi.framework.Bundle;
@@ -42,6 +47,32 @@
         return this.versions.getUnmodifiable();
     }
     
+    public Set getVersions( final String expr )
+    
+        throws CoreException
+        
+    {
+        final VersionMatchExpr prepared = new VersionMatchExpr( this, expr );
+        final Set result = new HashSet();
+            
+        for( Iterator itr = this.versions.iterator(); itr.hasNext(); )
+        {
+            final IVersion ver = (IVersion) itr.next();
+            
+            if( prepared.evaluate( ver ) )
+            {
+                result.add( ver );
+            }
+        }
+        
+        return result;
+    }
+    
+    public IVersion getVersionInternal( final String version )
+    {
+        return (IVersion) this.versions.get( version );
+    }
+    
     public boolean hasVersion( final String version )
     {
         return this.versions.containsKey( version );
@@ -49,7 +80,7 @@
 
     public List getSortedVersions( final boolean ascending )
     
-        throws VersionFormatException
+        throws VersionFormatException, CoreException
         
     {
         final ArrayList list = new ArrayList( this.versions );
@@ -61,12 +92,18 @@
     }
     
     public Comparator getVersionComparator()
+    
+        throws CoreException
+        
     {
         return getVersionComparator( true, null );
     }
     
     protected Comparator getVersionComparator( final boolean ascending,
                                                final IVersionAdapter adapter )
+    
+        throws CoreException
+        
     {
         Comparator comp;
         
@@ -89,8 +126,14 @@
                 }
                 catch( Exception e )
                 {
-                    // TODO: handle this.
-                    return null;
+                    final String msg
+                        = NLS.bind( Resources.failedToCreate, 
+                                    this.versionComparatorClass );
+                    
+                    final IStatus st 
+                        = FacetCorePlugin.createErrorStatus( msg, e );
+                    
+                    throw new CoreException( st );
                 }
             }
             
@@ -135,6 +178,8 @@
         this.versionComparatorClass = clname;
     }
     
+    public abstract String createVersionNotFoundErrMsg( String verstr );
+    
     protected abstract IVersionAdapter getVersionAdapter();
     
     protected static interface IVersionAdapter
@@ -142,4 +187,18 @@
         String adapt( Object obj );
     }
 
+    private static final class Resources
+    
+        extends NLS
+        
+    {
+        public static String failedToCreate;
+        
+        static
+        {
+            initializeMessages( Versionable.class.getName(), 
+                                Resources.class );
+        }
+    }
+
 }
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/Versionable.properties b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/Versionable.properties
new file mode 100644
index 0000000..94219a0
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/internal/Versionable.properties
@@ -0,0 +1 @@
+failedToCreate = Failed to instantiate class {0}.
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/IRuntimeComponentType.java b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/IRuntimeComponentType.java
index e1ef5f8..9cd3941 100644
--- a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/IRuntimeComponentType.java
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/IRuntimeComponentType.java
@@ -15,6 +15,7 @@
 import java.util.List;
 import java.util.Set;
 
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.wst.common.project.facet.core.VersionFormatException;
 
 /**
@@ -81,7 +82,9 @@
      * @return returns the latest version of this runtime component
      */
 
-    IRuntimeComponentVersion getLatestVersion();
+    IRuntimeComponentVersion getLatestVersion()
+    
+        throws CoreException;
     
     /**
      * Returns a sorted list containing all of the versions of this runtime
@@ -93,7 +96,9 @@
      * @throws VersionFormatException if failed while parsing a version string
      */
     
-    List getSortedVersions( boolean ascending );
+    List getSortedVersions( boolean ascending )
+    
+        throws CoreException;
     
     /**
      * Returns the version comparator specified for this runtime component type.
@@ -103,7 +108,9 @@
      * @return the version comparator specified for this runtime component type
      */
     
-    Comparator getVersionComparator();
+    Comparator getVersionComparator()
+    
+        throws CoreException;
     
     /**
      * Returns the path that can be used to find the icon to be used with this
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/internal/RuntimeComponent.java b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/internal/RuntimeComponent.java
index bba578d..5709940 100644
--- a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/internal/RuntimeComponent.java
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/internal/RuntimeComponent.java
@@ -15,9 +15,11 @@
 import java.util.HashMap;
 import java.util.Map;
 
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IAdapterFactory;
 import org.eclipse.core.runtime.IAdapterManager;
 import org.eclipse.core.runtime.Platform;
+import org.eclipse.wst.common.project.facet.core.internal.FacetCorePlugin;
 import org.eclipse.wst.common.project.facet.core.runtime.IRuntimeComponent;
 import org.eclipse.wst.common.project.facet.core.runtime.IRuntimeComponentType;
 import org.eclipse.wst.common.project.facet.core.runtime.IRuntimeComponentVersion;
@@ -82,7 +84,16 @@
         
         if( res == null )
         {
-            final IAdapterFactory factory = rcv.getAdapterFactory( type );
+            IAdapterFactory factory = null;
+            
+            try
+            {
+                factory = rcv.getAdapterFactory( type );
+            }
+            catch( CoreException e )
+            {
+                FacetCorePlugin.log( e );
+            }
             
             if( factory != null )
             {
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/internal/RuntimeComponentType.java b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/internal/RuntimeComponentType.java
index e6d7fc6..c671fd0 100644
--- a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/internal/RuntimeComponentType.java
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/internal/RuntimeComponentType.java
@@ -14,6 +14,8 @@
 import java.util.Collections;
 import java.util.Comparator;
 
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.wst.common.project.facet.core.VersionFormatException;
 import org.eclipse.wst.common.project.facet.core.internal.Versionable;
 import org.eclipse.wst.common.project.facet.core.runtime.IRuntimeComponentType;
@@ -85,7 +87,7 @@
 
     public IRuntimeComponentVersion getLatestVersion()
     
-        throws VersionFormatException
+        throws VersionFormatException, CoreException
         
     {
         final Comparator comp = getVersionComparator( true, VERSION_ADAPTER );
@@ -109,4 +111,11 @@
         return VERSION_ADAPTER;
     }
     
+    public String createVersionNotFoundErrMsg( final String verstr )
+    {
+        return NLS.bind( RuntimeManagerImpl.Resources.runtimeComponentVersionNotDefinedNoPlugin,
+                         this.id, verstr );
+    }
+
+    
 }
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/internal/RuntimeComponentVersion.java b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/internal/RuntimeComponentVersion.java
index 7917162..e505bd7 100644
--- a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/internal/RuntimeComponentVersion.java
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/internal/RuntimeComponentVersion.java
@@ -13,8 +13,14 @@
 
 import java.util.HashMap;
 
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IAdapterFactory;
+import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Platform;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.wst.common.project.facet.core.internal.FacetCorePlugin;
+import org.eclipse.wst.common.project.facet.core.internal.IVersion;
+import org.eclipse.wst.common.project.facet.core.internal.Versionable;
 import org.eclipse.wst.common.project.facet.core.runtime.IRuntimeComponentType;
 import org.eclipse.wst.common.project.facet.core.runtime.IRuntimeComponentVersion;
 import org.osgi.framework.Bundle;
@@ -25,7 +31,7 @@
 
 public final class RuntimeComponentVersion
 
-    implements IRuntimeComponentVersion
+    implements IRuntimeComponentVersion, IVersion
     
 {
     private String plugin;
@@ -63,7 +69,15 @@
         this.version = version;
     }
     
+    public Versionable getVersionable()
+    {
+        return (Versionable) this.type;
+    }
+
     IAdapterFactory getAdapterFactory( final Class type )
+    
+        throws CoreException
+        
     {
         synchronized( this.adapterFactories )
         {
@@ -83,13 +97,19 @@
                 {
                     final Class cl = bundle.loadClass( ref.clname );
                     factory = cl.newInstance();
-                    this.adapterFactories.put( type.getName(), factory );
                 }
                 catch( Exception e )
                 {
-                    // TODO: handle this better
-                    throw new RuntimeException( e );
+                    final String msg
+                        = NLS.bind( Resources.failedToCreate, ref.clname );
+                    
+                    final IStatus st
+                        = FacetCorePlugin.createErrorStatus( msg );
+                    
+                    throw new CoreException( st );
                 }
+
+                this.adapterFactories.put( type.getName(), factory );
             }
             
             return (IAdapterFactory) factory;
@@ -119,4 +139,19 @@
         }
     }
     
+    private static final class Resources
+    
+        extends NLS
+        
+    {
+        public static String failedToCreate;
+        
+        static
+        {
+            initializeMessages( RuntimeComponentVersion.class.getName(), 
+                                Resources.class );
+        }
+    }
+    
+    
 }
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/internal/RuntimeComponentVersion.properties b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/internal/RuntimeComponentVersion.properties
new file mode 100644
index 0000000..94219a0
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/internal/RuntimeComponentVersion.properties
@@ -0,0 +1 @@
+failedToCreate = Failed to instantiate class {0}.
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/internal/RuntimeManagerImpl.java b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/internal/RuntimeManagerImpl.java
index 087f481..b35c303 100644
--- a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/internal/RuntimeManagerImpl.java
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/internal/RuntimeManagerImpl.java
@@ -20,16 +20,19 @@
 import java.util.Map;
 import java.util.Set;
 
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IConfigurationElement;
 import org.eclipse.core.runtime.IExtension;
 import org.eclipse.core.runtime.IExtensionPoint;
 import org.eclipse.core.runtime.IExtensionRegistry;
 import org.eclipse.core.runtime.Platform;
+import org.eclipse.osgi.util.NLS;
 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;
 import org.eclipse.wst.common.project.facet.core.internal.FacetCorePlugin;
 import org.eclipse.wst.common.project.facet.core.internal.IndexedSet;
+import org.eclipse.wst.common.project.facet.core.internal.ProjectFacetsManagerImpl;
 import org.eclipse.wst.common.project.facet.core.runtime.IRuntime;
 import org.eclipse.wst.common.project.facet.core.runtime.IRuntimeBridge;
 import org.eclipse.wst.common.project.facet.core.runtime.IRuntimeComponent;
@@ -109,7 +112,7 @@
     public static Set getRuntimes()
     {
         bridge();
-        return runtimes.getUnmodifiable();
+        return (Set) runtimes.clone();
     }
     
     public static Set getRuntimes( final Set facets )
@@ -227,10 +230,22 @@
                         
                         if( m.facetAllowNewer )
                         {
-                            final List sorted = m.facet.getSortedVersions( true );
+                            final List sorted; 
+                            
+                            try
+                            {
+                                sorted = m.facet.getSortedVersions( true );
+                            }
+                            catch( CoreException e )
+                            {
+                                FacetCorePlugin.log( e );
+                                continue;
+                            }
+                            
                             boolean found = false;
                             
-                            for( Iterator itr3 = sorted.iterator(); itr3.hasNext(); )
+                            for( Iterator itr3 = sorted.iterator(); 
+                                 itr3.hasNext(); )
                             {
                                 if( found )
                                 {
@@ -359,7 +374,8 @@
 
         if( id == null )
         {
-            // TODO: error
+            reportMissingAttribute( config, "id" );
+            return;
         }
         
         final RuntimeComponentType rct = new RuntimeComponentType();
@@ -379,7 +395,8 @@
                 
                 if( clname == null )
                 {
-                    // TODO: error
+                    reportMissingAttribute( child, "class" );
+                    return;
                 }
                 
                 rct.setVersionComparator( clname );
@@ -399,14 +416,16 @@
 
         if( type == null )
         {
-            // TODO: error
+            reportMissingAttribute( config, "type" );
+            return;
         }
         
         final String ver = config.getAttribute( "version" );
 
         if( ver == null )
         {
-            // TODO: error
+            reportMissingAttribute( config, "version" );
+            return;
         }
         
         final RuntimeComponentType rct 
@@ -414,7 +433,13 @@
         
         if( rct == null )
         {
-            // TODO: error
+            final String msg
+                = NLS.bind( Resources.runtimeComponentTypeNotDefined, 
+                            config.getNamespace(), type );
+            
+            FacetCorePlugin.log( msg );
+            
+            return;
         }
         
         final RuntimeComponentVersion rcv = new RuntimeComponentVersion();
@@ -446,12 +471,19 @@
 
                 if( id == null )
                 {
-                    // TODO: error
+                    reportMissingAttribute( child, "id" );
+                    return;
                 }
                 
                 if( ! isRuntimeComponentTypeDefined( id ) )
                 {
-                    // TODO: error
+                    final String msg
+                        = NLS.bind( Resources.runtimeComponentTypeNotDefined, 
+                                    child.getNamespace(), id );
+                    
+                    FacetCorePlugin.log( msg );
+                    
+                    return;
                 }
                 
                 rctype = getRuntimeComponentType( id );
@@ -462,7 +494,17 @@
                 {
                     if( ! rctype.hasVersion( version ) )
                     {
-                        // TODO: error
+                        final String[] params
+                            = new String[] { config.getNamespace(), id, 
+                                             version };
+                        
+                        final String msg
+                            = NLS.bind( Resources.runtimeComponentVersionNotDefined, 
+                                        params ); 
+                        
+                        FacetCorePlugin.log( msg );
+                        
+                        return;
                     }
                     
                     rcversion = rctype.getVersion( version );
@@ -474,7 +516,8 @@
 
                 if( factory == null )
                 {
-                    // TODO: error
+                    reportMissingAttribute( child, "class" );
+                    return;
                 }
             }
             else if( childName.equals( "type" ) )
@@ -483,7 +526,8 @@
 
                 if( type == null )
                 {
-                    // TODO: error
+                    reportMissingAttribute( child, "class" );
+                    return;
                 }
                 else
                 {
@@ -533,12 +577,19 @@
 
                 if( id == null )
                 {
-                    // TODO: error
+                    reportMissingAttribute( child, "id" );
+                    return;
                 }
                 
                 if( ! ProjectFacetsManager.isProjectFacetDefined( id ) )
                 {
-                    // TODO: error
+                    final String msg
+                        = NLS.bind( ProjectFacetsManagerImpl.Resources.facetNotDefined, 
+                                    child.getNamespace(), id );
+                    
+                    FacetCorePlugin.log( msg );
+                    
+                    return;
                 }
                 
                 m.facet = ProjectFacetsManager.getProjectFacet( id );
@@ -549,7 +600,17 @@
                 {
                     if( ! m.facet.hasVersion( version ) )
                     {
-                        // TODO: error
+                        final String[] params
+                            = new String[] { config.getNamespace(), id, 
+                                             version };
+                        
+                        final String msg
+                            = NLS.bind( ProjectFacetsManagerImpl.Resources.facetVersionNotDefined, 
+                                        params ); 
+                        
+                        FacetCorePlugin.log( msg );
+                        
+                        return;
                     }
                     
                     m.facetVersion = m.facet.getVersion( version );
@@ -570,12 +631,19 @@
     
                     if( id == null )
                     {
-                        // TODO: error
+                        reportMissingAttribute( child, "id" );
+                        return;
                     }
                     
                     if( ! isRuntimeComponentTypeDefined( id ) )
                     {
-                        // TODO: error
+                        final String msg
+                            = NLS.bind( Resources.runtimeComponentTypeNotDefined, 
+                                        config.getNamespace(), id );
+                        
+                        FacetCorePlugin.log( msg );
+                        
+                        return;
                     }
                     
                     m.runtimeCompType = getRuntimeComponentType( id );
@@ -586,7 +654,17 @@
                     {
                         if( ! m.runtimeCompType.hasVersion( version ) )
                         {
-                            // TODO: error
+                            final String[] params
+                                = new String[] { config.getNamespace(), id, 
+                                                 version };
+                            
+                            final String msg
+                                = NLS.bind( Resources.runtimeComponentVersionNotDefined, 
+                                            params ); 
+                            
+                            FacetCorePlugin.log( msg );
+                            
+                            return;
                         }
                         
                         m.runtimeCompVersion 
@@ -606,6 +684,17 @@
         mappings.add( m );
     }
     
+    private static void reportMissingAttribute( final IConfigurationElement el,
+                                                final String attribute )
+    {
+        final String[] params 
+            = new String[] { el.getNamespace(), el.getName(), attribute };
+        
+        final String msg = NLS.bind( Resources.missingAttribute, params ); 
+    
+        FacetCorePlugin.log( msg );
+    }
+    
     private static final class Mapping
     {
         public IProjectFacet facet;
@@ -633,13 +722,22 @@
                 }
                 else if( this.runtimeCompAllowNewer )
                 {
-                    final Comparator comparator 
-                        = this.runtimeCompType.getVersionComparator();
+                    final Comparator comp;
+                    
+                    try
+                    {
+                        comp = this.runtimeCompType.getVersionComparator();
+                    }
+                    catch( CoreException e )
+                    {
+                        FacetCorePlugin.log( e );
+                        return false;
+                    }
                     
                     final String v1 = version.getVersionString();
                     final String v2 = this.runtimeCompVersion.getVersionString();
                     
-                    if( comparator.compare( v1, v2 ) > 0 )
+                    if( comp.compare( v1, v2 ) > 0 )
                     {
                         return true;
                     }
@@ -650,4 +748,21 @@
         }
     }
 
+    public static final class Resources
+    
+        extends NLS
+        
+    {
+        public static String missingAttribute;
+        public static String runtimeComponentTypeNotDefined;
+        public static String runtimeComponentVersionNotDefined;
+        public static String runtimeComponentVersionNotDefinedNoPlugin;
+        
+        static
+        {
+            initializeMessages( RuntimeManagerImpl.class.getName(), 
+                                Resources.class );
+        }
+    }
+    
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/internal/RuntimeManagerImpl.properties b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/internal/RuntimeManagerImpl.properties
new file mode 100644
index 0000000..a351681
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.project.facet.core/src/org/eclipse/wst/common/project/facet/core/runtime/internal/RuntimeManagerImpl.properties
@@ -0,0 +1,4 @@
+missingAttribute = An extension element <{1}> in plugin {0} is missing a required attribute {2}.
+runtimeComponentTypeNotDefined = Runtime component type {1} has not been defined. It's used in plugin {0}.
+runtimeComponentVersionNotDefined = Version {2} of runtime component type {1} has not been defined. It's used in plugin {0}.
+runtimeComponentVersionNotDefinedNoPlugin = Version {1} of runtime component type {0} has not been defined.
\ No newline at end of file
diff --git a/plugins/org.eclipse.wst.common.project.facet.ui/.cvsignore b/plugins/org.eclipse.wst.common.project.facet.ui/.cvsignore
index fc40a91..1150533 100644
--- a/plugins/org.eclipse.wst.common.project.facet.ui/.cvsignore
+++ b/plugins/org.eclipse.wst.common.project.facet.ui/.cvsignore
@@ -2,5 +2,3 @@
 build.xml
 facet-ui.jar
 temp.folder
-@dot
-src.zip
diff --git a/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/AddRemoveFacetsWizard.java b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/AddRemoveFacetsWizard.java
index 382112d..a30334b 100644
--- a/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/AddRemoveFacetsWizard.java
+++ b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/AddRemoveFacetsWizard.java
@@ -65,7 +65,7 @@
     
     public void addPages()
     {
-        this.facetsSelectionPage = new FacetsSelectionPage();
+        this.facetsSelectionPage = new FacetsSelectionPage( context );
         
         if( this.fproj != null )
         {
diff --git a/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/AddRemoveFacetsAction.java b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/AddRemoveFacetsAction.java
index 2b12be0..cd95d1d 100644
--- a/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/AddRemoveFacetsAction.java
+++ b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/AddRemoveFacetsAction.java
@@ -14,10 +14,12 @@
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.ErrorDialog;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.wizard.IWizard;
 import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.osgi.util.NLS;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.IObjectActionDelegate;
 import org.eclipse.ui.IWorkbenchPart;
@@ -59,8 +61,12 @@
             }
             catch( CoreException e )
             {
-                // TODO: Handle this better.
-                throw new RuntimeException( e );
+                ErrorDialog.openError( this.shell, Resources.errDlgTitle,
+                                       e.getMessage(), e.getStatus() );
+                
+                FacetUiPlugin.log( e );
+                
+                return;
             }
             
             final IWizard wizard = new AddRemoveFacetsWizard( fproj );
@@ -76,4 +82,18 @@
         this.selection = selection;
     }
 
+    private static final class Resources
+    
+        extends NLS
+        
+    {
+        public static String errDlgTitle;
+        
+        static
+        {
+            initializeMessages( AddRemoveFacetsAction.class.getName(), 
+                                Resources.class );
+        }
+    }
+    
 }
diff --git a/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/AddRemoveFacetsAction.properties b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/AddRemoveFacetsAction.properties
new file mode 100644
index 0000000..feb2801
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/AddRemoveFacetsAction.properties
@@ -0,0 +1 @@
+errDlgTitle = Error
diff --git a/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/ConflictingFacetsFilter.java b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/ConflictingFacetsFilter.java
index 99021b5..b68a429 100644
--- a/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/ConflictingFacetsFilter.java
+++ b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/ConflictingFacetsFilter.java
@@ -15,6 +15,7 @@
 import java.util.Iterator;
 import java.util.Set;
 
+import org.eclipse.core.runtime.CoreException;
 import org.eclipse.wst.common.project.facet.core.IConstraint;
 import org.eclipse.wst.common.project.facet.core.IGroup;
 import org.eclipse.wst.common.project.facet.core.IProjectFacet;
@@ -116,7 +117,17 @@
                     = ProjectFacetsManager.getProjectFacet( name );
                 
                 final Set versions = rf.getVersions();
-                final Comparator comp = rf.getVersionComparator();
+                final Comparator comp;
+                
+                try
+                {
+                    comp = rf.getVersionComparator();
+                }
+                catch( CoreException e )
+                {
+                    FacetUiPlugin.log( e );
+                    return false;
+                }
                 
                 for( Iterator itr = versions.iterator(); itr.hasNext(); )
                 {
diff --git a/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/FacetUiPlugin.java b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/FacetUiPlugin.java
index 587c56e..3442418 100644
--- a/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/FacetUiPlugin.java
+++ b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/FacetUiPlugin.java
@@ -48,5 +48,18 @@
         
         log.log( new Status( IStatus.ERROR, PLUGIN_ID, IStatus.OK, msg, e ) );
     }
+
+    public static void log( final String msg )
+    {
+        final ILog log = getInstance().getLog();
+        
+        log.log( new Status( IStatus.ERROR, PLUGIN_ID, IStatus.OK, msg, null ) );
+    }
+    
+    public static IStatus createErrorStatus( final String msg,
+                                             final Exception e )
+    {
+        return new Status( IStatus.ERROR, FacetUiPlugin.PLUGIN_ID, 0, msg, e );
+    }
     
 }
diff --git a/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/FacetsSelectionPage.java b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/FacetsSelectionPage.java
index 26c73f3..3e545ba 100644
--- a/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/FacetsSelectionPage.java
+++ b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/FacetsSelectionPage.java
@@ -13,8 +13,11 @@
 
 import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.Iterator;
 import java.util.Set;
 
+import org.eclipse.core.runtime.IAdapterManager;
+import org.eclipse.core.runtime.Platform;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
@@ -23,10 +26,13 @@
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Listener;
+import org.eclipse.wst.common.project.facet.core.IActionConfig;
 import org.eclipse.wst.common.project.facet.core.ICategory;
 import org.eclipse.wst.common.project.facet.core.IPreset;
 import org.eclipse.wst.common.project.facet.core.IProjectFacet;
+import org.eclipse.wst.common.project.facet.core.IFacetedProject.Action;
 import org.eclipse.wst.common.project.facet.core.runtime.IRuntime;
+import org.eclipse.wst.common.project.facet.ui.IWizardContext;
 
 /**
  * @author <a href="mailto:kosta@bea.com">Konstantin Komissarchik</a>
@@ -37,6 +43,7 @@
     extends WizardPage
 
 {
+    private IWizardContext context;
     private IPreset initialPreset;
     private Set initialSelection;
     private final Set fixed;
@@ -45,13 +52,14 @@
     private FacetsSelectionPanel panel;
     private ArrayList listeners;
 
-    public FacetsSelectionPage()
+    public FacetsSelectionPage( final IWizardContext context )
     {
         super( "facets.selection.page" );
 
         setTitle( "Select Project Facets" );
         setDescription( "Select facets for this project." );
 
+        this.context = context;
         this.initialPreset = null;
         this.initialSelection = null;
         this.fixed = new HashSet();
@@ -114,7 +122,8 @@
     public void createControl( final Composite parent )
     {
         this.panel 
-            = new FacetsSelectionPanel( parent, SWT.NONE, this.runtime );
+            = new FacetsSelectionPanel( parent, SWT.NONE, this.runtime, 
+                                        context );
 
         this.panel.setFixedProjectFacets( this.fixed );
         
@@ -189,10 +198,46 @@
             ( (Listener) this.listeners.get( i ) ).handleEvent( event );
         }
         
-        final boolean valid
-            = FacetsSelectionPage.this.panel.isSelectionValid();
-
-        setPageComplete( valid );
+        setPageComplete( this.panel.isSelectionValid() );
+    }
+    
+    public void setVisible( final boolean visible )
+    {
+        if( visible )
+        {
+            for( Iterator itr = this.panel.getActions().iterator(); 
+                 itr.hasNext(); )
+            {
+                final Object config = ( (Action) itr.next() ).getConfig();
+                
+                if( config != null )
+                {
+                    IActionConfig c = null;
+                    
+                    if( config instanceof IActionConfig )
+                    {
+                        c = (IActionConfig) config;
+                    }
+                    else
+                    {
+                        final IAdapterManager m 
+                            = Platform.getAdapterManager();
+                        
+                        final String t
+                            = IActionConfig.class.getName();
+                        
+                        c = (IActionConfig) m.loadAdapter( config, t );
+                    }
+                    
+                    if( c != null )
+                    {
+                        c.setProjectName( this.context.getProjectName() );
+                    }
+                }
+            }
+        }
+        
+        super.setVisible( visible );
     }
 
 }
diff --git a/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/FacetsSelectionPanel.java b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/FacetsSelectionPanel.java
index 51b9357..14b50d2 100644
--- a/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/FacetsSelectionPanel.java
+++ b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/FacetsSelectionPanel.java
@@ -21,6 +21,7 @@
 import java.util.Set;
 
 import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IAdapterManager;
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Status;
@@ -72,6 +73,7 @@
 import org.eclipse.swt.widgets.MenuItem;
 import org.eclipse.swt.widgets.TreeColumn;
 import org.eclipse.swt.widgets.TreeItem;
+import org.eclipse.wst.common.project.facet.core.IActionConfig;
 import org.eclipse.wst.common.project.facet.core.ICategory;
 import org.eclipse.wst.common.project.facet.core.IConstraint;
 import org.eclipse.wst.common.project.facet.core.IPreset;
@@ -80,6 +82,7 @@
 import org.eclipse.wst.common.project.facet.core.ProjectFacetsManager;
 import org.eclipse.wst.common.project.facet.core.IFacetedProject.Action;
 import org.eclipse.wst.common.project.facet.core.runtime.IRuntime;
+import org.eclipse.wst.common.project.facet.ui.IWizardContext;
 import org.osgi.framework.Bundle;
 
 /**
@@ -126,6 +129,8 @@
     private final ComboBoxCellEditor ceditor;
     private final TableViewer problemsView;
     private final RuntimesPanel runtimesPanel;
+    
+    private final IWizardContext context;
 
     /**
      * Contains the <code>TableRowData</code> objects representing all of the
@@ -149,11 +154,13 @@
     }
 
     public FacetsSelectionPanel( final Composite parent,
-                                  final int style,
-                                  final IRuntime runtime )
+                                 final int style,
+                                 final IRuntime runtime,
+                                 final IWizardContext context )
     {
         super( parent, style );
 
+        this.context = context;
         this.data = new ArrayList();
         this.fixed = new HashSet();
         this.base = new HashSet();
@@ -167,7 +174,14 @@
         for( Iterator itr = ProjectFacetsManager.getProjectFacets().iterator();
              itr.hasNext(); )
         {
-            this.data.add( new TableRowData( (IProjectFacet) itr.next() ) );
+            try
+            {
+                this.data.add( new TableRowData( (IProjectFacet) itr.next() ) );
+            }
+            catch( CoreException e )
+            {
+                FacetUiPlugin.log( e );
+            }
         }
 
         // Read the dialog settings.
@@ -452,13 +466,31 @@
     
     private static Action getAction( final Set actions,
                                      final Action.Type type,
-                                     final IProjectFacetVersion f )
+                                     final IProjectFacetVersion fv )
     {
         for( Iterator itr = actions.iterator(); itr.hasNext(); )
         {
             final Action action = (Action) itr.next();
             
-            if( action.getType() == type && action.getProjectFacetVersion() == f )
+            if( action.getType() == type && action.getProjectFacetVersion() == fv )
+            {
+                return action;
+            }
+        }
+        
+        return null;
+    }
+    
+    private static Action getAction( final Set actions,
+                                     final Action.Type type,
+                                     final IProjectFacet f )
+    {
+        for( Iterator itr = actions.iterator(); itr.hasNext(); )
+        {
+            final Action action = (Action) itr.next();
+            
+            if( action.getType() == type && 
+                action.getProjectFacetVersion().getProjectFacet() == f )
             {
                 return action;
             }
@@ -481,7 +513,48 @@
             {
                 try
                 {
-                    config = fv.createActionConfig( type );
+                    final IProjectFacet f = fv.getProjectFacet();
+                    
+                    action = getAction( actions, type, f );
+                    
+                    if( action != null )
+                    {
+                        final IProjectFacetVersion current
+                            = action.getProjectFacetVersion();
+                        
+                        if( fv.isSameActionConfig( type, current ) )
+                        {
+                            config = action.getConfig();
+                            
+                            IActionConfig c = null;
+                            
+                            if( config instanceof IActionConfig )
+                            {
+                                c = (IActionConfig) config;
+                            }
+                            else
+                            {
+                                final IAdapterManager m 
+                                    = Platform.getAdapterManager();
+                                
+                                final String t
+                                    = IActionConfig.class.getName();
+                                
+                                c = (IActionConfig) m.loadAdapter( config, t );
+                            }
+                            
+                            if( c != null )
+                            {
+                                c.setVersion( fv );
+                            }
+                        }
+                    }
+                    
+                    if( config == null )
+                    {
+                        final String pjname = this.context.getProjectName();
+                        config = fv.createActionConfig( type, pjname );
+                    }
                 }
                 catch( CoreException e )
                 {
@@ -1179,6 +1252,9 @@
         private boolean isFixed;
 
         public TableRowData( final IProjectFacet f )
+        
+            throws CoreException
+            
         {
             this.f = f;
             this.versions = f.getSortedVersions( false );
diff --git a/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/ProjectFacetsUiManagerImpl.java b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/ProjectFacetsUiManagerImpl.java
index 2c516b5..27dc7e2 100644
--- a/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/ProjectFacetsUiManagerImpl.java
+++ b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/ProjectFacetsUiManagerImpl.java
@@ -17,11 +17,15 @@
 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.IExtension;
 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.common.project.facet.core.IProjectFacet;
 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;
@@ -73,7 +77,14 @@
         
         for( Iterator itr = clnames.iterator(); itr.hasNext(); )
         {
-            pages.add( create( plugin, (String) itr.next() ) );
+            try
+            {
+                pages.add( create( plugin, (String) itr.next() ) );
+            }
+            catch( CoreException e )
+            {
+                FacetUiPlugin.log( e );
+            }
         }
         
         return pages;
@@ -81,6 +92,9 @@
     
     private Object create( final String plugin,
                            final String clname )
+    
+        throws CoreException
+        
     {
         final Bundle bundle = Platform.getBundle( plugin );
         
@@ -91,8 +105,12 @@
         }
         catch( Exception e )
         {
-            // TODO: handle this better.
-            throw new RuntimeException( e );
+            final String msg
+                = NLS.bind( Resources.failedToCreate, clname );
+            
+            final IStatus st = FacetUiPlugin.createErrorStatus( msg, e );
+            
+            throw new CoreException( st );
         }
     }
     
@@ -125,37 +143,57 @@
                 {
                     readWizardPagesInfo( config );
                 }
-                else
-                {
-                    // TODO: handle this better.
-                    throw new IllegalStateException();
-                }
             }
         }
     }
     
     private void readWizardPagesInfo( final IConfigurationElement config )
     {
-        final String name = config.getAttribute( "facet" );
+        final String id = config.getAttribute( "facet" );
 
-        if( name == null )
+        if( id == null )
         {
-            // TODO: handle this better.
-            throw new IllegalStateException();
+            reportMissingAttribute( config, "facet" );
+            return;
         }
+        
+        if( ! ProjectFacetsManager.isProjectFacetDefined( id ) )
+        {
+            final String msg
+                = NLS.bind( Resources.facetNotDefined, 
+                            config.getNamespace(), id );
+            
+            FacetUiPlugin.log( msg );
+            
+            return;
+        }
+        
+        final IProjectFacet f = ProjectFacetsManager.getProjectFacet( id );
 
         final String version = config.getAttribute( "version" );
 
         if( version == null )
         {
-            // TODO: handle this better.
-            throw new IllegalStateException();
+            reportMissingAttribute( config, "version" );
+            return;
         }
         
-        //TODO: Handle the case where the facet is not available.
+        if( ! f.hasVersion( version ) )
+        {
+            final String[] params
+                = new String[] { config.getNamespace(), id, 
+                                 version };
+            
+            final String msg
+                = NLS.bind( Resources.facetVersionNotDefined, 
+                            params ); 
+            
+            FacetUiPlugin.log( msg );
+            
+            return;
+        }
         
-        final IProjectFacetVersion fv
-            = ProjectFacetsManager.getProjectFacet( name ).getVersion( version );
+        final IProjectFacetVersion fv = f.getVersion( version );
         
         final WizardPagesInfo info = new WizardPagesInfo();
         info.plugin = config.getDeclaringExtension().getNamespace();
@@ -177,10 +215,19 @@
             {
                 actionType = Action.Type.UNINSTALL;
             }
+            else if( childName.equals( "version-change" ) )
+            {
+                actionType = Action.Type.UNINSTALL;
+            }
             else
             {
-                // TODO: handle this better.
-                throw new IllegalStateException();
+                final String msg
+                    = NLS.bind( Resources.invalidActionType, 
+                                config.getNamespace(), childName );
+                
+                FacetUiPlugin.log( msg );
+                
+                return;
             }
             
             info.pagesets.put( actionType, readPageList( child ) );
@@ -205,8 +252,8 @@
                 
                 if( clname == null )
                 {
-                    // TODO: handle this better.
-                    throw new IllegalStateException();
+                    reportMissingAttribute( config, "class" );
+                    continue;
                 }
                 
                 list.add( clname );
@@ -216,10 +263,39 @@
         return list;
     }
     
+    private static void reportMissingAttribute( final IConfigurationElement el,
+                                                final String attribute )
+    {
+        final String[] params 
+            = new String[] { el.getNamespace(), el.getName(), attribute };
+        
+        final String msg = NLS.bind( Resources.missingAttribute, params ); 
+    
+        FacetUiPlugin.log( msg );
+    }
+    
     private static class WizardPagesInfo
     {
         public String plugin;
         public HashMap pagesets = new HashMap();
     }
     
+    private static final class Resources
+    
+        extends NLS
+        
+    {
+        public static String missingAttribute;
+        public static String facetNotDefined;
+        public static String facetVersionNotDefined;
+        public static String failedToCreate;
+        public static String invalidActionType;
+        
+        static
+        {
+            initializeMessages( ProjectFacetsUiManagerImpl.class.getName(), 
+                                Resources.class );
+        }
+    }
+    
 }
diff --git a/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/ProjectFacetsUiManagerImpl.properties b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/ProjectFacetsUiManagerImpl.properties
new file mode 100644
index 0000000..485f236
--- /dev/null
+++ b/plugins/org.eclipse.wst.common.project.facet.ui/src/org/eclipse/wst/common/project/facet/ui/internal/ProjectFacetsUiManagerImpl.properties
@@ -0,0 +1,5 @@
+missingAttribute = An extension element <{1}> in plugin {0} is missing a required attribute {2}.
+facetNotDefined = Project facet {1} has not been defined. It's used in plugin {0}.
+facetVersionNotDefined = Version {2} of project facet {1} has not been defined. It's used in plugin {0}.
+failedToCreate = Failed to instantiate class {0}.
+invalidActionType = "{1}" is an invalid action type. It's used in plugin {0}.
\ No newline at end of file