diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.common/META-INF/MANIFEST.MF
index cc8dbe0..c7c68f5 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.common/META-INF/MANIFEST.MF
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/META-INF/MANIFEST.MF
@@ -9,7 +9,7 @@
  org.eclipse.jst.jsf.common.dom,
  org.eclipse.jst.jsf.common.internal;x-friends:="org.eclipse.jst.jsf.core",
  org.eclipse.jst.jsf.common.internal.types;x-friends:="org.eclipse.jst.jsf.core,org.eclipse.jst.jsf.core.tests,org.eclipse.jst.jsf.validation.el.tests,org.eclipse.jst.jsf.designtime.tests,org.eclipse.jst.jsf.context.symbol.tests",
- org.eclipse.jst.jsf.common.internal.resource;x-friends:="org.eclipse.jst.jsf.core.tests,org.eclipse.jst.jsf.core",
+ org.eclipse.jst.jsf.common.internal.resource;x-friends:="org.eclipse.jst.jsf.core.tests",
  org.eclipse.jst.jsf.common.metadata,
  org.eclipse.jst.jsf.common.metadata.internal;x-friends:="org.eclipse.jst.jsf.metadata.tests",
  org.eclipse.jst.jsf.common.metadata.internal.impl;x-internal:=true,
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/TagIdentifier.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/TagIdentifier.java
index b92b393..3d675a6 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/TagIdentifier.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/dom/TagIdentifier.java
@@ -86,26 +86,34 @@
         
         final String uri = tagWrapper.getUri();
         
-        if (uri == null && getUri() != null)
+        if (uri == null)
         {
-            return false;
+            if (getUri() != null)
+            {
+                return false;
+            }
         }
         else if (uri.equals(getUri()))
         {
             final String tagName = tagWrapper.getTagName();
             
-            if (tagName == null && getTagName() != null)
+            if (tagName == null)
             {
-                return false;
+                if(getTagName() != null)
+                {
+                    return false;
+                }
             }
-
-            // uri and tag name must both the same for it to be the same type
-            // TODO: the ignore case thing is dependent on the type of container document
-            // Use toLower instead of equalsIgnoreCase to ensure that hashCode generates
-            // a hashCode that guarantees x.equals(y) => x.hashCode == y.hashCode
-            if (tagName.toLowerCase().equals((getTagName().toLowerCase())))
+            else
             {
-                return true;
+                // uri and tag name must both the same for it to be the same type
+                // TODO: the ignore case thing is dependent on the type of container document
+                // Use toLower instead of equalsIgnoreCase to ensure that hashCode generates
+                // a hashCode that guarantees x.equals(y) => x.hashCode == y.hashCode
+                if (tagName.toLowerCase().equals((getTagName().toLowerCase())))
+                {
+                    return true;
+                }
             }
         }
 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/ITestTracker.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/ITestTracker.java
new file mode 100644
index 0000000..a3369aa
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/ITestTracker.java
@@ -0,0 +1,40 @@
+package org.eclipse.jst.jsf.common.internal;
+
+/**
+ * An injection interface that allows classes to selectively report test progress.
+ * 
+ * @author cbateman
+ *
+ */
+public interface ITestTracker 
+{
+    /**
+     * Event types
+     *
+     */
+    public enum Event
+    {
+        /**
+         * Signals that tracking should begin on the eventLabel
+         * The seqId must be repeated on the STOP_TRACKING event
+         * for the same event.
+         */
+        START_TRACKING,
+        /**
+         * Signals that tracking should stop on the named event
+         * for the seqId that was passed first in the START_TRACKING.
+         * 
+         */
+        STOP_TRACKING
+    }
+    
+    /**
+     * Fires the event of type event, a unique instance tracking seqId
+     * and a label called eventLabel.
+     * 
+     * @param event
+     * @param seqId
+     * @param eventLabel
+     */
+    void fireEvent(Event event, long seqId, String eventLabel);
+}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/IResourceLifecycleListener.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/IResourceLifecycleListener.java
index 16a3d44..a3ab30f 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/IResourceLifecycleListener.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/IResourceLifecycleListener.java
@@ -22,6 +22,36 @@
      */
     public static class EventResult
     {
+        private static EventResult DEFAULT;
+
+        /**
+         * @return an event result with defaults initialized
+         */
+        public static EventResult getDefaultEventResult()
+        {
+            if (DEFAULT == null)
+            {
+                DEFAULT = new EventResult();
+            }
+            return DEFAULT;
+        }
+
+        private static EventResult DISPOSE_AFTER_EVENT;
+
+        /**
+         * @return an event result with default except dispose after
+         * is set
+         */
+        public static EventResult getDisposeAfterEventResult()
+        {
+            if (DISPOSE_AFTER_EVENT == null)
+            {
+                DISPOSE_AFTER_EVENT = new EventResult();
+                DISPOSE_AFTER_EVENT.setDisposeAfterEvent(true);
+            }
+            return DISPOSE_AFTER_EVENT;
+        }
+
         /**
          * set to true if after the current event is finished firing, the source
          * should be disposed. If self-disposal is not applicable, the flag is ignored
@@ -39,7 +69,7 @@
         /**
          * @param disposeAfterEvent
          */
-        public void setDisposeAfterEvent(boolean disposeAfterEvent) {
+        protected void setDisposeAfterEvent(boolean disposeAfterEvent) {
             _disposeAfterEvent = disposeAfterEvent;
         }
     }
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/LifecycleListener.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/LifecycleListener.java
index e587857..6e99b52 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/LifecycleListener.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/LifecycleListener.java
@@ -8,13 +8,12 @@
 import org.eclipse.core.resources.IResourceChangeEvent;
 import org.eclipse.core.resources.IResourceChangeListener;
 import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
 import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jst.jsf.common.JSFCommonPlugin;
+import org.eclipse.jst.jsf.common.internal.ITestTracker;
+import org.eclipse.jst.jsf.common.internal.ITestTracker.Event;
+import org.eclipse.jst.jsf.common.internal.resource.IResourceLifecycleListener.EventResult;
 import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.EventType;
 import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.ReasonType;
-import org.eclipse.jst.jsf.common.internal.resource.IResourceLifecycleListener.EventResult;
 
 /**
  * Listens to resource changes and fires lifecycle events
@@ -22,11 +21,27 @@
  * @author cbateman
  *
  */
-public class LifecycleListener implements IResourceChangeListener, IResourceDeltaVisitor
+public class LifecycleListener implements IResourceChangeListener
 {
-    private final IResource                                 _res;
+    private final static boolean                            ENABLE_TEST_TRACKING = false;
+    private static long                                     _seqId;
+    
+    private final List<IResource>                           _resources;
     private final List<IResourceLifecycleListener>          _listeners;
     private boolean                                         _isDisposed = false;
+    private ITestTracker                                    _testTracker; // == null; initialized by setter injection
+
+    /**
+     * Initialize an inactive lifecycle listener.  A workspace listener will not
+     * be installed by this constructor.  The object created using this constructor
+     * will not fire any events until addResource is called at least once to add
+     * a target resource
+     */
+    public LifecycleListener()
+    {
+        _resources = new ArrayList<IResource>();
+        _listeners = new ArrayList<IResourceLifecycleListener>(1);
+    }
 
     /**
      * Create a new lifecycle listener for the res
@@ -34,13 +49,72 @@
      */
     public LifecycleListener(IResource res)
     {
-        _res = res;
-        _listeners = new ArrayList<IResourceLifecycleListener>(1);
+        this();
+        _resources.add(res);
+        ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
+    }
+
+    /**
+     * @param resources
+     */
+    public LifecycleListener(List<IResource> resources)
+    {
+        this();
+        _resources.addAll(resources);
         ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
     }
     
 
     /**
+     * @param testTracker
+     */
+    public final void setTestTracker(ITestTracker testTracker)
+    {
+        _testTracker = testTracker;
+    }
+
+    /**
+     * @param res
+     */
+    public void addResource(final IResource res)
+    {
+        synchronized(_resources)
+        {
+            int preSize = _resources.size();
+            if (!_resources.contains(res))
+            {
+                _resources.add(res);
+            }
+            
+            // if the size of the array was 0
+            // and is now greater, make sure the listener is added
+            if (preSize == 0
+                    && _resources.size() > 0)
+            {
+                ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
+            }
+        }
+    }
+
+    /**
+     * @param res
+     */
+    public void removeResource(final IResource res)
+    {
+        synchronized(_resources)
+        {
+            _resources.remove(res);
+            
+            // if there are no longer target resources,
+            // remove the workspace listener
+            if (_resources.size() == 0)
+            {
+                ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
+            }
+        }
+    }
+
+    /**
      * Release the resource change listener
      */
     public void dispose()
@@ -51,10 +125,9 @@
             // be triggered during the remainder of dispose
             ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
 
-            synchronized(_listeners)
-            {
-                _listeners.clear();
-            }
+            // don't clear the listener list currently because of 
+            // concurrent change problems.
+
             _isDisposed = true;
         }
     }
@@ -83,7 +156,7 @@
         {
             throw new IllegalStateException();
         }
-        
+
         synchronized(_listeners)
         {
             if (!_listeners.contains(listener))
@@ -117,16 +190,32 @@
 
     public void resourceChanged(IResourceChangeEvent event) 
     {
+        long seqId = _seqId++;
+        
+        if (ENABLE_TEST_TRACKING && _testTracker != null)
+        {
+            _testTracker.fireEvent(Event.START_TRACKING, seqId, "trackMethod_resourceChanged");
+        }
+
         assert(!isDisposed());
 
         switch(event.getType())
         {
             case IResourceChangeEvent.PRE_CLOSE:
             {
-                IProject proj = (IProject) event.getResource();
-                if (proj == _res || proj == _res.getProject())
+                final IProject proj = (IProject) event.getResource();
+
+                synchronized(_resources)
                 {
-                    fireLifecycleEvent(new ResourceLifecycleEvent(_res, EventType.RESOURCE_INACCESSIBLE, ReasonType.RESOURCE_PROJECT_CLOSED));
+                    final List<IResource> resources = copyResourceList();
+                    for (final IResource res : resources)
+                    {
+                        if (proj == res || proj == res.getProject())
+                        {
+                            fireLifecycleEvent(
+                                    new ResourceLifecycleEvent(res, EventType.RESOURCE_INACCESSIBLE, ReasonType.RESOURCE_PROJECT_CLOSED));
+                        }
+                    }
                 }
             }
             break;
@@ -135,77 +224,142 @@
             {
                 IProject proj = (IProject) event.getResource();
 
-                // if the resource being tracked is the resource being deleted,
-                // then fire a resource delete event
-                if (proj == _res)
+                synchronized(_resources)
                 {
-                    fireLifecycleEvent(new ResourceLifecycleEvent(_res, EventType.RESOURCE_INACCESSIBLE, ReasonType.RESOURCE_DELETED));
-                }
-                // if the resource being tracked is a resource in the project being
-                // deleted, then fire a project deleted event
-                else if (proj == _res.getProject())
-                {
-                    fireLifecycleEvent(new ResourceLifecycleEvent(_res, EventType.RESOURCE_INACCESSIBLE, ReasonType.RESOURCE_PROJECT_DELETED));
+                    final List<IResource> resources = copyResourceList();
+                    for (final IResource res : resources)
+                    {
+                        // if the resource being tracked is the resource being deleted,
+                        // then fire a resource delete event
+                        if (proj == res)
+                        {
+                            fireLifecycleEvent(new ResourceLifecycleEvent(res, EventType.RESOURCE_INACCESSIBLE, ReasonType.RESOURCE_DELETED));
+                        }
+                        // if the resource being tracked is a resource in the project being
+                        // deleted, then fire a project deleted event
+                        else if (proj == res.getProject())
+                        {
+                            fireLifecycleEvent(
+                                new ResourceLifecycleEvent(res, EventType.RESOURCE_INACCESSIBLE, ReasonType.RESOURCE_PROJECT_DELETED));
+                        }
+                    }
                 }
             }
             break;
 
             case IResourceChangeEvent.POST_CHANGE:
             {
-                IResourceDelta delta = event.getDelta();
-                try
+                synchronized(_resources)
                 {
-                    delta.accept(this);
-                }
-                catch (CoreException ce)
-                {
-                    // can't do anything but log
-                    JSFCommonPlugin.log(new Throwable(ce));
+                    final List<IResource> resources = copyResourceList();
+                    for (final IResource res : resources)
+                    {
+                        // only bother continuing if the resource we are tracking
+                        // is not a project since post-change events on projects 
+                        // that we care about won't occur
+                        if (res.getType() != IResource.PROJECT)
+                        {
+                            IResourceDelta delta = event.getDelta();
+                            
+//                            long seqId2 = _seqId++;
+//                            if (ENABLE_TEST_TRACKING && _testTracker != null)
+//                            {
+//                                _testTracker.fireEvent(Event.START_TRACKING, seqId2, "testFindMember");
+//                            }
+                            // only care about post change events to resources
+                            // that we are tracking
+                            delta = delta.findMember(res.getFullPath());
+
+                            if (delta != null)
+                            {
+                                visit(delta);
+                            }
+
+//                            if (ENABLE_TEST_TRACKING && _testTracker != null)
+//                            {
+//                                _testTracker.fireEvent(Event.STOP_TRACKING, seqId2, "testFindMember");
+//                            }
+                        }
+                    }
                 }
             }
             break;
+
+            default:
+            // do nothing
             // we only handle these three
         }
+
+        if (ENABLE_TEST_TRACKING && _testTracker != null)
+        {
+            _testTracker.fireEvent(Event.STOP_TRACKING, seqId, "trackMethod_resourceChanged");
+        }
+    }
+
+    private List<IResource> copyResourceList()
+    {
+        synchronized(_resources)
+        {
+            List<IResource>  resList = new ArrayList<IResource>(_resources.size());
+            resList.addAll(_resources);
+            return resList;
+        }
     }
 
     private void fireLifecycleEvent(ResourceLifecycleEvent event)
     {
+       List<IResourceLifecycleListener>                copyListeners
+           = new ArrayList(_listeners.size());
+
+        // copy the listeners to avoid concurrent modification problems
+        // if a listeners removes itself due to an event
         synchronized(_listeners)
         {
-            boolean  disposeAfter = false;
+            copyListeners.addAll(_listeners);
+        }
 
-            for (final IResourceLifecycleListener listener : _listeners)
-            {
-               EventResult result = listener.acceptEvent(event);
-               disposeAfter |= result.getDisposeAfterEvent();
-            }
+        boolean  disposeAfter = false;
 
-            if (disposeAfter)
-            {
-                dispose();
-            }
+        for (final IResourceLifecycleListener listener : copyListeners)
+        {
+           EventResult result = listener.acceptEvent(event);
+           disposeAfter |= result.getDisposeAfterEvent();
+        }
+
+        if (disposeAfter)
+        {
+            dispose();
         }
     }
 
-    public boolean visit(IResourceDelta delta) throws CoreException 
+    private void visit(IResourceDelta delta) 
     {
         assert(!isDisposed());
 
+        final IResource res = delta.getResource();
+
         switch (delta.getKind())
         {
-            case IResourceDelta.REMOVED:
+            case IResourceDelta.CHANGED:
             {
-                if (_res.equals(delta.getResource()))
+                // the contents of the file have changed
+                if ((delta.getFlags() & IResourceDelta.CONTENT) != 0)
                 {
                     fireLifecycleEvent(
                         new ResourceLifecycleEvent
-                            (_res, EventType.RESOURCE_INACCESSIBLE, ReasonType.RESOURCE_DELETED));
-                    // TODO: return false to stop child visits?
+                            (res, EventType.RESOURCE_CHANGED
+                                    , ReasonType.RESOURCE_CHANGED_CONTENTS));
                 }
             }
+            break;
+            case IResourceDelta.REMOVED:
+            {
+                fireLifecycleEvent(
+                    new ResourceLifecycleEvent
+                        (res, EventType.RESOURCE_INACCESSIBLE
+                                    , ReasonType.RESOURCE_DELETED));
+            }
+            break;
         }
-
-        // keep going on children
-        return true;
     }
 }
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/ResourceLifecycleEvent.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/ResourceLifecycleEvent.java
index b4e6fd1..81f6ff6 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/ResourceLifecycleEvent.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/resource/ResourceLifecycleEvent.java
@@ -18,7 +18,13 @@
          * Indicates that the resource is no longer accessible (as testable with
          * IResource.isAccessible).  The reasonType will indicate why.
          */
-        RESOURCE_INACCESSIBLE;
+        RESOURCE_INACCESSIBLE,
+        
+        /**
+         * Indicates that the resource being tracked has changed in some
+         * way, use ReasonType to determine specifics
+         */
+        RESOURCE_CHANGED;
     }
     
     /**
@@ -43,9 +49,13 @@
         /**
          * The resource's project was closed.  This event is pre-change
          */
-        RESOURCE_PROJECT_CLOSED
+        RESOURCE_PROJECT_CLOSED,
+        /**
+         * Occurs when the contents of a non-project resource has changed 
+         */
+        RESOURCE_CHANGED_CONTENTS
     }
-    
+
     private final IResource   _affectedResource;
     private final EventType   _eventType;
     private final ReasonType  _reasonType;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeComparator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeComparator.java
index 9926224..79332b9 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeComparator.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/internal/types/TypeComparator.java
@@ -42,7 +42,7 @@
         final String[] mustBeSatisfied = boxedFirstType.getSignatures();
         final String[] testSignatures = boxedSecondType.getSignatures();
         // TODO: need better user messages here
-        Diagnostic result = new BasicDiagnostic(Diagnostic.ERROR, "", 0,  //$NON-NLS-1$
+        Diagnostic result = new BasicDiagnostic(Diagnostic.WARNING, "", 0,  //$NON-NLS-1$
                 Messages.getString("TypeComparator.Expression.Doesnt.Match.Expected.Types"), null); //$NON-NLS-1$
         // now loop through each type in the first type and see
         // if there is a type satisfying it in the second
@@ -214,7 +214,7 @@
     {
         if (firstType.isRHS() && !secondType.isRHS())
         {
-            return new BasicDiagnostic(Diagnostic.ERROR, "", 0,  //$NON-NLS-1$
+            return new BasicDiagnostic(Diagnostic.WARNING, "", 0,  //$NON-NLS-1$
                             Messages.getString("TypeComparator.Expression.Not.Gettable"), null); //$NON-NLS-1$
         }
         
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/JDTBeanIntrospector.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/JDTBeanIntrospector.java
index 4bffcfe..e584233 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/JDTBeanIntrospector.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/util/JDTBeanIntrospector.java
@@ -15,9 +15,9 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 
 import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.jdt.core.Flags;
@@ -86,11 +86,10 @@
 
         final Map properties = new HashMap();
         
-        for (final Iterator it = propertiesWorkingCopy.keySet().iterator(); it.hasNext();)
+        for (Entry<String, JDTBeanProperty> entry : propertiesWorkingCopy.entrySet())
         {
-            final String key = (String) it.next();
-            JDTBeanPropertyWorkingCopy  wcopy = 
-                (JDTBeanPropertyWorkingCopy) propertiesWorkingCopy.get(key);
+            final String key = entry.getKey();
+            JDTBeanPropertyWorkingCopy  wcopy = (JDTBeanPropertyWorkingCopy) entry.getValue();
             properties.put(key, wcopy.toValueObject());
         }
 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/MetadataContextResolver.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/MetadataContextResolver.java
index b623100..495589f 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/MetadataContextResolver.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/resolver/structureddocument/internal/impl/MetadataContextResolver.java
@@ -63,13 +63,10 @@
             
             final ITaglibDomainMetaDataModelContext mdContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, uri);
             Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(mdContext, element.getLocalName()+"/"+attribute.getLocalName(), key); //$NON-NLS-1$
-            return TraitValueHelper.getValueAsListOfStrings(trait);
-//            return
-//                CMAnnotationHelper.
-//                    getCMAttributeProperties(uri, 
-//                                             element.getLocalName(), 
-//                                             attribute.getLocalName(),
-//                                             key);
+            if( trait != null )
+            {
+            	return TraitValueHelper.getValueAsListOfStrings(trait);
+            }
             
         }
         else if (curNode instanceof Element)
@@ -80,12 +77,10 @@
             
             final ITaglibDomainMetaDataModelContext mdContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, uri);
             Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(mdContext, element.getLocalName(), key);
-            return TraitValueHelper.getValueAsListOfStrings(trait);
-//            return
-//                CMAnnotationHelper.
-//                    getCMElementProperties(uri, 
-//                             element.getLocalName(), 
-//                             key);
+            if( trait != null )
+            {
+            	return TraitValueHelper.getValueAsListOfStrings(trait);
+            }
         }
         
         return Collections.EMPTY_LIST;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBoundedListTypeDescriptorImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBoundedListTypeDescriptorImpl.java
index 4dd73dc..7af15cb 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBoundedListTypeDescriptorImpl.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IBoundedListTypeDescriptorImpl.java
@@ -2,7 +2,7 @@
  * <copyright>
  * </copyright>
  *
- * $Id: IBoundedListTypeDescriptorImpl.java,v 1.4 2007/05/07 17:30:20 cbateman Exp $
+ * $Id: IBoundedListTypeDescriptorImpl.java,v 1.5 2007/09/24 23:23:34 cbateman Exp $
  */
 package org.eclipse.jst.jsf.context.symbol.internal.impl;
 
@@ -110,6 +110,10 @@
 
     /**
      * <!-- begin-user-doc -->
+     * @param methodName 
+     * @param methodArguments 
+     * @param symbolName 
+     * @return a symbol representing the return value of the method 
      * <!-- end-user-doc -->
      * @generated NOT
      */
@@ -139,7 +143,7 @@
                         SymbolFactory.eINSTANCE.createIPropertySymbol();
 
                     // TODO: there is a possible problem here for non-string keyed maps
-                    propSymbol.setName(symbolName.toString());
+                    propSymbol.setName(symbolName);
                     propSymbol.setReadable(true);
                     IJavaTypeDescriptor2 typeDesc = 
                         SymbolFactory.eINSTANCE.createIJavaTypeDescriptor2();
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IJavaTypeDescriptor2Impl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IJavaTypeDescriptor2Impl.java
index a12e921..52f3693 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IJavaTypeDescriptor2Impl.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/IJavaTypeDescriptor2Impl.java
@@ -402,7 +402,7 @@
             case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__BEAN_METHODS:
                 return getBeanMethods();
             case SymbolPackage.IJAVA_TYPE_DESCRIPTOR2__ARRAY_COUNT:
-                return new Integer(getArrayCount());
+                return Integer.valueOf(getArrayCount());
         }
         return super.eGet(featureID, resolve, coreType);
     }
@@ -566,15 +566,16 @@
         final JDTBeanIntrospector  introspector = 
             new JDTBeanIntrospector(getType());
         
-		final Map properties = introspector.getProperties();
+		final Map<String, JDTBeanProperty> properties = introspector.getProperties();
+		
 		final Collection calculatedProps = new ArrayList(properties.size());
         
-		for (final Iterator it = properties.keySet().iterator(); it.hasNext();)
+		for (final Iterator<Map.Entry<String, JDTBeanProperty>> it = properties.entrySet().iterator(); it.hasNext();)
 		{
-		    final String propertyName = (String) it.next();
-            final JDTBeanProperty property = 
-                (JDTBeanProperty) properties.get(propertyName);
-			
+		    Map.Entry<String, JDTBeanProperty> entry = it.next();
+		    final String propertyName = entry.getKey();
+            final JDTBeanProperty property = entry.getValue();
+
 			final IBeanPropertySymbol workingCopy =
 			    SymbolFactory.eINSTANCE.createIBeanPropertySymbol();
 			workingCopy.setName(propertyName);
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/SymbolFactoryImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/SymbolFactoryImpl.java
index 83453e7..75c59b8 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/SymbolFactoryImpl.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/SymbolFactoryImpl.java
@@ -379,6 +379,9 @@
 
     /**
      * <!-- begin-user-doc -->
+     * @param eDataType 
+     * @param initialValue 
+     * @return the value type for the data type 
      * <!-- end-user-doc -->
      * @generated
      */
@@ -388,6 +391,9 @@
 
     /**
      * <!-- begin-user-doc -->
+     * @param eDataType 
+     * @param instanceValue 
+     * @return the string for the value type 
      * <!-- end-user-doc -->
      * @generated
      */
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/SymbolPackageImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/SymbolPackageImpl.java
index f72c71c..707b176 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/SymbolPackageImpl.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/SymbolPackageImpl.java
@@ -1,7 +1,7 @@
 /**
  * Copyright 2006 Oracle
  *
- * $Id: SymbolPackageImpl.java,v 1.6 2007/05/15 22:00:27 cbateman Exp $
+ * $Id: SymbolPackageImpl.java,v 1.7 2007/09/24 23:25:39 cbateman Exp $
  */
 package org.eclipse.jst.jsf.context.symbol.internal.impl;
 
@@ -260,6 +260,7 @@
      * <p>Invocation of this method will not affect any packages that have
      * already been initialized.
      * <!-- begin-user-doc -->
+     * @return the symbols package 
      * <!-- end-user-doc -->
      * @see #eNS_URI
      * @see #createPackageContents()
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/Util.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/Util.java
index 8e136f1..0c2f288 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/Util.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/impl/Util.java
@@ -80,7 +80,7 @@
                         SymbolFactory.eINSTANCE.createIPropertySymbol();
 
                     // TODO: there is a possible problem here for non-string keyed maps
-                    propSymbol.setName(symbolName.toString());
+                    propSymbol.setName(symbolName);
                     propSymbol.setReadable(true);
                     
                     {
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/ITypeDescriptorItemProvider.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/ITypeDescriptorItemProvider.java
index 600cacd..247422a 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/ITypeDescriptorItemProvider.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/context/symbol/internal/provider/ITypeDescriptorItemProvider.java
@@ -229,6 +229,7 @@
 	/**
      * This adds a property descriptor for the Type Parameter Signatures feature.
      * <!-- begin-user-doc -->
+     * @param object 
      * <!-- end-user-doc -->
      * @generated
      */
@@ -251,6 +252,7 @@
     /**
      * This adds a property descriptor for the Jdt Context feature.
      * <!-- begin-user-doc -->
+     * @param object 
      * <!-- end-user-doc -->
      * @generated
      */
@@ -273,6 +275,7 @@
     /**
      * This adds a property descriptor for the Enum Type feature.
      * <!-- begin-user-doc -->
+     * @param object 
      * <!-- end-user-doc -->
      * @generated
      */
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.core/plugin.xml
index 3eff8fd..8fd3920 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/plugin.xml
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/plugin.xml
@@ -210,7 +210,10 @@
             id="attributevalues.LengthType"/>           
       <attributeValueRuntimeType
             class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.ColorType"
-            id="attributevalues.ColorType"/>          
+            id="attributevalues.ColorType"/>
+      <attributeValueRuntimeType
+            class="org.eclipse.jst.jsf.taglibprocessing.attributevalues.ResourceBundleType"
+            id="attributevalues.ResourceBundleType"/>         
    </extension>
    
    <extension
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigDialogSettingData.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigDialogSettingData.java
index 93086db..90a04c8 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigDialogSettingData.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryConfigDialogSettingData.java
@@ -38,12 +38,12 @@
 	
 	
 	/**
-	 * Constructor where implementation type was chosen to be CLIENT_SUPPLIED.  Created for backwards compatibilty when server supplied was not an option.
+	 * Constructor where implementation type was chosen to be USER_SPECIFIED.  Created for backwards compatibilty when server supplied was not an option.
 	 * @param implLibDeployFlag
 	 * @param compLibs
 	 */
 	public JSFLibraryConfigDialogSettingData(boolean implLibDeployFlag, String[] compLibs) {
-		this(IMPLEMENTATION_TYPE.CLIENT_SUPPLIED, implLibDeployFlag, compLibs);		
+		this(IMPLEMENTATION_TYPE.USER_SPECIFIED, implLibDeployFlag, compLibs);		
 	}
 	
 	/**
@@ -84,7 +84,7 @@
 	 */
 	public JSFLibraryInternalReference getJSFImplementationLibrary() {
 		if (selJSFLibImpl == null) {
-			// To instanciate a JSFLibraryReferenceUserDefined object from default impl lib as the saved library.  
+			// To instanciate a JSFLibraryReferenceUserSpecified object from default impl lib as the saved library.  
 			JSFLibraryInternalReference dftImplLib = jsfLibReg.getDefaultJSFImplementationLibrary(); 		
 			if (dftImplLib != null) {
 				selJSFLibImpl = new JSFLibraryInternalReference(dftImplLib.getLibrary(), 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryRegistryUtil.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryRegistryUtil.java
index 0e3c02a..aa4bce9 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryRegistryUtil.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryconfig/JSFLibraryRegistryUtil.java
@@ -328,11 +328,10 @@
 	 * 
 	 * @param oldId
 	 * @param newId
-	 * @param removeAndAddBecauseOfRename
 	 * @param monitor
 	 * @throws JavaModelException
 	 */
-	public static void rebindClasspathContainerEntries(String oldId, String newId, boolean removeAndAddBecauseOfRename, IProgressMonitor monitor) throws JavaModelException {
+	public static void rebindClasspathContainerEntries(String oldId, String newId, IProgressMonitor monitor) throws JavaModelException {
 		IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot();
 		IJavaProject[] projects= JavaCore.create(root).getJavaProjects();
 		IPath containerPath= new Path(JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID).append(newId);
@@ -340,7 +339,7 @@
 		
 		JSFLibrary lib = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getJSFLibraryByID(newId);
 		List affectedProjects= new ArrayList();
-		removeAndAddBecauseOfRename = (!oldId.equals(newId));
+		boolean removeAndAddBecauseOfRename = (!oldId.equals(newId));
 		// find all projects using the old container name...
 		for (int i= 0; i < projects.length; i++) {
 			IJavaProject project= projects[i];
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/adapter/MaintainDefaultImplementationAdapter.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/adapter/MaintainDefaultImplementationAdapter.java
index 6f6ff66..f1c76ad 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/adapter/MaintainDefaultImplementationAdapter.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/jsflibraryregistry/adapter/MaintainDefaultImplementationAdapter.java
@@ -112,7 +112,7 @@
 	 * 
 	 * @param library JSFLibrary instance
 	 */
-	protected void implementationFlagSet(JSFLibrary library) {
+	private void implementationFlagSet(JSFLibrary library) {
 		JSFLibraryRegistry jsfLibReg = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry();
 		if (jsfLibReg != null) {
 			JSFLibrary defaultImpl = jsfLibReg.getDefaultImplementation();
@@ -123,8 +123,8 @@
 				jsfLibReg.setDefaultImplementation(library);
 			} else if (
 					!library.isImplementation() &&
-					(defaultImpl != null && library.getID() == defaultImpl.getID())
-			) {
+					(defaultImpl != null && library.getID().equals(defaultImpl.getID())))
+			{
 				setNewDefaultImplementation();
 			}
 		}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/IJSFFacetInstallDataModelProperties.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/IJSFFacetInstallDataModelProperties.java
index ad03d47..8667868 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/IJSFFacetInstallDataModelProperties.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/IJSFFacetInstallDataModelProperties.java
@@ -89,7 +89,13 @@
     	 */
     	SERVER_SUPPLIED,
     	/**
-    	 * Client supplied
+    	 * Not supplied by the server.  The user is specifiying.
+    	 */
+    	USER_SPECIFIED,
+    	
+    	/**
+    	 * Not supplied by the server.  The user is specifiying.  Same as USER_SPECIFIED.
+    	 * @deprecated use USER_SPECIFIED
     	 */
     	CLIENT_SUPPLIED;
     	
@@ -102,8 +108,8 @@
     			return "UNKNOWN"; //$NON-NLS-1$
     		if (type ==  SERVER_SUPPLIED)
     			return "SERVER_SUPPLIED";//$NON-NLS-1$
-    		if (type == CLIENT_SUPPLIED)
-    			return "CLIENT_SUPPLIED";//$NON-NLS-1$
+    		if (type == USER_SPECIFIED || type ==CLIENT_SUPPLIED )
+    			return "USER_SPECIFIED";//$NON-NLS-1$
     		return "UNKNOWN"; //$NON-NLS-1$
     	}
     	
@@ -116,9 +122,10 @@
     			return UNKNOWN;
     		if (type.equals("SERVER_SUPPLIED"))//$NON-NLS-1$
     			return SERVER_SUPPLIED;
-    		if (type.equals("CLIENT_SUPPLIED"))//$NON-NLS-1$
-    			return CLIENT_SUPPLIED;
+    		if (type.equals("USER_SPECIFIED") || type.equals("CLIENT_SUPPLIED"))//$NON-NLS-1$// $NON-NLS-2$
+    			return USER_SPECIFIED;
     		return UNKNOWN; 
     	}
+    	
     }
 }
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDataModelProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDataModelProvider.java
index 1c7b7db..c778b02 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDataModelProvider.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDataModelProvider.java
@@ -112,7 +112,7 @@
 			}
 		}
 		else if (name.equals(IMPLEMENTATION)) {
-			if (getProperty(IMPLEMENTATION_TYPE_PROPERTY_NAME) == IMPLEMENTATION_TYPE.CLIENT_SUPPLIED) {
+			if (getProperty(IMPLEMENTATION_TYPE_PROPERTY_NAME) == IMPLEMENTATION_TYPE.USER_SPECIFIED) {
 				JSFLibraryInternalReference lib = (JSFLibraryInternalReference)getProperty(IMPLEMENTATION);
 				IStatus status = validateImpl(lib.getLibrary());
 				if (!OK_STATUS.equals(status))
@@ -227,7 +227,7 @@
 		IStatus status = null;
 		
 		JSFLibraryInternalReference ref = null;
-		if (getProperty(IMPLEMENTATION_TYPE_PROPERTY_NAME) == IMPLEMENTATION_TYPE.CLIENT_SUPPLIED) {
+		if (getProperty(IMPLEMENTATION_TYPE_PROPERTY_NAME) == IMPLEMENTATION_TYPE.USER_SPECIFIED) {
 			ref = ((JSFLibraryInternalReference)getProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION));
 			if (ref != null){
 				status = checkForDupeArchiveFiles(jars, ((JSFLibraryInternalReference)getProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION)).getLibrary());
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDelegate.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDelegate.java
index 99c481e..02a0b32 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDelegate.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetInstallDelegate.java
@@ -36,6 +36,7 @@
 import org.eclipse.jst.j2ee.model.ModelProviderManager;
 import org.eclipse.jst.javaee.web.Servlet;
 import org.eclipse.jst.javaee.web.WebApp;
+import org.eclipse.jst.jsf.core.IJSFCoreConstants;
 import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
 import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryInternalReference;
 import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
@@ -237,11 +238,12 @@
 						project.refreshLocal(IResource.DEPTH_INFINITE, monitor_inner);
 					}
 
-					private boolean shouldUseJ2EEConfig(final IProjectFacetVersion fv) {
-						if (fv.getVersionString().equals("1.1"))
+					private boolean shouldUseJ2EEConfig(final IProjectFacetVersion facetVersion) {
+						if (IJSFCoreConstants.FACET_VERSION_1_1.equals(facetVersion.getVersionString()))
+						{
 							return true;
-						else
-							return false;
+						}
+						return false;
 					}
 				};
 				op.run(monitor);
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetUninstallDelegate.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetUninstallDelegate.java
index b447e72..ae17f08 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetUninstallDelegate.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFFacetUninstallDelegate.java
@@ -57,8 +57,11 @@
 
 			try {
 				// Remove JSF Libraries
-				removeJSFLibaries(project, fv, monitor);
-
+				removeJSFLibraries(project, fv, monitor);
+				
+				//Remove Runtime contributed JSF classpath entries
+				removeRuntimeContributedJSFClasspathEntries(project, fv, monitor);
+				
 				// remove servlet stuff from web.xml
 				uninstallJSFReferencesFromWebApp(project, monitor);
 
@@ -78,7 +81,7 @@
 	 * @param project
 	 * @param monitor
 	 */
-	private void removeJSFLibaries(final IProject project, final IProjectFacetVersion fv, final IProgressMonitor monitor) {
+	private void removeJSFLibraries(final IProject project, final IProjectFacetVersion fv, final IProgressMonitor monitor) {
 		 final IJavaProject jproj = JavaCore.create(project);
 		 List keptEntries = new ArrayList();
 		 try {
@@ -86,9 +89,7 @@
 			  keptEntries = new ArrayList();
 			 for (int i=0;i<entries.length;i++){
 				 IClasspathEntry entry = entries[i];
-				 if (entry.getEntryKind() == IClasspathEntry.CPE_CONTAINER && 
-						 ! entry.getPath().segment(0)
-						 	.equals(JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID))
+				 if ( !(JSFLibraryConfigurationHelper.isJSFLibraryContainer(entry)))
 					 keptEntries.add(entry);
 			 }
 		} catch (JavaModelException e) {
@@ -103,6 +104,10 @@
 			}
 		 }	
 		
+
+	}
+	
+	private void removeRuntimeContributedJSFClasspathEntries(final IProject project, final IProjectFacetVersion fv, final IProgressMonitor monitor) {
 		try {
 			ClasspathHelper.removeClasspathEntries(project, fv);				
 		} catch (CoreException e) {
@@ -143,22 +148,22 @@
 		
 	}
 
-	class RemoveJSFFromJavaEEWebAppOperation implements Runnable {
-		private WebApp webApp;
-		private Servlet servlet;
+	static class RemoveJSFFromJavaEEWebAppOperation implements Runnable {
+		private WebApp _webApp;
+		private Servlet _servlet;
 		
 		RemoveJSFFromJavaEEWebAppOperation(final WebApp webApp, final Servlet servlet){
-			this.webApp = webApp;
-			this.servlet = servlet;
+			this._webApp = webApp;
+			this._servlet = servlet;
 		}
 		
 		public void run() {
 			// remove faces url mappings
-			JSFUtils12.removeURLMappings(webApp, servlet);
+			JSFUtils12.removeURLMappings(_webApp, _servlet);
 			// remove context params
-			removeJSFContextParams(webApp, servlet);
+			removeJSFContextParams(_webApp, _servlet);
 			// remove servlet
-			removeJSFServlet(webApp, servlet);
+			removeJSFServlet(_webApp, _servlet);
 			
 		}
 		private void removeJSFContextParams(final WebApp webApp, final Servlet servlet) {
@@ -178,22 +183,22 @@
 		
 	}
 	
-	class RemoveJSFFromJ2EEWebAppOperation implements Runnable {
-		private org.eclipse.jst.j2ee.webapplication.WebApp webApp;
-		private org.eclipse.jst.j2ee.webapplication.Servlet servlet;
+	static class RemoveJSFFromJ2EEWebAppOperation implements Runnable {
+		private org.eclipse.jst.j2ee.webapplication.WebApp _webApp;
+		private org.eclipse.jst.j2ee.webapplication.Servlet _servlet;
 		
 		RemoveJSFFromJ2EEWebAppOperation(final org.eclipse.jst.j2ee.webapplication.WebApp webApp, final org.eclipse.jst.j2ee.webapplication.Servlet servlet){
-			this.webApp = webApp;
-			this.servlet = servlet;
+			this._webApp = webApp;
+			this._servlet = servlet;
 		}
 		
 		public void run() {
 			// remove faces url mappings
-			JSFUtils11.removeURLMappings(webApp, servlet);
+			JSFUtils11.removeURLMappings(_webApp, _servlet);
 			// remove context params
-			removeJSFContextParams(webApp, servlet);
+			removeJSFContextParams(_webApp, _servlet);
 			// remove servlet
-			removeJSFServlet(webApp, servlet);
+			removeJSFServlet(_webApp, _servlet);
 			
 		}
 		private void removeJSFContextParams(final org.eclipse.jst.j2ee.webapplication.WebApp webApp, final org.eclipse.jst.j2ee.webapplication.Servlet servlet) {
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils11.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils11.java
index 4660bc6..70ec7af 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils11.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils11.java
@@ -180,13 +180,13 @@
 					.createServletType();
 			servletType.setClassName(className);
 			servlet.setWebType(servletType);
-			servlet.setLoadOnStartup(new Integer(1));
+			servlet.setLoadOnStartup(Integer.valueOf(1));
 			// Add the servlet to the web application model
 			webApp.getServlets().add(servlet);			
 		} else {
 			// update
 			servlet.setServletName(displayName);
-			servlet.setLoadOnStartup(new Integer(1));
+			servlet.setLoadOnStartup(Integer.valueOf(1));
 		}
 		return servlet;
 	}
@@ -301,7 +301,7 @@
 				if (cp.getParamValue().indexOf(config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH)) < 0) {
 					String curVal = cp.getParamValue();
 					String val = config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH);
-					if (curVal != null || !curVal.trim().equals("")) { //$NON-NLS-1$
+					if (curVal != null && !"".equals(curVal.trim())) { //$NON-NLS-1$
 						val = curVal + ",\n" + val; //$NON-NLS-1$
 					}
 					cp.setParamValue(val);
@@ -342,7 +342,7 @@
 				if (cp.getValue().indexOf(config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH)) < 0) {
 					String curVal = cp.getValue();
 					String val = config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH);
-					if (curVal != null || !curVal.trim().equals("")) { //$NON-NLS-1$
+					if (curVal != null && !"".equals(curVal.trim())) { //$NON-NLS-1$
 						val = curVal + ",\n" + val; //$NON-NLS-1$
 					}
 					cp.setValue(val);
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils12.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils12.java
index 192c141..6654f55 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils12.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/internal/project/facet/JSFUtils12.java
@@ -141,14 +141,14 @@
 			servlet = WebFactory.eINSTANCE.createServlet();
 			servlet.setServletName(displayName);
 			servlet.setServletClass(className);
-			servlet.setLoadOnStartup(new Integer(1));
+			servlet.setLoadOnStartup(Integer.valueOf(1));
 			// Add the servlet to the web application model
 			webApp.getServlets().add(servlet);
 
 		} else {
 			// update
 			servlet.setServletName(displayName);
-			servlet.setLoadOnStartup(new Integer(1));
+			servlet.setLoadOnStartup(Integer.valueOf(1));
 		}
 		return servlet;
 	}
@@ -266,7 +266,7 @@
 				if (cp.getParamValue().indexOf(config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH)) < 0) {
 					String curVal = cp.getParamValue();
 					String val = config.getStringProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH);
-					if (curVal != null || !curVal.trim().equals("")) { //$NON-NLS-1$
+					if (curVal != null && !"".equals(curVal.trim())) { //$NON-NLS-1$
 						val = curVal + ",\n" + val; //$NON-NLS-1$
 					}
 					cp.setParamValue(val);
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JARFileJSFAppConfigProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JARFileJSFAppConfigProvider.java
index b488336..30c96a0 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JARFileJSFAppConfigProvider.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsfappconfig/JARFileJSFAppConfigProvider.java
@@ -190,8 +190,8 @@
 				Resource resource = factory.createResource(URI.createFileURI(tempFile.getAbsolutePath()));
 				
 				try {
-					resource.load(Collections.EMPTY_MAP);
-					if (resource != null) {
+                    if (resource != null) {
+                        resource.load(Collections.EMPTY_MAP);
 						EList resourceContents = resource.getContents();
 						if (resourceContents != null && resourceContents.size() > 0) {
 							facesConfig = (FacesConfigType)resourceContents.get(0);
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReference.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReference.java
index ee9ed62..9c77f03 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReference.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReference.java
@@ -16,7 +16,8 @@
 
 /**
  * Represents a reference to a JSF Library on a project
- *
+ * 
+ * <p><b>Provisional API - subject to change</b></p>
  */
 public abstract interface JSFLibraryReference {
 	/**
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferencePluginProvided.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferencePluginProvided.java
index 7884124..aff18c0 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferencePluginProvided.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferencePluginProvided.java
@@ -11,10 +11,11 @@
 package org.eclipse.jst.jsf.core.jsflibraryconfiguration;
 
 /**
- * A reference to a plugin defined JSF Library
+ * A reference to a plugin-defined JSF Library
  *
+ * <p><b>Provisional API - subject to change</b></p>
  */
-public interface JSFLibraryReferencePluginProvided extends JSFLibraryReferenceUserDefined {
+public interface JSFLibraryReferencePluginProvided extends JSFLibraryReferenceUserSpecified, JSFLibraryReferenceUserDefined {
 	/**
 	 * @return plugin id.  May return null if plugin id cannot be determined.  
 	 */
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceServerSupplied.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceServerSupplied.java
index 50617b1..b03ece3 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceServerSupplied.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceServerSupplied.java
@@ -11,8 +11,10 @@
 package org.eclipse.jst.jsf.core.jsflibraryconfiguration;
 
 /**
- * @author gekessle
- *
+ * A reference to a JSF Library where the implementation library is presumed to be coming from the 
+ * server
+ * 
+ * <p><b>Provisional API - subject to change</b></p>
  */
 public interface JSFLibraryReferenceServerSupplied extends
 		JSFLibraryReference {
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceUserDefined.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceUserDefined.java
index 67d8808..f5e69d3 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceUserDefined.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceUserDefined.java
@@ -12,7 +12,8 @@
 
 
 /**
- * Represents an reference to a user defined JSF Library
+ * Represents an reference to a user specified JSF Library
+ * @deprecated use JSFLibraryReferenceUserSpecified 
  */
 public interface JSFLibraryReferenceUserDefined extends JSFLibraryReference {
 	//
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryValidationListener.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceUserSpecified.java
similarity index 67%
rename from jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryValidationListener.java
rename to jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceUserSpecified.java
index dbd6b01..c0ba3a8 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryValidationListener.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFLibraryReferenceUserSpecified.java
@@ -8,16 +8,14 @@
  * Contributors:
  *     Oracle Corporation - initial API and implementation
  *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.classpath;
+package org.eclipse.jst.jsf.core.jsflibraryconfiguration;
+
 
 /**
- * Listeners of  {@link JSFLibraryValidationEvent}s should implement
- *
+ * Represents an reference to a user specified JSF Library
+ * 
+ * <p><b>Provisional API - subject to change</b></p>
  */
-public interface JSFLibraryValidationListener {
-	/**
-	 * Callback 
-	 * @param e
-	 */
-	public void notifyValidation(JSFLibraryValidationEvent e);
+public interface JSFLibraryReferenceUserSpecified extends JSFLibraryReference {
+	//
 }
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFVersion.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFVersion.java
index a0f36cf..b4e14d4 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFVersion.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/JSFVersion.java
@@ -11,8 +11,9 @@
 package org.eclipse.jst.jsf.core.jsflibraryconfiguration;
 
 /**
- * @author gekessle
+ * Enumeration of JavaServer Faces Versions
  *
+ * <p><b>Provisional API - subject to change</b></p>
  */
 public enum JSFVersion {
 	
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceFacadeFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceFacadeFactory.java
index 8f371e5..7b827b0 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceFacadeFactory.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceFacadeFactory.java
@@ -24,14 +24,14 @@
  */
 public class JSFLibraryReferenceFacadeFactory {
 	/**
-	 * Returns a JSFLibraryReferenceUserDefined or JSFLibraryReferencePluginProvided instance.
+	 * Returns a JSFLibraryReferenceUserSpecified (or JSFLibraryReferenceUserDefined})  or JSFLibraryReferencePluginProvided instance.
 	 * Will not create a JSFLibraryReferenceServerSupplied as there is no cp entry.   Use createServerSuppliedJSFLibRef instead.
-	 * @param cpEntry
-	 * @return an instance of JSFLibraryInternalReference.  Null will be returned if the cpEntry is not a 
+	 * @param classpathEntry
+	 * @return an instance of JSFLibraryInternalReference.  Null will be returned if the cpEntry is not a JSF Library reference.
 	 */
-	public static JSFLibraryReference create(final IClasspathEntry cpEntry) {
-		if (JSFLibraryConfigurationHelper.isJSFLibraryContainer(cpEntry)){
-			return createReference(cpEntry);
+	public static JSFLibraryReference create(final IClasspathEntry classpathEntry) {
+		if (JSFLibraryConfigurationHelper.isJSFLibraryContainer(classpathEntry)){
+			return createReference(classpathEntry);
 		}
 		return null;
 	}
@@ -45,26 +45,26 @@
 
 
 	/**
-	 * @param cpEntry
+	 * @param classpathEntry
 	 * @return {@link JSFLibraryReference}
 	 */
 	private static JSFLibraryReference createReference(
-			final IClasspathEntry cpEntry) {
+			final IClasspathEntry classpathEntry) {
 		
-		String libID = cpEntry.getPath().segment(1).toString();
+		String libID = classpathEntry.getPath().segment(1);
 		org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryInternalReference libRef = JSFLibraryRegistryUtil.getInstance().getJSFLibraryReferencebyID(libID);
 		if (libRef!= null){
-			boolean isDeployed = getJ2EEModuleDependency(cpEntry);
+			boolean isDeployed = getJ2EEModuleDependency(classpathEntry);
 			if (libRef.getLibrary() != null && libRef.getLibrary() instanceof PluginProvidedJSFLibrary)
 				return new JSFLibraryReferencePluginProvidedImpl(libRef, isDeployed);
 			
-			return new JSFLibraryReferenceUserDefinedImpl(libRef, isDeployed);
+			return new JSFLibraryReferenceUserSpecifiedImpl(libRef, isDeployed);
 		}
 		return null;
 	}
 
-	private static boolean getJ2EEModuleDependency(IClasspathEntry cpEntry) {
-		IClasspathAttribute[] attrs = cpEntry.getExtraAttributes();
+	private static boolean getJ2EEModuleDependency(IClasspathEntry classpathEntry) {
+		IClasspathAttribute[] attrs = classpathEntry.getExtraAttributes();
 		for (int i=0;i<attrs.length;i++){
 			IClasspathAttribute attr = attrs[i];
 			if (attr.getName().equals(IClasspathDependencyConstants.CLASSPATH_COMPONENT_DEPENDENCY)){
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceUserDefinedImpl.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceUserSpecifiedImpl.java
similarity index 74%
rename from jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceUserDefinedImpl.java
rename to jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceUserSpecifiedImpl.java
index 98508e0..39b9be9 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceUserDefinedImpl.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/internal/JSFLibraryReferenceUserSpecifiedImpl.java
@@ -12,17 +12,18 @@
 
 import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryInternalReference;
 import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryReferenceUserDefined;
+import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryReferenceUserSpecified;
 
 /**
- * Implementation of a reference to a user defined JSF Library  
+ * Implementation of a reference to a user specified JSF Library  
  *
  */
-public class JSFLibraryReferenceUserDefinedImpl extends AbstractJSFLibraryReferenceImpl implements JSFLibraryReferenceUserDefined{
+public class JSFLibraryReferenceUserSpecifiedImpl extends AbstractJSFLibraryReferenceImpl implements JSFLibraryReferenceUserSpecified, JSFLibraryReferenceUserDefined{
 	/**
 	 * @param libRef of type {@link JSFLibraryInternalReference}
 	 * @param isDeployed
 	 */
-	public JSFLibraryReferenceUserDefinedImpl(
+	public JSFLibraryReferenceUserSpecifiedImpl(
 			JSFLibraryInternalReference libRef, boolean isDeployed) {
 
 		super(libRef, isDeployed);
@@ -32,7 +33,7 @@
 	 * @see org.eclipse.jst.jsf.core.jsflibraryconfiguration.internal.AbstractJSFLibraryReferenceImpl#toString()
 	 */
 	public String toString() {
-		StringBuffer buf = new StringBuffer("UserDefined: (");
+		StringBuffer buf = new StringBuffer("UserSpecified: (");
 		buf.append(super.toString());
 		buf.append(")");
 		
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/package-info.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/package-info.java
new file mode 100644
index 0000000..78bd2ce
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/core/jsflibraryconfiguration/package-info.java
@@ -0,0 +1,17 @@
+/*******************************************************************************
+ * Copyright (c) 2007 Oracle Corporation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the 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:
+ *    Oracle - initial API and implementation
+ *    
+ ********************************************************************************/
+
+/**
+ * This package is used to provide adopters with a mechanism to deal with JSF Library references.
+ * <p><b>Provisional API - subject to change</b></p>
+ */
+package org.eclipse.jst.jsf.core.jsflibraryconfiguration;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/DesignTimeApplicationManager.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/DesignTimeApplicationManager.java
index 79abedc..e2f8698 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/DesignTimeApplicationManager.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/DesignTimeApplicationManager.java
@@ -80,7 +80,7 @@
         
     private static final String   DEFAULT_METHOD_RESOLVER_ID =
         "org.eclipse.jst.jsf.core.methodresolver.default"; //$NON-NLS-1$
-    
+
     /**
      * @param project
      * @return the app manager associated with project
@@ -96,16 +96,30 @@
         {
             synchronized(project)
             {
-                Object manager = 
-                    project.getSessionProperty(SESSION_PROPERTY_KEY_PROJECT);
-    
+                DesignTimeApplicationManager manager = 
+                    (DesignTimeApplicationManager) project.getSessionProperty(SESSION_PROPERTY_KEY_PROJECT);
+
+                
                 if (manager == null)
                 {
                     manager = new DesignTimeApplicationManager(project);
                     project.setSessionProperty(SESSION_PROPERTY_KEY_PROJECT, manager);
                 }
-                
-                return (DesignTimeApplicationManager) manager;
+                // bug 147729: if project was renamed, the project param will be
+                // valid, but it will not be in sync with the one for _project
+                // unfortunately, since we are using session propertie
+                else
+                {
+                    synchronized(manager)
+                    {
+                        if (!project.equals(manager._project))
+                        {
+                            manager._project = project;
+                        }
+                    }
+                }
+
+                return manager;
             }
         }
         catch (CoreException ce)
@@ -117,7 +131,9 @@
     }
     
     // instance definition
-    private final IProject                              _project;
+    // _project must be writable in case the manager needs to be retargetted
+    // after a rename/move etc.
+    private IProject                                    _project;
     private final IExternalContextFactoryLocator        _locator;
     
     private DesignTimeApplicationManager(IProject project)
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPDefaultSymbolFactory.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPDefaultSymbolFactory.java
index 876ccfa..f53de12 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPDefaultSymbolFactory.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPDefaultSymbolFactory.java
@@ -22,11 +22,13 @@
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jst.jsf.common.internal.types.TypeConstants;
 import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
 import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
 import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver;
 import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
 import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
+import org.eclipse.jst.jsf.context.symbol.IBoundedJavaTypeDescriptor;
 import org.eclipse.jst.jsf.context.symbol.IComponentSymbol;
 import org.eclipse.jst.jsf.context.symbol.IMapTypeDescriptor;
 import org.eclipse.jst.jsf.context.symbol.ISymbol;
@@ -198,6 +200,15 @@
                 {
                     problems.add(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0,Messages.getString("JSPDefaultSymbolFactory.Problem.ErrorCreatingVariable"), ce)); //$NON-NLS-1$
                 }
+                
+                final IBoundedJavaTypeDescriptor typeDesc = SymbolFactory.eINSTANCE.createIBoundedJavaTypeDescriptor();
+                typeDesc.setTypeSignatureDelegate( TypeConstants.TYPE_JAVAOBJECT );
+                final IComponentSymbol symbol = SymbolFactory.eINSTANCE.createIComponentSymbol();
+                symbol.setName(symbolName);
+                symbol.setTypeDescriptor(typeDesc);
+                symbol.setDetailedDescription(Messages.getString("JSPDefaultSymbolFactory.Resource.bundle.map.detailedDescription")+baseNameNode.getNodeValue()+"</i>"); //$NON-NLS-1$ //$NON-NLS-2$
+                
+                return symbol;
             }
         }
         return null;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPModelProcessor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPModelProcessor.java
index 490fc06..2dfdb9d 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPModelProcessor.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/JSPModelProcessor.java
@@ -18,7 +18,6 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.locks.ReentrantLock;
 
 import org.eclipse.core.resources.IFile;
@@ -28,6 +27,11 @@
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.core.runtime.Status;
 import org.eclipse.jst.jsf.common.JSFCommonPlugin;
+import org.eclipse.jst.jsf.common.internal.resource.IResourceLifecycleListener;
+import org.eclipse.jst.jsf.common.internal.resource.LifecycleListener;
+import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent;
+import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.EventType;
+import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.ReasonType;
 import org.eclipse.jst.jsf.common.metadata.Trait;
 import org.eclipse.jst.jsf.common.metadata.internal.TraitValueHelper;
 import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelContext;
@@ -46,8 +50,6 @@
 import org.eclipse.jst.jsf.designtime.context.DTFacesContext;
 import org.eclipse.jst.jsp.core.internal.domdocument.DOMModelForJSP;
 import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.model.ModelLifecycleEvent;
-import org.eclipse.wst.sse.core.internal.provisional.IModelLifecycleListener;
 import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
 import org.eclipse.wst.sse.core.internal.provisional.IStructuredModel;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
@@ -66,97 +68,100 @@
 public class JSPModelProcessor
 {
     private final static Map<IFile, JSPModelProcessor>  RESOURCE_MAP = 
-    	new HashMap<IFile, JSPModelProcessor>();
+        new HashMap<IFile, JSPModelProcessor>();
     private final static java.util.concurrent.locks.Lock CRITICAL_SECTION =
-    	new  ReentrantLock();
-    
+        new  ReentrantLock();
+    private static LifecycleListener  LIFECYCLE_LISTENER;
+
     /**
      * @param file The file to get the model processor for  
      * @return the processor for a particular model, creating it if it does not
      *         already exist
      * @throws CoreException if an attempt to get the model associated with file
      *         fails due to reasons other than I/O problems
-     * @throws IOException if an attempt to get the model associated with file
-     *         fails due to I/O problems
      */
-    public static JSPModelProcessor get(IFile file) throws CoreException, IOException
+    public static JSPModelProcessor get(IFile file) throws CoreException
     {
-		CRITICAL_SECTION.lock();
-		try
-    	{
-			if (!file.isAccessible())
-			{
-				throw new CoreException(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, "File must be accessible"));
-			}
-			
-	        JSPModelProcessor processor = RESOURCE_MAP.get(file);
-	
-	        if (processor == null)
-	        {
-	            processor = new JSPModelProcessor(file);
-	            RESOURCE_MAP.put(file, processor);
-	            processor._refCount.set(1);
-	        }
-	        else
-	        {
-	        	// TODO: should lock refCount separately since this 
-	        	// static method does not have exclusive access
-	        	processor._refCount.incrementAndGet();
-	        }
-	        return processor;
-    	}
-    	finally
-    	{
-    		CRITICAL_SECTION.unlock();
-    	}
+        CRITICAL_SECTION.lock();
+        try
+        {
+            if (!file.isAccessible())
+            {
+                throw new CoreException(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, "File must be accessible"));
+            }
+
+            JSPModelProcessor processor = RESOURCE_MAP.get(file);
+
+            if (processor == null)
+            {
+                if (LIFECYCLE_LISTENER == null)
+                {
+                    LIFECYCLE_LISTENER = new LifecycleListener(file);
+                }
+                else
+                {
+                    LIFECYCLE_LISTENER.addResource(file);
+                }
+
+                processor = new JSPModelProcessor(file,LIFECYCLE_LISTENER);
+                RESOURCE_MAP.put(file, processor);
+            }
+
+            return processor;
+        }
+        finally
+        {
+            CRITICAL_SECTION.unlock();
+        }
     }
 
     /**
      * Disposes of the JSPModelProcessor associated with model
      * @param file the model processor to be disposed
      */
-    public static void dispose(IFile file)
+    private static void dispose(IFile file)
     {
-    	CRITICAL_SECTION.lock();
+        CRITICAL_SECTION.lock();
         try
         {
-        	JSPModelProcessor processor = RESOURCE_MAP.get(file);
-        	
-        	if (processor != null)
-        	{
-	            int refCount = processor._refCount.decrementAndGet();
-	
-	            // if either the ref count drops below zero 
-	            // or the file is no longer accessible, the dispose
-	            if (refCount < 1 
-	            		|| !file.isAccessible())
-	            {
-	                RESOURCE_MAP.remove(file);
-	                
-	                if (!processor.isDisposed())
-	                {
-	                	processor.dispose();
-	                }
-	            }
-        	}
+            JSPModelProcessor processor = RESOURCE_MAP.get(file);
+
+            if (processor != null)
+            {
+                RESOURCE_MAP.remove(file);
+                
+                if (!processor.isDisposed())
+                {
+                    processor.dispose();
+                    LIFECYCLE_LISTENER.removeResource(file);
+                }
+                
+            }
+
+            if (RESOURCE_MAP.size() == 0)
+            {
+                // if we no longer have any resources being tracked,
+                // then dispose the lifecycle listener
+                LIFECYCLE_LISTENER.dispose();
+                LIFECYCLE_LISTENER = null;
+            }
         }
         finally
         {
-        	CRITICAL_SECTION.unlock();
+            CRITICAL_SECTION.unlock();
         }
     }
 
     private final IFile             _file;
-    private final DOMModelForJSP    _model;
-    private final ModelListener     _modelListener;
-    private boolean                 isDisposed;
+    private LifecycleListener       _lifecycleListener;
+    private IResourceLifecycleListener  _resListener;
+    private boolean                 _isDisposed;
     private Map<Object, ISymbol>    _requestMap;
     private Map<Object, ISymbol>    _sessionMap;
     private Map<Object, ISymbol>    _applicationMap;
     private Map<Object, ISymbol>    _noneMap;
     private long                    _lastModificationStamp;
-    private AtomicInteger			_refCount = new AtomicInteger(0);
-    
+
     // used to avoid infinite recursion in refresh.  Must never be null
     private final CountingMutex     _lastModificationStampMonitor = new CountingMutex();
 
@@ -165,18 +170,51 @@
      * 
      * @param model
      */
-    private JSPModelProcessor(final IFile  file) throws CoreException, IOException
+    private JSPModelProcessor(final IFile  file, final LifecycleListener lifecycleListener)
     {
-        _model = getModelForFile(file);
-        _modelListener = new ModelListener();
-        _model.addModelLifecycleListener(_modelListener);
+        //_model = getModelForFile(file);
+        //_modelListener = new ModelListener();
+        //_model.addModelLifecycleListener(_modelListener);
         _file = file;
-        // a negative value guarantees that refresh(false) will 
+        _lifecycleListener = lifecycleListener;
+        _resListener = new IResourceLifecycleListener()
+        {
+            public EventResult acceptEvent(ResourceLifecycleEvent event)
+            {
+                final EventResult result = EventResult.getDefaultEventResult();
+
+                // not interested
+                if (!_file.equals(event.getAffectedResource()))
+                {
+                    return result; 
+                }
+
+                if (event.getEventType() == EventType.RESOURCE_INACCESSIBLE)
+                {
+                    dispose(_file);
+                }
+                else if (event.getEventType() == EventType.RESOURCE_CHANGED)
+                {
+                    // if the file has changed contents on disk, then
+                    // invoke an unforced refresh of the JSP file
+                    if (event.getReasonType() == ReasonType.RESOURCE_CHANGED_CONTENTS)
+                    {
+                        refresh(false);
+                    }
+                }
+
+                return result;
+            }
+        };
+
+        lifecycleListener.addListener(_resListener);
+        
+        // a negative value guarantees that refresh(false) will
         // force a refresh on the first run
         _lastModificationStamp = -1;
     }
 
-    private DOMModelForJSP getModelForFile(final IFile file) 
+    private DOMModelForJSP getModelForFile(final IFile file)
             throws CoreException, IOException
     {
         final IModelManager modelManager = 
@@ -195,16 +233,22 @@
             model.releaseFromRead();
         }
         
-        throw new CoreException(new Status(IStatus.ERROR, "org.eclipse.blah", 0,  //$NON-NLS-1$
-                        "model not of expected type", new Throwable())); //$NON-NLS-1$
+        throw new CoreException
+            (new Status(IStatus.ERROR
+                        , "org.eclipse.blah"
+                        , 0  //$NON-NLS-1$
+                        ,"model not of expected type"
+                        , new Throwable())); //$NON-NLS-1$
     }
 
     private void dispose()
     {
-        if (!isDisposed)
+        if (!_isDisposed)
         {
-        	_model.releaseFromRead();
-            _model.removeModelLifecycleListener(_modelListener);
+            // ensure the resource listener is disposed
+            _lifecycleListener.removeListener(_resListener);
+            _resListener = null;
+            _lifecycleListener = null;
 
             if (_requestMap != null)
             {
@@ -230,9 +274,8 @@
                 _noneMap = null;
             }
 
-            _refCount.set(0);
             // mark as disposed
-            isDisposed = true;
+            _isDisposed = true;
         }
     }
 
@@ -240,19 +283,21 @@
      * @return true if this model processor has been disposed.  Disposed
      * processors should not be used.
      */
-    boolean isDisposed()
+    public boolean isDisposed()
     {
-        return isDisposed;
+        return _isDisposed;
     }
 
     /**
-     * Mainly for test and diagnostic purposes.
-     * 
-     * @return the current number of undisposed references to this model processor
+     * If isModelDirty() returns true, then it means that a call
+     * to refresh(false) will trigger a reprocess of the underlying document.
+     *
+     * @return true if the underlying JSP model is considered to be dirty
      */
-    public int getRefCount()
+    public boolean isModelDirty()
     {
-    	return _refCount.get();
+        final long currentModificationStamp = _file.getModificationStamp();
+        return _lastModificationStamp != currentModificationStamp;
     }
     
     /**
@@ -260,9 +305,15 @@
      * @param forceRefresh -- if true, always refreshes, if false,
      * then it only refreshes if the file's modification has changed
      * since the last refresh
+     * @throws IllegalStateException if isDisposed() == true
      */
     public void refresh(final boolean forceRefresh)
     {
+        if (isDisposed())
+        {
+            throw new IllegalStateException("Processor is disposed for file: "+_file.toString());
+        }
+
         synchronized(_lastModificationStampMonitor)
         {
             if (_lastModificationStampMonitor.isSignalled())
@@ -273,49 +324,58 @@
                 return;
             }
 
+            DOMModelForJSP  model = null;
             try
             {
                 _lastModificationStampMonitor.setSignalled(true);
                 
-                long currentModificationStamp;
-                
-                currentModificationStamp = _file.getModificationStamp();
-    
+
                 // only refresh if forced or if the underlying file has changed
                 // since the last run
                 if (forceRefresh
-                        || _lastModificationStamp != currentModificationStamp)
+                        || isModelDirty())
                 {
-                    refreshInternal();
+                    model = getModelForFile(_file);
+                    refreshInternal(model);
                     _lastModificationStamp = _file.getModificationStamp();
                 }
             }
+            catch (CoreException e) {
+               JSFCorePlugin.log(new RuntimeException(e), "Error refreshing internal model");
+            } catch (IOException e) {
+                JSFCorePlugin.log(new RuntimeException(e), "Error refreshing internal model");
+            }
             // make sure that we unsignal the monitor before releasing the
             // mutex
             finally
             {
+                if (model != null)
+                {
+                    model.releaseFromRead();
+                }
                 _lastModificationStampMonitor.setSignalled(false);
             }
         }
     }
     
-    private void refreshInternal()
+    private void refreshInternal(DOMModelForJSP model)
     {
         final IStructuredDocumentContext context = 
-            IStructuredDocumentContextFactory.INSTANCE.getContext(_model.getStructuredDocument(), -1);
+            IStructuredDocumentContextFactory.INSTANCE.getContext(model.getStructuredDocument(), -1);
         final ITaglibContextResolver taglibResolver =
             IStructuredDocumentContextResolverFactory.INSTANCE.getTaglibContextResolver(context);
-        IDOMDocument document = _model.getDocument();
+        IDOMDocument document = model.getDocument();
         getApplicationMap().clear();
         getRequestMap().clear();
         getSessionMap().clear();
         //long curTime = System.currentTimeMillis();
-        recurseChildNodes(document.getChildNodes(), taglibResolver);
+        recurseChildNodes(model, document.getChildNodes(), taglibResolver);
         //long netTime = System.currentTimeMillis() - curTime;
         //System.out.println("Net time to recurse document: "+netTime);
     }
-   
-    private void recurseChildNodes(final NodeList nodes, 
+
+    private void recurseChildNodes(final DOMModelForJSP model,
+                                   final NodeList nodes, 
                                     final ITaglibContextResolver taglibResolver)
     {
         for (int i = 0; i < nodes.getLength(); i++)
@@ -323,12 +383,12 @@
             final Node child = nodes.item(i);
             
             // process attributes at this node before recursing
-            processAttributes(child, taglibResolver);
-            recurseChildNodes(child.getChildNodes(), taglibResolver);
+            processAttributes(model, child, taglibResolver);
+            recurseChildNodes(model, child.getChildNodes(), taglibResolver);
         }
     }
-    
-    private void processAttributes(final Node node, 
+
+    private void processAttributes(final DOMModelForJSP model, final Node node, 
                                     final ITaglibContextResolver taglibResolver)
     {
         if (taglibResolver.hasTag(node))
@@ -341,13 +401,13 @@
             {
                 final Node attribute = node.getAttributes().item(i);
 
-                processSymbolContrib(uri, elementName, attribute);
+                processSymbolContrib(model, uri, elementName, attribute);
                 processSetsLocale(uri, elementName, attribute);
             }
         }
     }
 
-    private void processSymbolContrib(final String uri, final String elementName, Node attribute)
+    private void processSymbolContrib(final DOMModelForJSP model, final String uri, final String elementName, Node attribute)
     {
         final SymbolContribAggregator  aggregator =
             SymbolContribAggregator.
@@ -367,7 +427,7 @@
                     factory.create(symbolName, 
                                   ISymbolConstants.SYMBOL_SCOPE_REQUEST, //TODO:
                                   IStructuredDocumentContextFactory.INSTANCE.
-                                      getContext(_model.getStructuredDocument(), 
+                                      getContext(model.getStructuredDocument(), 
                                                  attribute),
                                   problems);
 
@@ -398,7 +458,7 @@
         {
             DesignTimeApplicationManager  dtAppMgr =
                 DesignTimeApplicationManager.getInstance(_file.getProject());
-            
+
             DTFacesContext facesContext = dtAppMgr.getFacesContext(_file);
             
             if (facesContext != null)
@@ -421,14 +481,14 @@
         {
             return Collections.unmodifiableMap(map);
         }
-        
+
         return Collections.EMPTY_MAP;
     }
-    
+
     private void updateMap(ISymbol symbol, String  scopeName)
     {
         final Map<Object, ISymbol> map = getMapForScopeInternal(scopeName);
-        
+
         if (map != null)
         {
             map.put(symbol.getName(), symbol);
@@ -504,32 +564,6 @@
     }
 
     /**
-     * Listens to the JSP model and reacts to changes
-     * @author cbateman
-     *
-     */
-    private class ModelListener implements IModelLifecycleListener
-    {
-        public void processPostModelEvent(ModelLifecycleEvent event)
-        {
-            // TODO: figure this event structure out seems like it is possibly
-            // broken...
-            if (((event.getType() & ModelLifecycleEvent.MODEL_DIRTY_STATE) != 0
-                    && !_model.isDirty()) // if the dirty state changed as now not dirty, then we have a save
-                )//|| (event.getType() & ModelLifecycleEvent.MODEL_REINITIALIZED) != 0)
-            {
-                // refresh if modified on disk
-                refresh(false);
-            }
-        }
-
-        public void processPreModelEvent(ModelLifecycleEvent arg0) {
-            // do nothing
-        }
-    }
-    
-    
-    /**
      * Aggregates the sets-locale meta-data
      * 
      * @author cbateman
@@ -541,8 +575,8 @@
         static LocaleSetAggregator create(IProject project, 
                                               final String uri, 
                                               final String elementName, final String attributeName)
-        {            
-        	final ITaglibDomainMetaDataModelContext mdContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, uri);
+        {
+            final ITaglibDomainMetaDataModelContext mdContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, uri);
             Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(mdContext, elementName+"/"+attributeName, SETS_LOCALE); //$NON-NLS-1$
 
             if (TraitValueHelper.getValueAsBoolean(trait))
@@ -573,12 +607,12 @@
          * @return a new instance only if attributeName is a symbol contributor
          */
         static SymbolContribAggregator create(final IProject project, 
-        									  final String uri, 
+                                              final String uri, 
                                               final String elementName, 
                                               final String attributeName)
         {
-        	final String entityKey = elementName+"/"+attributeName; //$NON-NLS-1$
-        	final ITaglibDomainMetaDataModelContext mdContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, uri);
+            final String entityKey = elementName+"/"+attributeName; //$NON-NLS-1$
+            final ITaglibDomainMetaDataModelContext mdContext = TaglibDomainMetaDataQueryHelper.createMetaDataModelContext(project, uri);
             Trait trait = TaglibDomainMetaDataQueryHelper.getTrait(mdContext, entityKey, CONTRIBUTES_VALUE_BINDING);
 
             boolean contribsValueBindings = TraitValueHelper.getValueAsBoolean(trait);
@@ -593,8 +627,8 @@
 
                 if (scope != null && !scope.equals("")) //$NON-NLS-1$
                 {
-                	trait = TaglibDomainMetaDataQueryHelper.getTrait(mdContext, entityKey, VALUE_BINDING_SYMBOL_FACTORY);
-                	symbolFactory = TraitValueHelper.getValueAsString(trait);                      
+                    trait = TaglibDomainMetaDataQueryHelper.getTrait(mdContext, entityKey, VALUE_BINDING_SYMBOL_FACTORY);
+                    symbolFactory = TraitValueHelper.getValueAsString(trait);                      
                 }
 
                 return new SymbolContribAggregator(scope, symbolFactory);
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/StartupHandler.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/StartupHandler.java
index 05c442e..b3b4377 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/StartupHandler.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/jsp/StartupHandler.java
@@ -39,8 +39,8 @@
 public class StartupHandler implements IStartup 
 {
     private final JSPEditorListener    _partListener = new JSPEditorListener();
-    
-	public void earlyStartup() 
+
+    public void earlyStartup() 
     {
         PlatformUI.getWorkbench().getDisplay().asyncExec(new Runnable()
         {
@@ -67,73 +67,69 @@
                     }
                     windows[i].getPartService().addPartListener(_partListener);
                 }
-                
+
                 // TODO: register with all windows?
                 PlatformUI.getWorkbench().addWindowListener(new IWindowListener()
                 {
-        
                     public void windowActivated(IWorkbenchWindow window) {
                         // do nothing
                     }
-        
+
                     public void windowDeactivated(IWorkbenchWindow window) {
                         // do nothing
                     }
-        
+
                     public void windowClosed(IWorkbenchWindow window) {
                         window.getPartService().removePartListener(_partListener);
                     }
-        
+
                     public void windowOpened(IWorkbenchWindow window) {
                         window.getPartService().addPartListener(_partListener);
                     }
-                });    
+                });
             }
         });
-	}
+    }
 
-	private static class JSPEditorListener implements IPartListener2
-	{
-		private JSPModelProcessor 		_processor;
-		
-		public void partActivated(IWorkbenchPartReference partRef) {
-			// do nothing
-		}
+    private static class JSPEditorListener implements IPartListener2
+    {
+        private JSPModelProcessor         _processor;
 
-		public void partBroughtToTop(IWorkbenchPartReference partRef) {
-			// do nothing
-		}
+        public void partActivated(IWorkbenchPartReference partRef) {
+            // do nothing
+        }
+
+        public void partBroughtToTop(IWorkbenchPartReference partRef) {
+            // do nothing
+        }
 
         public void partClosed(IWorkbenchPartReference partRef) {
-            if (partRef instanceof IEditorReference)
-            {
-                releaseJSPModelListener((IEditorReference) partRef);
-            }
-		}
+            // do nothing
+        }
 
-		public void partDeactivated(IWorkbenchPartReference partRef) {
-			// do nothing
-		}
+        public void partDeactivated(IWorkbenchPartReference partRef) {
+            // do nothing
+        }
 
-		public void partOpened(IWorkbenchPartReference partRef) {
+        public void partOpened(IWorkbenchPartReference partRef) {
             if (isValidJSPEditor(partRef))
             {
                 setJSPModelListener((IEditorReference)partRef);
             }
-		}
+        }
 
-		public void partHidden(IWorkbenchPartReference partRef) {
-			// do nothing
-		}
+        public void partHidden(IWorkbenchPartReference partRef) {
+            // do nothing
+        }
 
-		public void partVisible(IWorkbenchPartReference partRef) {
-			// do nothing
-		}
+        public void partVisible(IWorkbenchPartReference partRef) {
+            // do nothing
+        }
 
-		public void partInputChanged(IWorkbenchPartReference partRef) {
-			// do nothing
-		}
-       
+        public void partInputChanged(IWorkbenchPartReference partRef) {
+            // do nothing
+        }
+
         private boolean isJSPEditor(IEditorReference editorRef)
         {
             IFile file = getIFile(editorRef);
@@ -145,7 +141,7 @@
 
             return false;
         }
-        
+
         /**
          * @param editorRef
          * @return true if the editor is editing the JSP content type and
@@ -159,18 +155,17 @@
                     JSFAppConfigUtils.isValidJSFProject(file.getProject()) &&
                         isJSPEditor(editorRef);
         }
-        
-        
+
         boolean isValidJSPEditor(IWorkbenchPartReference partRef)
         {
             if (partRef instanceof IEditorReference)
             {
                 return isValidJSPEditor((IEditorReference)partRef);
             }
-            
+
             return false;
         }
-        
+
         void setJSPModelListener(IEditorReference editorRef)
         {
             IFile file = getIFile(editorRef);
@@ -189,17 +184,7 @@
                 }
             }
         }
-        
-        void releaseJSPModelListener(IEditorReference editorRef)
-        {
-        	IFile file = getIFile(editorRef);
-        	
-            if (file != null)
-            {
-                JSPModelProcessor.dispose(file);
-            }
-        }
-        
+
         IFile getIFile(IEditorReference editorRef)
         {
             try
@@ -216,8 +201,8 @@
             {
                 JSFCorePlugin.getDefault().getLog().log(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0, "Error acquiring editor input",excp)); //$NON-NLS-1$
             }
-            
+
             return null;
         }
-	}
+    }
 }
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/JSPTagVariableSymbolSourceProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/JSPTagVariableSymbolSourceProvider.java
index 994dc7d..ca109f7 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/JSPTagVariableSymbolSourceProvider.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/JSPTagVariableSymbolSourceProvider.java
@@ -86,13 +86,6 @@
                 JSFCorePlugin.getDefault().getLog().log(new Status(IStatus.ERROR, JSFCorePlugin.PLUGIN_ID, 0, "Error acquiring model processor",e)); //$NON-NLS-1$
                 // fall-through to empty symbol array
             }
-            finally
-            {
-            	if (modelProcessor != null)
-            	{
-            		JSPModelProcessor.dispose(fileContext);
-            	}
-            }
         }
         
         return ISymbol.EMPTY_SYMBOL_ARRAY;
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSource.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSource.java
index 975c257..4e7d66c 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSource.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/internal/symbols/ResourceBundleMapSource.java
@@ -22,10 +22,15 @@
 
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
 import org.eclipse.core.resources.IStorage;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.QualifiedName;
 import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jst.jsf.common.internal.resource.IResourceLifecycleListener;
+import org.eclipse.jst.jsf.common.internal.resource.LifecycleListener;
+import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent;
+import org.eclipse.jst.jsf.common.internal.resource.ResourceLifecycleEvent.EventType;
 import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
 import org.eclipse.jst.jsf.core.internal.tld.LoadBundleUtil;
 
@@ -42,13 +47,18 @@
     {
         if (project != null)
         {
-            return (IFile) getBundleFileCache(project).get(baseName);
+            Map bundleFileCache = getBundleFileCache(project);
+            
+            if (bundleFileCache != null)
+            {
+                return (IFile) bundleFileCache.get(baseName);
+            }
         }
 
         return null;
     }
 
-    private static Map getBundleFileCache(IProject project)
+    private static Map getBundleFileCache(final IProject project)
     {
         synchronized(project)
         {
@@ -62,6 +72,34 @@
                 if (bundleFileCache == null)
                 {
                     bundleFileCache = new HashMap();
+                    LifecycleListener listener = new LifecycleListener(project);
+                    listener.addListener(new IResourceLifecycleListener()
+                    {
+                        public EventResult acceptEvent(ResourceLifecycleEvent event) 
+                        {
+                            EventResult result = EventResult.getDefaultEventResult();
+                            
+                            if (event.getEventType() == EventType.RESOURCE_INACCESSIBLE)
+                            {
+                                try
+                                {
+                                    Map bundleCache = 
+                                        (Map) project.getSessionProperty(SESSION_PROPERTY_KEY_PROJECT);
+                                    bundleCache.clear();
+                                    project.setSessionProperty(SESSION_PROPERTY_KEY_PROJECT, null);
+                                }
+                                catch (CoreException ce)
+                                {
+                                    JSFCorePlugin.log("Error clearing bundle file cache", ce); //$NON-NLS-1$
+                                }
+                                result = EventResult.getDisposeAfterEventResult();
+                            }
+                            
+                            return result;
+                        }
+                    }
+                    );
+
                     project.setSessionProperty(SESSION_PROPERTY_KEY_PROJECT, bundleFileCache);
                 }
             }
@@ -78,7 +116,8 @@
                                                    final String  resourcePathStr)
                       throws IOException, CoreException
     {
-        IStorage storage = LoadBundleUtil.getLoadBundleResource(project, resourcePathStr);
+        IStorage storage = 
+            LoadBundleUtil.getLoadBundleResource(project, resourcePathStr);
 
         IFile bundleRes = null;
 
@@ -119,14 +158,17 @@
     {
         if (_bundleFile.isAccessible())
         {
-            if (_resourceBundle == null
+            if (_resourceBundle == null  // doesn't exist yet
+                    // exists but ws is out of sync
+                    || !_bundleFile.isSynchronized(IResource.DEPTH_ZERO)
+                    // exists but user has changed in workspace
                     || _bundleFile.getModificationStamp() 
                             != _lastModificationStamp)
             {
                 InputStream  bundleStream = null;
                 try
                 {
-                	// force refresh if out of sync
+                    // force refresh if out of sync
                     bundleStream = _bundleFile.getContents(true);
                     _resourceBundle = new Properties();
                     _resourceBundle.load(bundleStream);
@@ -161,9 +203,15 @@
             // bundle no longer exists so remove it
             Map bundleFileCache = getBundleFileCache(_bundleFile.getProject());
 
-            if (bundleFileCache.containsKey(_resourcePathStr))
+            if (bundleFileCache != null &&
+                    bundleFileCache.containsKey(_resourcePathStr))
             {
                 bundleFileCache.remove(_resourcePathStr);
+            }
+            // in either case, clear the bundle entry
+            if (_resourceBundle != null)
+            {
+                _resourceBundle.clear();
                 _resourceBundle = null;
             }
         }
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultBeanSymbolSourceProvider.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultBeanSymbolSourceProvider.java
index 29614fd..7f5d0c7 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultBeanSymbolSourceProvider.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/designtime/symbols/DefaultBeanSymbolSourceProvider.java
@@ -22,6 +22,7 @@
 import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.core.IType;
 import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jst.jsf.context.symbol.ERuntimeSource;
 import org.eclipse.jst.jsf.context.symbol.IBeanInstanceSymbol;
 import org.eclipse.jst.jsf.context.symbol.IJavaTypeDescriptor2;
@@ -138,17 +139,18 @@
                     {
                         IJavaProject javaProject = JavaCore.create(iProject);
                         IType type = javaProject.findType(bean.getManagedBeanClass().getTextContent());
-                        
+
                         // don't bother setting a type descriptor if we
                         // can't find a type
                         if (type != null)
                         {
-                            IJavaTypeDescriptor2 javaTypeDescriptor = SymbolFactory.eINSTANCE.createIJavaTypeDescriptor2();
+                            IJavaTypeDescriptor2 javaTypeDescriptor = 
+                                SymbolFactory.eINSTANCE.createIJavaTypeDescriptor2();
                             javaTypeDescriptor.setType(type);
                             symbol.setJavaTypeDescriptor(javaTypeDescriptor);
                         }
                     }
-                    catch (Exception t)
+                    catch (JavaModelException t)
                     {
                         // do nothing; skip type info for this bean
                     }
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ColorType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ColorType.java
index 0bd700d..916b277 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ColorType.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ColorType.java
@@ -25,6 +25,8 @@
  * Meta-data processing type representing a color.
  * A color is defined as in html spec http://www.w3.org/TR/html4/types.html#type-color
  * 
+ * <p><b>Provisional API - subject to change</b></p>
+ * 
  * @author ykats
  */
 
@@ -34,7 +36,7 @@
 	 * List of standard colors
 	 * See http://www.w3.org/TR/html4/types.html#type-color
 	 */
-	public static String[] COLORS = {"Black", "Silver", "Gray", "White", "Maroon", "Red", "Purple",
+	private final static String[] COLORS = {"Black", "Silver", "Gray", "White", "Maroon", "Red", "Purple",
 				"Fuchsia", "Green", "Lime", "Olive", "Yellow", "Navy", "Blue", "Teal","Aqua"};
 		//if ordering changes, must change RGB[] ordering
 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigConverterIDFeatures.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigConverterIDFeatures.java
index bcad219..79b1c5b 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigConverterIDFeatures.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigConverterIDFeatures.java
@@ -11,6 +11,7 @@
  ********************************************************************************/
 package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -110,9 +111,13 @@
 	 * 
 	 * Converter ID Sorter - incomplete
 	 */
-	class ConverterSorter implements Comparator {
+	private static class ConverterSorter implements Comparator, Serializable {
+	    /**
+         * 
+         */
+        private static final long serialVersionUID = 5255291244511783735L;
 
-		public int compare(Object o1, Object o2) {		
+        public int compare(Object o1, Object o2) {		
 			//TODO
 			return 0;
 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigValidatorIDFeatures.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigValidatorIDFeatures.java
index b402817..2a2711a 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigValidatorIDFeatures.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/FacesConfigValidatorIDFeatures.java
@@ -11,6 +11,7 @@
  ********************************************************************************/
 package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
 
+import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -109,9 +110,13 @@
 	/**
 	 * Validator id sorter - incomplete
 	 */
-	class ValidatorSorter implements Comparator {
+	private static class ValidatorSorter implements Comparator, Serializable {
+		/**
+         * 
+         */
+        private static final long serialVersionUID = -398026037193914126L;
 
-		public int compare(Object o1, Object o2) {		
+        public int compare(Object o1, Object o2) {		
 			//TODO
 			return 0;
 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/JavaClassType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/JavaClassType.java
index 48c37d0..912c818 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/JavaClassType.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/JavaClassType.java
@@ -410,7 +410,7 @@
 		return false;
 	}
 	
-	private class Searcher extends SearchRequestor{
+	private static class Searcher extends SearchRequestor{
 		private List results = new ArrayList();
 		public void acceptSearchMatch(SearchMatch match) throws CoreException {
 			results.add(match);
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LengthType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LengthType.java
index 43bcbaa..bad4083 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LengthType.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/LengthType.java
@@ -28,7 +28,7 @@
 		if (value == null) return true;
 		String aValue = stripPercentIfPresent(value);		
 		try {
-			int anInt = Integer.valueOf(aValue);
+			int anInt = Integer.valueOf(aValue).intValue();
 			if (anInt < 0)
 				addNewValidationMessage(INVALID_LENGTH);
 			
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/Messages.java
index 8eb89f0..9e58827 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/Messages.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/Messages.java
@@ -131,4 +131,9 @@
      * see messages.properties
      */	
 	public static String ColorType_invalid_color;
+	
+	/**
+	 * see messages.properties
+	 */
+	public static String Bundle_not_found_rb;
 }
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ResourceBundleType.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ResourceBundleType.java
new file mode 100644
index 0000000..08ead16
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/ResourceBundleType.java
@@ -0,0 +1,68 @@
+package org.eclipse.jst.jsf.taglibprocessing.attributevalues;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
+import org.eclipse.jst.jsf.context.resolver.structureddocument.IWorkspaceContextResolver;
+import org.eclipse.jst.jsf.core.internal.tld.LoadBundleUtil;
+import org.eclipse.jst.jsf.metadataprocessors.AbstractRootTypeDescriptor;
+import org.eclipse.jst.jsf.metadataprocessors.features.IValidValues;
+import org.eclipse.jst.jsf.metadataprocessors.features.IValidationMessage;
+import org.eclipse.jst.jsf.metadataprocessors.features.ValidationMessage;
+
+/**
+ * Meta-data processing type representing a path to resource bundle on classpath
+ * Patch by Vadim Dmitriev.  See https://bugs.eclipse.org/bugs/show_bug.cgi?id=203307.
+ * 
+ * @author Vadim Dmitriev
+ */
+public class ResourceBundleType extends AbstractRootTypeDescriptor implements IValidValues 
+{
+	private IProject _project 								= null;
+	private final List<IValidationMessage> _validationMsgs 	= new ArrayList<IValidationMessage>(1);
+	
+	private IProject getProject()
+	{
+		if( _project == null )
+		{
+            final IWorkspaceContextResolver wkspaceResolver =
+                IStructuredDocumentContextResolverFactory.INSTANCE.getWorkspaceContextResolver( getStructuredDocumentContext() );
+            _project = wkspaceResolver.getProject();
+		}
+		
+		return _project;
+	}
+
+	public boolean isValidValue( String value )
+	{
+		try
+		{
+			IProject project = getProject();
+			IStorage bundle = LoadBundleUtil.getLoadBundleResource( project , value );
+			if( bundle != null )
+			{
+				return true;
+			}
+		}
+		catch (CoreException e) 
+		{
+			//error message is generated later
+		}
+		
+		final String message = 
+			MessageFormat.format(Messages.Bundle_not_found_rb, value); 
+		_validationMsgs.add(new ValidationMessage(message, "", IStatus.ERROR));
+		return false;
+	}
+	
+	public List getValidationMessages() 
+	{
+		return _validationMsgs;
+	}
+}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/messages.properties
index eb00fe6..533eca5 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/messages.properties
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/taglibprocessing/attributevalues/messages.properties
@@ -35,3 +35,4 @@
 JavaClassType_invalid_type=Value for type attribute must be valid Java class and not empty.
 JavaClassType_not_found=Java type not found, not instantiable, or does implement correct interfaces or extend correct superclass.
 ColorType_invalid_color=Value is not a valid color.
+Bundle_not_found_rb=Resource bundle {0} cannot be found on classpath 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ComponentValidatorVisitor.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ComponentValidatorVisitor.java
index 0743670..c661023 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ComponentValidatorVisitor.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/appconfig/ComponentValidatorVisitor.java
@@ -115,7 +115,7 @@
                     String nameValue = name.getTextContent().trim();
 
                     // TODO: isJavaIdentifierStart seems broken...
-                    if (Character.isJavaIdentifierStart(nameValue.charAt(0)));
+                    if (Character.isJavaIdentifierStart(nameValue.charAt(0)))
                     {
                         isValid = true;
                         for (int i = 1; i < nameValue.length(); i++)
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/AddArithmeticBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/AddArithmeticBinaryOperator.java
index 56d1457..e1975f0 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/AddArithmeticBinaryOperator.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/AddArithmeticBinaryOperator.java
@@ -32,11 +32,11 @@
 
     protected Long doRealOperation(Long firstArg, Long secondArg) 
     {
-        return new Long(firstArg.longValue() + secondArg.longValue());
+        return Long.valueOf(firstArg.longValue() + secondArg.longValue());
     }
 
     protected Double doRealOperation(Double firstArg, Double secondArg) {
-        return new Double(firstArg.doubleValue() + secondArg.doubleValue());
+        return Double.valueOf(firstArg.doubleValue() + secondArg.doubleValue());
     }
 
     protected BigDecimal doRealOperation(BigDecimal firstArg,
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/DivArithmeticBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/DivArithmeticBinaryOperator.java
index 34c63c4..b1d3059 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/DivArithmeticBinaryOperator.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/DivArithmeticBinaryOperator.java
@@ -252,7 +252,7 @@
     }
 
     protected Long doRealOperation(Long firstArg, Long secondArg) {
-        return new Long(firstArg.longValue() / secondArg.longValue());
+        return Long.valueOf(firstArg.longValue() / secondArg.longValue());
     }
 
     protected String getOperatorName() {
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/EqualityRelationalBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/EqualityRelationalBinaryOperator.java
index de6881b..fcfca03 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/EqualityRelationalBinaryOperator.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/EqualityRelationalBinaryOperator.java
@@ -197,7 +197,8 @@
         if (TypeCoercer.typeIsNull(firstArg.getSignature())
                 || TypeCoercer.typeIsNull(secondArg.getSignature()))
         {
-            final boolean result = doRealOperation(new Integer(4), null);
+            // TODO: this is a strange thing to do...
+            final boolean result = doRealOperation(Integer.valueOf(4), null);
             return _diagnosticFactory.create_BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME(Boolean.toString(result));
         }
 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/ModArithmeticBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/ModArithmeticBinaryOperator.java
index ed8e394..ba4765b 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/ModArithmeticBinaryOperator.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/ModArithmeticBinaryOperator.java
@@ -41,7 +41,6 @@
 
     ModArithmeticBinaryOperator(DiagnosticFactory diagnosticFactory) {
         super(diagnosticFactory);
-        // TODO Auto-generated constructor stub
     }
 
     public ValueType performOperation(ValueType firstArg, ValueType secondArg) 
@@ -225,8 +224,8 @@
             if (firstValue != null && secondValue != null)
             {
                 return new IntegerLiteralType(
-                        doRealOperation(new Long(firstValue.longValue()), 
-                                        new Long(secondValue.longValue())).longValue());
+                        doRealOperation(Long.valueOf(firstValue.longValue()), 
+                                        Long.valueOf(secondValue.longValue())).longValue());
             }
 
             // if we get to here, the coercion is valid, so a Long will be
@@ -365,7 +364,7 @@
     }
     
     protected Long doRealOperation(Long firstArg, Long secondArg) {
-        return new Long(firstArg.longValue() % secondArg.longValue());
+        return Long.valueOf(firstArg.longValue() % secondArg.longValue());
      }
 
      protected Double doRealOperation(Double firstArg, Double secondArg) {
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MultiplyArithmeticBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MultiplyArithmeticBinaryOperator.java
index 01f8d9a..7076622 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MultiplyArithmeticBinaryOperator.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/MultiplyArithmeticBinaryOperator.java
@@ -35,7 +35,7 @@
 
     protected Long doRealOperation(Long firstArg, Long secondArg) 
     {
-        return new Long(firstArg.longValue() * secondArg.longValue());
+        return Long.valueOf(firstArg.longValue() * secondArg.longValue());
     }
 
     protected Double doRealOperation(Double firstArg, Double secondArg) 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/SubtractArithmeticBinaryOperator.java b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/SubtractArithmeticBinaryOperator.java
index bc1b97b..2879cec 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/SubtractArithmeticBinaryOperator.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.core/src/org/eclipse/jst/jsf/validation/internal/el/operators/SubtractArithmeticBinaryOperator.java
@@ -34,7 +34,7 @@
 
     protected Long doRealOperation(Long firstArg, Long secondArg) 
     {
-        return new Long(firstArg.longValue() - secondArg.longValue());
+        return Long.valueOf(firstArg.longValue() - secondArg.longValue());
     }
 
     protected Double doRealOperation(Double firstArg, Double secondArg) 
diff --git a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core.xml b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core.xml
index 0a7ae08..7f6eda8 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core.xml
+++ b/jsf/plugins/org.eclipse.jst.jsf.standard.tagsupport/metadata/jsf_core.xml
@@ -192,6 +192,13 @@
 				<value>org.eclipse.jst.jsf.designtime.core.loadBundle</value>
 			</trait>
 		</entity>
+		<entity id="basename">
+			<trait id="attribute-value-runtime-type">
+				<value>
+					org.eclipse.jst.jsf.core.attributevalues.ResourceBundleType
+				</value>
+			</trait>
+		</entity>
 	</entity>
 	<entity id="param" type="tag"><include-entity-group id="common-core-attributes"/></entity>
 	<entity id="selectItem" type="tag">
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.classpath b/jsf/plugins/org.eclipse.jst.jsf.ui/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.cvsignore b/jsf/plugins/org.eclipse.jst.jsf.ui/.cvsignore
deleted file mode 100644
index 117a1fe..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.cvsignore
+++ /dev/null
@@ -1,5 +0,0 @@
-bin
-@dot*
-temp.folder
-build.xml
-javaCompiler...args
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.project b/jsf/plugins/org.eclipse.jst.jsf.ui/.project
deleted file mode 100644
index 45f845d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.jsf.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.core.resources.prefs b/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index c8e6e65..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Sun May 27 16:04:34 EDT 2007
-eclipse.preferences.version=1
-encoding//src/org/eclipse/jst/jsf/ui/internal/messages.properties=8859_1
-encoding/<project>=ISO-8859-1
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.jdt.core.prefs b/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 123186c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,77 +0,0 @@
-#Tue Apr 10 09:49:41 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.doc.comment.support=enabled
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=warning
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled
-org.eclipse.jdt.core.compiler.problem.fieldHiding=warning
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.invalidJavadoc=error
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTags=enabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsDeprecatedRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsNotVisibleRef=disabled
-org.eclipse.jdt.core.compiler.problem.invalidJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=warning
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingJavadocComments=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingJavadocTags=warning
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=warning
-org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=ignore
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=error
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=warning
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=warning
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=error
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=error
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=error
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.jdt.ui.prefs b/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 39df095..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Tue Apr 10 09:49:42 PDT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?><templates/>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/META-INF/MANIFEST.MF b/jsf/plugins/org.eclipse.jst.jsf.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index f66d5bd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,33 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %plugin.name
-Bundle-SymbolicName: org.eclipse.jst.jsf.ui; singleton:=true
-Bundle-Version: 1.0.1.qualifier
-Bundle-Activator: org.eclipse.jst.jsf.ui.internal.JSFUiPlugin
-Bundle-Vendor: %plugin.provider
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.jst.jsf.core;bundle-version="[1.0.0,1.1.0)",
- org.eclipse.wst.common.project.facet.ui;bundle-version="[1.1.0,1.3.0)",
- org.eclipse.core.resources;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jdt.core;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jdt.ui;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.j2ee;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.common.frameworks.ui;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.jst.jsf.common;bundle-version="[1.0.0,1.1.0)",
- org.eclipse.jface.text;bundle-version="[3.2.0,4.0.0)",
- org.eclipse.jst.jsp.core;bundle-version="[1.1.0,1.3.0)",
- org.eclipse.wst.xml.core;bundle-version="[1.1.0,1.2.0)",
- org.eclipse.wst.xml.ui;bundle-version="[1.0.100,1.1.0)",
- org.eclipse.wst.sse.ui;bundle-version="[1.0.101,1.1.0)",
- org.eclipse.emf.ecore;bundle-version="[2.2.0,2.4.0)",
- org.eclipse.jst.jsp.ui;bundle-version="[1.1.0,1.3.0)",
- org.eclipse.ui.forms
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.jst.jsf.ui.internal;x-friends:="org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.ui.internal.classpath;x-friends:="org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.ui.internal.contentassist;x-internal:=true,
- org.eclipse.jst.jsf.ui.internal.contentassist.el;x-internal:=true,
- org.eclipse.jst.jsf.ui.internal.jsflibraryconfig;x-internal:=true,
- org.eclipse.jst.jsf.ui.internal.project.facet;x-friends:="org.eclipse.jst.jsf.ui.tests",
- org.eclipse.jst.jsf.ui.internal.validation;x-internal:=true
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/about.html b/jsf/plugins/org.eclipse.jst.jsf.ui/about.html
deleted file mode 100644
index 04d4782..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/about.html
+++ /dev/null
@@ -1,22 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-<body lang="EN-US">
-<h2>About This Content</h2>
- 
-<p>June 06, 2007</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>If you did not receive this Content directly from the Eclipse Foundation, the Content is being redistributed by another party (&quot;Redistributor&quot;) and different terms and conditions may
-apply to your use of any object code in the Content.  Check the Redistributor's license that was provided with the Content.  If no such license exists, contact the Redistributor.  Unless otherwise
-indicated below, the terms and conditions of the EPL still apply to any source code in the Content.</p>
-
-</body>
-</html>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/build.properties b/jsf/plugins/org.eclipse.jst.jsf.ui/build.properties
deleted file mode 100644
index 8d7f590..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/build.properties
+++ /dev/null
@@ -1,20 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the 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:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               icons/,\
-               plugin.properties,\
-               about.html
-javacSource=1.5
-javacTarget=1.5
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/attr_val.gif b/jsf/plugins/org.eclipse.jst.jsf.ui/icons/attr_val.gif
deleted file mode 100644
index d4cb425..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/attr_val.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/full/wizban/addlibrary_wiz.gif b/jsf/plugins/org.eclipse.jst.jsf.ui/icons/full/wizban/addlibrary_wiz.gif
deleted file mode 100644
index 128c9d1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/full/wizban/addlibrary_wiz.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_l_obj.gif b/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_l_obj.gif
deleted file mode 100644
index 6cb185c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_l_obj.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_obj.gif b/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_obj.gif
deleted file mode 100644
index 2fa1d77..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/jar_obj.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/library_obj.gif b/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/library_obj.gif
deleted file mode 100644
index cb55e33..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/icons/obj16/library_obj.gif
+++ /dev/null
Binary files differ
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.properties b/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.properties
deleted file mode 100644
index b3c2077..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2006 Oracle Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the 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:
-#    Gerry Kessler - initial API and implementation
-###############################################################################
-plugin.name=JavaServer Faces Tools - UI
-plugin.provider=Eclipse.org
-
-jsf.library.reference=JSF Library References
-jsf.library.wizard.name=JSF Library
-
-preferencepage.jsflibraries.name=Libraries
-preferencepage.jsfvalidation.name=Validation
-preferencepage.jsf.name=JavaServer Faces Tools
-
-newwizard.jsf.category.name=JavaServer Faces
-newwizard.jsflibrary.name=JSF Library
-newwizard.jsflibrary.description=Create a new JSF Library
-classpathContainerPage.name.0 = JSF Libraries
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.xml b/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.xml
deleted file mode 100644
index aa03746..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/plugin.xml
+++ /dev/null
@@ -1,91 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-  <!-- JSF Project Facet --> 
-  <extension
-        point="org.eclipse.ui.preferencePages">
-     <page
-           category="org.eclipse.wst.sse.ui.internal.provisional.preferences/org.eclipse.jst.jsf.ui.JSFRootPage"
-           class="org.eclipse.jst.jsf.ui.internal.classpath.JSFLibrariesPreferencePage"
-           id="org.eclipse.jst.jsf.ui.jsfLibraryPage"
-           name="%preferencepage.jsflibraries.name"/>
-     <page
-           category="org.eclipse.wst.sse.ui.internal.provisional.preferences/org.eclipse.jst.jsf.ui.JSFRootPage"
-           class="org.eclipse.jst.jsf.ui.internal.validation.JSFValidationPreferencePage"
-           id="org.eclipse.jst.jsf.ui.JSFValidationPage"
-           name="%preferencepage.jsfvalidation.name"/>
-     <page
-           category="org.eclipse.wst.sse.ui.internal.provisional.preferences"
-           class="org.eclipse.jst.jsf.ui.internal.preferences.EmptyRootPreferencePage"
-           id="org.eclipse.jst.jsf.ui.JSFRootPage"
-           name="%preferencepage.jsf.name">
-     </page>
-  </extension>
-  <extension
-        point="org.eclipse.ui.newWizards">
-     <category
-           id="org.eclipse.jst.jsf.ui.jsfcategory"
-           name="%newwizard.jsf.category.name"/>
-     <wizard
-           canFinishEarly="false"
-           category="org.eclipse.jst.jsf.ui.jsfcategory"
-           class="org.eclipse.jst.jsf.ui.internal.classpath.JSFLibraryWizard"
-           hasPages="true"
-           icon="icons/obj16/library_obj.gif"
-           id="org.eclipse.jst.jsf.ui.jsfLibraryWizard"
-           name="%newwizard.jsflibrary.name"
-           preferredPerspectives="org.eclipse.jst.j2ee.J2EEPerspective">
-        <description>
-           %newwizard.jsflibrary.description
-        </description>
-     </wizard>
-  </extension>
-  <extension 
-        point="org.eclipse.wst.common.project.facet.ui.wizardPages">
-     <wizard-pages action="jst.jsf.v11.install">
-        <page class="org.eclipse.jst.jsf.ui.internal.project.facet.JSFFacetInstallPage"/>
-     </wizard-pages>
-     <wizard-pages action="jst.jsf.v12.install">
-        <page class="org.eclipse.jst.jsf.ui.internal.project.facet.JSFFacetInstallPage"/>
-     </wizard-pages>
-  </extension>  
-  
-  <extension point="org.eclipse.wst.sse.ui.editorConfiguration"> 
-	<sourceViewerConfiguration
-            class="org.eclipse.jst.jsp.ui.StructuredTextViewerConfigurationJSP"
-            target="org.eclipse.jst.jsp.core.jspsource"/>
-                <provisionalConfiguration 
-                        type="contentassistprocessor" 
-                        class="org.eclipse.jst.jsf.ui.internal.contentassist.el.JSFELContentAssistProcessor" 
-                        target="org.eclipse.jst.jsp.SCRIPT.JSP_EL2" /> 
-				<provisionalConfiguration 
-                        type="contentassistprocessor" 
-                        class="org.eclipse.jst.jsf.ui.internal.contentassist.JSFContentAssistProcessor" 
-                        target="org.eclipse.jst.jsp.JSP_DEFAULT,org.eclipse.jst.jsp.JSP_DIRECTIVE" />                         
-    </extension> 
-    <extension point="org.eclipse.wst.sse.ui.sourcevalidation">
-		<validator
-			scope="total"
-			class="org.eclipse.jst.jsf.validation.internal.JSPSemanticsValidator"
-			id="org.eclipse.jst.jsf.validation.JSFAttributeValueValidator">
-			<contentTypeIdentifier
-				id="org.eclipse.jst.jsp.core.jspsource">
-				<partitionType id="org.eclipse.jst.jsp.DEFAULT_JSP">
-				</partitionType>
-				<partitionType id="org.eclipse.jst.jsp.JSP_DIRECTIVE">
-				</partitionType>
-				<partitionType id="org.eclipse.jst.jsp.SCRIPT.JSP_EL2">
-				</partitionType>
-			</contentTypeIdentifier>
-		</validator>
-	</extension>
-    <extension
-          point="org.eclipse.jdt.ui.classpathContainerPage">
-       <classpathContainerPage
-             class="org.eclipse.jst.jsf.ui.internal.classpath.JSFLibraryContainerWizardPage"
-             id="org.eclipse.jst.jsf.core.internal.jsflibrarycontainer"
-             name="%classpathContainerPage.name.0">
-       </classpathContainerPage>
-    </extension>
-    
-</plugin>
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/JSFUiPlugin.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/JSFUiPlugin.java
deleted file mode 100644
index 8b043ad..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/JSFUiPlugin.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the 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:
- *    Gerry Kessler - initial API and implementation
- *    Ian Trimble - added logging methods
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.ui.internal;
-
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * JSF UI plugin.
- * 
- * @author Gerry Kessler - Oracle, Ian Trimble - Oracle
- */
-public class JSFUiPlugin extends AbstractUIPlugin {
-
-	/**
-	 * The plugin id
-	 */
-	public static final String PLUGIN_ID = "org.eclipse.jst.jsf.ui"; //$NON-NLS-1$
-	//The shared instance.
-	private static JSFUiPlugin plugin;
-    private static ResourceBundle   _resourceBundle;
-    
-	/**
-	 * The constructor.
-	 */
-	public JSFUiPlugin() {
-		plugin = this;
-	}
-
-	/**
-	 * This method is called upon plug-in activation
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/**
-	 * This method is called when the plug-in is stopped
-	 */
-	public void stop(BundleContext context) throws Exception {
-		super.stop(context);
-		plugin = null;
-	}
-
-	/**
-	 * Returns the shared instance.
-	 * @return the default plugin instance
-	 */
-	public static JSFUiPlugin getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given
-	 * plug-in relative path.
-	 *
-	 * @param path the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		path = "icons/" + path; //$NON-NLS-1$
-		return AbstractUIPlugin.imageDescriptorFromPlugin("org.eclipse.jst.jsf.ui", path); //$NON-NLS-1$
-	}
-
-    /**
-     * Returns the string from the plugin's resource bundle, or 'key' if not
-     * found.
-     * @param key the key used to look up the string
-     * @return the resource string if one is found matching key or key is returned if it is not
-     */
-    public static String getResourceString(String key) {
-        ResourceBundle bundle = getDefault().getResourceBundle();
-        try {
-            return (bundle != null) ? bundle.getString(key) : key;
-        } catch (MissingResourceException e) {
-            return key;
-        }
-    }
-    
-    /**
-     * @return the resource bundle
-     */
-    public ResourceBundle getResourceBundle()
-    {
-        return _resourceBundle;
-    }
-    
-	/**
-	 * @return the plugin id
-	 */
-	public String getPluginID() {
-		return PLUGIN_ID;
-	}
-
-	/**
-	 * Logs using the default ILog implementation provided by getLog().
-	 * 
-	 * @param severity Severity (IStatus constant) of log entry
-	 * @param message Human-readable message describing log entry
-	 * @param ex Throwable instance (can be null)
-	 */
-	public static void log(int severity, String message, Throwable ex) {
-		getDefault().getLog().log(new Status(severity, PLUGIN_ID, IStatus.OK, message, ex));
-	}
-
-	/**
-	 * Logs using the default ILog implementation provided by getLog().
-	 * 
-	 * @param severity Severity (IStatus constant) of log entry
-	 * @param message Human-readable message describing log entry
-	 */
-	public static void log(int severity, String message) {
-		log(severity, message, null);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/Messages.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/Messages.java
deleted file mode 100644
index 147df36..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/Messages.java
+++ /dev/null
@@ -1,379 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the 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:
- *    Gerry Kessler - initial API and implementation
- *    Ian Trimble - changed to work correctly with org.eclipse.osgi.util.NLS
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.ui.internal;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * String resource handler.
- * 
- * @author Gerry Kessler - Oracle, Ian Trimble - Oracle
- */
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.jst.jsf.ui.internal.messages"; //$NON-NLS-1$
-
-	/**
-	 * see messages.properties
-	 */
-	public static String JSFFacetInstallPage_JSFLibraryLabel0;
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_title;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_description;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_JSFImplLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_Add1;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_Add2;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_DeployJarsLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_JSFConfigLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_JSFServletNameLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_JSFServletClassNameLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_JSFURLMappingLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_PatternDialogTitle;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_PatternDialogDesc;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_Remove;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_PatternEmptyMsg;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_PatternSpecifiedMsg;
-    /**
-     * see messages.properties
-     */
-	public static String JSFFacetInstallPage_ErrorNoWebAppDataModel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_DEFAULT_IMPL_DESC;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_DefinedJSFLibraries;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_IMPL_DESC;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_MISSING_DESC;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_New;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_Edit;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_Remove;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_CannotRemovePluginProvidedTitle;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_CannotRemovePluginProvidedMessage;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_MakeDefault;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_Description;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_CannotModifyPluginProvidedTitle;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibrariesPreferencePage_CannotModifyPluginProvidedMessage;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_Add;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_AddAll;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_ComponentLibrary;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_DeployButtonLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_DeployJAR;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_ImplementationLibrary;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_NewComponentLibrary;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_NewImplButtonTooltip;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_NewImplementationLibrary;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_NullProject;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_Remove;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_RemoveAll;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_ServerSuppliedButtonLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_ServerSuppliedButtonTooltip;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_TH_Deploy;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryConfigControl_TH_LibraryName;
-
-
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_PageName;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_Title;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_Description;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_WarningNoJSFFacet;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_JSFLibraries;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_Add;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_Edit;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_ErrorInitializing;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_ImplAlreadyPresent;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_SelectOneImpl;
-    /**
-     * see messages.properties
-     */    
-	public static String JSFLibraryContainerWizardPage_V1Registry_Warning_DialogTitle;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryContainerWizardPage_V1Registry_Warning_DialogText;
-    /**
-     * see messages.properties
-     */
-    public static String JSFLibraryContainerWizardPage_EditLibrary_DescriptionText;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryPropertyPage_No_JSF_Facet_Installed;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryPropertyPage_No_JSF_Implementation_Lib_Selected;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_DESCRIPTION;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_IMPLS_ONLY_DESC;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_CreateImplementation;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_CreateJSFLibrary;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_EditJSFLibrary;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_JSFLibrary;
-    /**
-     * see messages.properties
-     */
-    public static String JSFLibraryWizard_JSFLibraryWizard_DontShowThisAgain_CheckBoxLabel;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_LibraryName;
-    /**
-     * see messages.properties
-     */
-    public static String JSFLibraryWizard_V1JSFLibrary_DialogMessage;
-    /**
-     * see messages.properties
-     */
-    public static String JSFLibraryWizard_V1JSFLibrary_DialogTitle;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_VersionSupported;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_LibraryJars;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_IsJSFImplementation;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_DeployJars;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_Add;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_Remove;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_ExtJarFileDialogTitle;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_ValidateNoJars;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_ValidateNoLibraryName;
-    /**
-     * see messages.properties
-     */
-	public static String JSFLibraryWizard_ValidateExistingLibraryName;
-
-    /**
-     * Title set on the el validation preference panel
-     */
-    public static String JSFValidationPreferencePage_ELPrefPanel_Title;
-    /**
-     * Title set on the checkbox that enables/disables build validation for EL
-     */
-    public static String JSFValidationPreferencePage_ELPrefPanel_BuildValidationCheckBoxTitle;
-    /**
-     * Title set on the checkbox that enables/disables incremental (as you type)
-     * validation for EL
-     */
-    public static String JSFValidationPreferencePage_ELPrefPanel_IncrementalValidationCheckBoxTitle;
-
-    /**
-     * see messages.properties
-     */
-    public static String JSFLibraryEditControl_ImplVersion_UNKNOWN;
-
-    /**
-     * see messages.properties
-     */
-    public static String JSFPreferences_RootPage_Description;
-    
-    static {
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibrariesPreferencePage.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibrariesPreferencePage.java
deleted file mode 100644
index 772939f..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibrariesPreferencePage.java
+++ /dev/null
@@ -1,411 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the 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:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.TreeItem;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.IWorkbenchWizard;
-
-/**
- * Provides a preference page for JSF Libraries.
- * 
- * @author Gerry Kessler - Oracle
- */
-public class JSFLibrariesPreferencePage extends PreferencePage implements IWorkbenchPreferencePage{
-	private static final String IMPL_DESC = Messages.JSFLibrariesPreferencePage_IMPL_DESC;
-	private static final String DEFAULT_IMPL_DESC = Messages.JSFLibrariesPreferencePage_DEFAULT_IMPL_DESC;
-	private static final String MISSING = Messages.JSFLibrariesPreferencePage_MISSING_DESC;
-	
-	private IWorkbench wb;
-
-	private TreeViewer tv;
-	private TreeViewerAdapter tvAdapter;
-	private TreeLabelProvider tvLabelProvider;
-	
-	private Composite btnComp;
-
-	private Button btnNew;
-	private Button btnEdit;
-	private Button btnDelete;
-	private Button btnMakeDefaultImpl;
-	
-	protected Control createContents(Composite parent) {
-		Composite c = new Composite(parent, SWT.NONE);
-		c.setLayout(new GridLayout(2, false)); 
-		c.setLayoutData(new GridData(GridData.FILL_BOTH));				
-		
-		Label lblLibs = new Label(c, SWT.NONE);
-		lblLibs.setText(Messages.JSFLibrariesPreferencePage_DefinedJSFLibraries);
-		GridData gd1 = new GridData();
-		gd1.horizontalSpan = 2;
-		lblLibs.setLayoutData(gd1);
-		
-		tv = new TreeViewer(c, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
-		tvAdapter = new TreeViewerAdapter();
-		tvLabelProvider = new TreeLabelProvider();
-		tv.setContentProvider(tvAdapter);
-		tv.setLabelProvider(tvLabelProvider);
-		tv.addSelectionChangedListener(tvAdapter);
-		tv.addDoubleClickListener(tvAdapter);
-		tv.setComparator(tvAdapter);
-		tv.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
-		tv.setInput(getJSFLibraries());
-		
-		createButtons(c);
-		
-		return c;
-	}
-
-	private void createButtons(Composite c){		
-		btnComp = new Composite(c, SWT.NONE);
-		GridLayout gl1 = new GridLayout(1, false);
-		gl1.marginHeight = 0;
-		gl1.marginWidth = 0;
-		btnComp.setLayout(gl1);
-		btnComp.setLayoutData(new GridData(GridData.END | GridData.VERTICAL_ALIGN_FILL));
-		
-		btnNew = new Button(btnComp, SWT.NONE);
-		btnNew.setText(Messages.JSFLibrariesPreferencePage_New);
-		btnNew.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING));
-		btnNew.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e) {
-				openJSFLibraryEditDialog(null);
-			}
-		});
-		
-		btnEdit = new Button(btnComp, SWT.NONE);
-		btnEdit.setText(Messages.JSFLibrariesPreferencePage_Edit);
-		btnEdit.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING));
-		btnEdit.setEnabled(false);
-		btnEdit.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e) {
-				TreeItem[] element = tv.getTree().getSelection();
-				if (element != null){
-					openJSFLibraryEditDialog(element[0]);
-				}
-
-			}
-		});
-		
-		btnDelete = new Button(btnComp, SWT.NONE);
-		btnDelete.setText(Messages.JSFLibrariesPreferencePage_Remove);
-		btnDelete.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING));
-		btnDelete.setEnabled(false);
-		btnDelete.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e) {
-				boolean modified = false;
-				if (tv.getSelection() instanceof StructuredSelection){
-					StructuredSelection objs = (StructuredSelection)tv.getSelection();
-					if (objs != null){
-						Iterator it = objs.iterator();
-						while (it.hasNext()){
-							JSFLibrary lib = (JSFLibrary)it.next();
-							if (lib instanceof PluginProvidedJSFLibrary)
-								MessageDialog.openInformation(
-										getShell(),
-										Messages.JSFLibrariesPreferencePage_CannotRemovePluginProvidedTitle,
-										Messages.JSFLibrariesPreferencePage_CannotRemovePluginProvidedMessage);
-	
-							else {
-								JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().removeJSFLibrary(lib);
-								modified = true;
-							}
-						}
-						if (modified){
-							JSFLibraryRegistryUtil.getInstance().saveJSFLibraryRegistry();
-							tv.refresh();
-						}
-					}
-				}
-			}
-		});
-		
-		btnMakeDefaultImpl = new Button(btnComp, SWT.NONE);
-		btnMakeDefaultImpl.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_END));
-		btnMakeDefaultImpl.setText(Messages.JSFLibrariesPreferencePage_MakeDefault);
-		btnMakeDefaultImpl.setVisible(false);
-		btnMakeDefaultImpl.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (tv.getSelection() instanceof StructuredSelection){
-					StructuredSelection objs = (StructuredSelection)tv.getSelection();
-					if (objs != null){
-						if (objs.getFirstElement() instanceof JSFLibrary){
-							 JSFLibrary lib = (JSFLibrary)objs.getFirstElement();
-							 JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().setDefaultImplementation(lib);							 							
-						 }
-						 JSFLibraryRegistryUtil.getInstance().saveJSFLibraryRegistry();
-						 tv.refresh();
-					}
-				}
-			}
-		});
-		
-	}
-	private Object getJSFLibraries() {
-		return JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getAllJSFLibraries();
-	}
-
-	public void init(IWorkbench workbench) {
-		wb = workbench;
-		setDescription(Messages.JSFLibrariesPreferencePage_Description);
-		noDefaultAndApplyButton();
-	}
-	
-	/**
-	 * Getter created only for JUnit tests.  Should not be used otherwise.
-	 * @return the TreeViewer of JSF Libraries
-	 */
-	public Viewer getLibraryViewer(){
-		return tv;
-	}
-	
-	private class TreeViewerAdapter extends ViewerComparator implements ITreeContentProvider, ISelectionChangedListener, IDoubleClickListener {
-		private final Object[] NO_ELEMENTS= new Object[0];
-
-		// ------- ITreeContentProvider Interface ------------
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			// will never happen
-		}
-
-		public void dispose() {
-            // do nothing
-		}
-
-		public Object[] getElements(Object obj) {
-			return ((List)getJSFLibraries()).toArray();
-		}
-		
-		public Object[] getChildren(Object element) {
-			if (element instanceof JSFLibrary) {
-				return ((JSFLibrary)element).getArchiveFiles().toArray();
-			}
-			return NO_ELEMENTS;
-		}
-
-		public Object getParent(Object element) {
-//			if (elements instanceof JSFLibrary) {
-//				return tvAdapter.getParent(tv.getTree().class, element);
-//			}
-			return null;//fParentElement;
-		}
-
-		public boolean hasChildren(Object element) {
-			if (element instanceof JSFLibrary) {
-				return true;
-			}
-			return false;
-		}		
-
-		// ------- ISelectionChangedListener Interface ------------
-
-		public void selectionChanged(SelectionChangedEvent event) {
-			doListSelected(event);
-		}
-		
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
-		 */
-		public void doubleClick(DoubleClickEvent event) {
-			doDoubleClick(event);
-		}		
-		
-		public int compare(Viewer viewer, Object e1, Object e2) {
-			if (e1 instanceof JSFLibrary && e2 instanceof JSFLibrary){
-				JSFLibrary lib1 = (JSFLibrary)e1;
-				JSFLibrary lib2 = (JSFLibrary)e2;
-				
-				return getComparator().compare(lib1.getLabel(), lib2.getLabel());
-			}
-			return super.compare(viewer, e1, e2);
-		}
-		
-		
-	}
-
-	/**
-	 * Respond to a list selection event
-	 * 
-	 * @param event
-	 */
-	protected void doListSelected(SelectionChangedEvent event) {
-		updateButtonState();
-	}
-
-	/**
-	 * Respond to a double click event by opening the edit dialog
-	 * @param event
-	 */
-	protected void doDoubleClick(DoubleClickEvent event) {
-		openJSFLibraryEditDialog(tv.getTree().getSelection()[0]);
-	}
-	
-	private void updateButtonState() {
-		btnEdit.setEnabled(tv.getTree().getSelectionCount() == 1);	
-		if (tv.getTree().getSelectionCount() == 1 && tv.getTree().getSelection()[0].getData() instanceof JSFLibrary){	
-			btnDelete.setEnabled(true);
-			btnMakeDefaultImpl.setVisible(false);
-			JSFLibrary lib = (JSFLibrary)tv.getTree().getSelection()[0].getData();
-			btnMakeDefaultImpl.setVisible(lib.isImplementation());
-		} else {
-			btnDelete.setEnabled(false);
-			btnMakeDefaultImpl.setVisible(false);
-		}
-	}
-	
-	private void openJSFLibraryEditDialog(Object element) {
-		if (isPluginProvidedJSFLibrary(element)){
-			MessageDialog.openInformation(
-					getShell(),
-					Messages.JSFLibrariesPreferencePage_CannotModifyPluginProvidedTitle,
-					Messages.JSFLibrariesPreferencePage_CannotModifyPluginProvidedMessage);
-			return;
-		}
-		IWorkbenchWizard wizard = new JSFLibraryWizard();
-		wizard.init(wb, getStructuredElement(element));
-		WizardDialog dialog = new WizardDialog(wb.getActiveWorkbenchWindow().getShell(), wizard);
-		int ret = dialog.open();
-		if (ret == Window.OK){
-			tv.refresh();
-		}
-	}
-	
-	private IStructuredSelection getStructuredElement(Object element) {
-		if (element instanceof TreeItem){
-			Object item = ((TreeItem)element).getData();
-			if (item instanceof ArchiveFile){
-				JSFLibrary parent = ((ArchiveFile)item).getJSFLibrary();
-				return new StructuredSelection(parent);
-			} else if (item instanceof JSFLibrary) {
-				return new StructuredSelection(item);
-			}
-		}
-		return null;
-	}
-
-	private boolean isPluginProvidedJSFLibrary(Object treeElement){
-		if (treeElement instanceof TreeItem){
-			Object item = ((TreeItem)treeElement).getData();
-			if (item instanceof PluginProvidedJSFLibrary){
-				return true;
-			} else if (item instanceof ArchiveFile) {
-				return (((ArchiveFile)item).getJSFLibrary() instanceof PluginProvidedJSFLibrary);
-			}
-		}
-		return false;
-	}
-
-	private class TreeLabelProvider implements ILabelProvider {
-		Image libImg;
-		Image jarImg;
-
-		TreeLabelProvider(){
-			if (jarImg == null){
-				ImageDescriptor jarImgDesc = JSFUiPlugin.getImageDescriptor("obj16/jar_obj.gif"); //$NON-NLS-1$
-				jarImg = jarImgDesc.createImage();
-			}
-			if (libImg == null){
-				ImageDescriptor libImgDesc = JSFUiPlugin.getImageDescriptor("obj16/library_obj.gif"); //$NON-NLS-1$
-				libImg = libImgDesc.createImage();
-			}
-		}
-		
-		public Image getImage(Object element) {
-			if (element instanceof JSFLibrary)
-            {
-				return libImg;
-            }
-			return jarImg;
-		}
-
-		public String getText(Object element) {
-			StringBuffer labelBuf = new StringBuffer();
-			if (element instanceof JSFLibrary) {
-				JSFLibrary lib = (JSFLibrary)element;
-				labelBuf.append(lib.getLabel());
-				if (lib.isImplementation()) {
-					if (lib == JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getDefaultImplementation()) {
-						labelBuf.append(DEFAULT_IMPL_DESC);
-					} else {
-						labelBuf.append(IMPL_DESC);
-					}
-				}
-			}
-			if (element instanceof ArchiveFile) {
-				ArchiveFile jar = (ArchiveFile)element;
-				labelBuf.append(jar.getName());
-				if (!jar.exists())
-					labelBuf.append(MISSING);
-				labelBuf.append(" - ").append(((ArchiveFile)element).getSourceLocation()); //$NON-NLS-1$
-			}
-			return labelBuf.toString();
-		}
-
-		public void addListener(ILabelProviderListener listener) {
-            // no listeners supported
-		}
-
-		public void dispose() {
-			if (libImg != null){
-				libImg.dispose();
-			}			
-			if (jarImg != null){
-				jarImg.dispose();
-			}		
-		}
-
-		public boolean isLabelProperty(Object element, String property) {
-			return false;
-		}
-
-		public void removeListener(ILabelProviderListener listener) {
-            // no listeners supported
-		}
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryContainerWizardPage.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryContainerWizardPage.java
deleted file mode 100644
index fdbe74d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryContainerWizardPage.java
+++ /dev/null
@@ -1,581 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the 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:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.ui.wizards.IClasspathContainerPage;
-import org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension;
-import org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension2;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.PluginProvidedJSFLibrary;
-import org.eclipse.jst.jsf.core.jsfappconfig.JSFAppConfigUtils;
-import org.eclipse.jst.jsf.core.jsflibraryconfiguration.JSFLibraryConfigurationHelper;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchWizard;
-import org.eclipse.ui.PlatformUI;
-
-/**
- * Provides a classpath container wizard page for JSF Libraries.
- * 
- * @author Gerry Kessler - Oracle
- */
-public class JSFLibraryContainerWizardPage extends WizardPage implements
-		IClasspathContainerPage, IClasspathContainerPageExtension, IClasspathContainerPageExtension2{
-
-	private CheckboxTableViewer lv;
-	private JSFLibrariesTableViewerAdapter lvAdapter;
-	private JSFLibrariesListLabelProvider lvLabelProvider;
-	
-	private boolean isJSFProject = false;
-	private IClasspathEntry containerEntry;
-	private IClasspathEntry[] currentEntries;
-	private Map _currentLibs;
-	private JSFLibrary currentLib;
-	
-	private boolean   _projectHaveV1JSFLibraries; // = false;
-	private IProject  _iproject;
-
-	private static final String IMPL_DESC = Messages.JSFLibrariesPreferencePage_IMPL_DESC;
-	
-	/**
-	 * Zero arg constructor
-	 */
-	public JSFLibraryContainerWizardPage(){
-        super(Messages.JSFLibraryContainerWizardPage_PageName);        
-        setTitle(Messages.JSFLibraryContainerWizardPage_Title);
-        setDescription(Messages.JSFLibraryContainerWizardPage_Description);
-        // TODO: Replace with a custom image.
-        setImageDescriptor( JSFUiPlugin.getImageDescriptor("full/wizban/addlibrary_wiz.gif")); //$NON-NLS-1$
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension#initialize(org.eclipse.jdt.core.IJavaProject, org.eclipse.jdt.core.IClasspathEntry[])
-	 */
-	public void initialize(IJavaProject project, IClasspathEntry[] currentEntries_) {
-		this.currentEntries = currentEntries_;
-
-        _iproject = project.getProject();
-        this.isJSFProject = JSFAppConfigUtils.isValidJSFProject(_iproject);
-        if (this.isJSFProject)
-		{
-			_projectHaveV1JSFLibraries = 
-			    JSFLibraryRegistryUtil.doesProjectHaveV1JSFLibraries(_iproject);
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.ui.wizards.IClasspathContainerPage#finish()
-	 */
-	public boolean finish() {
-	    boolean finish = true;
-	    if (_projectHaveV1JSFLibraries)
-	    {
-	        // if the user doesn't want to confirm, back off on the change
-	        // and let them decide if they want to hit cancel
-	        finish = WarningMessageDialog.
-	            openConfirm(getShell()
-	                        , Messages.JSFLibraryContainerWizardPage_V1Registry_Warning_DialogTitle
-	                        , Messages.JSFLibraryContainerWizardPage_V1Registry_Warning_DialogText);
-	        
-	        if (finish)
-	        {
-	            JSFLibraryRegistryUtil.removeV1JSFLibraryProperty(Collections.singletonList(_iproject));
-	        }
-	    }
-		return finish;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.ui.wizards.IClasspathContainerPageExtension2#getNewContainers()
-	 */
-	public IClasspathEntry[] getNewContainers() {
-		IPath cp = new Path(JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID);
-		List res = new ArrayList();
-		Object[] items = lv.getCheckedElements();
-		for (int i=0;i<items.length;i++){
-			JSFLibrary jsfLib = (JSFLibrary)items[i];
-			if (getSelectedJSFLibariesForProject().get(jsfLib.getID()) == null){
-				IPath path = cp.append(new Path(jsfLib.getID()));
-				IClasspathEntry entry = JavaCore.newContainerEntry(path);
-				// need to update wtp dependency in j2ee mod dependency ui
-				res.add(entry);
-			}
-		}
-		return (IClasspathEntry[])res.toArray(new IClasspathEntry[]{});
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		if (!isJSFProject) {
-			return false;
-		}
-		if (isEditReference() && ! selectionHasChanged())
-			return false;
-		
-		return isValid();
-	}
-
-	private boolean isValid() {		
-		return isCheckedItems() && getErrorMessage() == null;
-	}
-
-	//to be used to know whether the selected library has changed when in "edit" mode
-	private boolean selectionHasChanged() {
-		JSFLibrary lib = getCurrentLibrarySelection();
-		if (lib == null)
-			return false;
-		
-		return (getJSFLibraryForEdit(containerEntry) != lib) ;
-
-	}
-
-	private JSFLibrary getCurrentLibrarySelection() {
-		JSFLibrary lib = null;
-		StructuredSelection ssel = (StructuredSelection)lv.getSelection();
-		if (ssel != null && !ssel.isEmpty()){
-			lib = (JSFLibrary)ssel.getFirstElement();
-		}
-		return lib;
-	}
-
-	private boolean isCheckedItems() {		
-		return lv.getCheckedElements().length > 0;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.ui.wizards.IClasspathContainerPage#getSelection()
-	 */
-	public IClasspathEntry getSelection() {
-		IClasspathEntry entry = null;
-		if (isEditReference()){
-			if (lv.getCheckedElements().length == 0)
-				return containerEntry;
-						
-			JSFLibrary lib = (JSFLibrary)lv.getCheckedElements()[0];
-			if (lib != null){
-				if (lib == getJSFLibraryForEdit(containerEntry))
-				{
-					return containerEntry;
-				}
-                IPath path = new Path(JSFLibraryConfigurationHelper.JSF_LIBRARY_CP_CONTAINER_ID).append(new Path(lib.getID()));
-                entry = JavaCore.newContainerEntry(path, containerEntry.getAccessRules(), containerEntry.getExtraAttributes(),containerEntry.isExported());
-			}			
-		}
-		return entry;
-
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.ui.wizards.IClasspathContainerPage#setSelection(org.eclipse.jdt.core.IClasspathEntry)
-	 */
-	public void setSelection(IClasspathEntry containerEntry) {
-		//this is signalling that this is an "edit"
-		this.containerEntry = containerEntry;
-	}
-
-	public void createControl(Composite parent) {
-		//Build UI to display JSF Lib components from registry
-		Composite c = new Composite(parent, SWT.NONE);
-		c.setLayout(new GridLayout(2, false));
-		c.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		//disable wizard if this is not a valid JSF project
-		if (!isJSFProject){
-			Label warning = new Label(c , SWT.NONE);
-			warning.setText(Messages.JSFLibraryContainerWizardPage_WarningNoJSFFacet);
-			setControl(c);			
-			return;
-		}
-
-		Label lblViewer = new Label(c, SWT.NONE);
-		lblViewer.setText(Messages.JSFLibraryContainerWizardPage_JSFLibraries);
-		GridData gd1 = new GridData(GridData.BEGINNING);
-		gd1.horizontalSpan = 2;
-		lblViewer.setLayoutData(gd1);
-
-		lv = createTableViewer(c);
-		lv.getControl().setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		lvAdapter = new JSFLibrariesTableViewerAdapter();
-		lvLabelProvider = new JSFLibrariesListLabelProvider();
-		lv.setContentProvider(lvAdapter);
-		lv.setLabelProvider(lvLabelProvider);
-		lv.addSelectionChangedListener(lvAdapter);
-		lv.addDoubleClickListener(lvAdapter);
-		lv.setComparator(lvAdapter);
-		
-		Composite buttons = new Composite(c, SWT.NONE);
-		buttons.setLayout(new GridLayout(1, false));
-		buttons.setLayoutData(new GridData(GridData.FILL_VERTICAL));
-		
-		final Button addButton = new Button(buttons, SWT.NONE);
-		addButton.setText(Messages.JSFLibraryContainerWizardPage_Add);
-		addButton.setLayoutData(new GridData(GridData.END | GridData.VERTICAL_ALIGN_BEGINNING));
-		addButton.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e){
-				openJSFLibraryWizard(null);				
-			}
-		});
-		
-		final Button editButton = new Button(buttons, SWT.NONE);
-		editButton.setText(Messages.JSFLibraryContainerWizardPage_Edit);
-		editButton.setLayoutData(new GridData(GridData.END | GridData.VERTICAL_ALIGN_BEGINNING));
-		editButton.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e){
-				StructuredSelection sel = (StructuredSelection)lv.getSelection();
-				if ((sel == null || sel.isEmpty()) && containerEntry != null){
-					JSFLibrary jsfLib = getJSFLibraryForEdit(containerEntry);
-					sel = new StructuredSelection(jsfLib);
-				}
-				openJSFLibraryWizard(sel);				
-			}
-
-		});
-		editButton.setVisible(false);
-		lv.addSelectionChangedListener(new ISelectionChangedListener(){
-			public void selectionChanged(SelectionChangedEvent event) {
-				setEditButton(event.getSelection());
-			}
-
-			private void setEditButton(final ISelection selection) {
-				IStructuredSelection sel = (IStructuredSelection)selection;
-				editButton.setVisible(sel.size()==1);		
-				if (sel.size() == 1){					
-					JSFLibrary lib = (JSFLibrary)sel.getFirstElement();
-					boolean pp = lib instanceof PluginProvidedJSFLibrary;
-					editButton.setEnabled(! pp);
-					if (isEditReference()){
-						lv.setAllChecked(false);
-						lv.setChecked(lib, true);
-					}
-				}
-				
-			}			
-		});
-		setControl(c);
-		
-		if (isEditReference()){
-			JSFLibrary lib = getJSFLibraryForEdit(containerEntry);
-			lv.setInput(getAllUnselectedJSFLibrariesExceptReferencedLib(lib));	
-			selectAndCheckCurrentLib(lib);
-			setDescription(Messages.JSFLibraryContainerWizardPage_EditLibrary_DescriptionText);
-		} 
-		else {
-			lv.setInput(getAllJSFLibraries());		
-			lv.setCheckedElements(getSelectedJSFLibariesForProject().values().toArray(new Object[0]));
-		}
-	}
-
-	private void selectAndCheckCurrentLib(final JSFLibrary lib) {
-		if (lib != null){
-			StructuredSelection ssel = new StructuredSelection(lib);	
-			lv.setSelection(ssel);
-			lv.setChecked(lib, true);
-		}
-	}
-
-	private Object getAllUnselectedJSFLibrariesExceptReferencedLib(JSFLibrary referenceLib) {
-		List allLibs = getAllJSFLibraries();
-		Collection selLibs = getSelectedJSFLibariesForProject().values();
-		for (Iterator it=selLibs.iterator();it.hasNext();){
-			JSFLibrary aLib = (JSFLibrary)it.next();
-			int i= allLibs.indexOf(aLib);
-			//remove from allLibs unless it is the selected reference
-			if (i >= 0 && ((referenceLib == null) || (aLib != null && ! aLib.getID().equals(referenceLib.getID())))){
-				allLibs.remove(i);
-			}
-		}
-		return allLibs;
-	}
-
-	private List getJSFLibraryEntries(IClasspathEntry[] entries) {
-		List jsfLibs = new ArrayList();
-		for (int i=0;i<entries.length;i++){
-			IClasspathEntry entry = entries[i];
-			if (JSFLibraryConfigurationHelper.isJSFLibraryContainer(entry)){
-				JSFLibrary lib = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry(). getJSFLibraryByID(getLibraryId(entry));
-				if (lib != null){
-					jsfLibs.add(lib);
-				}
-			}
-		}
-		
-		return jsfLibs;
-	}
-
-	private String getLibraryId(IClasspathEntry entry) {
-		return entry.getPath().segment(1);
-	}
-
-	private void openJSFLibraryWizard(IStructuredSelection element){
-		IWorkbenchWizard wizard = new JSFLibraryWizard();
-		IWorkbench wb = PlatformUI.getWorkbench();
-		wizard.init(wb, element);
-		WizardDialog dialog = new WizardDialog(wb.getActiveWorkbenchWindow().getShell(), wizard);
-		int ret = dialog.open();
-		if (ret == Window.OK){
-			//FIXME: select returned object
-			if (containerEntry == null){
-				lv.setInput(getAllJSFLibraries());				
-			}
-			else {
-				lv.setInput(getAllUnselectedJSFLibrariesExceptReferencedLib(getJSFLibraryForEdit(containerEntry)));
-				lv.refresh(true);
-			}
-			lv.refresh();
-		}
-	}
-	
-	private CheckboxTableViewer createTableViewer(Composite parent) {
-		Table table= new Table(parent, SWT.CHECK | SWT.BORDER | SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
-		table.setFont(parent.getFont());
-		CheckboxTableViewer tableViewer= new CheckboxTableViewer(table);
-		tableViewer.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent e) {
-				if (! isEditReference()){
-					//ensure that existing CP entries cannot be unchecked
-					if (getSelectedJSFLibariesForProject().get(((JSFLibrary)e.getElement()).getID()) != null){
-						if (containerEntry == null)
-							e.getCheckable().setChecked(e.getElement(), true);
-						else
-							lv.setAllChecked(true);
-					}
-				}
-				else {
-					//select only one
-					lv.setAllChecked(false);
-					lv.setChecked(e.getElement(), true);
-					if (isEditReference())
-						lv.setSelection(new StructuredSelection(e.getElement()));
-				}
-				validate();				
-			}
-		});
-		return tableViewer;
-	}
-
-	private Map getSelectedJSFLibariesForProject(){
-		if (_currentLibs == null){
-			List allLibs = getAllJSFLibraries();
-			List curLibs = getJSFLibraryEntries(currentEntries);
-			_currentLibs = new HashMap(curLibs.size());
-			for (Iterator it=curLibs.iterator();it.hasNext();){
-				JSFLibrary lib = (JSFLibrary)it.next();
-				int index = getIndex(allLibs, lib);
-				if (index >=0)
-					_currentLibs.put(lib.getID(), allLibs.get(index));
-			}
-					
-		}
-		return _currentLibs;
-	}
-	
-	private List getAllJSFLibraries() {
-		List allLibs = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getAllJSFLibraries();
-
-		return allLibs;
-	}
-
-
-	private JSFLibrary getJSFLibraryForEdit(
-			IClasspathEntry containerEntry_) {
-		if (currentLib == null){
-			String id = getLibraryId(containerEntry_);
-			currentLib = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getJSFLibraryByID(id);	
-		}
-		return currentLib;
-
-	}
-	
-	private int getIndex(List libs, JSFLibrary lib) {
-		for (int i=0;i<libs.size();i++){
-			if (lib.getID().equals(((JSFLibrary)libs.get(i)).getID()))
-				return i;
-		}
-		return -1;
-	}
-
-	private class JSFLibrariesTableViewerAdapter extends ViewerComparator implements IStructuredContentProvider, ISelectionChangedListener, IDoubleClickListener {
-
-		private Object input;
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			input = newInput;
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IContentProvider#dispose()
-		 */
-		public void dispose() {
-            // do nothing
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IStructuredContentProvider#getElements(java.lang.Object)
-		 */
-		public Object[] getElements(Object inputElement) {		
-			return ((List)input).toArray();
-		}		
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
-		 */
-		public void selectionChanged(SelectionChangedEvent event) {
-			if (isEditReference()){
-				setPageComplete(isPageComplete());
-			}
-			
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.viewers.IDoubleClickListener#doubleClick(org.eclipse.jface.viewers.DoubleClickEvent)
-		 */
-		public void doubleClick(DoubleClickEvent event) {
-			doDoubleClick(event);
-		}
-		
-		public int compare(Viewer viewer, Object e1, Object e2) {
-			JSFLibrary lib1 = (JSFLibrary)e1;
-			JSFLibrary lib2 = (JSFLibrary)e2;
-			
-			//sort first by in selection already and then by name
-			boolean lib1Sel = getSelectedJSFLibariesForProject().get(lib1.getID())!=null;
-			boolean lib2Sel = getSelectedJSFLibariesForProject().get(lib2.getID())!= null;
-			
-			if ((lib1Sel && lib2Sel) || (!lib1Sel && !lib2Sel) ){
-				return getComparator().compare(lib1.getLabel(), lib2.getLabel());
-			}
-			else if (lib1Sel)
-				return -1;
-			else
-				return 1;
-		}
-	}
-	
-	private class JSFLibrariesListLabelProvider implements ILabelProvider{		
-		Image libImg;
-		public Image getImage(Object element) {
-			if (libImg == null){
-				ImageDescriptor libImgDesc = JSFUiPlugin.getImageDescriptor("obj16/library_obj.gif"); //$NON-NLS-1$
-				libImg = libImgDesc.createImage();
-			}
-			return libImg;
-		}
-
-		public String getText(Object element) {
-			if (element instanceof JSFLibrary) {
-				JSFLibrary lib = (JSFLibrary)element;
-				if (lib.isImplementation()) {
-					return lib.getLabel() + " " + IMPL_DESC; //$NON-NLS-1$
-				}
-                return lib.getLabel();
-			}
-			return null;
-		}
-
-		public void dispose() {
-			if (libImg != null)
-				libImg.dispose();
-		}
-
-		public void addListener(ILabelProviderListener listener) {		
-            // no listener support
-		}
-
-		public boolean isLabelProperty(Object element, String property) {
-			return false;
-		}
-
-		public void removeListener(ILabelProviderListener listener) {
-            // no listener support
-		}
-	}
-	
-	private void validate() {
-		setErrorMessage(null);
-		int implChosenCount = implSelectedCount();
-		if (implChosenCount>1){
-			setErrorMessage(Messages.JSFLibraryContainerWizardPage_ImplAlreadyPresent);
-		}
-        setPageComplete(isPageComplete());
-	}
-
-
-	private boolean isEditReference() {
-		return (containerEntry != null);		
-	}
-
-	private int implSelectedCount() {
-		int count = 0;
-		for (int i=0;i<lv.getCheckedElements().length;i++){
-			JSFLibrary lib = (JSFLibrary)lv.getCheckedElements()[i];
-			if (lib.isImplementation())
-				count++;
-		}
-		return count;
-	}
-
-	private void doDoubleClick(DoubleClickEvent event) {
-		StructuredSelection ssel = (StructuredSelection)event.getSelection();
-		if (ssel != null && 
-				(! ((JSFLibrary)ssel.getFirstElement() instanceof PluginProvidedJSFLibrary)))
-			openJSFLibraryWizard((IStructuredSelection)event.getSelection());
-	}
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryEditControl.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryEditControl.java
deleted file mode 100644
index e751dd9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryEditControl.java
+++ /dev/null
@@ -1,499 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.CCombo;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Common control for adding JSF library instances
- */
-public class JSFLibraryEditControl extends Composite implements ModifyListener, SelectionListener {
-	private static final String MISSING = Messages.JSFLibrariesPreferencePage_MISSING_DESC;
-	private Text txtName;
-	private Label lblName;
-	private CCombo cboVersions;
-	private Label lblVersions;
-	private Button chkDeploy;
-	private Button chkImpl;
-	private Composite btnBar;
-	private Button btnAdd;
-	private Button btnRemove;
-	private TableViewer jars;
-	
-	private boolean initing = false;
-
-	private JSFLibrary workingCopyLibrary;
-	
-	private String validationMsg;
-	private Set _listeners;
-	private int _isNew = -1;//use isNew() method.. not this variable directly
-
-	/**
-	 * @param workingCopyLibrary  working copy of the JSF library
-	 * @param parent parent SWT control
-	 */
-	public JSFLibraryEditControl(JSFLibrary workingCopyLibrary, Composite parent){
-		super(parent, SWT.NONE);
-		this.workingCopyLibrary = workingCopyLibrary;
-		_listeners = new HashSet(1);
-		createControl(parent);
-	}
-	
-	/**
-	 * @param listener
-	 */
-	public void addValidationListener(JSFLibraryValidationListener listener){
-		removeValidationListener(listener);
-		_listeners.add(listener);
-	}
-	
-	/**
-	 * @param listener
-	 */
-	public void removeValidationListener(JSFLibraryValidationListener listener){
-		_listeners.remove(listener);
-	}
-	
-	/**
-	 * @param parent
-	 */
-	public void createControl(Composite parent) {
-		initing = true;
-
-//		this = new Composite(parent, SWT.NONE);
-		this.setLayout(new GridLayout(2, false));
-		this.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		lblName = new Label(this, SWT.NONE);
-		lblName.setText(Messages.JSFLibraryWizard_LibraryName);
-		lblName.setLayoutData(new GridData(GridData.BEGINNING));
-
-		txtName = new Text(this, SWT.BORDER);
-		txtName.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		txtName.addModifyListener(this);
-
-		lblVersions = new Label(this, SWT.NONE);
-		lblVersions.setText(Messages.JSFLibraryWizard_VersionSupported);
-
-		cboVersions = new CCombo(this, SWT.SINGLE | SWT.READ_ONLY | SWT.BORDER);
-		cboVersions.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		cboVersions.addModifyListener(this);
-
-		Group jarsComp = new Group(this, SWT.NONE);
-		jarsComp.setText(Messages.JSFLibraryWizard_LibraryJars);
-		GridLayout gl1 = new GridLayout(2, false);
-		jarsComp.setLayout(gl1);
-		GridData gd2 = new GridData(GridData.FILL_HORIZONTAL
-				| GridData.FILL_VERTICAL);
-		gd2.horizontalSpan = 2;
-		jarsComp.setLayoutData(gd2);
-
-		createJarsViewer(jarsComp);
-
-		createButtons(jarsComp);
-
-		chkImpl = new Button(this, SWT.CHECK);
-		chkImpl.setText(Messages.JSFLibraryWizard_IsJSFImplementation);
-		GridData gd3 = new GridData();
-		gd3.horizontalSpan = 2;
-		chkImpl.setLayoutData(gd3);
-		chkImpl.addSelectionListener(this);
-
-		chkDeploy = new Button(this, SWT.CHECK);
-		chkDeploy.setText(Messages.JSFLibraryWizard_DeployJars);
-		GridData gd4 = new GridData();
-		gd4.horizontalSpan = 2;
-		chkDeploy.setLayoutData(gd4);
-//		chkDeploy.addSelectionListener(this);
-		chkDeploy.setVisible(false);
-
-		loadVersions();
-
-		if (!isNew()) {
-			txtName.setText(workingCopyLibrary.getName());
-			if (workingCopyLibrary.getJSFVersion().getName().equals(JSFVersion.UNKNOWN_LITERAL.getName())) {
-				cboVersions.setText(Messages.JSFLibraryEditControl_ImplVersion_UNKNOWN);
-			} else {
-				cboVersions.setText(workingCopyLibrary.getJSFVersion().getName());
-			}
-			chkDeploy.setSelection(workingCopyLibrary.isDeployed());
-			chkImpl.setSelection(workingCopyLibrary.isImplementation());
-		}
-		jars.setInput(workingCopyLibrary);
-
-		initing = false;
-
-		txtName.setFocus();
-	}
-
-	private void createJarsViewer(Group jarsComp) {
-		jars = new TableViewer(jarsComp, SWT.BORDER | SWT.MULTI);
-		jars.setContentProvider(new IStructuredContentProvider() {
-			public Object[] getElements(Object inputElement) {
-				if (inputElement instanceof JSFLibrary)
-					return ((JSFLibrary) inputElement).getArchiveFiles()
-							.toArray();
-				return new Object[0];
-			}
-
-			public void dispose() {
-                // do nothing
-			}
-
-			public void inputChanged(Viewer viewer, Object oldInput,
-					Object newInput) {
-				// won't happen
-			}
-		});
-		jars.setLabelProvider(new ILabelProvider() {
-			private Image jarImg = null;
-			public Image getImage(Object element) {
-				if (jarImg == null){
-					ImageDescriptor desc = JSFUiPlugin.getImageDescriptor("obj16/jar_obj.gif"); //$NON-NLS-1$
-					jarImg = desc.createImage();
-				}
-				return jarImg;
-			}
-
-			public String getText(Object element) {
-				StringBuffer labelBuf = new StringBuffer();
-				if (element instanceof ArchiveFile) {
-					ArchiveFile archive = (ArchiveFile) element;
-					labelBuf.append(archive.getName());	
-					if (!archive.exists())
-						labelBuf.append(MISSING); 
-					labelBuf.append(" - ").append(archive.getPath()); //$NON-NLS-1$
-				}
-				return labelBuf.toString();
-			}
-
-			public void addListener(ILabelProviderListener listener) {
-                // no listeners supported
-			}
-
-			public void dispose() {
-				if (jarImg != null)
-					jarImg.dispose();
-			}
-
-			public boolean isLabelProperty(Object element, String property) {
-				return false;
-			}
-
-			public void removeListener(ILabelProviderListener listener) {
-                // no listeners supported
-			}
-		});
-
-		jars.addSelectionChangedListener(new ISelectionChangedListener(){
-			public void selectionChanged(SelectionChangedEvent event){
-				updateButtons();
-			}
-		});
-		
-		GridData gd = new GridData(GridData.FILL_BOTH);
-//		gd.widthHint = convertWidthInCharsToPixels(30);
-//		gd.heightHint = convertHeightInCharsToPixels(10);
-		jars.getControl().setLayoutData(gd);
-	}
-
-	private void updateButtons() {
-		btnRemove.setEnabled(!((StructuredSelection)jars.getSelection()).isEmpty());
-		// getButton(IDialogConstants.OK_ID).setEnabled(modified);
-	}
-
-	private void createButtons(Composite c) {
-		btnBar = new Composite(c, SWT.NONE);
-		GridLayout gl = new GridLayout(1, false);
-		gl.marginHeight = 0;
-		gl.marginTop = 0;
-		gl.marginWidth = 0;
-		btnBar.setLayout(gl);
-		btnBar.setLayoutData(new GridData(GridData.END));
-
-		btnAdd = new Button(btnBar, SWT.NONE);
-		btnAdd.setText(Messages.JSFLibraryWizard_Add);
-		btnAdd.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		btnAdd.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				String cur = null;
-				String[] chosenJars = openExtJarFileDialog(cur);
-				if (chosenJars != null) {
-					for (int i = 0; i < chosenJars.length; i++) {
-						String jar = chosenJars[i];
-						if (!workingCopyLibrary.containsArchiveFile(jar)) {
-							ArchiveFile archive = JSFLibraryRegistryFactory.eINSTANCE
-								.createArchiveFile();
-							archive.setSourceLocation(jar);
-							archive.setRelativeDestLocation("WEB-INF/lib"); //$NON-NLS-1$
-							workingCopyLibrary.getArchiveFiles().add(archive);
-						}
-					}
-					jars.refresh();
-					validate();
-				}
-			}
-		});
-
-		btnRemove = new Button(btnBar, SWT.NONE);
-		btnRemove.setEnabled(false);
-		btnRemove.setText(Messages.JSFLibraryWizard_Remove);
-		btnRemove.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		btnRemove.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (jars.getSelection() instanceof StructuredSelection){
-					StructuredSelection objs = (StructuredSelection)jars.getSelection();
-					if (objs != null){
-						Iterator it = objs.iterator();
-						 while (it.hasNext()){
-							 Object obj = it.next();
-							 ArchiveFile jar = (ArchiveFile)obj;
-							 workingCopyLibrary.getArchiveFiles().remove(jar);							 
-						 }
-					}
-					jars.refresh();
-					validate();
-				}
-			}
-		});
-	}
-
-	private void loadVersions() {
-		cboVersions.removeAll();
-		Iterator it = JSFVersion.VALUES.iterator();
-		while (it.hasNext()) {
-			JSFVersion ver = (JSFVersion) it.next();
-			if (ver.getName().equals(JSFVersion.UNKNOWN_LITERAL.getName())) {
-				cboVersions.add(Messages.JSFLibraryEditControl_ImplVersion_UNKNOWN);
-			} else {
-				cboVersions.add(ver.getName());
-			}
-		}
-	}
-
-	private String[] openExtJarFileDialog(String existing) {
-		String title = Messages.JSFLibraryWizard_ExtJarFileDialogTitle;
-
-		FileDialog dialog = new FileDialog(getShell(),
-				existing == null ? SWT.MULTI : SWT.SINGLE);
-		dialog.setText(title);
-		dialog.setFilterExtensions(new String[] { "*.jar;*.zip" }); //$NON-NLS-1$
-		// FIXME: remember and use last path chosen??
-		String filterPath = ResourcesPlugin.getWorkspace().getRoot()
-				.getFullPath().toString();
-		dialog.setFilterPath(filterPath);
-		// if (existing != null) {
-		// dialog.setFileName(existing.getPath().lastSegment());
-		// }
-
-		String res = dialog.open();
-		if (res == null) {
-			return null;
-		}
-		String[] fileNames = dialog.getFileNames();
-		String[] elems = new String[fileNames.length];
-		IPath file = new Path(res);
-		IPath apath = file.removeLastSegments(1);
-		for (int i = 0; i < fileNames.length; i++) {
-			elems[i] = apath.append(fileNames[i]).toString();
-		}
-		return elems;
-	}	
-
-	public void modifyText(ModifyEvent e) {
-		validate();
-		updateButtons();	
-	}
-
-	private void fireValidateEvent(final JSFLibraryValidationEvent jSFLibraryValidationEvent) {
-		new Runnable(){
-			public void run() {
-				for (Iterator it=_listeners.iterator();it.hasNext();){
-					JSFLibraryValidationListener listener = (JSFLibraryValidationListener)it.next();
-					listener.notifyValidation(jSFLibraryValidationEvent);
-				}
-			}
-		}.run();
-	}
-
-
-	public void widgetSelected(SelectionEvent e) {
-		validate();
-		updateButtons();
-	}
-
-	public void widgetDefaultSelected(SelectionEvent e) {
-        // no handling for default selection
-	}
-
-	private void validate() {
-		if (initing)
-			return;
-		validationMsg = null;
-//		setPageComplete(true);
-		if (!validateName() || !validateJars() || !validateVersion()) {
-//			setPageComplete(false);
-		}
-		fireValidateEvent(new JSFLibraryValidationEvent(validationMsg));
-	}
-	
-	private boolean validateJars() {
-		if (workingCopyLibrary.getArchiveFiles().isEmpty()) {
-			validationMsg = Messages.JSFLibraryWizard_ValidateNoJars;
-			return false;
-		}
-		return true;
-	}
-	
-	private boolean validateVersion() {
-		//FIXME: why isn't selection indesx correct???
-	//	if (cboVersions.getSelectionIndex() < 0) {
-	//		setErrorMessage("Choose the maximum JSF version supported if known.");
-	//		return false;
-	//	}
-		return true;
-	}
-	
-	private boolean validateName() {
-		if (txtName.getText() == null
-				|| txtName.getText().trim().equals("")) { //$NON-NLS-1$
-			validationMsg = Messages.JSFLibraryWizard_ValidateNoLibraryName;
-			return false;
-		}
-		String aName = txtName.getText().trim();
-		if (isNew() || (!isNew() && !getCurrentLibraryName().equals(aName))) {
-			if (isNameInRegistry(JSFLibraryRegistryUtil.getInstance()
-					.getJSFLibraryRegistry().getAllJSFLibraries(), aName)) {
-				validationMsg = Messages.JSFLibraryWizard_ValidateExistingLibraryName;
-				return false;
-			}
-		}
-		return true;
-	}
-	
-	private boolean isNew() {
-		if (_isNew == -1){
-			_isNew = workingCopyLibrary.getName() == null ? 1 : 0;
-		}
-		return _isNew == 1;
-	}
-
-	private String getCurrentLibraryName() {
-		return workingCopyLibrary.getName();		
-	}
-
-	private boolean isNameInRegistry(Collection c, String name) {
-		Iterator it = c.iterator();
-		while (it.hasNext()) {
-			JSFLibrary lib = (JSFLibrary) it.next();
-			if (lib.getName().equals(name)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @return the trimmed name of the user input for jsf library name
-	 */
-	public String getJSFLibraryName() {		
-		return txtName.getText().trim();
-	}
-
-
-	/**
-	 * @return the value of the user input for the isDeployed checkbox
-	 */
-	public boolean getIsDeployed() {		
-		return chkDeploy.getSelection();
-	}
-
-
-	/**
-	 * @return the value of the user input for the isJSFImplementation checkbox
-	 */
-	public boolean getIsImplementation() {
-		return chkImpl.getSelection();
-	}
-
-	/**
-	 * @return the jsf version selected in the version dropping
-	 */
-	public JSFVersion getJSFVersion() {
-		if (cboVersions.getSelectionIndex() >= 0) {
-			JSFVersion ver = (JSFVersion) JSFVersion.VALUES.get(cboVersions
-					.getSelectionIndex());
-			return ver;
-		}
-		return JSFVersion.UNKNOWN_LITERAL;
-	}
-
-	/**
-	 * @param implsOnly
-	 */
-	public void setImplOnly(boolean implsOnly) {
-		if (implsOnly){
-			chkImpl.setSelection(true);
-			chkImpl.setEnabled(false);
-		}
-	}
-	
-	/**
-	 * @param nonImplsOnly
-	 */
-	public void setNonImplOnly(boolean nonImplsOnly) {
-		if (nonImplsOnly){
-			chkImpl.setSelection(false);
-			chkImpl.setEnabled(false);
-		}
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryValidationEvent.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryValidationEvent.java
deleted file mode 100644
index a869d0a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryValidationEvent.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import org.eclipse.core.runtime.IStatus;
-
-/**
- * Validation event used by JSFLibraryControl to notify containers of updates
- *
- */
-public class JSFLibraryValidationEvent {
-	private String msg;
-	private int severity;
-	
-	/**
-	 * Constructor
-	 * @param msg
-	 * @param severity - IStatus int value
-	 */
-	public JSFLibraryValidationEvent(String msg, int severity) {
-		this.msg = msg;
-		this.severity = severity;
-	}
-	
-	/**
-	 * Constructs event with severity of IStatus.ERROR
-	 * @param msg
-	 */
-	public JSFLibraryValidationEvent(String msg) {
-		this(msg, IStatus.ERROR);
-	}
-	
-	/**
-	 * @return validation message
-	 */
-	public String getMessage(){
-		return msg;
-	}
-	
-	/**
-	 * @return IStatus int value
-	 */
-	public int getSeverity(){
-		return severity;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryWizard.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryWizard.java
deleted file mode 100644
index bfab216..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryWizard.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the 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:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistryFactory;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFVersion;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-
-/**
- * Dialog for creating or editing a JSF Library or Implementation.
- * <br>
- * If the selection passed in init is not null then the item will be edit mode.
- * 
- * @author Gerry Kessler - Oracle
- */
-public class JSFLibraryWizard extends Wizard implements INewWizard {
-
-	/**
-	 * Implementation libaries to be included
-	 */
-	public static int IMPLS = 1;
-	/**
-	 * Non-Implementation libaries to be included
-	 */
-	public static int NONIMPLS = 2;
-	
-	private JSFLibraryEditControl jsfLibraryEditControl;
-	
-	private boolean isNew = false;
-	private boolean modified = false;
-
-	private JSFLibrary curLibrary;
-	private JSFLibrary workingCopyLibrary;
-
-	private JSFLibraryWizardPage page;
-
-	private static final String DESCRIPTION = Messages.JSFLibraryWizard_DESCRIPTION;
-	private static final String IMPLS_ONLY_DESC = Messages.JSFLibraryWizard_IMPLS_ONLY_DESC;
-
-	private boolean _impls;	
-	private boolean _nonimpls;
-	
-    private List<IProject>        _projectsWithV1JSFLibraries = new ArrayList<IProject>();
-	
-	/**
-	 * Constructor
-	 * see IMPLS
-	 * see NONIMPLS
-	 * @param libTypes 
-	 */
-	public JSFLibraryWizard(int libTypes) {
-		super();
-		if ((libTypes & IMPLS) == IMPLS)
-			_impls = true;
-
-		if ((libTypes & NONIMPLS) == NONIMPLS)
-			_nonimpls = true;
-	}
-
-	
-	/**
-	 * Constructor.   List will include all JSF Libraries.
-	 */
-	public JSFLibraryWizard() {
-		super();
-		_impls = true;
-		_nonimpls = true;
-	}
-
-	private boolean isImplsOnly(){
-		if (_impls && ! _nonimpls)
-			return true;
-		return false;		
-	}
-	
-	private boolean isNonImplsOnly(){
-		if (_nonimpls && ! _impls)
-			return true;
-		return false;		
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench, org.eclipse.jface.viewers.IStructuredSelection)
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) 
-	{
-	    initV1LibrariesList();
-	    
-		if (selection != null
-				&& selection.getFirstElement() instanceof JSFLibrary) {
-			curLibrary = (JSFLibrary) selection.getFirstElement();
-			workingCopyLibrary = curLibrary.getWorkingCopy();
-		} else {
-			isNew = true;
-			workingCopyLibrary = JSFLibraryRegistryFactory.eINSTANCE.createJSFLibrary();
-		}
-		if (isImplsOnly()) {
-			setWindowTitle(Messages.JSFLibraryWizard_CreateImplementation);
-		} else {
-			setWindowTitle(isNew ? Messages.JSFLibraryWizard_CreateJSFLibrary : Messages.JSFLibraryWizard_EditJSFLibrary);
-		}
-	}
-
-	private void initV1LibrariesList()
-	{
-        final IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
-        
-        // loop through the workspace and look for projects that are still using the V1 way
-        // of doing JSF libraries
-        for (int i = 0; i < projects.length; i++)
-        {
-            final IProject project = projects[i];
-            if (JSFLibraryRegistryUtil.doesProjectHaveV1JSFLibraries(project))
-            {
-                _projectsWithV1JSFLibraries.add(project);
-            }
-        }
-    }
-
-	/**
-	 * Updates the JSF Library instance with the values from the working copy and 
-	 * persists the registry.
-	 * 
-	 * If editing a library reference, referencing java models will be updated.
-	 *  
-	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
-	 */
-	public boolean performFinish() 
-	{
-	    // on init, if we detected any projects with old library
-	    // refs, we need to warn the user
-	    if (!isNew &&  // can ignore new libraries, since old projects can't possibly have dependencies on them
-	            _projectsWithV1JSFLibraries.size() > 0)
-	    {
-	        String  projectNames = ""; //$NON-NLS-1$
-	        for (Iterator<IProject> it = _projectsWithV1JSFLibraries.iterator(); it.hasNext();)
-	        {
-	            IProject project = it.next();
-	            projectNames += project.getName() + ","; //$NON-NLS-1$
-	        }
-	        // trim trailing comma
-	        if (projectNames.length() > 0)
-	        {
-	            projectNames = projectNames.substring(0, projectNames.length()-1);
-	        }
-	        
-	        final String messageText = MessageFormat.format(Messages.JSFLibraryWizard_V1JSFLibrary_DialogMessage,
-	                                        new Object[] {projectNames});
-	        MessageDialogWithToggle dialog = 
-	            WarningMessageDialogWithToggle.openOkCancelConfirm
-	                (getShell(), Messages.JSFLibraryWizard_V1JSFLibrary_DialogTitle, messageText, Messages.JSFLibraryWizard_JSFLibraryWizard_DontShowThisAgain_CheckBoxLabel, false, null, null);
-	        if (dialog.getReturnCode() != IDialogConstants.OK_ID)
-	        {
-	            // abort if the user doesn't really want to commit this change
-	            return false;
-	        }
-
-	        // if user accepted and asked not be warned again, clear the 
-	        // the project properties.
-	        if (dialog.getToggleState())
-            {
-	            JSFLibraryRegistryUtil.removeV1JSFLibraryProperty(_projectsWithV1JSFLibraries);
-            }
-	    }
-	    
-		final String name = jsfLibraryEditControl.getJSFLibraryName();
-		final boolean isDeployed = jsfLibraryEditControl.getIsDeployed();
-		final boolean isImplementation = jsfLibraryEditControl.getIsImplementation();
-		final JSFVersion version = jsfLibraryEditControl.getJSFVersion();
-		
-		workingCopyLibrary.setName(name);
-		workingCopyLibrary.setDeployed(isDeployed);
-		workingCopyLibrary.setImplementation(isImplementation);
-		workingCopyLibrary.setJSFVersion(version);
-		
-		final String originalID = curLibrary != null ? curLibrary.getID() :workingCopyLibrary.getID();
-		
-		if (isNew){
-			JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().addJSFLibrary(workingCopyLibrary);
-		}
-		else {
-			curLibrary.updateValues(workingCopyLibrary);
-			try {
-				JSFLibraryRegistryUtil.rebindClasspathContainerEntries(originalID, workingCopyLibrary.getID(), false, null);
-			} catch (JavaModelException e) {
-				JSFUiPlugin.log(IStatus.ERROR, "Exception while updating JSF Library containers", e); //$NON-NLS-1$
-			}
-		}
-		JSFLibraryRegistryUtil.getInstance().saveJSFLibraryRegistry();
-		return true;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.Wizard#addPages()
-	 */
-	public void addPages() {
-		page = new JSFLibraryWizardPage(Messages.JSFLibraryWizard_JSFLibrary);
-		super.addPage(page);
-		page.setWizard(this);
-	}
-
-	/**
-	 * @return the JSFLibrary being modified by this wizard
-	 */
-	public JSFLibrary getJSFLibrary() {
-		return workingCopyLibrary;
-	}
-
-	private class JSFLibraryWizardPage extends WizardPage {
-
-		/**
-		 * @param pageName
-		 */
-		protected JSFLibraryWizardPage(String pageName) {
-			super(pageName);
-			setDescription(isImplsOnly() ? IMPLS_ONLY_DESC : DESCRIPTION);
-			setTitle(Messages.JSFLibraryWizard_JSFLibrary);
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-		 */
-		public boolean isPageComplete() {
-			if (modified == false) {
-				return false;
-			}
-			return super.isPageComplete();
-		}
-
-		/* (non-Javadoc)
-		 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-		 */
-		public void createControl(Composite parent) {
-			initializeDialogUnits(parent);
-
-			jsfLibraryEditControl = new JSFLibraryEditControl(workingCopyLibrary, parent);
-			jsfLibraryEditControl.setImplOnly(isImplsOnly());
-			jsfLibraryEditControl.setNonImplOnly(isNonImplsOnly());
-			jsfLibraryEditControl.setLayout(new GridLayout(2, false));
-			jsfLibraryEditControl.setLayoutData(new GridData(GridData.FILL_BOTH));
-
-			jsfLibraryEditControl.addValidationListener(new JSFLibraryValidationListener(){
-				public void notifyValidation(JSFLibraryValidationEvent e) {
-					setErrorMessage(e.getMessage());
-					modified = true;
-					setPageComplete(getErrorMessage()==null);
-				}				
-			});
-
-			setControl(jsfLibraryEditControl);
-			setPageComplete(false);
-		}
-
-	}
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryWizardPage.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryWizardPage.java
deleted file mode 100644
index f2209f9..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/JSFLibraryWizardPage.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the 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:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.swt.widgets.Composite;
-
-/**
- * Dialog for creating or editing a JSF Library or Implementation.
- * <br>
- * If the selection passed in init is not null then the item will be edit mode.
- * 
- * @author Gerry Kessler - Oracle
- */
-public class JSFLibraryWizardPage extends WizardPage {
-
-	private boolean modified = false;
-	private JSFLibrary workingCopyLibrary;
-
-	private static final String DESCRIPTION = Messages.JSFLibraryWizard_DESCRIPTION;
-
-	/**
-	 * Constructor
-	 */
-	public JSFLibraryWizardPage(){
-		super("JSFLibrary"); //$NON-NLS-1$
-	}
-
-	/**
-	 * @return JSF Library working copy 
-	 */
-	public JSFLibrary getJSFLibrary() {
-		return workingCopyLibrary;
-	}
-
-	/**
-	 * Constructor
-	 * @param pageName
-	 */
-	public JSFLibraryWizardPage(String pageName) {
-		super(pageName);
-		setDescription(DESCRIPTION);//implsOnly ? IMPLS_ONLY_DESC : 
-		setTitle(Messages.JSFLibraryWizard_JSFLibrary);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.WizardPage#isPageComplete()
-	 */
-	public boolean isPageComplete() {
-		if (modified == false) {
-			return false;
-		}
-		return super.isPageComplete();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		initializeDialogUnits(parent);
-
-		JSFLibraryEditControl editControl = new JSFLibraryEditControl(workingCopyLibrary, parent);		
-		editControl.addValidationListener(new JSFLibraryValidationListener(){
-			public void notifyValidation(JSFLibraryValidationEvent e) {
-				setErrorMessage(e.getMessage());
-				modified = true;
-				setPageComplete(getErrorMessage()==null);					
-			}			
-		});
-		setControl(editControl);
-		setPageComplete(false);
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/WarningMessageDialog.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/WarningMessageDialog.java
deleted file mode 100644
index ad3b136..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/WarningMessageDialog.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleAdapter;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Customized warning dialog for JSF Library Upgrade warnings.
- * 
- * @author cbateman
- *
- */
-class WarningMessageDialog extends MessageDialog 
-{
-    private Text    _messageLabel;
-    
-    /**
-     * @param parent
-     * @param title
-     * @param message
-     * @return true if the user hit OK
-     * 
-     * Overriden to set the default button to CANCEL and use this dialog.
-     */
-    public static boolean openConfirm(Shell parent, String title, String message) {
-        MessageDialog dialog = new WarningMessageDialog(parent, title, null, // accept
-                // the
-                // default
-                // window
-                // icon
-                message, QUESTION, new String[] { IDialogConstants.OK_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 1); // CANCEL is the
-        // default
-        return dialog.open() == 0;
-    }
-    
-    WarningMessageDialog(Shell parentShell, String dialogTitle,
-            Image dialogTitleImage, String dialogMessage, int dialogImageType,
-            String[] dialogButtonLabels, int defaultIndex) {
-        super(parentShell, dialogTitle, dialogTitleImage, dialogMessage,
-                dialogImageType, dialogButtonLabels, defaultIndex);
-    }
-
-    @Override
-    protected Control createMessageArea(Composite composite) 
-    {
-        // create composite
-        // create image
-        Image image = getImage();
-        if (image != null) {
-            imageLabel = new Label(composite, SWT.NULL);
-            image.setBackground(imageLabel.getBackground());
-            imageLabel.setImage(image);
-            addAccessibleListeners(imageLabel, image);
-            GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.BEGINNING)
-                    .applyTo(imageLabel);
-        }
-        // create message
-        if (message != null) {
-            _messageLabel = new Text(composite, getMessageLabelStyle()|SWT.READ_ONLY);
-            _messageLabel.setText(message);
-            GridDataFactory
-                    .fillDefaults()
-                    .align(SWT.FILL, SWT.BEGINNING)
-                    .grab(true, false)
-                    .hint(
-                            convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH),
-                            SWT.DEFAULT).applyTo(_messageLabel);
-        }
-        return composite;   
-    }
-    
-    /**
-     * NOTE: copied from IconAndMessageDialog
-     * Add an accessible listener to the label if it can be inferred from the
-     * image.
-     * 
-     * @param label
-     * @param image
-     */
-    private void addAccessibleListeners(Label label, final Image image) {
-        label.getAccessible().addAccessibleListener(new AccessibleAdapter() {
-            public void getName(AccessibleEvent event) {
-                final String accessibleMessage = getAccessibleMessageFor(image);
-                if (accessibleMessage == null) {
-                    return;
-                }
-                event.result = accessibleMessage;
-            }
-        });
-    }
-    
-    /**
-     * NOTE: copied from IconAndMessageDialog
-     * @param image
-     * @return an accesible string
-     */
-    private String getAccessibleMessageFor(Image image) {
-        if (image.equals(getErrorImage())) {
-            return JFaceResources.getString("error");//$NON-NLS-1$
-        }
-
-        if (image.equals(getWarningImage())) {
-            return JFaceResources.getString("warning");//$NON-NLS-1$
-        }
-
-        if (image.equals(getInfoImage())) {
-            return JFaceResources.getString("info");//$NON-NLS-1$
-        }
-
-        if (image.equals(getQuestionImage())) {
-            return JFaceResources.getString("question"); //$NON-NLS-1$
-        }
-
-        return null;
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/WarningMessageDialogWithToggle.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/WarningMessageDialogWithToggle.java
deleted file mode 100644
index 834889d..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/classpath/WarningMessageDialogWithToggle.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.classpath;
-
-import org.eclipse.jface.dialogs.IDialogConstants;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.layout.GridDataFactory;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.accessibility.AccessibleAdapter;
-import org.eclipse.swt.accessibility.AccessibleEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-
-/**
- * Customized warning dialog for JSF Library Upgrade warnings.
- * 
- * @author cbateman
- *
- */
-class WarningMessageDialogWithToggle extends MessageDialogWithToggle 
-{
-    private Text    _messageLabel;
-
-    /**
-     * @param parent
-     * @param title
-     * @param message
-     * @param toggleMessage
-     * @param toggleState
-     * @param store
-     * @param key
-     * @return the dialog.
-     * 
-     * Overriden to make default button CANCEL and use this dialog
-     */
-    public static MessageDialogWithToggle openOkCancelConfirm(Shell parent,
-            String title, String message, String toggleMessage,
-            boolean toggleState, IPreferenceStore store, String key) {
-        MessageDialogWithToggle dialog = new WarningMessageDialogWithToggle(parent,
-                title, null, // accept the default window icon
-                message, QUESTION, new String[] { IDialogConstants.OK_LABEL,
-                        IDialogConstants.CANCEL_LABEL }, 1, // CANCEL is the default
-                toggleMessage, toggleState);
-        dialog.open();
-        return dialog;
-    }
-    
-    WarningMessageDialogWithToggle(Shell parentShell, String dialogTitle,
-            Image image, String message, int dialogImageType,
-            String[] dialogButtonLabels, int defaultIndex,
-            String toggleMessage, boolean toggleState) {
-        super(parentShell, dialogTitle, image, message, dialogImageType,
-                dialogButtonLabels, defaultIndex, toggleMessage, toggleState);
-    }
-
-    @Override
-    protected Control createMessageArea(Composite composite) 
-    {
-        // create composite
-        // create image
-        Image image = getImage();
-        if (image != null) {
-            imageLabel = new Label(composite, SWT.NULL);
-            image.setBackground(imageLabel.getBackground());
-            imageLabel.setImage(image);
-            addAccessibleListeners(imageLabel, image);
-            GridDataFactory.fillDefaults().align(SWT.CENTER, SWT.BEGINNING)
-                    .applyTo(imageLabel);
-        }
-        // create message
-        if (message != null) {
-            _messageLabel = new Text(composite, getMessageLabelStyle()|SWT.READ_ONLY);
-            _messageLabel.setText(message);
-            GridDataFactory
-                    .fillDefaults()
-                    .align(SWT.FILL, SWT.BEGINNING)
-                    .grab(true, false)
-                    .hint(
-                            convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH),
-                            SWT.DEFAULT).applyTo(_messageLabel);
-        }
-        return composite;   
-    }
-    
-    /**
-     * NOTE: copied from IconAndMessageDialog
-     * Add an accessible listener to the label if it can be inferred from the
-     * image.
-     * 
-     * @param label
-     * @param image
-     */
-    private void addAccessibleListeners(Label label, final Image image) {
-        label.getAccessible().addAccessibleListener(new AccessibleAdapter() {
-            public void getName(AccessibleEvent event) {
-                final String accessibleMessage = getAccessibleMessageFor(image);
-                if (accessibleMessage == null) {
-                    return;
-                }
-                event.result = accessibleMessage;
-            }
-        });
-    }
-    
-    /**
-     * NOTE: copied from IconAndMessageDialog
-     * @param image
-     * @return an accesible string
-     */
-    private String getAccessibleMessageFor(Image image) {
-        if (image.equals(getErrorImage())) {
-            return JFaceResources.getString("error");//$NON-NLS-1$
-        }
-
-        if (image.equals(getWarningImage())) {
-            return JFaceResources.getString("warning");//$NON-NLS-1$
-        }
-
-        if (image.equals(getInfoImage())) {
-            return JFaceResources.getString("info");//$NON-NLS-1$
-        }
-
-        if (image.equals(getQuestionImage())) {
-            return JFaceResources.getString("question"); //$NON-NLS-1$
-        }
-
-        return null;
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/contentassist/JSFContentAssistProcessor.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/contentassist/JSFContentAssistProcessor.java
deleted file mode 100644
index 625bf5a..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/contentassist/JSFContentAssistProcessor.java
+++ /dev/null
@@ -1,295 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the 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:
- *    Gerry Kessler/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.ui.internal.contentassist;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.FileLocator;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.jface.text.contentassist.IContextInformationValidator;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IDOMContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.ITaglibContextResolver;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.metadataprocessors.MetaDataEnabledProcessingFactory;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValue;
-import org.eclipse.jst.jsf.metadataprocessors.features.IPossibleValues;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.wst.sse.ui.internal.contentassist.CustomCompletionProposal;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMAttributeDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMElementDeclaration;
-import org.eclipse.wst.xml.core.internal.contentmodel.CMNamedNodeMap;
-import org.eclipse.wst.xml.core.internal.contentmodel.modelquery.ModelQuery;
-import org.eclipse.wst.xml.core.internal.modelquery.ModelQueryUtil;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-import org.eclipse.wst.xml.ui.internal.contentassist.XMLRelevanceConstants;
-import org.eclipse.wst.xml.ui.internal.taginfo.MarkupTagInfoProvider;
-import org.osgi.framework.Bundle;
-import org.w3c.dom.Attr;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-
-/**
- * The content assist processor for non-EL attribute values.
- * 
- * @author Gerry Kessler - Oracle
- * 
- */
-public class JSFContentAssistProcessor implements IContentAssistProcessor {
-	private ITextRegionContextResolver resolver;
-	private ITaglibContextResolver tlResolver;
-	private String defaultAdditionalInfo;
-
-	private String defaultIconPath = "/icons/attr_val.gif"; //$NON-NLS-1$
-	
-	private ImageDescriptor defaultAttrValImgDesc;
-	
-	private MarkupTagInfoProvider fInfoProvider;
-
-	/**
-	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#computeCompletionProposals(org.eclipse.jface.text.ITextViewer,
-	 *      int)
-	 */
-	public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer,
-			int documentPosition) {
-		List proposals = new ArrayList();
-		IStructuredDocumentContext context = IStructuredDocumentContextFactory.INSTANCE
-				.getContext(viewer, documentPosition);
-
-		if (context != null) {
-			resolver = IStructuredDocumentContextResolverFactory.INSTANCE
-					.getTextRegionResolver(context);
-
-			if (resolver != null) {
-				final String regionType = resolver.getRegionType();
-
-				if (regionType != null
-						&& regionType.equals(DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE)) {
-					
-					tlResolver = IStructuredDocumentContextResolverFactory.INSTANCE
-							.getTaglibContextResolver(context);
-
-					if (tlResolver != null) {
-						
-						Attr attr = getAttribute(context);
-						if (attr != null) {
-							Node tagElement = attr.getOwnerElement();
-							if (tagElement != null) {
-								String uri = tlResolver.getTagURIForNodeName(tagElement);
-								if (uri != null) {									
-									proposals = createProposals(context, uri, tagElement, attr);
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-
-		return (ICompletionProposal[]) proposals
-				.toArray(new ICompletionProposal[0]);
-	}
-
-	private String getDefaultAdditionalInfo(Node tagElement, Attr attr) {
-		if (defaultAdditionalInfo == null){
-			CMElementDeclaration elementNode = getCMElementDeclaration(tagElement);
-			if (elementNode != null){
-				CMAttributeDeclaration attrNode = getCMAttributeDeclaration(elementNode, attr);
-				if (attrNode != null)
-					defaultAdditionalInfo = getInfoProvider().getInfo(attrNode);
-			}
-		}
-		return defaultAdditionalInfo;
-	}
-	
-	private CMElementDeclaration getCMElementDeclaration(Node node) {
-		CMElementDeclaration result = null;
-		if (node.getNodeType() == Node.ELEMENT_NODE) {
-			ModelQuery modelQuery = ModelQueryUtil.getModelQuery(node.getOwnerDocument());
-			if (modelQuery != null)
-				result = modelQuery.getCMElementDeclaration((Element) node);
-		}
-		return result;
-	}
-
-	private CMAttributeDeclaration getCMAttributeDeclaration(CMElementDeclaration tagElement, Attr attr) {
-		CMNamedNodeMap attrs = tagElement.getAttributes();
-		for (Iterator it = attrs.iterator();it.hasNext();){
-			CMAttributeDeclaration CMAttr = (CMAttributeDeclaration)it.next();
-			if (CMAttr.getAttrName().equals(attr.getName()))
-				return CMAttr;
-		}
-		return null;
-	}
-	
-	private MarkupTagInfoProvider getInfoProvider() {
-		if (fInfoProvider == null) {
-			fInfoProvider = new MarkupTagInfoProvider();
-		}
-		return fInfoProvider;
-	}
-	
-	private List createProposals(IStructuredDocumentContext context, String uri, Node tagElement, Attr attr) {
-		List ret = new ArrayList();
-		List processors = MetaDataEnabledProcessingFactory.getInstance()
-						.getAttributeValueRuntimeTypeFeatureProcessors(
-								IPossibleValues.class, context, uri,
-								tagElement.getLocalName(), attr.getLocalName());
-		
-		if (processors != null) {
-			for (int i = 0; i < processors.size(); i++) {
-				IPossibleValues p = (IPossibleValues) processors.get(i);
-				ret.addAll(createProposals(p, tagElement, attr));
-			}
-		}
-		return ret;
-	}
-
-	private List createProposals(IPossibleValues p, Node tagElement, Attr attr) {
-		List ret = new ArrayList();
-		defaultAdditionalInfo = null;
-		Iterator it = p.getPossibleValues().iterator();
-		while (it.hasNext()) {
-			IPossibleValue val = (IPossibleValue) it.next();
-			if (val != null){ //just in case...
-				ICompletionProposal proposal = new CustomCompletionProposal(
-						val.getValue(), 		//replacement text
-						getReplacementOffset(), //replacementOffset
-						getReplacementLength(), //replacementLength
-						getCursorPosition(val), //cursor pos
-						getImage(val), 			//image
-						val.getDisplayValue(), 	//display value
-						null, 					//IContextInformation
-						getAdditionalInfo(val,tagElement,attr), //addditional info
-						XMLRelevanceConstants.R_JSP_ATTRIBUTE_VALUE,	//relevance
-						true);					//updateReplace
-	
-				ret.add(proposal);
-			}
-		}
-		return ret;
-	}
-
-
-	private String getAdditionalInfo(IPossibleValue val, Node tagElement, Attr attr) {
-		if (val.getAdditionalInformation() != null)
-			return val.getAdditionalInformation();
-		
-		return 	getDefaultAdditionalInfo(tagElement, attr);
-	}
-
-	private int getReplacementLength() {
-		return resolver.getRegionText().length() - 2;
-	}
-
-	private int getCursorPosition(IPossibleValue val) {
-		//Something changed in 1.5RC2 CustomCompletionProposal 
-		//it appears that the cursor position is now relative to where it is currently
-		//rather than relative to document
-		
-		//return getReplacementOffset() + val.getValue().length();
-		return val.getValue().length();
-	}
-
-	private int getReplacementOffset() {
-		return resolver.getStartOffset() + 1;
-	}
-
-	private Image getImage(IPossibleValue val) {
-		ImageDescriptor icon = val.getIcon();		
-		if (icon == null || icon.equals("")){ //$NON-NLS-1$
-			return getDefaultAttributeValueImage();
-		}
-		
-		return getOrCreateImage(icon);		
-	}
-
-	private Image getOrCreateImage(ImageDescriptor icon) {
-		if (icon == null)
-			return null;
-			
-		Image img = JSFUiPlugin.getDefault().getImageRegistry().get(icon.toString());
-		if (img == null){
-			try {
-				img = icon.createImage();
-				JSFUiPlugin.getDefault().getImageRegistry().put(icon.toString(), img);
-			} catch (RuntimeException e) {
-                // empty block; C.B: handle exception?
-			}
-		}
-		return img;
-	}
-
-	private Image getDefaultAttributeValueImage() {
-		if (defaultAttrValImgDesc == null){
-			Bundle bundle = Platform.getBundle(JSFUiPlugin.PLUGIN_ID);
-			URL url= FileLocator.find(bundle,new Path(defaultIconPath ), null);
-			defaultAttrValImgDesc = ImageDescriptor.createFromURL(url);
-		}
-		return getOrCreateImage(defaultAttrValImgDesc);
-	}
-
-	private Attr getAttribute(IStructuredDocumentContext context) {
-		final IDOMContextResolver domResolver = IStructuredDocumentContextResolverFactory.INSTANCE
-				.getDOMContextResolver(context);
-
-		if (domResolver != null) {
-			final Node curNode = domResolver.getNode();
-
-			if (curNode instanceof Attr) {
-				return (Attr) curNode;
-			}
-		}
-		return null;
-
-	}
-
-	public IContextInformation[] computeContextInformation(ITextViewer viewer,
-			int offset) {
-		// no context info
-		return null;
-	}
-
-	public char[] getCompletionProposalAutoActivationCharacters() {
-		// auto activate when user hits a '.'
-		return new char[] { '.' };
-	}
-
-	public char[] getContextInformationAutoActivationCharacters() {
-		// no auto-activation for context info
-		return null;
-	}
-
-	public String getErrorMessage() {
-		// don't flag errors
-		return null;
-	}
-
-	public IContextInformationValidator getContextInformationValidator() {
-		// don't validate context information
-		return null;
-	}
-
-}
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/contentassist/el/JSFELContentAssistProcessor.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/contentassist/el/JSFELContentAssistProcessor.java
deleted file mode 100644
index c398843..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/contentassist/el/JSFELContentAssistProcessor.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the 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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.ui.internal.contentassist.el;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.jface.text.ITextViewer;
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-import org.eclipse.jface.text.contentassist.IContentAssistProcessor;
-import org.eclipse.jface.text.contentassist.IContextInformation;
-import org.eclipse.jface.text.contentassist.IContextInformationValidator;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.IStructuredDocumentContextResolverFactory;
-import org.eclipse.jst.jsf.context.resolver.structureddocument.internal.ITextRegionContextResolver;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContext;
-import org.eclipse.jst.jsf.context.structureddocument.IStructuredDocumentContextFactory;
-import org.eclipse.jst.jsf.core.internal.contentassist.el.ContentAssistParser;
-import org.eclipse.jst.jsf.core.internal.contentassist.el.ContentAssistStrategy;
-import org.eclipse.jst.jsp.core.internal.regions.DOMJSPRegionContexts;
-import org.eclipse.wst.xml.core.internal.regions.DOMRegionContext;
-import org.eclipse.wst.xml.ui.internal.contentassist.ProposalComparator;
-
-/**
- * The content assist processor for JSF EL partitions on attribute values.
- * 
- * @author cbateman
- *
- */
-public class JSFELContentAssistProcessor implements IContentAssistProcessor 
-{
-	/**
-	 * @see org.eclipse.jface.text.contentassist.IContentAssistProcessor#computeCompletionProposals(org.eclipse.jface.text.ITextViewer, int)
-	 */
-	public ICompletionProposal[] computeCompletionProposals(ITextViewer viewer,
-			int documentPosition) 
-	{
-		final List  proposals = new ArrayList();
-		final IStructuredDocumentContext context = 
-			IStructuredDocumentContextFactory.INSTANCE.getContext(viewer, documentPosition);
-		
-		if (context != null)
-		{
-			ITextRegionContextResolver  resolver = 
-				IStructuredDocumentContextResolverFactory.INSTANCE.getTextRegionResolver(context);
-			
-			if (resolver != null)
-			{
-				final String regionType = resolver.getRegionType();
-				
-				if (regionType != null
-						&& resolver.matchesRelative(new String[] {DOMRegionContext.XML_TAG_ATTRIBUTE_VALUE}))
-				{
-					
-					String elText = null;
-					
-					// if we are in the EL content, then get the current region text
-					if (DOMJSPRegionContexts.JSP_VBL_CONTENT.equals(regionType))
-					{
-						elText = resolver.getRegionText().trim();
-					}
-					// otherwise, we may be at the end of a content region but at
-					// the beginning of a closing brace so check to see if the previous
-					// region was a VBL_CONTENT
-					// TODO: this search algorithm may need improvement
-					else if (regionType.equals(DOMJSPRegionContexts.JSP_VBL_CLOSE))
-					{
-						IStructuredDocumentContext previousContext = 
-							resolver.getPreviousContext();
-						
-						ITextRegionContextResolver prevResolver =
-							IStructuredDocumentContextResolverFactory.INSTANCE.getTextRegionResolver(previousContext);
-						
-						if (prevResolver != null)
-						{
-                            if (DOMJSPRegionContexts.JSP_VBL_CONTENT.equals(prevResolver.getRegionType()))
-                            {
-    							resolver = prevResolver;
-    							elText = prevResolver.getRegionText().trim();
-                            }
-                            else if (DOMJSPRegionContexts.JSP_VBL_OPEN.equals(prevResolver.getRegionType()))
-                            {
-                                elText = ""; //$NON-NLS-1$
-                            }
-						}
-					}
-					
-                    
-					final ContentAssistStrategy strategy = 
-                        ContentAssistParser.getPrefix(documentPosition - resolver.getStartOffset() + 1, elText);
-                    
-					if (strategy != null)
-						proposals.addAll(strategy.getProposals(context));
-				}
-			}
-		}
-		
-        Collections.sort(proposals, new ProposalComparator());
-		return (ICompletionProposal[]) proposals.toArray(new ICompletionProposal[0]);
-	}
-
-
-	public IContextInformation[] computeContextInformation(ITextViewer viewer,
-			int offset) {
-		// no context info
-		return null;
-	}
-
-	public char[] getCompletionProposalAutoActivationCharacters() {
-		// auto activate when user hits a '.'
-		return new char[] {'.'};
-	}
-
-	public char[] getContextInformationAutoActivationCharacters() {
-		// no auto-activation for context info
-		return null;
-	}
-
-	public String getErrorMessage() {
-		// don't flag errors
-		return null;
-	}
-
-	public IContextInformationValidator getContextInformationValidator() {
-		// don't validate context information
-		return null;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/IJSFImplLibraryCreationListener.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/IJSFImplLibraryCreationListener.java
deleted file mode 100644
index 85fc288..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/IJSFImplLibraryCreationListener.java
+++ /dev/null
@@ -1,26 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the 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:
- *    Justin Chen - development check in
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.jsflibraryconfig;
-
-/**
- * Listener interface when a new JSF implementation library is created.
- * 
- * @author Justin Chen - Oracle
- *
- */
-public interface IJSFImplLibraryCreationListener extends java.util.EventListener {
-	/**
-	 * Ok button is pressed in JSF Library dialog.
-	 * 
-	 * @param event
-	 */
-	public void okClicked(JSFImplLibraryCreationEvent event);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFImplLibraryCreationEvent.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFImplLibraryCreationEvent.java
deleted file mode 100644
index df3b0f1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFImplLibraryCreationEvent.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the 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:
- *    Justin Chen - development check in
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.jsflibraryconfig;
-
-import java.util.EventObject;
-
-/**
- * JSF Implementation library creation event.
- * 
- * @author Justin Chen - Oracle
- *
- */
-public class JSFImplLibraryCreationEvent extends EventObject {
-
-	private static final long serialVersionUID = 6390319185522362453L;
-	private boolean isLibCreated; 
-	
-	/**
-	 * @param source
-	 * @param okClicked
-	 */
-	public JSFImplLibraryCreationEvent(Object source, boolean okClicked) {
-		super(source);
-		this.isLibCreated = okClicked;
-	}
-
-	/**
-	 * Ok button pressed.
-	 * 
-	 * @return boolean
-	 */
-	public boolean isLibraryCreated() {
-		return isLibCreated;
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControl.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControl.java
deleted file mode 100644
index 26386cd..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControl.java
+++ /dev/null
@@ -1,1000 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006, 2007 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the 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:
- *    Justin Chen
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.jsflibraryconfig;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.EventObject;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.Vector;
-
-import org.eclipse.core.runtime.ISafeRunnable;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.util.SafeRunnable;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTableViewer;
-import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.DoubleClickEvent;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.IDoubleClickListener;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.LabelProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.jface.viewers.ViewerSorter;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryConfigModel;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryConfiglModelSource;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryInternalReference;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryRegistryUtil;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.ArchiveFile;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibrary;
-import org.eclipse.jst.jsf.core.internal.jsflibraryregistry.JSFLibraryRegistry;
-import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties;
-import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.jst.jsf.ui.internal.classpath.JSFLibraryWizard;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.MouseAdapter;
-import org.eclipse.swt.events.MouseEvent;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelSynchHelper;
-
-/**
- * A custom control used in wizard and property pages.
- * 
- * @author Justin Chen
- */
-public class JSFLibraryConfigControl extends Composite { 
-	private static final String IMPL_DESC = Messages.JSFLibrariesPreferencePage_IMPL_DESC;
-	private static final String DEFAULT_IMPL_DESC = Messages.JSFLibrariesPreferencePage_DEFAULT_IMPL_DESC;
-	private static final String MISSING = Messages.JSFLibrariesPreferencePage_MISSING_DESC;
-
-	final private int COLUMN_DEPLOY = 0;
-	final private int COLUMN_LIB_NAME = 1;
-
-	private JSFLibraryConfigModel workingCopyModel = null;
-	
-	private Button btnServerSupplied;
-	private Button btnUserSupplied;
-	private ComboViewer cvImplLib;
-	private CheckboxTableViewer ctvSelCompLib;
-	private Button btnDeployJars;
-	private TreeViewer tvCompLib;
-	private TreeViewerAdapter tvAdapter;
-	private TreeLabelProvider tvLabelProvider;
-	private Combo comboImplLib;
-	private Button btnAddAll;
-	private Button btnRemoveAll;
-	
-	private Vector newJSFLibCreatedListeners = new Vector();
-	private Set _changeListeners;
-	private boolean _initing;
-	private IDataModel model;	
-
-	/**
-	 * @param listener
-	 */
-	public void addOkClickedListener(IJSFImplLibraryCreationListener listener) {
-		newJSFLibCreatedListeners.addElement(listener);
-	}
-	/**
-	 * @param listener
-	 */
-	public void removeOkClickedListener(IJSFImplLibraryCreationListener listener) {
-		newJSFLibCreatedListeners.removeElement(listener);
-	}
-	
-	/**
-	 * @param listener
-	 */
-	public void addChangeListener(JSFLibraryConfigControlChangeListener listener){
-		getChangeListeners().add(listener);
-	}
-	
-	/**
-	 * @param listener
-	 */
-	public void removeChangeListener(JSFLibraryConfigControlChangeListener listener){
-		if (getChangeListeners().contains(listener))
-			getChangeListeners().remove(listener);
-	}
-	
-	private Set getChangeListeners() {
-		if (_changeListeners == null){
-			_changeListeners = new HashSet();
-		}
-		return _changeListeners;
-	}
-	
-	private void fireChangedEvent(final EventObject e){
-		if (_initing) return;
-		SafeRunnable.run(new ISafeRunnable(){
-			public void handleException(Throwable exception) {
-			    // TODO: should we perhaps do something here?
-			    JSFUiPlugin.log(IStatus.ERROR, exception.getLocalizedMessage());
-			}
-			public void run() throws Exception {
-				for (Iterator it=getChangeListeners().iterator();it.hasNext();){
-					((JSFLibraryConfigControlChangeListener)it.next()).changed(new JSFLibraryConfigControlChangeEvent(e));
-				}
-			}
-		});
-	}
-	
-	/**
-	 * Create the composite
-	 * @param parent
-	 * @param style
-	 */	
-	public JSFLibraryConfigControl(Composite parent, int style) {
-		super(parent, style);
-		_initing = true;
-		createControls();
-	}	
-	
-	/**
-	 * set control values from provided model.
-	 * 
-	 * @param source
-	 */
-	public void loadControlValuesFromModel(JSFLibraryConfiglModelSource source) {
-		if (source != null) {
-			// never read persistentModel = source;
-			workingCopyModel = JSFLibraryConfigModel.JSFLibraryConfigModelFactory.createInstance(source);
-			initializeControlValues();
-			_initing = false;
-		} else {
-			JSFUiPlugin.log(IStatus.ERROR, Messages.JSFLibraryConfigControl_NullProject);
-		}
-		
-	}
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.swt.widgets.Widget#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-	}
-	
-	/**
-	 * Return current selected JSF Implementation Library.
-	 * Otherwise, return null.
-	 *  
-	 * @return JSFLibraryInternalReference
-	 */
-	public JSFLibraryInternalReference getSelectedJSFLibImplementation() {
-		return workingCopyModel.getCurrentJSFImplementationLibrarySelection();
-	}
-	 
-	/**
-	 * Return a list of selected JSF Component Libraries.
-	 * Otherwise, return an empty list.
-	 * 
-	 * @return a list of selected JSF Component Libraries
-	*/
-	public List getSelectedJSFLibComponents() {
-		return workingCopyModel.getCurrentJSFComponentLibrarySelection();
-	}
-	
-	/**
-	 * 
-	 * @return JSFLibraryConfigModelAdapter
-	 */
-	public JSFLibraryConfigModel getWorkingModel() {
-		return workingCopyModel;
-	}
-	
-	private void initializeControlValues() {
-		loadJSFImplList();
-		
-		btnDeployJars.setSelection(false);
-		JSFLibraryInternalReference savedImplLib = workingCopyModel.getSavedJSFImplementationLibrary();
-		if ( savedImplLib != null ) {
-			/*
-			 * Get the input for the control to set selection.
-			 */
-			JSFLibraryInternalReference selected = JSFLibraryRegistryUtil.getInstance().getJSFLibraryReferencebyID(savedImplLib.getID());
-			if (selected != null) {
-				btnDeployJars.setSelection(selected.isCheckedToBeDeployed());			
-				cvImplLib.setSelection(new StructuredSelection(selected), true);
-			}
-		} else {
-			JSFLibraryInternalReference dftJSFImplLib = JSFLibraryRegistryUtil.getInstance().getDefaultJSFImplementationLibrary();
-			if (dftJSFImplLib != null) {			
-				btnDeployJars.setSelection(dftJSFImplLib.isCheckedToBeDeployed());	
-				cvImplLib.setSelection(new StructuredSelection(dftJSFImplLib), true);				
-			}
-			else 
-				btnDeployJars.setEnabled(false);
-		}
-		
-		loadJSFCompList();
-
-		JSFLibraryInternalReference savedCompLib = null; 
-		JSFLibraryInternalReference selected = null;
-		//Iterator it = persistentModel.getJSFComponentLibraries().iterator();
-		Iterator it = workingCopyModel.getJSFComponentLibraries().iterator();
-		while (it.hasNext()) {
-			savedCompLib = (JSFLibraryInternalReference) it.next();
-			selected = JSFLibraryRegistryUtil.getInstance().getJSFLibraryReferencebyID(savedCompLib.getID());
-			if (selected != null) {
-				ctvSelCompLib.setChecked(selected, selected.isCheckedToBeDeployed());
-			}
-		}
-
-		setCompListModelProperty();
-		
-		initializeImplementationType();
-		
-		redraw();
-	}
-	
-	private void initializeImplementationType() {
-		IMPLEMENTATION_TYPE implType = workingCopyModel.getImplementationType();
-		if (implType == IMPLEMENTATION_TYPE.SERVER_SUPPLIED) {
-			btnServerSupplied.setSelection(true);
-			btnUserSupplied.setSelection(false);
-			enableUserSupplied(false);
-		} else if (implType == IMPLEMENTATION_TYPE.CLIENT_SUPPLIED) {
-			btnServerSupplied.setSelection(false);
-			btnUserSupplied.setSelection(true);
-			enableUserSupplied(true);
-		} else {
-			enableUserSupplied(false);
-		}	
-		model.setProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE_PROPERTY_NAME, implType);
-	}
-	private void loadJSFImplList() {
-		cvImplLib.setInput(workingCopyModel.getJSFImplementationLibraries());
-	}
-	
-	private void loadJSFCompList() {
-		tvCompLib.setInput(workingCopyModel.getJSFComponentLibraries());
-		ctvSelCompLib.setInput(workingCopyModel.getJSFComponentLibraries());		
-	}
-	
-	private JSFLibraryInternalReference getCurrentSelectedJSFImplLib() {
-		JSFLibraryInternalReference selJSFImpl = null;
-		StructuredSelection objs = (StructuredSelection)cvImplLib.getSelection();
-		if (objs != null){
-			if (objs.getFirstElement() instanceof JSFLibraryInternalReference){
-				selJSFImpl = (JSFLibraryInternalReference)objs.getFirstElement();
-			}
-		}
-		return selJSFImpl;		
-	}
-
-	private void createImplLibControls(Composite parent) {
-		final Composite cmpImpls = new Composite(parent, SWT.NONE);
-		final GridLayout gridLayoutImpls = new GridLayout();
-		gridLayoutImpls.numColumns = 4;
-		gridLayoutImpls.marginLeft = 0;
-		gridLayoutImpls.marginTop = 0;
-		gridLayoutImpls.marginBottom = 0;
-		
-		cmpImpls.setLayout(gridLayoutImpls);
-		GridData gdCmpImpls = new GridData();
-		gdCmpImpls.horizontalAlignment = SWT.FILL;
-		gdCmpImpls.grabExcessHorizontalSpace = true;
-		cmpImpls.setLayoutData(gdCmpImpls);
-
-		btnServerSupplied = new Button(cmpImpls, SWT.RADIO);
-		btnServerSupplied.setToolTipText(Messages.JSFLibraryConfigControl_ServerSuppliedButtonTooltip);
-		GridData gdSS = new GridData();
-		gdSS.horizontalAlignment = SWT.BEGINNING;
-		btnServerSupplied.setLayoutData(gdSS);
-		
-		btnServerSupplied.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e) {
-				setServerSuppliedLibrarySelection(e);
-			}			
-		});
-		
-		Label lblServerSupplied = new Label(cmpImpls, SWT.NONE);
-		lblServerSupplied.setText(Messages.JSFLibraryConfigControl_ServerSuppliedButtonLabel);
-		GridData lblSS = new GridData();
-		lblSS.grabExcessHorizontalSpace = true;
-		lblServerSupplied.setLayoutData(lblSS);
-		lblServerSupplied.addMouseListener(new MouseAdapter(){
-			public void mouseUp(MouseEvent e) {
-				btnServerSupplied.setSelection(true);
-				setServerSuppliedLibrarySelection(e);				
-			}			
-		});
-		
-		
-		Label lblSpacer1 = new Label(cmpImpls, SWT.NONE);
-		GridData gdSpc1 = new GridData();
-		gdSpc1.horizontalAlignment = SWT.END;
-		gdSpc1.horizontalSpan = 2;
-		lblSpacer1.setLayoutData(gdSpc1);
-		
-		btnUserSupplied = new Button(cmpImpls, SWT.RADIO);
-		btnUserSupplied.setLayoutData(new GridData());
-		btnUserSupplied.addSelectionListener(new SelectionAdapter(){
-			public void widgetSelected(SelectionEvent e) {
-				setUserSuppliedLibrarySelection(e);
-			}			
-		});
-		
-		this.addOkClickedListener(new IJSFImplLibraryCreationListener() {
-			public void okClicked(JSFImplLibraryCreationEvent event) {				
-				if (! btnUserSupplied.getSelection()  && event.isLibraryCreated()) {
-					btnServerSupplied.setSelection(false);
-					setUserSuppliedLibrarySelection(event);
-				}				
-			}			
-		});
-			
-		cvImplLib = new ComboViewer(cmpImpls, SWT.READ_ONLY);
-		cvImplLib.setLabelProvider(new ImplLibCVListLabelProvider());
-		cvImplLib.setContentProvider(new ImplLibCVContentProvider());
-		comboImplLib = cvImplLib.getCombo();
-		GridData gd_cvImplLib = new GridData();
-		gd_cvImplLib.horizontalAlignment = SWT.FILL;
-		gd_cvImplLib.grabExcessHorizontalSpace = true;
-		comboImplLib.setLayoutData(gd_cvImplLib);
-		cvImplLib.addSelectionChangedListener(
-			new ISelectionChangedListener() {
-				public void selectionChanged(SelectionChangedEvent event) {
-					StructuredSelection ss = (StructuredSelection) event.getSelection();
-					JSFLibraryInternalReference crtSelImplLib = (JSFLibraryInternalReference) ss.getFirstElement();
-					if (crtSelImplLib != null) btnDeployJars.setEnabled(true);
-					crtSelImplLib.setToBeDeployed(btnDeployJars.getSelection());
-					workingCopyModel.setCurrentJSFImplementationLibrarySelection(crtSelImplLib);
-					model.setProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION, crtSelImplLib);
-					fireChangedEvent(event);
-				}
-			}
-		);
-			
-		btnDeployJars = new Button(cmpImpls, SWT.CHECK);
-		GridData gdDeploy = new GridData();
-		btnDeployJars.setLayoutData(gdDeploy);
-		btnDeployJars.setText(Messages.JSFLibraryConfigControl_DeployButtonLabel);
-		btnDeployJars.setToolTipText(Messages.JSFLibraryConfigControl_DeployJAR);
-		btnDeployJars.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				if (! _initing){
-					JSFLibraryInternalReference jsflib = getCurrentSelectedJSFImplLib();
-					if (jsflib != null)
-						jsflib.setToBeDeployed(btnDeployJars.getSelection());
-					workingCopyModel.setCurrentJSFImplementationLibrarySelection(jsflib);//why r we doing this here???
-	//				model.setProperty(IJSFFacetInstallDataModelProperties.DEPLOY_IMPLEMENTATION, btnDeployJars.getSelection());
-					fireChangedEvent(e);
-				}
-			}
-		}
-		);
-		
-		final Button btnNewImpl = new Button(cmpImpls, SWT.NONE); //compTest,
-		GridData gdNew = new GridData();
-		gdNew.horizontalAlignment = SWT.END;
-		btnNewImpl.setLayoutData(gdNew);
-		btnNewImpl.setText(Messages.JSFLibraryConfigControl_NewImplementationLibrary);	
-		btnNewImpl.setToolTipText(Messages.JSFLibraryConfigControl_NewImplButtonTooltip);
-		btnNewImpl.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				JSFLibraryWizard wizard = new JSFLibraryWizard(JSFLibraryWizard.IMPLS);
-				IWorkbench wb = PlatformUI.getWorkbench();
-				wizard.init(wb, null);
-				WizardDialog dialog = new WizardDialog(wb
-						.getActiveWorkbenchWindow().getShell(), wizard);
-				int ret = dialog.open();
-				if (ret == Window.OK) {	
-					JSFLibraryInternalReference lib = new JSFLibraryInternalReference(wizard.getJSFLibrary(), true, true);
-					JSFLibraryRegistryUtil.getInstance().addJSFLibrary(lib);
-					workingCopyModel.getJSFImplementationLibraries().add(lib);
-					workingCopyModel.setCurrentJSFImplementationLibrarySelection(lib);
-					
-					loadJSFImplList();
-					btnDeployJars.setSelection(true);
-					cvImplLib.setSelection(new StructuredSelection(lib), true);
-					
-				}
-				// notify listeners that a JSF implementation is created.
-				JSFImplLibraryCreationEvent event = new JSFImplLibraryCreationEvent(this, (ret == Window.OK));
-				int size = newJSFLibCreatedListeners.size();
-				for (int i = 0; i < size; i++) {
-					IJSFImplLibraryCreationListener listener = 
-						(IJSFImplLibraryCreationListener) newJSFLibCreatedListeners.elementAt(i);
-					listener.okClicked(event);
-				}
-			}
-		});		
-	}
-	
-	private void setServerSuppliedLibrarySelection(final EventObject e) {
-		btnUserSupplied.setSelection(false);
-		model.setProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE_PROPERTY_NAME, IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE.SERVER_SUPPLIED);
-		enableUserSupplied(false);
-		fireChangedEvent(e);
-		
-	}
-	
-	private void setUserSuppliedLibrarySelection(final EventObject e) {
-		btnUserSupplied.setSelection(true);
-		model.setProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE_PROPERTY_NAME, IJSFFacetInstallDataModelProperties.IMPLEMENTATION_TYPE.CLIENT_SUPPLIED);
-		enableUserSupplied(true);	
-		fireChangedEvent(e);
-	}
-	
-	private void enableUserSupplied(boolean enabled) {
-		cvImplLib.getCombo().setEnabled(enabled);
-		btnDeployJars.setEnabled(enabled);		
-	}
-	
-	private void createCompLibControls(Composite parent) {
-		final Composite cmpCompLibs = new Composite(parent, SWT.NONE);
-		final GridLayout gridLayoutCompLibs = new GridLayout();
-		gridLayoutCompLibs.numColumns = 4;
-		gridLayoutCompLibs.marginLeft = 0;
-		gridLayoutCompLibs.marginRight = 0;
-		gridLayoutCompLibs.marginWidth = 0;
-		cmpCompLibs.setLayout(gridLayoutCompLibs);
-		GridData gdComp = new GridData();
-		gdComp.horizontalAlignment = SWT.FILL;
-		gdComp.grabExcessHorizontalSpace = true;
-		cmpCompLibs.setLayoutData(gdComp);
-		
-		
-		final Label lblCompLib = new Label(cmpCompLibs, SWT.NONE);
-		final GridData gd_lbl_complib = new GridData(GridData.FILL, GridData.CENTER, false, false, 4, 1);
-		lblCompLib.setLayoutData(gd_lbl_complib);
-		lblCompLib.setText(Messages.JSFLibraryConfigControl_ComponentLibrary);
-				
-		tvCompLib = new TreeViewer(cmpCompLibs, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
-		tvAdapter = new TreeViewerAdapter();
-		tvLabelProvider = new TreeLabelProvider();
-		tvCompLib.setContentProvider(tvAdapter);
-		tvCompLib.setLabelProvider(tvLabelProvider);
-		tvCompLib.addDoubleClickListener(new IDoubleClickListener(){
-			public void doubleClick(DoubleClickEvent event) {
-				resetComponentLibSelection((StructuredSelection)event.getSelection(), 
-						tvCompLib, 
-						ctvSelCompLib, 
-						true);	
-				fireChangedEvent(event);
-			}			
-		});
-		tvCompLib.getTree().setLayoutData(new GridData(GridData.FILL_BOTH));
-		tvCompLib.addFilter(new TreeViewerFilter());		
-		
-		final Composite composite_buttons = new Composite(cmpCompLibs, SWT.NONE);
-		composite_buttons.setLayoutData(new GridData(SWT.FILL, SWT.FILL, false, false));
-		composite_buttons.setLayout(new GridLayout());
-
-		final Composite composite_Single = new Composite(composite_buttons, SWT.None);
-		composite_Single.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		final GridLayout gl_Single = new GridLayout();
-		gl_Single.marginHeight = 4;
-		composite_Single.setLayout(gl_Single);
-		
-		final Button btnAdd = new Button(composite_Single, SWT.NONE);
-		btnAdd.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
-		btnAdd.setText(Messages.JSFLibraryConfigControl_Add);
-		btnAdd.setEnabled(false);
-
-		final Button btnRemove = new Button(composite_Single, SWT.NONE);
-		btnRemove.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
-		btnRemove.setText(Messages.JSFLibraryConfigControl_Remove);
-		btnRemove.setEnabled(false);
-		
-		final Composite composite_All = new Composite(composite_buttons, SWT.None);
-		composite_All.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		final GridLayout gl_All = new GridLayout();
-		gl_Single.marginHeight = 4;
-		composite_All.setLayout(gl_All);
-		
-		btnAddAll = new Button(composite_All, SWT.NONE);
-		btnAddAll.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
-		btnAddAll.setText(Messages.JSFLibraryConfigControl_AddAll);
-
-		btnRemoveAll = new Button(composite_All, SWT.NONE);
-		btnRemoveAll.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
-		btnRemoveAll.setText(Messages.JSFLibraryConfigControl_RemoveAll);
-
-		final Composite composite_New = new Composite(composite_buttons, SWT.None);
-		composite_New.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-		final GridLayout gl_New = new GridLayout();
-		gl_Single.marginHeight = 4;
-		composite_New.setLayout(gl_New);
-		
-		final Button btnNewCompLib = new Button(composite_New, SWT.NONE);
-		btnNewCompLib.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false));
-		btnNewCompLib.setText(Messages.JSFLibraryConfigControl_NewComponentLibrary);		
-		btnNewCompLib.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				JSFLibraryWizard wizard = new JSFLibraryWizard(JSFLibraryWizard.NONIMPLS);				
-				IWorkbench wb = PlatformUI.getWorkbench();
-				wizard.init(wb, null);
-				WizardDialog dialog = new WizardDialog(wb
-						.getActiveWorkbenchWindow().getShell(), wizard);						
-				int ret = dialog.open();
-				if (ret == Window.OK) {
-					JSFLibraryInternalReference lib = new JSFLibraryInternalReference(
-							wizard.getJSFLibrary(), 
-							true, 
-							true);
-					JSFLibraryRegistryUtil.getInstance().addJSFLibrary(lib);					
-					workingCopyModel.getJSFComponentLibraries().add(lib);
-					
-					loadJSFCompList();
-					setCompListModelProperty();
-					ctvSelCompLib.setChecked(lib, true);
-				}
-			}
-		});	
-
-		ctvSelCompLib = CheckboxTableViewer.newCheckList(cmpCompLibs, SWT.MULTI | SWT.FULL_SELECTION | SWT.BORDER);
-		ctvSelCompLib.addFilter(new CheckedTableViewerFilter());
-		final Table table = ctvSelCompLib.getTable();
-		table.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true));		
-		table.setHeaderVisible(true);
-		final TableColumn tcDeploy = new TableColumn(table, SWT.LEFT);
-		tcDeploy.setWidth(50);
-		tcDeploy.setText(Messages.JSFLibraryConfigControl_TH_Deploy);
-		tcDeploy.setToolTipText(Messages.JSFLibraryConfigControl_DeployJAR);
-		final TableColumn tcLibName = new TableColumn(table, SWT.LEFT);
-		tcLibName.setWidth(150);
-		tcLibName.setText(Messages.JSFLibraryConfigControl_TH_LibraryName);
-		
-		//ctvSelCompLib.setCellModifier(new CellModifierCTVSelCompLib());
-		ctvSelCompLib.setSorter(new SelectedCompLibCTVSorter());
-		ctvSelCompLib.setLabelProvider(new SelectedCompLibCTVLabelProvider());
-		ctvSelCompLib.setContentProvider(new CompLibCTVContentProvider());
-		ctvSelCompLib.addDoubleClickListener(new IDoubleClickListener(){
-			public void doubleClick(DoubleClickEvent event) {
-				resetComponentLibSelection((StructuredSelection)event.getSelection(), 
-						tvCompLib, 
-						ctvSelCompLib, 
-						false);	
-				fireChangedEvent(event);
-			}			
-		});
-		ctvSelCompLib.addCheckStateListener(new ICheckStateListener() {
-			public void checkStateChanged(CheckStateChangedEvent event) {
-				JSFLibraryInternalReference changedItem = (JSFLibraryInternalReference) event.getElement();
-				boolean isChecked4Deploy = event.getChecked();
-				
-				List list = workingCopyModel.getJSFComponentLibraries();
-				Iterator it = list.iterator();
-				JSFLibraryInternalReference crtjsflib = null;
-				while (it.hasNext()) {
-					crtjsflib = (JSFLibraryInternalReference) it.next();
-					if (crtjsflib.getID().equals(changedItem.getID())) {
-						crtjsflib.setToBeDeployed(isChecked4Deploy);
-						fireChangedEvent(event);
-						break;
-					}
-				}
-			}
-		});
-		
-		btnAdd.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				resetComponentLibSelection((StructuredSelection)tvCompLib.getSelection(), 
-						tvCompLib, 
-						ctvSelCompLib, 
-						true);	
-				fireChangedEvent(e);
-			}
-		});
-		
-		btnAddAll.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				resetCompontLibSelectionAll(tvCompLib, ctvSelCompLib, true);
-				fireChangedEvent(e);
-			}
-		});		
-		btnRemove.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				resetComponentLibSelection((StructuredSelection)ctvSelCompLib.getSelection(), 
-						tvCompLib, 
-						ctvSelCompLib, 
-						false);	
-				fireChangedEvent(e);
-			}
-		});
-		
-		btnRemoveAll.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				resetCompontLibSelectionAll(tvCompLib, ctvSelCompLib, false);
-				fireChangedEvent(e);
-			}
-		});
-		
-		tvCompLib.addSelectionChangedListener(new ISelectionChangedListener(){
-			public void selectionChanged(SelectionChangedEvent event) {
-				StructuredSelection sel= (StructuredSelection)event.getSelection();
-				btnAdd.setEnabled(!sel.isEmpty() && sel.getFirstElement() instanceof JSFLibraryInternalReference);
-				btnAddAll.setEnabled(tvCompLib.getTree().getItemCount() > 0);
-			}			
-		});
-		
-		ctvSelCompLib.addSelectionChangedListener(new ISelectionChangedListener(){
-			public void selectionChanged(SelectionChangedEvent event) {
-				StructuredSelection sel= (StructuredSelection)event.getSelection();
-				btnRemove.setEnabled(!sel.isEmpty());
-				btnRemoveAll.setEnabled(ctvSelCompLib.getTable().getItemCount() > 0);
-			}			
-		});
-		
-	}
-	private void createControls() {
-		setRedraw(true);
-		final GridLayout gridLayout = new GridLayout();
-		gridLayout.numColumns = 1;
-		gridLayout.marginLeft = 0;
-		gridLayout.marginRight = 0;
-		gridLayout.marginWidth = 0;
-		gridLayout.marginTop = 0;
-		this.setLayout(gridLayout);
-		
-		createImplLibControls(this);
-		createSeparator(this);
-		createCompLibControls(this);
-		
-
-
-
-	}
-
-	private void createSeparator(Composite parent) {
-		final Label lblSeparator = new Label(parent, SWT.SEPARATOR | SWT.HORIZONTAL );
-		GridData gd_lbl_spacer = new GridData();
-		gd_lbl_spacer.horizontalAlignment = SWT.FILL;
-		lblSeparator.setLayoutData(gd_lbl_spacer);
-		lblSeparator.setAlignment(SWT.CENTER);
-	}
-	
-	/*
-	 * Event handling helper methods
-	 */	
-	
-	// Set selected item to the given state on model and update viewers.  
-	private void resetComponentLibSelection(StructuredSelection item, 
-			TreeViewer srcViewer, 
-			CheckboxTableViewer destViewer,
-			boolean state) {
-		if (item != null && !item.isEmpty()) {
-			List selected = new ArrayList(item.size());
-			for (Iterator sel=item.iterator();sel.hasNext();){
-				JSFLibraryInternalReference jsfLibDctr = (JSFLibraryInternalReference)sel.next();
-				selected.add(jsfLibDctr);
-				List list = workingCopyModel.getJSFComponentLibraries();
-				Iterator it = list.iterator();
-				JSFLibraryInternalReference crtjsfLibDctr = null;
-				while(it.hasNext()) {
-					crtjsfLibDctr = (JSFLibraryInternalReference)it.next();
-					if (crtjsfLibDctr.getID().equals(jsfLibDctr.getID())) {
-						crtjsfLibDctr.setToBeDeployed(state);
-						crtjsfLibDctr.setSelected(state);
-					}
-				}					
-			}
-						
-			loadJSFCompList();
-			
-			srcViewer.refresh();
-			destViewer.refresh();	
-			for (Iterator it=selected.iterator();it.hasNext();){
-				destViewer.setChecked(it.next(), state);
-			}
-			
-			setCompListModelProperty();
-		}		
-	}
-	
-	// Reset all component library from given state to model and update viewers.   
-	private void resetCompontLibSelectionAll(TreeViewer srcViewer, 
-			CheckboxTableViewer destViewer, 
-			boolean state) {
-
-			List list = workingCopyModel.getJSFComponentLibraries();
-			Iterator it = list.iterator();
-			JSFLibraryInternalReference jsfLibDctr;
-			while(it.hasNext()) {
-				jsfLibDctr = (JSFLibraryInternalReference)it.next();
-				jsfLibDctr.setSelected(state);
-				jsfLibDctr.setToBeDeployed(state);
-			}				
-			
-			loadJSFCompList();
-
-			srcViewer.refresh();
-			destViewer.refresh();
-			destViewer.setAllChecked(state);		
-			
-			btnAddAll.setEnabled(! state);
-			btnRemoveAll.setEnabled(state);
-			
-			setCompListModelProperty();
-	}
-	
-	//synchHelper is not able to track changes to data elements in tableviewer... manual set of property
-	private void setCompListModelProperty() {		
-		TableItem[] tableItems = ctvSelCompLib.getTable().getItems();
-		List compLibs = new ArrayList(tableItems.length);
-		for (int i=0;i<tableItems.length;i++){
-			compLibs.add(tableItems[i].getData());
-		}
-		JSFLibraryInternalReference[] libs = (JSFLibraryInternalReference[])compLibs.toArray(new JSFLibraryInternalReference[0]);		
-		model.setProperty(IJSFFacetInstallDataModelProperties.COMPONENT_LIBRARIES, libs);		
-	}
-	
-
-	/**
-	 * Configure the JSFLibraryConfigControl elements to used the containers synchHelper
-	 * @param synchHelper
-	 */
-	public void setSynchHelper(DataModelSynchHelper synchHelper) {	
-		model = synchHelper.getDataModel();
-		synchHelper.synchCombo(cvImplLib.getCombo(), IJSFFacetInstallDataModelProperties.IMPLEMENTATION_LIBRARIES, null);
-		synchHelper.synchCheckbox(btnDeployJars, IJSFFacetInstallDataModelProperties.DEPLOY_IMPLEMENTATION, null);
-		//not using synch helper for IMPLEMENTATION_TYPE
-//		synchHelper.synchCheckBoxTableViewer(ctvSelCompLib, IJSFFacetInstallDataModelProperties.COMPONENT_LIBRARIES, new Control[]{hiddenList});
-	}
-
-	/**
-	 * 	Inner Classes for filtering.
-	 *
-	 */
-	class CheckedTableViewerFilter extends ViewerFilter {
-		public boolean select(Viewer viewer, Object parentElement, Object element) {
-			if (element instanceof JSFLibraryInternalReference) {
-				return ((JSFLibraryInternalReference)element).isSelected();
-			}
-			return false;
-		}
-	}
-	class TreeViewerFilter extends ViewerFilter {
-
-		public boolean select(Viewer viewer, Object parentElement, Object element) {
-			if (element instanceof JSFLibraryInternalReference) {
-				return !((JSFLibraryInternalReference)element).isSelected();
-			}
-			return true;
-		}
-	}
-
-	class CompLibCTVContentProvider implements IStructuredContentProvider {
-		private List jsfComplLibs = new ArrayList(0);
-		
-		public Object[] getElements(Object inputElement) {						
-			return jsfComplLibs.toArray();
-		}
-		public void dispose() {
-            // do nothing
-		}
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			if (newInput == null) {
-				jsfComplLibs = Collections.EMPTY_LIST;
-			} else {
-				jsfComplLibs = (List)newInput;
-			}
-		}
-	}
-	class ImplLibCVContentProvider implements IStructuredContentProvider {
-		private List jsfImplLibs = new ArrayList(0);
-		
-		public Object[] getElements(Object inputElement) {
-			return jsfImplLibs.toArray();
-		}
-		public void dispose() {
-            // do nothing
-		}
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			if (newInput == null) {
-				jsfImplLibs = Collections.EMPTY_LIST;
-			} else {
-				jsfImplLibs = (List)newInput;
-			}
-		}
-	}
-	
-	// Label Provider
-	class SelectedCompLibCTVLabelProvider extends LabelProvider implements ITableLabelProvider {
-		public String getColumnText(Object element, int columnIndex) {
-			if (element instanceof JSFLibraryInternalReference){
-				
-			    switch(columnIndex) {
-			    case COLUMN_DEPLOY:
-			    	return " ";	  //$NON-NLS-1$
-			    case COLUMN_LIB_NAME:
-			    	return ((JSFLibraryInternalReference)element).getLabel();
-			    }				
-			}			
-		    return ""; //$NON-NLS-1$
-			
-		}
-		public Image getColumnImage(Object element, int columnIndex) {
-			return null;
-		}
-	}
-	class ImplLibCVListLabelProvider extends LabelProvider {
-		private JSFLibrary defaultImpl = null;
-		
-		public String getText(Object element) {
-			if (element instanceof JSFLibraryInternalReference){
-				StringBuffer labelBuf = new StringBuffer(((JSFLibraryInternalReference)element).getLabel());
-				JSFLibrary lib = ((JSFLibraryInternalReference)element).getLibrary();
-				if (getDefaultImpl()!= null && lib != null && lib.getID().equals(getDefaultImpl().getID()))
-					labelBuf.append(" ").append(JSFLibraryRegistry.DEFAULT_IMPL_LABEL); //$NON-NLS-1$
-				return labelBuf.toString() ;
-			}
-			return null;
-		}
-		private JSFLibrary getDefaultImpl() {
-			if (defaultImpl == null){
-				JSFLibraryRegistry jsflibreg = JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry();
-				defaultImpl = jsflibreg.getDefaultImplementation();
-			}
-			return defaultImpl;
-		}
-		public Image getImage(Object element) {
-			return null;
-		}
-	}
-	
-	// Sorter
-	class SelectedCompLibCTVSorter extends ViewerSorter {
-		public int compare(Viewer viewer, Object e1, Object e2) {
-			if (e1 instanceof JSFLibraryInternalReference && 
-					e2 instanceof JSFLibraryInternalReference) {
-			JSFLibraryInternalReference item1 = (JSFLibraryInternalReference)e1;
-			JSFLibraryInternalReference item2 = (JSFLibraryInternalReference)e2;			
-			return item1.getLabel().compareToIgnoreCase(item2.getLabel());
-			}
-			return 0;
-		}
-	}
-	
-	/*
-	 * Content provider Adapter for TreeViewer
-	 */
-	private class TreeViewerAdapter implements ITreeContentProvider {
-		private final Object[] NO_ELEMENTS= new Object[0];
-
-		// ------- ITreeContentProvider Interface ------------
-
-		public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			// will never happen
-		}
-
-		public void dispose() {
-            // do nothing
-		}
-
-		public Object[] getElements(Object obj) {
-			return workingCopyModel.getJSFComponentLibraries().toArray();
-		}
-		
-		public Object[] getChildren(Object element) {
-			if (element instanceof JSFLibraryInternalReference) {
-				return ((JSFLibraryInternalReference)element).getArchiveFiles().toArray();				
-			}
-			return NO_ELEMENTS;
-		}
-
-		public Object getParent(Object element) {
-			return null;
-		}
-
-		public boolean hasChildren(Object element) {
-			if (element instanceof JSFLibraryInternalReference) {
-				return true;
-			}
-			return false;
-		}		
-		
-	}
-	
-	private class TreeLabelProvider implements ILabelProvider {
-		Image libImg;
-		Image jarImg;
-
-		TreeLabelProvider(){
-			if (jarImg == null){
-				ImageDescriptor jarImgDesc = JSFUiPlugin.getImageDescriptor("obj16/jar_obj.gif"); //$NON-NLS-1$
-				jarImg = jarImgDesc.createImage();
-			}
-			if (libImg == null){
-				ImageDescriptor libImgDesc = JSFUiPlugin.getImageDescriptor("obj16/library_obj.gif"); //$NON-NLS-1$
-				libImg = libImgDesc.createImage();
-			}
-		}
-		
-		public Image getImage(Object element) {
-			if (element instanceof JSFLibraryInternalReference)
-            {
-			    return libImg;
-            }
-			return jarImg;
-		}
-
-		public String getText(Object element) {
-			StringBuffer labelBuf = new StringBuffer();
-			if (element instanceof JSFLibraryInternalReference) {
-				JSFLibraryInternalReference libWrapper = (JSFLibraryInternalReference)element;
-				JSFLibrary lib = libWrapper.getLibrary();
-				labelBuf.append(lib.getLabel());
-				if (lib.isImplementation()) {
-					labelBuf.append(" "); //$NON-NLS-1$
-					if (lib == JSFLibraryRegistryUtil.getInstance().getJSFLibraryRegistry().getDefaultImplementation()) {
-						labelBuf.append(DEFAULT_IMPL_DESC); 
-					} else {
-						labelBuf.append(IMPL_DESC); 
-					}
-				}
-			}
-			if (element instanceof ArchiveFile) {
-				ArchiveFile jar = (ArchiveFile)element;
-				labelBuf.append(jar.getName());
-				if (!jar.exists())
-					labelBuf.append(MISSING);
-				labelBuf.append(" - ").append(((ArchiveFile)element).getSourceLocation()); //$NON-NLS-1$
-			}
-			return labelBuf.toString();
-		}
-
-		public void addListener(ILabelProviderListener listener) {
-            // not handling listeners
-		}
-
-		public void dispose() {
-			if (libImg != null){
-				libImg.dispose();
-			}			
-			if (jarImg != null){
-				jarImg.dispose();
-			}		
-		}
-
-		public boolean isLabelProperty(Object element, String property) {
-			return false;
-		}
-
-		public void removeListener(ILabelProviderListener listener) {
-            // not handling listeners
-		}
-	}
-	
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControlChangeEvent.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControlChangeEvent.java
deleted file mode 100644
index 1611218..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControlChangeEvent.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.jsflibraryconfig;
-
-import java.util.EventObject;
-
-/**
- * Event that something has changed in the JSFLibraryConfigControl
- *
- */
-public class JSFLibraryConfigControlChangeEvent {
-	private EventObject event;
-
-	/**
-	 * Constructor
-	 * @param ev
-	 */
-	public JSFLibraryConfigControlChangeEvent(EventObject ev){
-		this.event = ev;
-	}
-
-	/**
-	 * @return java.util.EventObject
-	 */
-	public EventObject getEvent(){
-		return event;
-	}
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControlChangeListener.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControlChangeListener.java
deleted file mode 100644
index 945f9ef..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/jsflibraryconfig/JSFLibraryConfigControlChangeListener.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2001, 2007 Oracle Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     Oracle Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.jsflibraryconfig;
-
-
-/**
- * Interface to be implemented to listen to changes in the JSFLibraryConfigControl object
- *
- */
-public interface JSFLibraryConfigControlChangeListener {
-	/**
-	 * Callback method
-	 * @param e
-	 */
-	public void changed(JSFLibraryConfigControlChangeEvent e);
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/messages.properties
deleted file mode 100644
index e43aca1..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/messages.properties
+++ /dev/null
@@ -1,109 +0,0 @@
-###############################################################################
-# Copyright (c) 2005 Oracle Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the 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:
-#    Gerry Kessler - initial API and implementation
-#    Ian Trimble - change key names for use with org.eclipse.osgi.util.NLS
-###############################################################################
-JSFFacetInstallPage_title=JSF Capabilities
-JSFFacetInstallPage_description=Add JSF capabilities to this Web Project
-JSFFacetInstallPage_JSFImplLabel=JSF &Implementation:
-JSFFacetInstallPage_Add1=A&dd...
-JSFFacetInstallPage_Add2=&Add...
-JSFFacetInstallPage_DeployJarsLabel=&Deploy jars to WEB-INF/lib
-JSFFacetInstallPage_JSFConfigLabel=JSF &Configuration File:
-JSFFacetInstallPage_JSFServletNameLabel=JSF &Servlet Name:
-JSFFacetInstallPage_JSFServletClassNameLabel=JSF Servlet C&lassname:
-JSFFacetInstallPage_JSFURLMappingLabel=&URL Mapping Patterns:
-JSFFacetInstallPage_JSFLibraryLabel0=JSF Libraries:
-JSFFacetInstallPage_PatternDialogTitle=Specify URL Pattern
-JSFFacetInstallPage_PatternDialogDesc=URL Pattern
-JSFFacetInstallPage_Remove=&Remove
-JSFFacetInstallPage_PatternEmptyMsg=Pattern must not be empty
-JSFFacetInstallPage_PatternSpecifiedMsg=Pattern is already specified
-JSFFacetInstallPage_ErrorNoWebAppDataModel=Unable to locate WebApp datamodel
-
-JSFLibrariesPreferencePage_DefinedJSFLibraries=Defined JSF Libraries:
-JSFLibrariesPreferencePage_DEFAULT_IMPL_DESC=[implementation - default]
-JSFLibrariesPreferencePage_New=New...
-JSFLibrariesPreferencePage_Edit=Edit...
-JSFLibrariesPreferencePage_Remove=Remove
-JSFLibrariesPreferencePage_CannotRemovePluginProvidedTitle=Cannot Remove
-JSFLibrariesPreferencePage_CannotRemovePluginProvidedMessage=Plugin provided libraries cannot be removed from the registry
-JSFLibrariesPreferencePage_MakeDefault=Make Default
-JSFLibrariesPreferencePage_MISSING_DESC=[missing]
-JSFLibrariesPreferencePage_Description=JSF Libraries contain jars with JSF components and tag libraries.   Some JSF Libraries can be specially marked as implementations so that the WebApp can be executed.
-JSFLibrariesPreferencePage_IMPL_DESC=[implementation]
-JSFLibrariesPreferencePage_CannotModifyPluginProvidedTitle=Cannot Modify
-JSFLibraryPropertyPage_No_JSF_Implementation_Lib_Selected=No JSF implementation library selected.
-JSFLibrariesPreferencePage_CannotModifyPluginProvidedMessage=Plugin provided libraries cannot be edited
-
-JSFLibraryContainerWizardPage_PageName=Add JSF Library
-JSFLibraryContainerWizardPage_Title=JSF Library
-JSFLibraryContainerWizardPage_Description=Select JavaServer Face Libraries to add to the classpath
-JSFLibraryContainerWizardPage_WarningNoJSFFacet=JavaServer Face Libraries can only be configured for Dynamic Web projects with the JSF facet installed.
-JSFLibraryContainerWizardPage_JSFLibraries=JSF Libraries:
-JSFLibraryContainerWizardPage_Add=Add...
-JSFLibraryContainerWizardPage_V1Registry_Warning_DialogTitle=Backward compatibility issue
-JSFLibraryWizard_JSFLibraryWizard_DontShowThisAgain_CheckBoxLabel=Do not show this message again (affects all listed projects)
-JSFLibraryContainerWizardPage_V1Registry_Warning_DialogText=This project is currently configured for use with an obsolete version of JSF libraries. \
-Changing JSF library settings on this project may break backward compatibility with older versions of JSF tools.\
-\n\nSee http://wiki.eclipse.org/index.php/JSF_Library_Migration for more information.
-JSFLibraryContainerWizardPage_EditLibrary_DescriptionText=Select JSF Library for this reference to use.  Choose 'Edit...' to modify contents of the selected library.
-JSFLibraryContainerWizardPage_Edit=Edit...
-JSFLibraryContainerWizardPage_ImplAlreadyPresent=An implementation has already been chosen.  Please remove before adding different one
-JSFLibraryContainerWizardPage_ErrorInitializing=Error during initialization
-JSFLibraryContainerWizardPage_SelectOneImpl=Choose only one implementation
-
-JSFLibraryWizard_DESCRIPTION=Create a library of jars that make up a JSF component library.
-JSFLibraryWizard_IMPLS_ONLY_DESC=Create a library of jars that make up a JSF implementation library.
-JSFLibraryWizard_CreateImplementation=Create JSF Implementation Library
-JSFLibraryWizard_CreateJSFLibrary=Create JSF Library
-JSFLibraryWizard_EditJSFLibrary=Edit JSF Library
-JSFLibraryWizard_JSFLibrary=JSF Library
-JSFLibraryWizard_LibraryName=Library &Name:
-JSFLibraryWizard_VersionSupported=&Version Supported:
-JSFLibraryWizard_LibraryJars=Library &Jars
-JSFLibraryWizard_IsJSFImplementation=Is JSF &Implementation
-JSFLibraryWizard_DeployJars=&Deploy Jars
-JSFLibraryWizard_Add=&Add...
-JSFLibraryWizard_Remove=&Remove
-JSFLibraryWizard_ExtJarFileDialogTitle=Browse for Jars/Zips
-JSFLibraryWizard_ValidateNoJars=The library must contain at least one jar.
-JSFLibraryWizard_ValidateNoLibraryName=A library name must be supplied.
-JSFLibraryWizard_ValidateExistingLibraryName=A library or implementation by this name already exists.
-JSFLibraryWizard_V1JSFLibrary_DialogMessage=The projects listed below contain JSF library references that are\
-obsolete and may not be automatically updated by this change. To fix this issue, you need to update these\
-these projects.\
-\n\nSee http://wiki.eclipse.org/index.php/JSF_Library_Migration for more information. \n\nProjects: {0}
-JSFLibraryWizard_V1JSFLibrary_DialogTitle=Backward compatibility issue
-
-JSFLibraryConfigControl_ImplementationLibrary=Implementation Library
-JSFLibraryPropertyPage_No_JSF_Facet_Installed=JSF Facet not installed.
-JSFLibraryConfigControl_NewImplementationLibrary=New...
-JSFLibraryConfigControl_ServerSuppliedButtonTooltip=Chosen server adapter must supply the JSF Implementation jars.
-JSFLibraryConfigControl_ServerSuppliedButtonLabel=Server Supplied JSF Implementation
-JSFLibraryConfigControl_NewImplButtonTooltip=Create new user supplied implementation library
-JSFLibraryConfigControl_DeployJAR=Deploy jars to WEB-INF/lib
-JSFLibraryConfigControl_ComponentLibrary=Component Libraries
-JSFLibraryConfigControl_DeployButtonLabel=Deploy
-JSFLibraryConfigControl_Add=\ \ >  
-JSFLibraryConfigControl_Remove=\ \ <  
-JSFLibraryConfigControl_AddAll=\ \ >>  
-JSFLibraryConfigControl_RemoveAll=\ \ <<  
-JSFLibraryConfigControl_NewComponentLibrary=New...
-JSFLibraryConfigControl_TH_Deploy=Deploy
-JSFLibraryConfigControl_NullProject=No project specified.
-JSFLibraryConfigControl_TH_LibraryName=Library Name
-
-JSFValidationPreferencePage_ELPrefPanel_Title=Expression Language (EL) Validation
-JSFValidationPreferencePage_ELPrefPanel_BuildValidationCheckBoxTitle=Validate EL on &Build/Run Validation
-JSFValidationPreferencePage_ELPrefPanel_IncrementalValidationCheckBoxTitle= Validate EL as &you type (may be slow on some pages)
-
-JSFLibraryEditControl_ImplVersion_UNKNOWN=UNKNOWN
-
-JSFPreferences_RootPage_Description=Expand the tree to edit preferences for a specific feature.
\ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/preferences/EmptyRootPreferencePage.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/preferences/EmptyRootPreferencePage.java
deleted file mode 100644
index d269dd2..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/preferences/EmptyRootPreferencePage.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Jens Lukowski/Innoopract - initial renaming/restructuring
- *     Oracle - adapted for JSF tooling
- *     
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.preferences;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-/**
- * The empty pref page used as the root of all other JSF feature preference pages
- * under the Web&XML top-level pref page
- * 
- * @author cbateman
- *
- */
-public class EmptyRootPreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
-
-    private Composite createComposite(Composite parent, int numColumns) {
-        noDefaultAndApplyButton();
-        
-        Composite composite = new Composite(parent, SWT.NULL);
-
-        // GridLayout
-        GridLayout layout = new GridLayout();
-        layout.numColumns = numColumns;
-        composite.setLayout(layout);
-
-        // GridData
-        GridData data = new GridData(GridData.FILL);
-        data.horizontalIndent = 0;
-        data.verticalAlignment = GridData.FILL;
-        data.horizontalAlignment = GridData.FILL;
-        composite.setLayoutData(data);
-
-        return composite;
-    }
-
-    protected Control createContents(Composite parent) {
-        Composite composite = createScrolledComposite(parent);
-
-        String description = Messages.JSFPreferences_RootPage_Description;
-        Text text = new Text(composite, SWT.READ_ONLY);
-        // some themes on GTK have different background colors for Text and Labels
-        text.setBackground(composite.getBackground());
-        text.setText(description);
-
-        setSize(composite);
-        return composite;
-    }
-
-    private Composite createScrolledComposite(Composite parent) {
-        // create scrollbars for this parent when needed
-        final ScrolledComposite sc1 = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
-        sc1.setLayoutData(new GridData(GridData.FILL_BOTH));
-        Composite composite = createComposite(sc1, 1);
-        sc1.setContent(composite);
-
-        // not calling setSize for composite will result in a blank composite,
-        // so calling it here initially
-        // setSize actually needs to be called after all controls are created,
-        // so scrolledComposite
-        // has correct minSize
-        setSize(composite);
-        return composite;
-    }
-
-    public void init(IWorkbench workbench) {
-        // do  nothing
-    }
-
-    private void setSize(Composite composite) {
-        if (composite != null) {
-            // Note: The font is set here in anticipation that the class inheriting
-            //       this base class may add widgets to the dialog.   setSize
-            //       is assumed to be called just before we go live.
-            applyDialogFont(composite);
-            Point minSize = composite.computeSize(SWT.DEFAULT, SWT.DEFAULT);
-            composite.setSize(minSize);
-            // set scrollbar composite's min size so page is expandable but
-            // has scrollbars when needed
-            if (composite.getParent() instanceof ScrolledComposite) {
-                ScrolledComposite sc1 = (ScrolledComposite) composite.getParent();
-                sc1.setMinSize(minSize);
-                sc1.setExpandHorizontal(true);
-                sc1.setExpandVertical(true);
-            }
-        }
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/project/facet/JSFFacetInstallPage.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/project/facet/JSFFacetInstallPage.java
deleted file mode 100644
index 48a7ea7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/project/facet/JSFFacetInstallPage.java
+++ /dev/null
@@ -1,610 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2005 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the 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:
- *    Gerry Kessler - initial API and implementation
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.project.facet;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.DialogSettings;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.jface.dialogs.InputDialog;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.window.Window;
-import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryConfigDialogSettingData;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryConfiglModelSource;
-import org.eclipse.jst.jsf.core.internal.jsflibraryconfig.JSFLibraryInternalReference;
-import org.eclipse.jst.jsf.core.internal.project.facet.IJSFFacetInstallDataModelProperties;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.jst.jsf.ui.internal.jsflibraryconfig.IJSFImplLibraryCreationListener;
-import org.eclipse.jst.jsf.ui.internal.jsflibraryconfig.JSFImplLibraryCreationEvent;
-import org.eclipse.jst.jsf.ui.internal.jsflibraryconfig.JSFLibraryConfigControl;
-import org.eclipse.jst.jsf.ui.internal.jsflibraryconfig.JSFLibraryConfigControlChangeEvent;
-import org.eclipse.jst.jsf.ui.internal.jsflibraryconfig.JSFLibraryConfigControlChangeListener;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.List;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelProvider;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelEvent;
-import org.eclipse.wst.common.frameworks.datamodel.DataModelFactory;
-import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
-import org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage;
-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.ui.IFacetWizardPage;
-import org.eclipse.wst.common.project.facet.ui.IWizardContext;
-
-/**
- * JSF Facet installation wizard page.
- * 
- * @author Gerry Kessler - Oracle
- */
-public class JSFFacetInstallPage extends DataModelWizardPage implements
-		IJSFFacetInstallDataModelProperties, IFacetWizardPage {
-	// UI
-	private Label lblJSFImpl;
-	private Label lblJSFConfig;
-	private Text txtJSFConfig;
-	private Label lblJSFServletName;
-	private Text txtJSFServletName;
-	private Label lblJSFServletClassName;
-	private Text txtJSFServletClassName;	
-	private Label lblJSFServletURLPatterns;
-	private List lstJSFServletURLPatterns;
-	private Button btnAddPattern;
-	private Button btnRemovePattern;
-
-	private IDialogSettings dialogSettings;
-	private IDataModel webAppDataModel;
-	private static final String SETTINGS_ROOT = JSFUiPlugin.PLUGIN_ID
-			+ ".jsfFacetInstall"; //$NON-NLS-1$
-	private static final String SETTINGS_CONFIG = "configPath"; //$NON-NLS-1$
-	private static final String SETTINGS_SERVLET = "servletName"; //$NON-NLS-1$
-	private static final String SETTINGS_SERVLET_CLASSNAME = "servletClassname"; //$NON-NLS-1$
-	private static final String SETTINGS_URL_MAPPINGS = "urlMappings"; //$NON-NLS-1$
-	private static final String SETTINGS_URL_PATTERN = "pattern"; //$NON-NLS-1$
-	private static final String SETTINGS_DEPLOY_IMPL = "deployImplementation"; //$NON-NLS-1$
-	private static final String SETTINGS_IMPL_TYPE = "deployImplType";//$NON-NLS-1$
-	private static final String SETTINGS_COMPLIB = "selectedComponent"; //$NON-NLS-1$
-	private static final String SETTINGS_COMPLIB_SELECT_DEPLOY = "selectdeploycomplib"; //$NON-NLS-1$
-
-	private static final String SEPARATOR = ":"; //$NON-NLS-1$
-	
-	//Part of temporary fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=190304
-	private static final String DEFAULT_TO_CLIENT = "initialDefaultToClientSupplied";
-	private static final String DEFAULT_TO_SERVER = "initialDefaultToServerSupplied";
-
-
-	private JSFLibraryConfigControl jsfLibCfgComp = null;
-	// private String projectName = null;
-	private Composite composite = null;
-
-	/**
-	 * Zero argument constructor
-	 */
-	public JSFFacetInstallPage() {
-		// FIXME: following WebFacetInstallPage pattern which will be fixed at somepoint
-		super(DataModelFactory.createDataModel(new AbstractDataModelProvider() {/*
-																				 * do
-																				 * nothing
-																				 */
-		}), "jsf.facet.install.page"); //$NON-NLS-1$
-		setTitle(Messages.JSFFacetInstallPage_title);
-		setDescription(Messages.JSFFacetInstallPage_description);
-		dialogSettings = JSFUiPlugin.getDefault().getDialogSettings();
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage#createTopLevelComposite(org.eclipse.swt.widgets.Composite)
-	 */
-	protected Composite createTopLevelComposite(final Composite parent) {
-		initializeDialogUnits(parent);
-		composite = new Composite(parent, SWT.NONE);
-		final GridLayout jsfCompositeLayout = new GridLayout(3, false);
-		jsfCompositeLayout.marginTop = 0;
-		jsfCompositeLayout.marginBottom = 0;
-		jsfCompositeLayout.marginRight = 0;
-		jsfCompositeLayout.marginLeft = 0;
-		composite.setLayout(jsfCompositeLayout);
-
-		lblJSFImpl = new Label(composite, SWT.None);
-		GridData gdLbl = new GridData();
-		gdLbl.verticalIndent = 5;
-		gdLbl.verticalAlignment = SWT.BEGINNING;
-		lblJSFImpl.setLayoutData(gdLbl);
-		lblJSFImpl.setText(Messages.JSFFacetInstallPage_JSFLibraryLabel0);
-		
-		jsfLibCfgComp = new JSFLibraryConfigControl(composite, SWT.NONE);
-		jsfLibCfgComp
-				.addOkClickedListener(new IJSFImplLibraryCreationListener() {
-					public void okClicked(JSFImplLibraryCreationEvent event) {
-						if (event.isLibraryCreated()) {
-							validatePage();
-						}
-					}
-				});
-		
-		jsfLibCfgComp.addChangeListener( new JSFLibraryConfigControlChangeListener(){
-
-			public void changed(JSFLibraryConfigControlChangeEvent e) {
-				validatePage();				
-			}
-			
-		});
-		GridData gd_comp = new GridData();
-		gd_comp.horizontalSpan = 2;
-		gd_comp.grabExcessHorizontalSpace = true;
-		gd_comp.grabExcessVerticalSpace = true;
-		gd_comp.horizontalAlignment = SWT.FILL;
-		jsfLibCfgComp.setLayoutData(gd_comp);
-
-		lblJSFConfig = new Label(composite, SWT.NONE);
-		lblJSFConfig.setText(Messages.JSFFacetInstallPage_JSFConfigLabel);
-		lblJSFConfig.setLayoutData(new GridData(GridData.BEGINNING));
-
-		txtJSFConfig = new Text(composite, SWT.BORDER);
-		GridData gd1 = new GridData(GridData.FILL_HORIZONTAL);
-		gd1.horizontalSpan = 2;
-		txtJSFConfig.setLayoutData(gd1);
-
-		lblJSFServletName = new Label(composite, SWT.NONE);
-		lblJSFServletName
-				.setText(Messages.JSFFacetInstallPage_JSFServletNameLabel);
-		lblJSFServletName.setLayoutData(new GridData(GridData.BEGINNING));
-
-		txtJSFServletName = new Text(composite, SWT.BORDER);
-		GridData gd2 = new GridData(GridData.FILL_HORIZONTAL);
-		gd2.horizontalSpan = 2;
-		txtJSFServletName.setLayoutData(gd2);
-
-		lblJSFServletClassName = new Label(composite, SWT.NONE);
-		lblJSFServletClassName
-				.setText(Messages.JSFFacetInstallPage_JSFServletClassNameLabel);
-		lblJSFServletClassName.setLayoutData(new GridData(GridData.BEGINNING));
-
-		txtJSFServletClassName = new Text(composite, SWT.BORDER);
-		GridData gd2c = new GridData(GridData.FILL_HORIZONTAL);
-		gd2c.horizontalSpan = 2;
-		txtJSFServletClassName.setLayoutData(gd2c);
-		
-		lblJSFServletURLPatterns = new Label(composite, SWT.NULL);
-		lblJSFServletURLPatterns
-				.setText(Messages.JSFFacetInstallPage_JSFURLMappingLabel);
-		lblJSFServletURLPatterns.setLayoutData(new GridData(GridData.BEGINNING
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		lstJSFServletURLPatterns = new List(composite, SWT.BORDER);
-		GridData gd3 = new GridData(GridData.FILL_HORIZONTAL);
-		gd3.heightHint = convertHeightInCharsToPixels(5);
-		lstJSFServletURLPatterns.setLayoutData(gd3);
-		lstJSFServletURLPatterns.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				btnRemovePattern.setEnabled(lstJSFServletURLPatterns
-						.getSelectionCount() > 0);
-			}
-		});
-
-		Composite btnComposite = new Composite(composite, SWT.NONE);
-		GridLayout gl = new GridLayout(1, false);
-		// gl.marginBottom = 0;
-		// gl.marginTop = 0;
-		// gl.marginRight = 0;
-		gl.marginLeft = 0;
-		btnComposite.setLayout(gl);
-		btnComposite.setLayoutData(new GridData(GridData.END
-				| GridData.VERTICAL_ALIGN_FILL));
-
-		btnAddPattern = new Button(btnComposite, SWT.NONE);
-		btnAddPattern.setText(Messages.JSFFacetInstallPage_Add2);
-		btnAddPattern.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		btnAddPattern.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				InputDialog dialog = new InputDialog(getShell(),
-						Messages.JSFFacetInstallPage_PatternDialogTitle,
-						Messages.JSFFacetInstallPage_PatternDialogDesc, null,
-						new IInputValidator() {
-
-							public String isValid(String newText) {
-								return isValidPattern(newText);
-							}
-
-						});
-				dialog.open();
-				if (dialog.getReturnCode() == Window.OK) {
-					addItemToList(dialog.getValue(), true);
-				}
-			}
-		});
-
-		btnRemovePattern = new Button(btnComposite, SWT.NONE);
-		btnRemovePattern.setText(Messages.JSFFacetInstallPage_Remove);
-		btnRemovePattern.setLayoutData(new GridData(GridData.FILL_HORIZONTAL
-				| GridData.VERTICAL_ALIGN_BEGINNING));
-		btnRemovePattern.setEnabled(false);
-		btnRemovePattern.addSelectionListener(new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				removeItemFromList(lstJSFServletURLPatterns.getSelection());
-				btnRemovePattern.setEnabled(false);
-			}
-		});
-
-		addModificationListeners();
-
-		this.getContainer().getShell().pack();
-
-		return composite;
-	}
-
-	private void initializeValues() {
-		IDialogSettings root = dialogSettings.getSection(SETTINGS_ROOT);
-
-		initJSFCfgCtrlValues(root);
-
-		String conf = null;
-		if (root != null)
-			conf = root.get(SETTINGS_CONFIG);
-		if (conf == null || conf.equals("")) { //$NON-NLS-1$
-			conf = (String) model
-					.getDefaultProperty(IJSFFacetInstallDataModelProperties.CONFIG_PATH);
-		}
-		txtJSFConfig.setText(conf);
-
-		String servletName = null;
-		if (root != null)
-			servletName = root.get(SETTINGS_SERVLET);
-		if (servletName == null || servletName.equals("")) { //$NON-NLS-1$
-			servletName = (String) model
-					.getDefaultProperty(IJSFFacetInstallDataModelProperties.SERVLET_NAME);
-		}
-		txtJSFServletName.setText(servletName);
-
-		String servletClassname = null;
-		if (root != null)
-			servletClassname = root.get(SETTINGS_SERVLET_CLASSNAME);
-		if (servletClassname == null || servletClassname.equals("")) { //$NON-NLS-1$
-			servletClassname = (String) model
-					.getDefaultProperty(IJSFFacetInstallDataModelProperties.SERVLET_CLASSNAME);
-		}
-		txtJSFServletClassName.setText(servletClassname);
-
-		loadURLMappingPatterns(root);
-	}
-
-	private void initJSFCfgCtrlValues(IDialogSettings root) {
-		IMPLEMENTATION_TYPE implType = IMPLEMENTATION_TYPE.UNKNOWN;
-		String deployImpl = null;
-		
-		if (root != null) {
-			implType = IMPLEMENTATION_TYPE.getValue(root.get(SETTINGS_IMPL_TYPE));
-			deployImpl = root.get(SETTINGS_DEPLOY_IMPL);
-			
-		}
-				
-		//Part of temporary fix for https://bugs.eclipse.org/bugs/show_bug.cgi?id=190304
-		if (implType == IMPLEMENTATION_TYPE.UNKNOWN) {			
-			// if the impl type is still unknown, check if the product provided a default
-			IPreferenceStore prefs = JSFUiPlugin.getDefault().getPreferenceStore();
-			if(prefs.getBoolean(DEFAULT_TO_CLIENT)) {			
-				implType = IMPLEMENTATION_TYPE.CLIENT_SUPPLIED;
-			}
-			else if(prefs.getBoolean(DEFAULT_TO_SERVER)) {	
-				implType = IMPLEMENTATION_TYPE.SERVER_SUPPLIED;
-			}
-		}
-
-		if (deployImpl == null || deployImpl.equals("")) { //$NON-NLS-1$
-			deployImpl = ((Boolean) model
-					.getDefaultProperty(IJSFFacetInstallDataModelProperties.DEPLOY_IMPLEMENTATION))
-					.toString();
-		}
-
-		IDialogSettings complibs = null;
-		if (root != null) {
-			complibs = root.getSection(SETTINGS_COMPLIB);
-		}
-
-		String[] selection = null;
-		if (complibs != null) {
-			selection = complibs.getArray(SETTINGS_COMPLIB_SELECT_DEPLOY);
-		}
-
-		JSFLibraryConfiglModelSource source = new JSFLibraryConfigDialogSettingData(implType,
-				Boolean.valueOf(deployImpl).booleanValue(), selection);
-		jsfLibCfgComp.loadControlValuesFromModel(source);
-	}
-
-	
-	private void saveSettings() {
-		DialogSettings root = new DialogSettings(SETTINGS_ROOT);
-		dialogSettings.addSection(root);
-
-		root.put(SETTINGS_IMPL_TYPE, getJSFImplType());
-		root.put(SETTINGS_DEPLOY_IMPL, String.valueOf(getDeployJSFImpl()));
-		root.put(SETTINGS_CONFIG, getJSFConfig());
-		root.put(SETTINGS_SERVLET, getJSFServletName());
-		root.put(SETTINGS_SERVLET_CLASSNAME, getJSFServletClassname());
-		DialogSettings mappings = new DialogSettings(SETTINGS_URL_MAPPINGS);
-		root.addSection(mappings);
-		mappings.put(SETTINGS_URL_PATTERN, getJSFPatterns());
-
-		DialogSettings complibs = new DialogSettings(SETTINGS_COMPLIB);
-		root.addSection(complibs);
-		complibs.put(SETTINGS_COMPLIB_SELECT_DEPLOY, getCompLibSelections());
-	}
-
-	private String getJSFImplType() {
-		return IMPLEMENTATION_TYPE.getStringValue((IMPLEMENTATION_TYPE)model.getProperty(IMPLEMENTATION_TYPE_PROPERTY_NAME));
-	}
-
-	private boolean getDeployJSFImpl() {
-		if (jsfLibCfgComp.getSelectedJSFLibImplementation() == null) {
-			return false;
-		}
-		return jsfLibCfgComp.getSelectedJSFLibImplementation()
-				.isCheckedToBeDeployed();
-	}
-
-	private String getJSFConfig() {
-		return txtJSFConfig.getText().trim();
-	}
-
-	private String getJSFServletName() {
-		return txtJSFServletName.getText().trim();
-	}
-
-	private String getJSFServletClassname() {
-		return txtJSFServletClassName.getText().trim();
-	}
-	
-	private String[] getJSFPatterns() {
-		return lstJSFServletURLPatterns.getItems();
-	}
-
-	private String[] getCompLibSelections() {
-		/*
-		 * Iterate thru the selected component libraries and return selected
-		 * component libraries and their deployment flags in a string array.
-		 */
-		JSFLibraryInternalReference complib = null;
-		String str = null;
-		ArrayList al = new ArrayList();
-
-		java.util.List list = jsfLibCfgComp.getSelectedJSFLibComponents();
-		Iterator it = list.iterator();
-		while (it.hasNext()) {
-			complib = (JSFLibraryInternalReference) it.next();
-			str = complib.getID() + SEPARATOR + complib.isCheckedToBeDeployed();
-			al.add(str);
-		}
-
-		return (String[]) al.toArray(new String[al.size()]);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.project.facet.ui.IFacetWizardPage#setConfig(java.lang.Object)
-	 */
-	public void setConfig(Object config) {
-		model.removeListener(this);
-		synchHelper.dispose();
-
-		model = (IDataModel) config;
-		model.addListener(this);
-		synchHelper = initializeSynchHelper(model);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.wst.common.project.facet.ui.IFacetWizardPage#transferStateToConfig()
-	 */
-	public void transferStateToConfig() {
-		saveSettings(); // convenient place for this. don't want to save if user
-						// cancelled.
-		// do nothing else now. being handled by synchHelper
-		// config.setProperty(IJSFFacetInstallDataModelProperties.IMPLEMENTATION,
-		// getJSFImpl());
-//		model
-//				.setStringProperty(
-//						IJSFFacetInstallDataModelProperties.CONFIG_PATH,
-//						getJSFConfig());
-//		model.setStringProperty(
-//				IJSFFacetInstallDataModelProperties.SERVLET_NAME,
-//				getJSFServletName());
-		// config.setProperty(IJSFFacetInstallDataModelProperties.SERVLET_URL_PATTERNS,
-		// getJSFPatterns());
-
-//		java.util.List implLibs = new ArrayList();
-//		implLibs.add(jsfLibCfgComp.getSelectedJSFLibImplementation());
-//		java.util.List compLibs = jsfLibCfgComp.getSelectedJSFLibComponents();
-//		model.setProperty(
-//				IJSFFacetInstallDataModelProperties.IMPLEMENTATION_LIBRARIES,
-//				implLibs);
-//		model.setProperty(
-//				IJSFFacetInstallDataModelProperties.COMPONENT_LIBRARIES,
-//				compLibs);
-	}
-
-	private void addModificationListeners() {
-		 jsfLibCfgComp.setSynchHelper(synchHelper);		 
-		 synchHelper.synchText(txtJSFConfig, CONFIG_PATH, null);
-		 synchHelper.synchText(txtJSFServletName, SERVLET_NAME, null);
-		 synchHelper.synchText(txtJSFServletClassName, SERVLET_CLASSNAME, null);
-		 synchHelper.synchList(lstJSFServletURLPatterns, SERVLET_URL_PATTERNS, null);
-		 
-		// synchHelper.synchCheckbox(chkDeployImpl, DEPLOY_IMPLEMENTATION,
-		// null);
-	}
-
-	private String isValidPattern(String value) {
-		if (value == null || value.trim().equals("")) //$NON-NLS-1$
-			return Messages.JSFFacetInstallPage_PatternEmptyMsg;
-		if (lstJSFServletURLPatterns.indexOf(value) >= 0)
-			return Messages.JSFFacetInstallPage_PatternSpecifiedMsg;
-
-		return null;
-	}
-
-	private void loadURLMappingPatterns(IDialogSettings root) {
-		lstJSFServletURLPatterns.removeAll();
-		IDialogSettings mappings = null;
-		if (root != null)
-			mappings = root.getSection(SETTINGS_URL_MAPPINGS);
-		String[] patterns = null;
-		if (mappings != null)
-			patterns = mappings.getArray(SETTINGS_URL_PATTERN);
-
-		if (patterns == null || patterns.length == 0) {
-			patterns = (String[]) model
-					.getDefaultProperty(IJSFFacetInstallDataModelProperties.SERVLET_URL_PATTERNS);
-		}
-		for (int i = 0; i < patterns.length; i++) {
-			addItemToList(patterns[i], false);
-		}
-	}
-
-	private void addItemToList(String pattern, boolean selectMe) {
-		lstJSFServletURLPatterns.add(pattern == null ? "" : pattern); //$NON-NLS-1$
-		if (pattern == null && selectMe)
-			lstJSFServletURLPatterns.setSelection(lstJSFServletURLPatterns
-					.getItemCount() - 1);
-		// When 119321 is fixed - remove code below
-		updateModelForURLPattern();
-	}
-
-	private void removeItemFromList(String[] selection) {
-		for (int i = 0; i < selection.length; i++) {
-			String sel = selection[i];
-			lstJSFServletURLPatterns.remove(sel);
-		}
-		// When 119321 is fixed - remove code below
-		updateModelForURLPattern();
-	}
-
-	private void updateModelForURLPattern() {
-		model.setProperty(
-				IJSFFacetInstallDataModelProperties.SERVLET_URL_PATTERNS,
-				lstJSFServletURLPatterns.getItems());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage#getValidationPropertyNames()
-	 */
-	protected String[] getValidationPropertyNames() {
-		return new String[] { IMPLEMENTATION_TYPE_PROPERTY_NAME, IMPLEMENTATION, DEPLOY_IMPLEMENTATION,
-				CONFIG_PATH, SERVLET_NAME, SERVLET_CLASSNAME, COMPONENT_LIBRARIES };
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.project.facet.ui.IFacetWizardPage#setWizardContext(org.eclipse.wst.common.project.facet.ui.IWizardContext)
-	 */
-	public void setWizardContext(IWizardContext context) {
-		// hook into web datamodel if new project wizard.
-		Iterator it = context.getSelectedProjectFacets().iterator();
-		IProjectFacetVersion webFacetVersion = null;
-		while (it.hasNext()) {
-			// find Web facet
-			IProjectFacetVersion pfv = (IProjectFacetVersion) it.next();
-			if (pfv.getProjectFacet().getId().equals("jst.web")) { //$NON-NLS-1$
-				webFacetVersion = pfv;
-				break;
-			}
-		}
-		if (webFacetVersion != null) {
-			try {
-				webAppDataModel = (IDataModel) context.getConfig(
-						webFacetVersion, IFacetedProject.Action.Type.INSTALL,
-						context.getProjectName());
-				if (webAppDataModel != null) {
-					webAppDataModel.addListener(this);
-				}
-			} catch (CoreException e) {
-				JSFUiPlugin.log(IStatus.ERROR,
-						Messages.JSFFacetInstallPage_ErrorNoWebAppDataModel, e);
-			}
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage#propertyChanged(org.eclipse.wst.common.frameworks.datamodel.DataModelEvent)
-	 */
-	public void propertyChanged(DataModelEvent event) {
-		if (webAppDataModel != null) {
-			String propertyName = event.getPropertyName();
-			if (propertyName
-					.equals(IJ2EEModuleFacetInstallDataModelProperties.CONFIG_FOLDER)) {
-				model.setStringProperty(WEBCONTENT_DIR, event.getProperty()
-						.toString());
-			}
-		}
-		super.propertyChanged(event);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage#dispose()
-	 */
-	public void dispose() {
-		if (webAppDataModel != null)
-			webAppDataModel.removeListener(this);
-		
-		jsfLibCfgComp.dispose();
-		super.dispose();
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage#restoreDefaultSettings()
-	 */
-	protected void restoreDefaultSettings() {
-		initializeValues();
-
-		checkToCompletePage(jsfLibCfgComp);
-	}
-
-	/*
-	 * To force a JSF facet install page configuration to be performed    
-	 * when the JSF facet is selected but no JSF implementation library exists.
-	 */
-	private void checkToCompletePage(Composite control) {
-		boolean enableFinish = false;
-		IMPLEMENTATION_TYPE implType = (IMPLEMENTATION_TYPE)model.getProperty(IMPLEMENTATION_TYPE_PROPERTY_NAME);
-		if (implType == IMPLEMENTATION_TYPE.SERVER_SUPPLIED)
-			enableFinish = true;
-		else if (implType == IMPLEMENTATION_TYPE.CLIENT_SUPPLIED && 
-				control != null && control instanceof JSFLibraryConfigControl) {
-			enableFinish = (((JSFLibraryConfigControl)control).getSelectedJSFLibImplementation() != null);
-		} //else must be unknown type and requires user interaction
-		setPageComplete(enableFinish);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.common.frameworks.internal.datamodel.ui.DataModelWizardPage#showValidationErrorsOnEnter()
-	 */
-	protected boolean showValidationErrorsOnEnter() {
-		return true;
-	}
-
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ELPrefPanel.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ELPrefPanel.java
deleted file mode 100644
index 261413c..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ELPrefPanel.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the 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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import org.eclipse.jst.jsf.ui.internal.Messages;
-import org.eclipse.jst.jsf.validation.internal.ELValidationPreferences;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.RowLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
-
-/**
- * Creates and manages a panel for configuring 
- * 
- * @author cbateman
- */
-/*package*/ class ELPrefPanel 
-{
-    /* view */
-    private final Group                                 _container;
-    private final Button                                _chkBuildValidation;
-    private final Button                                _chkIncrementalValidation;
-    private final ProblemSeveritiesConfigurationBlock   _problemSeverities;
-    
-    /* model */
-    private ELValidationPreferences  _prefs;
-    
-    /**
-     * Allocates new container in parent.
-     * @param parent
-     * @param container 
-     * @param prefs 
-     */
-    public ELPrefPanel(Composite parent, IWorkbenchPreferenceContainer container, ELValidationPreferences prefs)
-    {
-        _prefs = prefs;
-
-        _container = new Group(parent, SWT.NONE);
-        _container.setText(Messages.JSFValidationPreferencePage_ELPrefPanel_Title);
-        RowLayout rowLayout = new RowLayout(SWT.VERTICAL);
-        rowLayout.marginTop = 5;
-        rowLayout.marginLeft = 5; 
-        _container.setLayout(rowLayout);
-
-        _chkBuildValidation = new Button(_container, SWT.CHECK);
-        _chkBuildValidation.setText(Messages.JSFValidationPreferencePage_ELPrefPanel_BuildValidationCheckBoxTitle);
-        _chkBuildValidation.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e) 
-            {
-                _prefs.setEnableBuildValidation(_chkBuildValidation.getSelection());
-                refresh();
-            }
-        });
-        
-        _chkIncrementalValidation = new Button(_container, SWT.CHECK);
-        _chkIncrementalValidation.setText(Messages.JSFValidationPreferencePage_ELPrefPanel_IncrementalValidationCheckBoxTitle);
-        _chkIncrementalValidation.addSelectionListener(new SelectionAdapter()
-        {
-            public void widgetSelected(SelectionEvent e) 
-            {
-                _prefs.setEnableIncrementalValidation(_chkIncrementalValidation.getSelection());
-                refresh();
-            }
-        });
-
-        new Label(_container, SWT.NONE);
-        
-        _problemSeverities = new ProblemSeveritiesConfigurationBlock(prefs, null, container);
-        _problemSeverities.createContents(_container);
-    }
-    
-    /**
-     * @return the top-level container managed by this panel
-     */
-    public Control getControl()
-    {
-        return _container;
-    }
-    
-    
-    /**
-     * Refreshes the UI from the model
-     */
-    public void refresh()
-    {
-        _chkBuildValidation.setSelection(_prefs.isEnableBuildValidation());
-        _chkIncrementalValidation.
-            setSelection(_prefs.isEnableIncrementalValidation());
-        _problemSeverities.updateControls();
-    }
-
-    /**
-     * 
-     */
-    public void processChanges() {
-        _problemSeverities.performOk();
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/JSFValidationPreferencePage.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/JSFValidationPreferencePage.java
deleted file mode 100644
index a003a58..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/JSFValidationPreferencePage.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006 Oracle Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the 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:
- *    Cameron Bateman/Oracle - initial API and implementation
- *    
- ********************************************************************************/
-
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.validation.internal.ValidationPreferences;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
-
-/**
- * Workbench preference page for configuring JSF validation
- * 
- * @author cbateman
- *
- */
-public class JSFValidationPreferencePage extends PreferencePage implements
-        IWorkbenchPreferencePage 
-{
-    private final ValidationPreferences     _prefs;
-    
-    private ELPrefPanel                     _elPrefPanel;
-    
-    /**
-     * Constructor
-     */
-    public JSFValidationPreferencePage()
-    {
-        super(/* TODO: title*/);
-        _prefs = new ValidationPreferences(getPreferenceStore());
-        _prefs.load();
-    }
-    
-    protected Control createContents(Composite parent) 
-    {
-        _elPrefPanel = new ELPrefPanel(parent, (IWorkbenchPreferenceContainer) getContainer(), _prefs.getElPrefs());
-        _elPrefPanel.refresh();
-        return _elPrefPanel.getControl();
-    }
-
-    public void init(IWorkbench workbench) 
-    {
-        // do nothing
-    }
-
-    protected void performApply() 
-    {
-        // process changes before committing to pref store
-        _elPrefPanel.processChanges();
-        _prefs.commit(getPreferenceStore());
-    }
-
-    protected void performDefaults() 
-    {
-        _prefs.setDefaults();
-        _elPrefPanel.refresh();
-        super.performDefaults();
-    }
-
-    public boolean performOk() 
-    {
-        performApply();
-        return true;
-    }
-
-    protected IPreferenceStore doGetPreferenceStore() 
-    {
-        // load the validation pref store
-        return JSFCorePlugin.getDefault().getPreferenceStore();
-    }
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/OptionsConfigurationBlock.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/OptionsConfigurationBlock.java
deleted file mode 100644
index f26a660..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/OptionsConfigurationBlock.java
+++ /dev/null
@@ -1,979 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Cameron Bateman/Oracle - adapted for use in JSF validation tooling
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.IdentityHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ProjectScope;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.preferences.DefaultScope;
-import org.eclipse.core.runtime.preferences.IScopeContext;
-import org.eclipse.core.runtime.preferences.InstanceScope;
-import org.eclipse.jdt.ui.JavaUI;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jface.dialogs.MessageDialogWithToggle;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.jface.resource.JFaceResources;
-import org.eclipse.jst.jsf.core.internal.IJSFPreferenceModel;
-import org.eclipse.jst.jsf.core.internal.JSFCorePlugin;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.validation.internal.ELValidationPreferences.Severity;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Link;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.forms.events.ExpansionAdapter;
-import org.eclipse.ui.forms.events.ExpansionEvent;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
-import org.eclipse.ui.preferences.IWorkingCopyManager;
-import org.eclipse.ui.preferences.WorkingCopyManager;
-import org.osgi.service.prefs.BackingStoreException;
-
-/**
- * Abstract options configuration block providing a general implementation for setting up
- * an options configuration page.
- * 
- * @since 2.1
- */
-abstract class OptionsConfigurationBlock 
-{
-    /**
-     * The preference model to be used
-     */
-    protected final IJSFPreferenceModel     _prefs;
-    
-    static final class Key 
-    {
-        private String fQualifier;
-        private String fKey;
-        
-        Key(String qualifier, String key) {
-            fQualifier= qualifier;
-            fKey= key;
-        }
-        
-        /**
-         * @return the key name
-         */
-        public String getName() {
-            return fKey;
-        }
-        
-//        private IEclipsePreferences getNode(IScopeContext context, IWorkingCopyManager manager) {
-//            IEclipsePreferences node= context.getNode(fQualifier);
-//            if (manager != null) {
-//                return manager.getWorkingCopy(node);
-//            }
-//            return node;
-//            
-//        }
-        
-        /**
-         * @param prefModel
-         * @param context
-         * @param manager
-         * @return the value stored for the key
-         */
-        public Object getStoredValue(IJSFPreferenceModel prefModel, IScopeContext context, IWorkingCopyManager manager)
-        {
-            return prefModel.getStoredValueByKey(context, fKey);
-        }
-        
-        /**
-         * @param prefModel
-         * @param context
-         * @param manager
-         * @return the stored value in prefModel under context for
-         * this key
-         */
-        public Object getCurValue(IJSFPreferenceModel prefModel, IScopeContext context, IWorkingCopyManager manager) {
-            //return getNode(context, manager).get(fKey, null);
-            return prefModel.getValueByKey(context, fKey);
-        }
-        
-        /**
-         * @param prefModel
-         * @param lookupOrder
-         * @param ignoreTopScope
-         * @param manager
-         * @return the stored value in the prefModelunder context
-         * using the list of lookupOrder for precedence of scopes
-         * in which to look.  Return first found based on order in lookupOrder
-         */
-        public Object getCurValue(IJSFPreferenceModel prefModel, IScopeContext[] lookupOrder, boolean ignoreTopScope, IWorkingCopyManager manager) {
-            for (int i= ignoreTopScope ? 1 : 0; i < lookupOrder.length; i++) {
-                Object value= getCurValue(prefModel, lookupOrder[i], manager);
-                if (value != null) {
-                    return value;
-                }
-            }
-            return null;
-        }
-        
-        /**
-         * Set the stored value
-         * @param prefModel 
-         * @param context
-         * @param value
-         * @param manager
-         * @return the old value or null if none
-         */
-        public Object setCurValue(IJSFPreferenceModel prefModel, IScopeContext context, Object value, IWorkingCopyManager manager) {
-            return prefModel.setValueByKey(context, fKey, value);
-//            if (value != null) {
-//                getNode(context, manager).put(fKey, value);
-//            } else {
-//                getNode(context, manager).remove(fKey);
-//            }
-        }
-            
-        /* (non-Javadoc)
-         * @see java.lang.Object#toString()
-         */
-        public String toString() {
-            return fQualifier + '/' + fKey;
-        }
-
-        /**
-         * @return the plugin qualifier
-         */
-        public String getQualifier() {
-            return fQualifier;
-        }
-
-    }
-    
-
-    static class ControlData {
-        private Key fKey;
-        private String[] fValues;
-        
-        ControlData(Key key, String[] values) {
-            fKey= key;
-            fValues= values;
-        }
-        
-        Key getKey() {
-            return fKey;
-        }
-        
-        String getValue(boolean selection) {
-            int index= selection ? 0 : 1;
-            return fValues[index];
-        }
-        
-        String getValue(int index) {
-            return fValues[index];
-        }       
-        
-        int getSelection(String value) {
-            if (value != null) {
-                for (int i= 0; i < fValues.length; i++) {
-                    if (value.equals(fValues[i])) {
-                        return i;
-                    }
-                }
-            }
-            return fValues.length -1; // assume the last option is the least severe
-        }
-    }
-    
-    private static final String REBUILD_COUNT_KEY= "preferences_build_requested"; //$NON-NLS-1$
-    
-    private static final String SETTINGS_EXPANDED= "expanded"; //$NON-NLS-1$
-
-    private final ArrayList fCheckBoxes;
-    private final ArrayList fComboBoxes;
-    private final ArrayList fTextBoxes;
-    private final HashMap fLabels;
-    private final ArrayList fExpandedComposites;
-    
-    private SelectionListener fSelectionListener;
-    private ModifyListener fTextModifyListener;
-
-    // TODO: protected IStatusChangeListener fContext;
-    private final IProject fProject; // project or null
-    private final Key[] fAllKeys;
-    
-    private IScopeContext[] fLookupOrder;
-    
-    private Shell fShell;
-
-    private final IWorkingCopyManager fManager;
-    private IWorkbenchPreferenceContainer fContainer;
-
-    private Map fDisabledProjectSettings; // null when project specific settings are turned off
-    
-    private int fRebuildCount; /// used to prevent multiple dialogs that ask for a rebuild
-    
-    OptionsConfigurationBlock(/*IStatusChangeListener context,*/IJSFPreferenceModel prefs, IProject project, Key[] allKeys, IWorkbenchPreferenceContainer container) {
-        //fContext= context;
-        fProject= project;
-        fAllKeys= allKeys;
-        fContainer= container;
-        _prefs = prefs;
-        
-        if (container == null) {
-            fManager= new WorkingCopyManager();
-        } else {
-            fManager= container.getWorkingCopyManager();
-        }
-        
-        if (fProject != null) {
-            fLookupOrder= new IScopeContext[] {
-                new ProjectScope(fProject),
-                new InstanceScope(),
-                new DefaultScope()
-            };
-        } else {
-            fLookupOrder= new IScopeContext[] {
-                new InstanceScope(),
-                new DefaultScope()
-            };
-        }
-        
-        testIfOptionsComplete(allKeys);
-        if (fProject == null || hasProjectSpecificOptions(fProject)) {
-            fDisabledProjectSettings= null;
-        } else {
-            fDisabledProjectSettings= new IdentityHashMap();
-            for (int i= 0; i < allKeys.length; i++) {
-                Key curr= allKeys[i];
-                fDisabledProjectSettings.put(curr, curr.getCurValue(_prefs, fLookupOrder, false, fManager));
-            }
-        }
-        
-        fCheckBoxes= new ArrayList();
-        fComboBoxes= new ArrayList();
-        fTextBoxes= new ArrayList(2);
-        fLabels= new HashMap();
-        fExpandedComposites= new ArrayList();
-        
-        fRebuildCount= getRebuildCount();
-    }   
-    
-    /**
-     * @return the preference container
-     */
-    protected final IWorkbenchPreferenceContainer getPreferenceContainer() {
-        return fContainer;
-    }
-    
-    /**
-     * @param plugin
-     * @param key
-     * @return construct a new Key based on the on the plugin id and
-     * preference key
-     */
-    protected static Key getKey(String plugin, String key) {
-        return new Key(plugin, key);
-    }
-    
-    /**
-     * @param key
-     * @return construct a new Key for a JSF core plugin preference
-     */
-    protected final static Key getJSFCoreKey(String key) {
-        return getKey(JSFCorePlugin.PLUGIN_ID, key);
-    }
-    
-    private void testIfOptionsComplete(Key[] allKeys) {
-        for (int i= 0; i < allKeys.length; i++) {
-            if (allKeys[i].getCurValue(_prefs, fLookupOrder, false, fManager) == null) {
-                JSFUiPlugin.log(IStatus.ERROR, "preference option missing: " + allKeys[i] + " (" + this.getClass().getName() +')');  //$NON-NLS-1$//$NON-NLS-2$
-            }
-        }
-    }
-    
-    private int getRebuildCount() {
-        return fManager.getWorkingCopy(new DefaultScope().getNode(JavaUI.ID_PLUGIN)).getInt(REBUILD_COUNT_KEY, 0);
-    }
-    
-    private void incrementRebuildCount() {
-        fRebuildCount++;
-        fManager.getWorkingCopy(new DefaultScope().getNode(JavaUI.ID_PLUGIN)).putInt(REBUILD_COUNT_KEY, fRebuildCount);
-    }
-    
-//    public void selectOption(String key, String qualifier) {
-//        for (int i= 0; i < fAllKeys.length; i++) {
-//            Key curr= fAllKeys[i];
-//            if (curr.getName().equals(key) && curr.getQualifier().equals(qualifier)) {
-//                selectOption(curr);
-//            }
-//        }
-//    }
-//    
-//    public void selectOption(Key key) {
-//        Control control= findControl(key);
-//        if (control != null) {
-//            if (!fExpandedComposites.isEmpty()) {
-//                ExpandableComposite expandable= getParentExpandableComposite(control);
-//                if (expandable != null) {
-//                    for (int i= 0; i < fExpandedComposites.size(); i++) {
-//                        ExpandableComposite curr= (ExpandableComposite) fExpandedComposites.get(i);
-//                        curr.setExpanded(curr == expandable);
-//                    }
-//                    expandedStateChanged(expandable);
-//                }
-//            }
-//            control.setFocus();
-//        }
-//    }
-    
-    
-    /**
-     * @param project
-     * @return true if there are project specific overrides in the 
-     * preferences for 'project'
-     */
-    public final boolean hasProjectSpecificOptions(IProject project) {
-        if (project != null) {
-            IScopeContext projectContext= new ProjectScope(project);
-            Key[] allKeys= fAllKeys;
-            for (int i= 0; i < allKeys.length; i++) {
-                if (allKeys[i].getCurValue(_prefs, projectContext, fManager) != null) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }   
-            
-    /**
-     * @return the shell hosting the UI
-     */
-    protected Shell getShell() {
-        return fShell;
-    }
-    
-    /**
-     * Set the shell hosting the UI.
-     * @param shell
-     */
-    protected void setShell(Shell shell) {
-        fShell= shell;
-    }   
-    
-    /**
-     * @param parent
-     * @return the parent of the UI control to be created
-     */
-    protected abstract Control createContents(Composite parent);
-    
-//    protected Button addCheckBox(Composite parent, String label, Key key, String[] values, int indent) {
-//        ControlData data= new ControlData(key, values);
-//        
-//        GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-//        gd.horizontalSpan= 3;
-//        gd.horizontalIndent= indent;
-//        
-//        Button checkBox= new Button(parent, SWT.CHECK);
-//        checkBox.setFont(JFaceResources.getDialogFont());
-//        checkBox.setText(label);
-//        checkBox.setData(data);
-//        checkBox.setLayoutData(gd);
-//        checkBox.addSelectionListener(getSelectionListener());
-//        
-//        makeScrollableCompositeAware(checkBox);
-//        
-//        String currValue= getValue(key);
-//        checkBox.setSelection(data.getSelection(currValue) == 0);
-//        
-//        fCheckBoxes.add(checkBox);
-//        
-//        return checkBox;
-//    }
-    
-    /**
-     * @param parent
-     * @param label
-     * @param key
-     * @param values
-     * @param indent
-     * @param widthHint
-     * @param listener
-     * @return a check box styled button with a related link
-     */
-    protected Button addCheckBoxWithLink(Composite parent, String label, Key key, String[] values, int indent, int widthHint, SelectionListener listener) {
-        ControlData data= new ControlData(key, values);
-        
-        GridData gd= new GridData(GridData.FILL, GridData.FILL, true, false);
-        gd.horizontalSpan= 3;
-        gd.horizontalIndent= indent;
-        
-        Composite composite= new Composite(parent, SWT.NONE);
-        GridLayout layout= new GridLayout();
-        layout.marginHeight= 0;
-        layout.marginWidth= 0;
-        layout.numColumns= 2;
-        composite.setLayout(layout);
-        composite.setLayoutData(gd);
-        
-        Button checkBox= new Button(composite, SWT.CHECK);
-        checkBox.setFont(JFaceResources.getDialogFont());
-        checkBox.setData(data);
-        checkBox.setLayoutData(new GridData(GridData.FILL, GridData.BEGINNING, false, false));
-        checkBox.addSelectionListener(getSelectionListener());
-        
-        gd= new GridData(GridData.FILL, GridData.CENTER, true, false);
-        gd.widthHint= widthHint;
-        
-        Link link= new Link(composite, SWT.NONE);
-        link.setText(label);
-        link.setLayoutData(gd);
-        if (listener != null) {
-            link.addSelectionListener(listener);
-        }
-        
-        makeScrollableCompositeAware(link);
-        makeScrollableCompositeAware(checkBox);
-        
-        String currValue= getValue(key);
-        checkBox.setSelection(data.getSelection(currValue) == 0);
-        
-        fCheckBoxes.add(checkBox);
-        
-        return checkBox;
-    }
-    
-    /**
-     * @param parent
-     * @param label
-     * @param key
-     * @param values
-     * @param valueLabels
-     * @param indent
-     * @return a Combo box added to parent with the label and key
-     */
-    protected Combo addComboBox(Composite parent, String label, Key key, String[] values, String[] valueLabels, int indent) {
-        GridData gd= new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1);
-        gd.horizontalIndent= indent;
-                
-        Label labelControl= new Label(parent, SWT.LEFT);
-        labelControl.setFont(JFaceResources.getDialogFont());
-        
-        labelControl.setText(label);
-        labelControl.setLayoutData(gd);
-                
-        Combo comboBox= newComboControl(parent, key, values, valueLabels);
-        comboBox.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-
-        fLabels.put(comboBox, labelControl);
-        
-        return comboBox;
-    }
-    
-    Combo addInversedComboBox(Composite parent, String label, Key key, String[] values, String[] valueLabels, int indent) {
-        GridData gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING);
-        gd.horizontalIndent= indent;
-        gd.horizontalSpan= 3;
-        
-        Composite composite= new Composite(parent, SWT.NONE);
-        GridLayout layout= new GridLayout();
-        layout.marginHeight= 0;
-        layout.marginWidth= 0;
-        layout.numColumns= 2;
-        composite.setLayout(layout);
-        composite.setLayoutData(gd);
-        
-        Combo comboBox= newComboControl(composite, key, values, valueLabels);
-        comboBox.setFont(JFaceResources.getDialogFont());
-        comboBox.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL));
-        
-        Label labelControl= new Label(composite, SWT.LEFT | SWT.WRAP);
-        labelControl.setText(label);
-        labelControl.setLayoutData(new GridData());
-        
-        fLabels.put(comboBox, labelControl);
-        return comboBox;
-    }
-    
-    Combo newComboControl(Composite composite, Key key, String[] values, String[] valueLabels) {
-        ControlData data= new ControlData(key, values);
-        
-        Combo comboBox= new Combo(composite, SWT.READ_ONLY);
-        comboBox.setItems(valueLabels);
-        comboBox.setData(data);
-        comboBox.addSelectionListener(getSelectionListener());
-        comboBox.setFont(JFaceResources.getDialogFont());
-            
-        makeScrollableCompositeAware(comboBox);
-        
-        String currValue= getValue(key);    
-        comboBox.select(data.getSelection(currValue));
-        
-        fComboBoxes.add(comboBox);
-        return comboBox;
-    }
-
-    Text addTextField(Composite parent, String label, Key key, int indent, int widthHint) {   
-        Label labelControl= new Label(parent, SWT.WRAP);
-        labelControl.setText(label);
-        labelControl.setFont(JFaceResources.getDialogFont());
-        labelControl.setLayoutData(new GridData());
-                
-        Text textBox= new Text(parent, SWT.BORDER | SWT.SINGLE);
-        textBox.setData(key);
-        textBox.setLayoutData(new GridData());
-        
-        makeScrollableCompositeAware(textBox);
-        
-        fLabels.put(textBox, labelControl);
-        
-        String currValue= getValue(key);    
-        if (currValue != null) {
-            textBox.setText(currValue);
-        }
-        textBox.addModifyListener(getTextModifyListener());
-
-        GridData data= new GridData(GridData.HORIZONTAL_ALIGN_FILL);
-        if (widthHint != 0) {
-            data.widthHint= widthHint;
-        }
-        data.horizontalIndent= indent;
-        data.horizontalSpan= 2;
-        textBox.setLayoutData(data);
-
-        fTextBoxes.add(textBox);
-        return textBox;
-    }
-    
-    ScrolledPageContent getParentScrolledComposite(Control control) {
-        Control parent= control.getParent();
-        while (!(parent instanceof ScrolledPageContent) && parent != null) {
-            parent= parent.getParent();
-        }
-        if (parent instanceof ScrolledPageContent) {
-            return (ScrolledPageContent) parent;
-        }
-        return null;
-    }
-    
-    ExpandableComposite getParentExpandableComposite(Control control) {
-        Control parent= control.getParent();
-        while (!(parent instanceof ExpandableComposite) && parent != null) {
-            parent= parent.getParent();
-        }
-        if (parent instanceof ExpandableComposite) {
-            return (ExpandableComposite) parent;
-        }
-        return null;
-    }
-    
-    private void makeScrollableCompositeAware(Control control) {
-        ScrolledPageContent parentScrolledComposite= getParentScrolledComposite(control);
-        if (parentScrolledComposite != null) {
-            parentScrolledComposite.adaptChild(control);
-        }
-    }
-    
-    ExpandableComposite createStyleSection(Composite parent, String label, int nColumns) {
-        ExpandableComposite excomposite= new ExpandableComposite(parent, SWT.NONE, ExpandableComposite.TWISTIE | ExpandableComposite.CLIENT_INDENT);
-        excomposite.setText(label);
-        excomposite.setExpanded(false);
-        excomposite.setFont(JFaceResources.getFontRegistry().getBold(JFaceResources.DIALOG_FONT));
-        excomposite.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false, nColumns, 1));
-        excomposite.addExpansionListener(new ExpansionAdapter() {
-            public void expansionStateChanged(ExpansionEvent e) {
-                expandedStateChanged((ExpandableComposite) e.getSource());
-            }
-        });
-        fExpandedComposites.add(excomposite);
-        makeScrollableCompositeAware(excomposite);
-        return excomposite;
-    }
-    
-    final void expandedStateChanged(ExpandableComposite expandable) {
-        ScrolledPageContent parentScrolledComposite= getParentScrolledComposite(expandable);
-        if (parentScrolledComposite != null) {
-            parentScrolledComposite.reflow(true);
-        }
-    }
-    
-    void restoreSectionExpansionStates(IDialogSettings settings) {
-        for (int i= 0; i < fExpandedComposites.size(); i++) {
-            ExpandableComposite excomposite= (ExpandableComposite) fExpandedComposites.get(i);
-            if (settings == null) {
-                excomposite.setExpanded(i == 0); // only expand the first node by default
-            } else {
-                excomposite.setExpanded(settings.getBoolean(SETTINGS_EXPANDED + String.valueOf(i)));
-            }
-        }
-    }
-    
-    void storeSectionExpansionStates(IDialogSettings settings) {
-        for (int i= 0; i < fExpandedComposites.size(); i++) {
-            ExpandableComposite curr= (ExpandableComposite) fExpandedComposites.get(i);
-            settings.put(SETTINGS_EXPANDED + String.valueOf(i), curr.isExpanded());
-        }
-    }
-    
-    SelectionListener getSelectionListener() {
-        if (fSelectionListener == null) {
-            fSelectionListener= new SelectionListener() {
-                public void widgetDefaultSelected(SelectionEvent e) {/*do nothing*/}
-    
-                public void widgetSelected(SelectionEvent e) {
-                    controlChanged(e.widget);
-                }
-            };
-        }
-        return fSelectionListener;
-    }
-    
-    ModifyListener getTextModifyListener() {
-        if (fTextModifyListener == null) {
-            fTextModifyListener= new ModifyListener() {
-                public void modifyText(ModifyEvent e) {
-                    textChanged((Text) e.widget);
-                }
-            };
-        }
-        return fTextModifyListener;
-    }       
-    
-    void controlChanged(Widget widget) {
-        ControlData data= (ControlData) widget.getData();
-        String newValue= null;
-        if (widget instanceof Button) {
-            newValue= data.getValue(((Button)widget).getSelection());           
-        } else if (widget instanceof Combo) {
-            newValue= data.getValue(((Combo)widget).getSelectionIndex());
-        } else {
-            return;
-        }
-        String oldValue= setValue(data.getKey(), newValue);
-        validateSettings(data.getKey(), oldValue, newValue);
-    }
-    
-    void textChanged(Text textControl) {
-        Key key= (Key) textControl.getData();
-        String number= textControl.getText();
-        String oldValue= setValue(key, number);
-        validateSettings(key, oldValue, number);
-    }   
-
-    boolean checkValue(Key key, String value) {
-        return value.equals(getValue(key));
-    }
-    
-    String getValue(Key key) {
-        if (fDisabledProjectSettings != null) {
-            return (String) fDisabledProjectSettings.get(key);
-        }
-        return key.getCurValue(_prefs, fLookupOrder, false, fManager).toString();
-    }
-    
-    
-    boolean getBooleanValue(Key key) {
-        return Boolean.valueOf(getValue(key)).booleanValue();
-    }
-    
-    String setValue(Key key, String value) {
-        if (fDisabledProjectSettings != null) {
-            return (String) fDisabledProjectSettings.put(key, value);
-        }
-        Object newValue =  key.setCurValue(_prefs, fLookupOrder[0], Severity.valueOfString(value), fManager);
-        return newValue != null ? newValue.toString() : "";
-    }
-    
-    String setValue(Key key, boolean value) {
-        return setValue(key, String.valueOf(value));
-    }
-
-    /**
-     * Returns the value as actually stored in the preference store.
-     * @param key
-     * @return the value as actually stored in the preference store.
-     */
-    Object getStoredValue(Key key) {
-        return key.getCurValue(_prefs, fLookupOrder, false, fManager);
-    }
-    
-    /**
-     * Update fields and validate.
-     * @param changedKey Key that changed, or null, if all changed.
-     * @param oldValue 
-     * @param newValue 
-     */ 
-    protected abstract void validateSettings(Key changedKey, String oldValue, String newValue);
-    
-    
-    String[] getTokens(String text, String separator) {
-        StringTokenizer tok= new StringTokenizer(text, separator); 
-        int nTokens= tok.countTokens();
-        String[] res= new String[nTokens];
-        for (int i= 0; i < res.length; i++) {
-            res[i]= tok.nextToken().trim();
-        }
-        return res;
-    }
-
-    private boolean getChanges(IScopeContext currContext, List changedSettings) {
-        boolean needsBuild= false;
-        for (int i= 0; i < fAllKeys.length; i++) {
-            Key key= fAllKeys[i];
-            Object oldVal= key.getStoredValue(_prefs, currContext, null);
-            Object val= key.getCurValue(_prefs, currContext, fManager);
-            if (val == null) {
-                if (oldVal != null) {
-                    changedSettings.add(key);
-                    needsBuild |= !oldVal.equals(key.getCurValue(_prefs, fLookupOrder, true, fManager));
-                }
-            } else if (!val.equals(oldVal)) {
-                changedSettings.add(key);
-                needsBuild |= oldVal != null || !val.equals(key.getCurValue(_prefs, fLookupOrder, true, fManager));
-            }
-        }
-        return needsBuild;
-    }
-    
-    void useProjectSpecificSettings(boolean enable) {
-        boolean hasProjectSpecificOption= fDisabledProjectSettings == null;
-        if (enable != hasProjectSpecificOption && fProject != null) {
-            if (enable) {
-                for (int i= 0; i < fAllKeys.length; i++) {
-                    Key curr= fAllKeys[i];
-                    String val= (String) fDisabledProjectSettings.get(curr);
-                    curr.setCurValue(_prefs, fLookupOrder[0], Severity.valueOfString(val), fManager);
-                }
-                fDisabledProjectSettings= null;
-                updateControls();
-                validateSettings(null, null, null);
-            } else {
-                fDisabledProjectSettings= new IdentityHashMap();
-                for (int i= 0; i < fAllKeys.length; i++) {
-                    Key curr= fAllKeys[i];
-                    Object oldSetting= curr.getCurValue(_prefs, fLookupOrder, false, fManager);
-                    fDisabledProjectSettings.put(curr, oldSetting);
-                    curr.setCurValue(_prefs, fLookupOrder[0], null, fManager); // clear project settings
-                }
-            }
-        }
-    }
-    
-    boolean areSettingsEnabled() {
-        return fDisabledProjectSettings == null || fProject == null;
-    }
-    
-    
-    boolean performOk() {
-        return processChanges(fContainer);
-    }
-    
-//    public boolean performApply() {
-//        return processChanges(null); // apply directly
-//    }
-    
-    boolean processChanges(IWorkbenchPreferenceContainer container) {
-        IScopeContext currContext= fLookupOrder[0];
-        
-        List /* <Key>*/ changedOptions= new ArrayList();
-        boolean needsBuild= getChanges(currContext, changedOptions);
-        if (changedOptions.isEmpty()) {
-            return true;
-        }
-        if (needsBuild) {
-            int count= getRebuildCount();
-            if (count > fRebuildCount) {
-                needsBuild= false; // build already requested
-                fRebuildCount= count;
-            }
-        }
-
-        boolean doBuild= false;
-        
-        final String  showBuildWarningKey = JSFCorePlugin.PLUGIN_ID + "." + "buildwarning_dont_show_again";
-        final IPreferenceStore prefStore = JSFCorePlugin.getDefault().getPreferenceStore();
-        final boolean showDialog = !MessageDialogWithToggle.ALWAYS.equals(prefStore.getString(showBuildWarningKey));
-        
-        if (needsBuild && showDialog) {
-            String[] strings= getFullBuildDialogStrings(fProject == null);
-            if (strings != null) {
-                MessageDialogWithToggle.openInformation
-                	(getShell(), strings[0], strings[1], 
-                			PreferencesMessages.ProblemSeveritiesConfigurationBlock_buildwarning_dont_show_again
-                			, false, prefStore, showBuildWarningKey);
-//                int res= dialog.open();
-//                if (res == 0) {
-//                    doBuild= true;
-//                } else if (res != 1) {
-//                    return false; // cancel pressed
-//                }
-            }
-        }
-        if (container != null) {
-            // no need to apply the changes to the original store: will be done by the page container
-            if (doBuild) { // post build
-                incrementRebuildCount();
-                // TODO: container.registerUpdateJob(CoreUtility.getBuildJob(fProject));
-            }
-        } else {
-            // apply changes right away
-            try {
-                fManager.applyChanges();
-            } catch (BackingStoreException e) {
-                JSFUiPlugin.log(IStatus.ERROR, "Error applying changes", e);
-                return false;
-            }
-            if (doBuild) {
-                //CoreUtility.getBuildJob(fProject).schedule();
-            }
-            
-        }
-        return true;
-    }
-    
-    abstract String[] getFullBuildDialogStrings(boolean workspaceSettings);
-            
-    
-//    public void performDefaults() {
-//        for (int i= 0; i < fAllKeys.length; i++) {
-//            Key curr= fAllKeys[i];
-//            String defValue= curr.getStoredValue(fLookupOrder, true, fManager);
-//            setValue(curr, defValue);
-//        }
-//        
-//        settingsUpdated();
-//        updateControls();
-//        validateSettings(null, null, null);
-//    }
-
-    /**
-     * @since 3.1
-     */
-    void performRevert() {
-        for (int i= 0; i < fAllKeys.length; i++) {
-            Key curr= fAllKeys[i];
-            String origValue= curr.getCurValue(_prefs, fLookupOrder, false, null).toString();
-            setValue(curr, origValue);
-        }
-
-        updateControls();
-        validateSettings(null, null, null);
-    }
-    
-    void dispose() {
-        // do nothing; sub-class should override
-    }
-    
-    void updateControls() {
-        // update the UI
-        for (int i= fCheckBoxes.size() - 1; i >= 0; i--) {
-            updateCheckBox((Button) fCheckBoxes.get(i));
-        }
-        for (int i= fComboBoxes.size() - 1; i >= 0; i--) {
-            updateCombo((Combo) fComboBoxes.get(i));
-        }
-        for (int i= fTextBoxes.size() - 1; i >= 0; i--) {
-            updateText((Text) fTextBoxes.get(i));
-        }
-    }
-    
-    void updateCombo(Combo curr) {
-        ControlData data= (ControlData) curr.getData();
-        
-        String currValue= getValue(data.getKey());  
-        curr.select(data.getSelection(currValue));                  
-    }
-    
-    void updateCheckBox(Button curr) {
-        ControlData data= (ControlData) curr.getData();
-        
-        String currValue= getValue(data.getKey());  
-        curr.setSelection(data.getSelection(currValue) == 0);                       
-    }
-    
-    void updateText(Text curr) {
-        Key key= (Key) curr.getData();
-        
-        String currValue= getValue(key);
-        if (currValue != null) {
-            curr.setText(currValue);
-        }
-    }
-    
-    Button getCheckBox(Key key) {
-        for (int i= fCheckBoxes.size() - 1; i >= 0; i--) {
-            Button curr= (Button) fCheckBoxes.get(i);
-            ControlData data= (ControlData) curr.getData();
-            if (key.equals(data.getKey())) {
-                return curr;
-            }
-        }
-        return null;        
-    }
-    
-    Combo getComboBox(Key key) {
-        for (int i= fComboBoxes.size() - 1; i >= 0; i--) {
-            Combo curr= (Combo) fComboBoxes.get(i);
-            ControlData data= (ControlData) curr.getData();
-            if (key.equals(data.getKey())) {
-                return curr;
-            }
-        }
-        return null;        
-    }
-    
-    Text getTextControl(Key key) {
-        for (int i= fTextBoxes.size() - 1; i >= 0; i--) {
-            Text curr= (Text) fTextBoxes.get(i);
-            ControlData data= (ControlData) curr.getData();
-            if (key.equals(data.getKey())) {
-                return curr;
-            }
-        }
-        return null;        
-    }
-    
-    Control findControl(Key key) {
-        Combo comboBox= getComboBox(key);
-        if (comboBox != null) {
-            return comboBox;
-        }
-        Button checkBox= getCheckBox(key);
-        if (checkBox != null) {
-            return checkBox;
-        }
-        Text text= getTextControl(key);
-        if (text != null) {
-            return text;
-        }
-        return null;
-    }
-    
-    void setComboEnabled(Key key, boolean enabled) {
-        Combo combo= getComboBox(key);
-        Label label= (Label) fLabels.get(combo);
-        combo.setEnabled(enabled);
-        label.setEnabled(enabled);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/PixelConverter.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/PixelConverter.java
deleted file mode 100644
index a5ed503..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/PixelConverter.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Oracle - copied for use in JSF validation tooling
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontMetrics;
-import org.eclipse.swt.graphics.GC;
-import org.eclipse.swt.widgets.Control;
-
-import org.eclipse.jface.dialogs.Dialog;
-
-/**
- * Copied from JDT.  Used by OptionsConfigurationBlock
- *
- */
-class PixelConverter {
-    
-    private final FontMetrics fFontMetrics;
-    
-    /**
-     * @param control
-     */
-    PixelConverter(Control control) {
-        this(control.getFont());
-    }
-    
-    /**
-     * @param font
-     */
-    PixelConverter(Font font) {
-        GC gc = new GC(font.getDevice());
-        gc.setFont(font);
-        fFontMetrics= gc.getFontMetrics();
-        gc.dispose();
-    }
-    
-    /*
-     * see org.eclipse.jface.dialogs.DialogPage#convertHeightInCharsToPixels(int)
-     */
-    int convertHeightInCharsToPixels(int chars) {
-        return Dialog.convertHeightInCharsToPixels(fFontMetrics, chars);
-    }
-
-    /*
-     * see org.eclipse.jface.dialogs.DialogPage#convertHorizontalDLUsToPixels(int)
-     */
-    int convertHorizontalDLUsToPixels(int dlus) {
-        return Dialog.convertHorizontalDLUsToPixels(fFontMetrics, dlus);
-    }
-
-    /*
-     * see org.eclipse.jface.dialogs.DialogPage#convertVerticalDLUsToPixels(int)
-     */
-    int convertVerticalDLUsToPixels(int dlus) {
-        return Dialog.convertVerticalDLUsToPixels(fFontMetrics, dlus);
-    }
-    
-    /*
-     * see org.eclipse.jface.dialogs.DialogPage#convertWidthInCharsToPixels(int)
-     */
-    int convertWidthInCharsToPixels(int chars) {
-        return Dialog.convertWidthInCharsToPixels(fFontMetrics, chars);
-    }   
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/PreferencesMessages.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/PreferencesMessages.java
deleted file mode 100644
index 8877117..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/PreferencesMessages.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     John Kaplan, johnkaplantech@gmail.com - 108071 [code templates] template for body of newly created class
- *     Oracle - adapted for JSF tooling
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import org.eclipse.osgi.util.NLS;
-
-/**
- * NLS messages for validation severity preferences
- * 
- * @author cbateman
- *
- */
-public final class PreferencesMessages extends NLS {
-
-    private static final String BUNDLE_NAME= "org.eclipse.jst.jsf.ui.internal.validation.messages";//$NON-NLS-1$
-
-    private PreferencesMessages() {
-        // Do not instantiate
-    }
-
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesPreferencePage_title;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_error;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_warning;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_ignore;
-
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_section_id_resolution;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_section_general;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_section_type_coercion_problems;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_section_constant_folding_and_unused_code;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_section_programming_errors;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_needsbuild_title;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_needsfullbuild_message;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_needsprojectbuild_message;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_buildwarning_dont_show_again;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_common_description;
-
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_general_syntax_error;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_empty_el_expression;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_missing_closing_expr_bracket;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_cannot_apply_operator_to_method_binding;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_dotted_property_key_should_use_array;
-
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_variable_not_found;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_member_not_found;
-
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_binary_op_numeric_coercion_error;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_binary_op_boolean_coercion_error;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_binary_op_no_coercion_available;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_binary_op_literal_to_number_coercion_error;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_unary_op_numeric_coercion_error;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_unary_op_boolean_coercion_error;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_unary_op_string_coercion_not_guaranteed;
-    
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_both_binary_operands_null;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_binary_expression_always_evaluates_same;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_equality_with_null_always_same;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_unary_expression_always_evaluates_same;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_empty_expression_always_false;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_enumeration_comparision_always_same;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_minus_on_null_always_zero;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_first_argument_short_circuits_expression;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_second_argument_always_evaluates_same;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_apply_dot_operator_with_null;
-    
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_possible_division_by_zero;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_possible_array_index_out_of_bounds;
-    /**
-     * see messages.properties
-     */
-    public static String  ProblemSeveritiesConfigurationBlock_pb_incompatible_enumeration_comparison;
-    /**
-     * see messages.properties
-     */
-    public static String ProblemSeveritiesConfigurationBlock_pb_member_is_intermediate;
-    
-    static {
-        NLS.initializeMessages(BUNDLE_NAME, PreferencesMessages.class);
-    }
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ProblemSeveritiesConfigurationBlock.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ProblemSeveritiesConfigurationBlock.java
deleted file mode 100644
index 69b31a7..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ProblemSeveritiesConfigurationBlock.java
+++ /dev/null
@@ -1,421 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Oracle - adapted for use in JSF Tooling
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.jface.dialogs.IDialogSettings;
-import org.eclipse.jst.jsf.core.internal.IJSFPreferenceModel;
-import org.eclipse.jst.jsf.ui.internal.JSFUiPlugin;
-import org.eclipse.jst.jsf.validation.internal.ELValidationPreferences;
-import org.eclipse.jst.jsf.validation.internal.ELValidationPreferences.Severity;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.forms.widgets.ExpandableComposite;
-import org.eclipse.ui.preferences.IWorkbenchPreferenceContainer;
-
-
-/**
-  */
-/*package*/ class ProblemSeveritiesConfigurationBlock extends OptionsConfigurationBlock {
-
-    private static final String SETTINGS_SECTION_NAME= "ProblemSeveritiesConfigurationBlock";  //$NON-NLS-1$
-    
-    /**
-     * preference key.  Match to DiagnosticFactory constants
-     */
-    private final static Key PREF_BINARY_OP_BOTH_OPERANDS_NULL = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_BOTH_OPERANDS_NULL);
-    private final static Key PREF_BINARY_OP_POSSIBLE_DIVISION_BY_ZERO = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_POSSIBLE_DIVISION_BY_ZERO);
-    private final static Key PREF_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION);
-    private final static Key PREF_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME);
-    private final static Key PREF_BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME);
-    private final static Key PREF_BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN);
-    private final static Key PREF_BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS);
-    private final static Key PREF_BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME =
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME);
-    private final static Key PREF_BINARY_OP_NO_AVAILABLE_TYPE_COERCION = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_NO_AVAILABLE_TYPE_COERCION);
-    private final static Key PREF_BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS);
-    private final static Key PREF_UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME = 
-        getJSFCoreKey(ELValidationPreferences.UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME);
-    private final static Key PREF_UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE = 
-        getJSFCoreKey(ELValidationPreferences.UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE);
-    private final static Key PREF_UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO = 
-        getJSFCoreKey(ELValidationPreferences.UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO);
-    private final static Key PREF_UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION = 
-        getJSFCoreKey(ELValidationPreferences.UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION);
-    private final static Key PREF_UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN = 
-        getJSFCoreKey(ELValidationPreferences.UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN);
-//    private final static Key PREF_TERNARY_OP_CHOICE_IS_ALWAYS_SAME = 
-//        getJSFCoreKey(ELValidationPreferences.TERNARY_OP_CHOICE_IS_ALWAYS_SAME);
-//    private final static Key PREF_TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN = 
-//        getJSFCoreKey(ELValidationPreferences.TERNARY_OP_CANNOT_COERCE_CHOICE_TO_BOOLEAN);
-    private final static Key PREF_UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED = 
-        getJSFCoreKey(ELValidationPreferences.UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED);
-    private final static Key PREF_CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING = 
-        getJSFCoreKey(ELValidationPreferences.CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING);
-    private final static Key PREF_MEMBER_NOT_FOUND = 
-        getJSFCoreKey(ELValidationPreferences.MEMBER_NOT_FOUND);
-    private final static Key PREF_VARIABLE_NOT_FOUND = 
-        getJSFCoreKey(ELValidationPreferences.VARIABLE_NOT_FOUND);
-    private final static Key PREF_MISSING_CLOSING_EXPR_BRACKET =
-        getJSFCoreKey(ELValidationPreferences.MISSING_CLOSING_EXPR_BRACKET);
-    private final static Key PREF_GENERAL_SYNTAX_ERROR = 
-        getJSFCoreKey(ELValidationPreferences.GENERAL_SYNTAX_ERROR);
-    private final static Key PREF_EMPTY_EL_EXPRESSION = 
-        getJSFCoreKey(ELValidationPreferences.EMPTY_EL_EXPRESSION);
-    private final static Key PREF_BINARY_OP_DOT_WITH_VALUEB_NULL = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_DOT_WITH_VALUEB_NULL);
-    private final static Key PREF_BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY =
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY);
-    private final static Key PREF_POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS = 
-        getJSFCoreKey(ELValidationPreferences.POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS);
-    private final static Key PREF_BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME);
-    private final static Key PREF_BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE = 
-        getJSFCoreKey(ELValidationPreferences.BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE);
-    private final static Key PREF_MEMBER_IS_INTERMEDIATE =
-        getJSFCoreKey(ELValidationPreferences.MEMBER_IS_INTERMEDIATE);
-
-    private final static int EXPECTED_PREFS = 28;
-    
-    private PixelConverter fPixelConverter;
-    
-    /**
-     * @param prefs 
-     * @param project
-     * @param container
-     */
-    public ProblemSeveritiesConfigurationBlock(/*TODO:IStatusChangeListener context,*/ IJSFPreferenceModel prefs, IProject project, IWorkbenchPreferenceContainer container) {
-        super(prefs, project, getKeys(), container);
-    }
-    
-    private static Key[] getKeys() 
-    {
-        Key[] keys = new Key[] {
-                PREF_BINARY_OP_BOTH_OPERANDS_NULL
-                , PREF_BINARY_OP_POSSIBLE_DIVISION_BY_ZERO
-                , PREF_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION 
-                , PREF_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME
-                , PREF_BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME
-                , PREF_BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN
-                , PREF_BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS
-                , PREF_BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME
-                , PREF_BINARY_OP_NO_AVAILABLE_TYPE_COERCION 
-                , PREF_BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS 
-                , PREF_UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME
-                , PREF_UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE 
-                , PREF_UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO 
-                , PREF_UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION
-                , PREF_UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN
-                , PREF_UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED
-                , PREF_CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING
-                , PREF_MEMBER_NOT_FOUND 
-                , PREF_VARIABLE_NOT_FOUND
-                , PREF_MISSING_CLOSING_EXPR_BRACKET
-                , PREF_GENERAL_SYNTAX_ERROR
-                , PREF_EMPTY_EL_EXPRESSION
-                , PREF_BINARY_OP_DOT_WITH_VALUEB_NULL
-                , PREF_BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY
-                , PREF_POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS 
-                , PREF_BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME
-                , PREF_BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE
-                , PREF_MEMBER_IS_INTERMEDIATE
-          };
-        
-        if (EXPECTED_PREFS != keys.length)
-        {
-            JSFUiPlugin.log(IStatus.WARNING, "Expected "+EXPECTED_PREFS+" preferences but was "+keys.length, new Throwable());
-        }
-
-        return keys;
-    }
-    
-    /*
-     * @see org.eclipse.jface.preference.PreferencePage#createContents(Composite)
-     */
-    protected Control createContents(Composite parent) {
-        fPixelConverter= new PixelConverter(parent);
-        setShell(parent.getShell());
-        
-        Group mainComp= new Group(parent, SWT.NONE);
-        mainComp.setFont(parent.getFont());
-        GridLayout layout= new GridLayout();
-        layout.marginHeight= 0;
-        layout.marginWidth= 0;
-        mainComp.setLayout(layout);
-        mainComp.setText(PreferencesMessages.ProblemSeveritiesConfigurationBlock_common_description);
-        
-        Composite commonComposite= createStyleTabContent(mainComp);
-        GridData gridData= new GridData(GridData.FILL, GridData.FILL, true, true);
-        gridData.heightHint= fPixelConverter.convertHeightInCharsToPixels(20);
-        commonComposite.setLayoutData(gridData);
-        
-        validateSettings(null, null, null);
-    
-        return mainComp;
-    }
-    
-    private Composite createStyleTabContent(Composite folder) {
-        String[] errorWarningIgnore= new String[] { Severity.ERROR.toString(), Severity.WARNING.toString(), Severity.IGNORE.toString() };
-        
-        String[] errorWarningIgnoreLabels= new String[] {
-            PreferencesMessages.ProblemSeveritiesConfigurationBlock_error,  
-            PreferencesMessages.ProblemSeveritiesConfigurationBlock_warning, 
-            PreferencesMessages.ProblemSeveritiesConfigurationBlock_ignore
-        };
-        
-        //String[] enabledDisabled= new String[] { ENABLED, DISABLED };
-        
-        int nColumns= 3;
-        
-        final ScrolledPageContent sc1 = new ScrolledPageContent(folder);
-        
-        Composite composite= sc1.getBody();
-        GridLayout layout= new GridLayout(nColumns, false);
-        layout.marginHeight= 0;
-        layout.marginWidth= 0;
-        composite.setLayout(layout);
-        
-//        Label description= new Label(composite, SWT.LEFT | SWT.WRAP);
-//        description.setFont(description.getFont());
-//        description.setText(PreferencesMessages.ProblemSeveritiesConfigurationBlock_common_description); 
-//        description.setLayoutData(new GridData(GridData.BEGINNING, GridData.CENTER, true, false, nColumns - 1, 1));
-                
-        int indentStep=  fPixelConverter.convertWidthInCharsToPixels(1);
-        
-        int defaultIndent= indentStep * 0;
-        //int extraIndent= indentStep * 2;
-        String label;
-        ExpandableComposite excomposite;
-        Composite inner;
-        
-        // -- general errors
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_section_general; 
-        excomposite= createStyleSection(composite, label, nColumns);
-        
-        inner= new Composite(excomposite, SWT.NONE);
-        inner.setFont(composite.getFont());
-        inner.setLayout(new GridLayout(nColumns, false));
-        excomposite.setClient(inner);
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_general_syntax_error; 
-        addComboBox(inner, label, PREF_GENERAL_SYNTAX_ERROR, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_empty_el_expression; 
-        addComboBox(inner, label, PREF_EMPTY_EL_EXPRESSION, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_missing_closing_expr_bracket; 
-        addComboBox(inner, label, PREF_MISSING_CLOSING_EXPR_BRACKET, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_cannot_apply_operator_to_method_binding; 
-        addComboBox(inner, label, PREF_CANNOT_APPLY_OPERATOR_TO_METHOD_BINDING, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_dotted_property_key_should_use_array; 
-        addComboBox(inner, label, PREF_BINARY_OP_DOT_WITH_DOTTED_KEY_SHOULD_USE_ARRAY, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-        
-        // --- id resolution
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_section_id_resolution; 
-        excomposite= createStyleSection(composite, label, nColumns);
-        
-        inner= new Composite(excomposite, SWT.NONE);
-        inner.setFont(composite.getFont());
-        inner.setLayout(new GridLayout(nColumns, false));
-        excomposite.setClient(inner);
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_variable_not_found; 
-        addComboBox(inner, label, PREF_VARIABLE_NOT_FOUND, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_member_not_found; 
-        addComboBox(inner, label, PREF_MEMBER_NOT_FOUND, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_member_is_intermediate; 
-        addComboBox(inner, label, PREF_MEMBER_IS_INTERMEDIATE, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        // --- type coercion problems
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_section_type_coercion_problems; 
-        excomposite= createStyleSection(composite, label, nColumns);
-        
-        inner= new Composite(excomposite, SWT.NONE);
-        inner.setFont(composite.getFont());
-        inner.setLayout(new GridLayout(nColumns, false));
-        excomposite.setClient(inner);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_binary_op_numeric_coercion_error; 
-        addComboBox(inner, label, PREF_BINARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_binary_op_boolean_coercion_error; 
-        addComboBox(inner, label, PREF_BINARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_binary_op_no_coercion_available; 
-        addComboBox(inner, label, PREF_BINARY_OP_NO_AVAILABLE_TYPE_COERCION, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_binary_op_literal_to_number_coercion_error; 
-        addComboBox(inner, label, PREF_BINARY_OP_COULD_NOT_COERCE_LITERALS_TO_NUMBERS, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_unary_op_numeric_coercion_error; 
-        addComboBox(inner, label, PREF_UNARY_OP_COULD_NOT_MAKE_NUMERIC_COERCION, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_unary_op_boolean_coercion_error; 
-        addComboBox(inner, label, PREF_UNARY_OP_CANNOT_COERCE_ARGUMENT_TO_BOOLEAN, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_unary_op_string_coercion_not_guaranteed; 
-        addComboBox(inner, label, PREF_UNARY_OP_STRING_CONVERSION_NOT_GUARANTEED, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        // --- constant folder and unused code
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_section_constant_folding_and_unused_code; 
-        excomposite= createStyleSection(composite, label, nColumns);
-        
-        inner= new Composite(excomposite, SWT.NONE);
-        inner.setFont(composite.getFont());
-        inner.setLayout(new GridLayout(nColumns, false));
-        excomposite.setClient(inner);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_both_binary_operands_null; 
-        addComboBox(inner, label, PREF_BINARY_OP_BOTH_OPERANDS_NULL, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_binary_expression_always_evaluates_same; 
-        addComboBox(inner, label, PREF_BINARY_OP_CONSTANT_EXPRESSION_ALWAYS_EVAL_SAME, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_equality_with_null_always_same; 
-        addComboBox(inner, label, PREF_BINARY_OP_EQUALITY_COMP_WITH_NULL_ALWAYS_EVAL_SAME, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_enumeration_comparision_always_same; 
-        addComboBox(inner, label, PREF_BINARY_COMPARISON_WITH_ENUM_ALWAYS_SAME, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_unary_expression_always_evaluates_same; 
-        addComboBox(inner, label, PREF_UNARY_OP_CONSTANT_EXPRESSION_EVAL_SAME, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_empty_expression_always_false; 
-        addComboBox(inner, label, PREF_UNARY_OP_EMPTY_ALWAYS_FALSE_ON_TYPE, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);          
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_minus_on_null_always_zero; 
-        addComboBox(inner, label, PREF_UNARY_OP_MINUS_ON_NULL_ALWAYS_ZERO, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);          
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_first_argument_short_circuits_expression; 
-        addComboBox(inner, label, PREF_BINARY_OP_FIRST_ARGUMENT_SHORT_CIRCUITS, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);          
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_second_argument_always_evaluates_same; 
-        addComboBox(inner, label, PREF_BINARY_OP_SECOND_ARGUMENT_ALWAYS_EVAL_SAME, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);          
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_apply_dot_operator_with_null; 
-        addComboBox(inner, label, PREF_BINARY_OP_DOT_WITH_VALUEB_NULL, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);          
-
-        // --- possible programming errors
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_section_programming_errors; 
-        excomposite= createStyleSection(composite, label, nColumns);
-        
-        inner= new Composite(excomposite, SWT.NONE);
-        inner.setFont(composite.getFont());
-        inner.setLayout(new GridLayout(nColumns, false));
-        excomposite.setClient(inner);
-        
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_possible_division_by_zero; 
-        addComboBox(inner, label, PREF_BINARY_OP_POSSIBLE_DIVISION_BY_ZERO, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_possible_array_index_out_of_bounds; 
-        addComboBox(inner, label, PREF_POSSIBLE_ARRAY_INDEX_OUT_OF_BOUNDS, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);        
-    
-        label= PreferencesMessages.ProblemSeveritiesConfigurationBlock_pb_incompatible_enumeration_comparison; 
-        addComboBox(inner, label, PREF_BINARY_OP_COMPARISON_OF_ENUMS_INCOMPATIBLE, errorWarningIgnore, errorWarningIgnoreLabels, defaultIndent);
-
-
-        new Label(composite, SWT.NONE);
-        
-        IDialogSettings section= JSFUiPlugin.getDefault().getDialogSettings().getSection(SETTINGS_SECTION_NAME);
-        restoreSectionExpansionStates(section);
-        
-        return sc1;
-    }
-    
-    /* (non-javadoc)
-     * Update fields and validate.
-     * @param changedKey Key that changed, or null, if all changed.
-     */ 
-    protected void validateSettings(Key changedKey, String oldValue, String newValue) {
-        if (!areSettingsEnabled()) {
-            return;
-        }
-        
-//        if (changedKey != null) {
-//            if (PREF_PB_UNUSED_PARAMETER.equals(changedKey) ||
-//                    PREF_PB_DEPRECATION.equals(changedKey) ||
-//                    PREF_PB_LOCAL_VARIABLE_HIDING.equals(changedKey) ||
-//                    PREF_PB_UNUSED_DECLARED_THROWN_EXCEPTION.equals(changedKey)) {              
-//                updateEnableStates();
-//            } else if (PREF_PB_SIGNAL_PARAMETER_IN_OVERRIDING.equals(changedKey)) {
-//                // merging the two options
-//                setValue(PREF_PB_SIGNAL_PARAMETER_IN_ABSTRACT, newValue);
-//            } else {
-//                return;
-//            }
-//        } else {
-            updateEnableStates();
-//        }       
-        // TODO: fContext.statusChanged(new StatusInfo());
-    }
-    
-    private void updateEnableStates() {
-//        boolean enableUnusedParams= !checkValue(PREF_PB_UNUSED_PARAMETER, Severity.IGNORE.toString());
-//        getCheckBox(PREF_PB_SIGNAL_PARAMETER_IN_OVERRIDING).setEnabled(enableUnusedParams);
-//        getCheckBox(PREF_PB_UNUSED_PARAMETER_INCLUDE_DOC_COMMENT_REFERENCE).setEnabled(enableUnusedParams);
-//        
-//        boolean enableDeprecation= !checkValue(PREF_PB_DEPRECATION, Severity.IGNORE.toString());
-//        getCheckBox(PREF_PB_DEPRECATION_IN_DEPRECATED_CODE).setEnabled(enableDeprecation);
-//        getCheckBox(PREF_PB_DEPRECATION_WHEN_OVERRIDING).setEnabled(enableDeprecation);
-//        
-//        boolean enableThrownExceptions= !checkValue(PREF_PB_UNUSED_DECLARED_THROWN_EXCEPTION, Severity.IGNORE.toString());
-//        getCheckBox(PREF_PB_UNUSED_DECLARED_THROWN_EXCEPTION_WHEN_OVERRIDING).setEnabled(enableThrownExceptions);
-//
-//        boolean enableHiding= !checkValue(PREF_PB_LOCAL_VARIABLE_HIDING, Severity.IGNORE.toString());
-//        getCheckBox(PREF_PB_SPECIAL_PARAMETER_HIDING_FIELD).setEnabled(enableHiding);
-    }
-
-    protected String[] getFullBuildDialogStrings(boolean workspaceSettings) {
-        String title= PreferencesMessages.ProblemSeveritiesConfigurationBlock_needsbuild_title; 
-        String message;
-        if (workspaceSettings) {
-            message= PreferencesMessages.ProblemSeveritiesConfigurationBlock_needsfullbuild_message; 
-        } else {
-            message= PreferencesMessages.ProblemSeveritiesConfigurationBlock_needsprojectbuild_message; 
-        }
-        return new String[] { title, message };
-    }
-    
-    /* (non-Javadoc)
-     * @see org.eclipse.jdt.internal.ui.preferences.OptionsConfigurationBlock#dispose()
-     */
-    public void dispose() {
-        IDialogSettings section= JSFUiPlugin.getDefault().getDialogSettings().addNewSection(SETTINGS_SECTION_NAME);
-        storeSectionExpansionStates(section);
-        super.dispose();
-    }
-    
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ScrolledPageContent.java b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ScrolledPageContent.java
deleted file mode 100644
index 74c21a8..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/ScrolledPageContent.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2005 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *     Oracle - updated for JSF tools
- *******************************************************************************/
-package org.eclipse.jst.jsf.ui.internal.validation;
-
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-import org.eclipse.ui.forms.widgets.FormToolkit;
-import org.eclipse.ui.forms.widgets.SharedScrolledComposite;
-
-import org.eclipse.jdt.internal.ui.JavaPlugin;
-
-
-/**
- * Customized SharedScrolledComposite
- */
-/*package*/ class ScrolledPageContent extends SharedScrolledComposite {
-
-    private FormToolkit fToolkit;
-    
-    /**
-     * @param parent
-     */
-    public ScrolledPageContent(Composite parent) {
-        this(parent, SWT.V_SCROLL | SWT.H_SCROLL);
-    }
-    
-    /**
-     * @param parent
-     * @param style
-     */
-    public ScrolledPageContent(Composite parent, int style) {
-        super(parent, style);
-        
-        setFont(parent.getFont());
-        
-        fToolkit= JavaPlugin.getDefault().getDialogsFormToolkit();
-        
-        setExpandHorizontal(true);
-        setExpandVertical(true);
-        
-        Composite body= new Composite(this, SWT.NONE);
-        body.setFont(parent.getFont());
-        setContent(body);
-    }
-    
-    
-    /**
-     * @param childControl
-     */
-    public void adaptChild(Control childControl) {
-        fToolkit.adapt(childControl, true, true);
-    }
-    
-    /**
-     * @return the content composite
-     */
-    public Composite getBody() {
-        return (Composite) getContent();
-    }
-
-}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/messages.properties b/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/messages.properties
deleted file mode 100644
index eaeea75..0000000
--- a/jsf/plugins/org.eclipse.jst.jsf.ui/src/org/eclipse/jst/jsf/ui/internal/validation/messages.properties
+++ /dev/null
@@ -1,64 +0,0 @@
-###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-# Contributors:
-#     IBM Corporation - initial API and implementation
-#     John Kaplan, johnkaplantech@gmail.com - 108071 [code templates] template for body of newly created class
-#     Cameron Bateman/Oracle - adapted for use in JSF validation tooling
-###############################################################################
-
-ProblemSeveritiesPreferencePage_title=Problem Severities
-
-ProblemSeveritiesConfigurationBlock_error=Error
-ProblemSeveritiesConfigurationBlock_warning=Warning
-ProblemSeveritiesConfigurationBlock_ignore=Ignore
-
-ProblemSeveritiesConfigurationBlock_section_id_resolution=&Identifier Resolution
-ProblemSeveritiesConfigurationBlock_section_general=&General Problems
-ProblemSeveritiesConfigurationBlock_section_type_coercion_problems=&Type Coercion Problems
-ProblemSeveritiesConfigurationBlock_section_constant_folding_and_unused_code=&Constant folding and unused code
-ProblemSeveritiesConfigurationBlock_section_programming_errors=&Possible programming errors
-
-ProblemSeveritiesConfigurationBlock_needsbuild_title=Error/Warning Settings Changed
-ProblemSeveritiesConfigurationBlock_needsfullbuild_message=The Error/Warning settings have changed. You will need to rebuild or revalidate for these changes to take effect.
-ProblemSeveritiesConfigurationBlock_needsprojectbuild_message=The Error/Warning settings have changed. A rebuild of the project is required for changes to take effect. Build the project now?
-ProblemSeveritiesConfigurationBlock_buildwarning_dont_show_again=Don't show this dialog again
-
-ProblemSeveritiesConfigurationBlock_common_description=Select the severity level for the following problems
-
-ProblemSeveritiesConfigurationBlock_pb_general_syntax_error=General Syntax Error
-ProblemSeveritiesConfigurationBlock_pb_empty_el_expression=Empty EL expression
-ProblemSeveritiesConfigurationBlock_pb_missing_closing_expr_bracket=Missing closing bracket on expression
-ProblemSeveritiesConfigurationBlock_pb_cannot_apply_operator_to_method_binding=Applying operator to method binding
-ProblemSeveritiesConfigurationBlock_pb_dotted_property_key_should_use_array=Dotted property names should use array ([]) syntax
-
-ProblemSeveritiesConfigurationBlock_pb_variable_not_found=Variable not found
-ProblemSeveritiesConfigurationBlock_pb_member_not_found=Member not found
-ProblemSeveritiesConfigurationBlock_pb_member_is_intermediate=Member is intermediate
-
-ProblemSeveritiesConfigurationBlock_pb_binary_op_numeric_coercion_error=Binary operation number coercion problems
-ProblemSeveritiesConfigurationBlock_pb_binary_op_boolean_coercion_error=Binary operation boolean coercion problems
-ProblemSeveritiesConfigurationBlock_pb_binary_op_no_coercion_available=Binary operation no available coercions
-ProblemSeveritiesConfigurationBlock_pb_binary_op_literal_to_number_coercion_error=Binary coercion of literal to number
-ProblemSeveritiesConfigurationBlock_pb_unary_op_numeric_coercion_error=Unary operation number coercion problems
-ProblemSeveritiesConfigurationBlock_pb_unary_op_boolean_coercion_error=Unary operation boolean coercion problems
-ProblemSeveritiesConfigurationBlock_pb_unary_op_string_coercion_not_guaranteed=Unary operation string coercion not guaranteed
-
-ProblemSeveritiesConfigurationBlock_pb_both_binary_operands_null=Both operands null
-ProblemSeveritiesConfigurationBlock_pb_binary_expression_always_evaluates_same=Binary expression always evaluates to same value
-ProblemSeveritiesConfigurationBlock_pb_equality_with_null_always_same=Equality comparison with null always evaluates to same value
-ProblemSeveritiesConfigurationBlock_pb_unary_expression_always_evaluates_same=Unary expression always evaluates to same value
-ProblemSeveritiesConfigurationBlock_pb_empty_expression_always_false=Empty operator always resolves to false on type
-ProblemSeveritiesConfigurationBlock_pb_enumeration_comparision_always_same=Enumeration comparison always evaluates to same value
-ProblemSeveritiesConfigurationBlock_pb_minus_on_null_always_zero=Minus applied to null always evaluates to zero
-ProblemSeveritiesConfigurationBlock_pb_first_argument_short_circuits_expression=First argument short-circuits expression
-ProblemSeveritiesConfigurationBlock_pb_second_argument_always_evaluates_same=Second argument always evaluates the same
-ProblemSeveritiesConfigurationBlock_pb_apply_dot_operator_with_null=Applying the dot ('.') operator with null always returns null
-
-ProblemSeveritiesConfigurationBlock_pb_possible_division_by_zero=Possible division by zero
-ProblemSeveritiesConfigurationBlock_pb_possible_array_index_out_of_bounds=Possible array index out of bounds
-ProblemSeveritiesConfigurationBlock_pb_incompatible_enumeration_comparison=Incompatible enumeration comparison
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_html.xml b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_html.xml
index dfbdb43..aa8c7e8 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_html.xml
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/metadata/jsf_html.xml
@@ -230,6 +230,16 @@
 		<trait id="large-icon">
 			<value>large/JSF_OUTPUTFORMAT.gif</value>
 		</trait>	
+		<trait id="tag-create">
+			<value xsi:type="pi:TagCreationInfo">
+				<template><![CDATA[
+					<param value=""
+						_uri_="http://java.sun.com/jsf/core" />
+					]]>
+				</template>
+				<attribute id="value" value="outputFormat" />
+			</value>			
+		</trait>
 	</entity>
 	<entity id="outputLabel" type="tag">		
 		<trait id="display-label">
@@ -241,6 +251,12 @@
 		<trait id="large-icon">
 			<value>large/JSF_OUTPUTLABEL.gif</value>
 		</trait>		
+ 		<trait id="tag-create">
+ 			<value xsi:type="pi:TagCreationInfo">
+ 				<attribute id="for" />
+				<attribute id="value" value="outputLabel" />
+ 			</value>
+ 		</trait>
 	</entity>
 	<entity id="outputLink" type="tag">
 		<trait id="display-label">
@@ -255,7 +271,7 @@
 		<trait id="tag-create">
 			<value xsi:type="pi:TagCreationInfo">
 				<template><![CDATA[
-				<outputText value="OutputLink"
+				<outputText value="outputLink"
 					_$uri$="http://java.sun.com/jsf/html" />
 				]]></template>
 
@@ -272,6 +288,11 @@
 		<trait id="large-icon">
 			<value>large/JSF_OUTPUTTEXT.gif</value>
 		</trait>			
+		<trait id="tag-create">
+			<value xsi:type="pi:TagCreationInfo">
+				<attribute id="value" value="outputText" />
+			</value>
+		</trait>
 	</entity>
 	<entity id="panelGrid" type="tag">
 		<trait id="display-label">
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ExpressionAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ExpressionAction.java
index 78f1782..3204dca 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ExpressionAction.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/ExpressionAction.java
@@ -40,15 +40,7 @@
     private String          _action;
     private IProject        _project;
     private IFile           _file;
-    private int             _type;
 
-    /**
-     * @param type
-     */
-    public ExpressionAction(int type)
-    {
-        _type = type;
-    }
 
     /**
      * @param attribute
@@ -85,21 +77,7 @@
                 IPageVariablesProvider.class);
         pageVarProvider.refresh();
 
-        Object result = null;
-        if (_type == METHOD)
-        {
-//            result = VariableResolverUtils.resolveMethodBinding(_action, _project, IWebFrameworkResolver.ACTION_METHOD,                    true);
-        	result = null;
-        }
-        else
-        {
-//            result = VariableResolverUtils.resolveValueBinding(_action, _project, true);
-        	result = null;
-        }
-        if (result == null)
-        {
-            JSFUIPlugin.getAlerts().warning("Message.Warning.Title", "Message.Warning.InvalidateExpression");//$NON-NLS-1$ $NON-NLS-2$
-        }
+        JSFUIPlugin.getAlerts().warning("Message.Warning.Title", "Message.Warning.InvalidateExpression");//$NON-NLS-1$ $NON-NLS-2$
     }
 
     /**
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFNavigationGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFNavigationGroup.java
index 8f2e179..4d593e3 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFNavigationGroup.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/JSFNavigationGroup.java
@@ -69,11 +69,11 @@
     {
         if (support.isActionSource())
         {
-            ExpressionAction action = new ExpressionAction(ExpressionAction.METHOD);
+            ExpressionAction action = new ExpressionAction();
             action.setText(JSFUIPlugin.getResourceString("ElementEdit.Submenu.JavaNavigation.Action"));//$NON-NLS-1$
-            action.setActionValue(ele.getAttribute(ICSSPropertyID.ATTR_ACTION));
             if (ele != null)
             {
+                action.setActionValue(ele.getAttribute(ICSSPropertyID.ATTR_ACTION));
                 IDOMModel model = ele.getModel();
                 action.setProject(StructuredModelUtil.getProjectFor(model));
                 action.setFile(StructuredModelUtil.getFileFor(model));
@@ -82,11 +82,11 @@
         }
         if (support.isValueHolder())
         {
-            ExpressionAction action = new ExpressionAction(ExpressionAction.VARIABLE);
+            ExpressionAction action = new ExpressionAction();
             action.setText(JSFUIPlugin.getResourceString("ElementEdit.Submenu.JavaNavigation.Value"));//$NON-NLS-1$
-            action.setActionValue(ele.getAttribute(ICSSPropertyID.ATTR_VALUE));
             if (ele != null)
             {
+                action.setActionValue(ele.getAttribute(ICSSPropertyID.ATTR_VALUE));
                 IDOMModel model = ele.getModel();
                 action.setProject(StructuredModelUtil.getProjectFor(model));
                 action.setFile(StructuredModelUtil.getFileFor(model));
@@ -95,11 +95,11 @@
         }
 
         {
-            ExpressionAction action = new ExpressionAction(ExpressionAction.VARIABLE);
+            ExpressionAction action = new ExpressionAction();
             action.setText(JSFUIPlugin.getResourceString("ElementEdit.Submenu.JavaNavigation.Binding"));//$NON-NLS-1$
-            action.setActionValue(ele.getAttribute(ICSSPropertyID.ATTR_BINDING));
             if (ele != null)
             {
+                action.setActionValue(ele.getAttribute(ICSSPropertyID.ATTR_BINDING));
                 IDOMModel model = ele.getModel();
                 action.setProject(StructuredModelUtil.getProjectFor(model));
                 action.setFile(StructuredModelUtil.getFileFor(model));
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/PageFlowContributor.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/PageFlowContributor.java
index f43db4f..293965d 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/PageFlowContributor.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/actions/PageFlowContributor.java
@@ -72,7 +72,7 @@
         }
     }
 
-    class PageFlowAction extends Action
+    private static class PageFlowAction extends Action
     {
         /**
          * this action's id
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/celleditors/ConverterValidatorIdDialogField.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/celleditors/ConverterValidatorIdDialogField.java
index 07c7ce3..a18eaa6 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/celleditors/ConverterValidatorIdDialogField.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/celleditors/ConverterValidatorIdDialogField.java
@@ -11,8 +11,6 @@
  *******************************************************************************/
 package org.eclipse.jst.pagedesigner.jsf.ui.celleditors;
 
-import java.util.Arrays;
-
 import org.eclipse.jst.jsf.common.ui.internal.dialogfield.ComboDialogField;
 import org.eclipse.jst.pagedesigner.properties.attrgroup.IElementContextable;
 import org.eclipse.swt.SWT;
@@ -40,25 +38,7 @@
      */
     public void setElementContext(IDOMNode ancester, IDOMElement element)
     {
-        String[] results = null;
-        if ("validator-id".equalsIgnoreCase(_elementId))
-        {
-            //results = FacesUtil.getRegisteredConverterIds(project);
-        	
-        }
-        else
-        {
-            // results = FacesUtil.getRegisteredValidatorIds(project);
-        }
-        if (results != null)
-        {
-            Arrays.sort(results);
-            setItems(results);
-        }
-        else
-        {
-            setItems(new String[0]);
-        }
+        setItems(new String[0]);
     }
 
     /**
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/celleditors/JSFAttributeCellEditorFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/celleditors/JSFAttributeCellEditorFactory.java
index e9931e6..aecbc42 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/celleditors/JSFAttributeCellEditorFactory.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/celleditors/JSFAttributeCellEditorFactory.java
@@ -46,33 +46,15 @@
     public CellEditor createCellEditor(Composite parent, IAttributeDescriptor attr, Element element)
     {
         String type = attr.getValueType();
-        String[] results = null;
+
         if (type.equalsIgnoreCase(CONVERTERID))
         {
-        	// XXX
-            // results = FacesUtil.getRegisteredConverterIds(project);
             Map map = new HashMap();
-            if (results != null)
-            {
-                for (int i = 0; i < results.length; i++)
-                {
-                    map.put(results[i], results[i]);
-                }
-            }
             return LabeledComboBoxCellEditor.newInstance(parent, map, SWT.NONE);
         }
         else if (type.equalsIgnoreCase(VALIDATORID))
         {
-        	// XXX
-            // results = FacesUtil.getRegisteredValidatorIds(project);
             Map map = new HashMap();
-            if (results != null)
-            {
-                for (int i = 0; i < results.length; i++)
-                {
-                    map.put(results[i], results[i]);
-                }
-            }
             return LabeledComboBoxCellEditor.newInstance(parent, map, SWT.NONE);
         }
         return null;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/LoadBundleTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/LoadBundleTagConverter.java
index 7608080..7cb56ba 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/LoadBundleTagConverter.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/jsfcore/LoadBundleTagConverter.java
@@ -103,17 +103,17 @@
                 PropertyResourceBundle bundle = new PropertyResourceBundle(ins);
                 if (bundle != null)
                 {
-                    if (PreviewUtil.BUNDLE_MAP == null)
+                    if (PreviewUtil.getBUNDLE_MAP() == null)
                     {
-                        PreviewUtil.BUNDLE_MAP = new HashMap();
+                        PreviewUtil.setBUNDLE_MAP(new HashMap());
                     }
                     else
                     {
-                        PreviewUtil.BUNDLE_MAP.clear();
+                        PreviewUtil.getBUNDLE_MAP().clear();
                     }
-                    PreviewUtil.BUNDLE_MAP.put(varString, bundle);
-                    PreviewUtil.BUNDLE = bundle;
-                    PreviewUtil.VAR = varString;
+                    PreviewUtil.getBUNDLE_MAP().put(varString, bundle);
+                    PreviewUtil.setBUNDLE(bundle);
+                    PreviewUtil.setVAR(varString);
                 }
             }
         }
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/LoadBundleOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/LoadBundleOperation.java
index af1d68d..4299133 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/LoadBundleOperation.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/converter/operations/jsf/LoadBundleOperation.java
@@ -90,14 +90,14 @@
 											inputStream = new BufferedInputStream(inputStream);
 											PropertyResourceBundle bundle = new PropertyResourceBundle(inputStream);
 											if (bundle != null) {
-												if (PreviewUtil.BUNDLE_MAP == null) {
-													PreviewUtil.BUNDLE_MAP = new HashMap();
+												if (PreviewUtil.getBUNDLE_MAP() == null) {
+													PreviewUtil.setBUNDLE_MAP(new HashMap());
 												} else {
-													PreviewUtil.BUNDLE_MAP.clear();
+													PreviewUtil.getBUNDLE_MAP().clear();
 												}
-												PreviewUtil.BUNDLE_MAP.put(var, bundle);
-												PreviewUtil.BUNDLE = bundle;
-												PreviewUtil.VAR = var;
+												PreviewUtil.getBUNDLE_MAP().put(var, bundle);
+												PreviewUtil.setBUNDLE(bundle);
+												PreviewUtil.setVAR(var);
 											}
 										}
 									} catch(IOException ioe) {
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/JarEntryEditorInput.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/JarEntryEditorInput.java
index f6b5697..17ee5a4 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/JarEntryEditorInput.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/elementedit/jsfcore/JarEntryEditorInput.java
@@ -51,6 +51,15 @@
         return fJarEntryFile.equals(other.fJarEntryFile);
     }
 
+    
+    @Override
+    public int hashCode() 
+    {
+        // two editor inputs are equal if their fJarEntryFile's are
+        // equal.  Therefore use the same criteria for hashcodes
+        return fJarEntryFile.hashCode();
+    }
+
     /*
      * @see IEditorInput#getPersistable()
      */
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlActionListenerSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlActionListenerSection.java
index bd40493..17b8281 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlActionListenerSection.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlActionListenerSection.java
@@ -169,6 +169,9 @@
         }
     }
 
+    /**
+     * Default constructor
+     */
     public JSFHtmlActionListenerSection()
     {
         super();
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlDataTableColumnsSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlDataTableColumnsSection.java
index d284853..1aad0e6 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlDataTableColumnsSection.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlDataTableColumnsSection.java
@@ -62,9 +62,9 @@
     private TableViewer            _columnsViewer;
     private Button                 _addButton, _removeButton, _moveUpButton, _moveDownButton;
 
-    final private String           DEFAULT_COLUMN_NAME = "column"; //$NON-NLS-1$
-    final private String           DEFAULT_FACET_NAME  = "header"; //$NON-NLS-1$
-    final private String           DEFAULT_TEXT_NAME   = "text"; //$NON-NLS-1$
+    final static private String           DEFAULT_COLUMN_NAME = "column"; //$NON-NLS-1$
+    final static private String           DEFAULT_FACET_NAME  = "header"; //$NON-NLS-1$
+    final static private String           DEFAULT_TEXT_NAME   = "text"; //$NON-NLS-1$
 
     class ColumnCotentLabelProvider implements IStructuredContentProvider, ITableLabelProvider
     {
@@ -169,6 +169,9 @@
 
     }
 
+    /**
+     * default constructor
+     */
     public JSFHtmlDataTableColumnsSection()
     {
         super();
@@ -332,7 +335,10 @@
         );
     }
 
-    public void updateButtonStatus()
+    /**
+     * Update the button status
+     */
+    private void updateButtonStatus()
     {
         _removeButton.setEnabled(true);
         _moveUpButton.setEnabled(true);
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputFormatParamsSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputFormatParamsSection.java
index 403fe09..ec1ad7c 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputFormatParamsSection.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputFormatParamsSection.java
@@ -242,6 +242,9 @@
         }
     }
 
+    /**
+     * Default constructor
+     */
     public JSFHtmlOutputFormatParamsSection()
     {
         super();
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputTextConverterSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputTextConverterSection.java
index f35fb1f..9a6a0fc 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputTextConverterSection.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlOutputTextConverterSection.java
@@ -171,6 +171,9 @@
 
     }
 
+    /**
+     * Default constructor
+     */
     public JSFHtmlOutputTextConverterSection()
     {
         super();
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectChoicesSection.java b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectChoicesSection.java
index 4eb9eeb..a2940c8 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectChoicesSection.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner.jsf.ui/src/org/eclipse/jst/pagedesigner/jsf/ui/sections/JSFHtmlSelectChoicesSection.java
@@ -168,6 +168,9 @@
         }
     }
 
+    /**
+     * Default constructor
+     */
     public JSFHtmlSelectChoicesSection()
     {
         super();
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.xml b/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.xml
index d984f0d..40e2e83 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.xml
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/plugin.xml
@@ -18,6 +18,12 @@
 		</editor>
 	</extension>
 
+	<extension point="org.eclipse.ui.actionSetPartAssociations">
+    	<actionSetPartAssociation targetID="org.eclipse.debug.ui.launchActionSet">
+        	<part id="org.eclipse.jst.pagedesigner.PageDesignerEditor"/>
+    	</actionSetPartAssociation>
+	</extension>
+
 	<extension point="org.eclipse.core.runtime.adapters">
 		<factory
 			class="org.eclipse.jst.pagedesigner.utils.UriAdapterFactory"
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/PDPlugin.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/PDPlugin.java
index 178b7bb..2c9f403 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/PDPlugin.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/PDPlugin.java
@@ -45,8 +45,6 @@
 import org.eclipse.ui.IWorkbenchPage;
 import org.eclipse.ui.IWorkbenchWindow;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.eclipse.wst.sse.core.StructuredModelManager;
-import org.eclipse.wst.sse.core.internal.provisional.IModelManager;
 import org.osgi.framework.BundleContext;
 
 /**
@@ -139,6 +137,7 @@
 
 	/**
 	 * Returns the shared instance.
+	 * @return the default plugin
 	 */
 	public static PDPlugin getDefault() {
 		return _plugin;
@@ -147,7 +146,7 @@
 	/**
 	 * get the alerts objects associated with this plugin for alerting the user.
 	 * 
-	 * @return
+	 * @return the Alerts object
 	 */
 	public static Alerts getAlerts() {
 		return _alerts;
@@ -155,6 +154,8 @@
 
 	/**
 	 * Returns a logger for the new class using this plugin for reference.
+	 * @param theClass
+	 * @return the Logger object associated with theClass
 	 */
 	public static Logger getLogger(Class theClass) {
 		if (getDefault() != null && getDefault().getRootLogger() != null) {
@@ -165,6 +166,7 @@
 
 	/**
 	 * Returns the plugin's root logger
+	 * @return the root logger
 	 */
 	public Logger getRootLogger() {
 		return _log;
@@ -172,22 +174,22 @@
 
 	/**
 	 * Returns this plugin's unique identifier
-	 * 
-	 * @retun this plugin's unique identifier
+	 * @return the plugin id
 	 */
 	public static String getPluginId() {
 		return getDefault().getBundle().getSymbolicName();
 	}
 
 	/**
-	 * Returns the plugin's resource bundle,
+	 * @return the plugin's resource bundle
 	 */
 	public ResourceBundle getResourceBundle() {
 		return _resourceBundle;
 	}
 
 	/**
-	 * Returns the string from the plugin's resource bundle, or 'key' if not
+	 * @param key 
+	 * @return the string from the plugin's resource bundle, or 'key' if not
 	 * found.
 	 */
 	public static String getResourceString(String key) {
@@ -200,14 +202,14 @@
 	}
 
 	/**
-	 * Returns the plugin's descriptor's resource bundle,
+	 * @return the plugin's descriptor's resource bundle,
 	 */
 	public ResourceBundle getPluginDecriptorBundle() {
 		return Platform.getResourceBundle(getDefault().getBundle());
 	}
 
 	/**
-	 * Returns the plugin's default properties. These are normally used for
+	 * @return the plugin's default properties. These are normally used for
 	 * default preferences.
 	 */
 	public Properties getProperties() {
@@ -215,7 +217,7 @@
 	}
 
 	/**
-	 * Returns the standard display to be used. The method first checks, if the
+	 * @return the standard display to be used. The method first checks, if the
 	 * thread calling this method has an associated dispaly. If so, this display
 	 * is returned. Otherwise the method returns the default display.
 	 */
@@ -229,7 +231,7 @@
 	}
 
 	/**
-	 * Returns the workspace instance.
+	 * @return the workspace instance.
 	 */
 	public static IWorkspace getWorkspace() {
 		return ResourcesPlugin.getWorkspace();
@@ -304,16 +306,30 @@
 	 * Read a file resource. The file should contain any partial path and the
 	 * filename from the plugin base. The caller is responsible for closing the
 	 * file.
+	 * @param file 
+	 * @return the input stream for the file
+	 * @throws MalformedURLException 
+	 * @throws IOException 
 	 */
 	public InputStream readFile(String file) throws MalformedURLException,
 			IOException {
 		return (new URL(_pluginBase, file)).openStream();
 	}
 
+	/**
+	 * @param file
+	 * @return the File associate with the name 'file'
+	 * @throws MalformedURLException
+	 * @throws IOException
+	 */
 	public File getFile(String file) throws MalformedURLException, IOException {
 		return new File((new URL(_pluginBase, file)).getPath());
 	}
 
+	/**
+	 * @return the plugin's install location with the leading "/" removed
+	 * and normalized to the the os string.
+	 */
 	public static Path getInstallLocation() {
 		try {
 			URL url = getDefault().getBundle().getEntry("/");
@@ -336,11 +352,7 @@
 		}
 	}
 
-	public static IModelManager getModelManager() {
-		return StructuredModelManager.getModelManager();
-	}
-
-	/**
+    /**
 	 * Returns the active workbench window.
 	 * 
 	 * @return the active workbench window. this can be null but I've never seen
@@ -379,10 +391,8 @@
 	}
 
 	/**
-	 * Returns the active workbench Shell. Used for some funciton need IShell
+	 * @return the active workbench Shell. Used for some funciton need IShell
 	 * Parameter.
-	 * 
-	 * @return
 	 */
 	public static Shell getActiveWorkbenchShell() {
 		IWorkbenchWindow window = getActiveWorkbenchWindow();
@@ -398,9 +408,7 @@
 	}
 
 	/**
-	 * Returns the active display.
-	 * 
-	 * @return
+	 * @return the active display.
 	 */
 	public static Display getDisplay() {
 		Shell shell = getActiveWorkbenchShell();
@@ -411,9 +419,7 @@
 	}
 
 	/**
-	 * Returns current active project.
-	 * 
-	 * @return
+	 * @return current active project.
 	 */
 	public static IProject getCurrentProject() {
 		IProject curProject = null;
@@ -428,6 +434,10 @@
 		return curProject;
 	}
 	
+	/**
+	 * Log status using the default plugin logger
+	 * @param status
+	 */
 	public static void log(IStatus status)
 	{
 	    ILog log = getDefault().getLog();
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/AbstractLinkCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/AbstractLinkCreator.java
index c2f6e25..0e7f371 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/AbstractLinkCreator.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/AbstractLinkCreator.java
@@ -23,6 +23,10 @@
 public abstract class AbstractLinkCreator implements ILinkCreator,
 		IExecutableExtension {
 	private String _identifier;
+    /**
+     * the link identifier attribute name
+     */
+    private static final String LINK_IDENTIFIER = "linkIdentifier";
 
 	/*
 	 * (non-Javadoc)
@@ -50,6 +54,6 @@
 	 */
 	public void setInitializationData(IConfigurationElement config,
 			String propertyName, Object data) throws CoreException {
-		this._identifier = config.getAttribute(ILinkCreator.LINK_IDENTIFIER);
+		this._identifier = config.getAttribute(LINK_IDENTIFIER);
 	}
 }
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/CreateLinkWizard.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/CreateLinkWizard.java
index e36848a..b385663 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/CreateLinkWizard.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/CreateLinkWizard.java
@@ -37,11 +37,16 @@
 
 	private DesignRange _range;
 
-	private Map _linkMap;
+	private Map<String, ILinkCreator> _linkMap;
 
 	private String _linkType;
 
-	public CreateLinkWizard(EditPart part, DesignRange range, Map linkMap) {
+	/**
+	 * @param part
+	 * @param range
+	 * @param linkMap
+	 */
+	public CreateLinkWizard(EditPart part, DesignRange range, Map<String, ILinkCreator> linkMap) {
 		this._part = part;
 		this._range = range;
 		this._linkMap = linkMap;
@@ -77,11 +82,17 @@
 		return true;
 	}
 
+	/**
+	 * @param pageTitle
+	 */
 	public void setPageTitle(String pageTitle) {
 		_pageTitle = pageTitle;
 		initializeDefaultPageImageDescriptor();
 	}
 
+	/**
+	 * 
+	 */
 	protected void initializeDefaultPageImageDescriptor() {
 		ImageDescriptor desc = PDPlugin.getDefault().getImageDescriptor(
 				INTIAL_DEFAULT_PAGE_IMAGE);
@@ -89,6 +100,9 @@
 		setWindowTitle(WIZARD_TITLE);
 	}
 
+	/**
+	 * @return the link type
+	 */
 	public String getChosenLinkType() {
 		return this._linkType;
 	}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ExtensionReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ExtensionReader.java
index 5ef0c1d..6cf3d9f 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ExtensionReader.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ExtensionReader.java
@@ -12,6 +12,7 @@
 package org.eclipse.jst.pagedesigner.actions.link;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.eclipse.core.runtime.CoreException;
@@ -30,20 +31,24 @@
 public class ExtensionReader {
 	private static Logger _log = PDPlugin.getLogger(ExtensionReader.class);
 
-	private static ILinkCreator[] _handlers = null;
+	private static List<ILinkCreator> _handlers = null;
 
 	private static final String ATTR_CLASS = "class";
 
-	public static synchronized ILinkCreator[] getAllLinkHandlers() {
+	/** 
+	 * @return the ext-pts for the link handler
+	 * List is not modifiable
+	 */
+	public static synchronized List<ILinkCreator> getAllLinkHandlers() {
 		if (_handlers == null) {
 			_handlers = readAllLinkHandlers();
 		}
-		return _handlers;
+		return Collections.unmodifiableList(_handlers);
 
 	}
 
-	private static ILinkCreator[] readAllLinkHandlers() {
-		List result = new ArrayList();
+	private static List<ILinkCreator> readAllLinkHandlers() {
+	    List<ILinkCreator> result = new ArrayList<ILinkCreator>();
 		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
 				.getExtensionPoint(PDPlugin.getPluginId(),
 						IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
@@ -64,7 +69,7 @@
 								.createExecutableExtension(ATTR_CLASS);
 
 						if (obj instanceof ILinkCreator) {
-							result.add(obj);
+							result.add((ILinkCreator)obj);
 						}
 					} catch (CoreException e) {
 						_log
@@ -73,8 +78,6 @@
 				}
 			}
 		}
-		ILinkCreator[] ret = new ILinkCreator[result.size()];
-		result.toArray(ret);
-		return ret;
+		return result;
 	}
 }
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ILinkCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ILinkCreator.java
index 83b332b..0652f37 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ILinkCreator.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/ILinkCreator.java
@@ -20,13 +20,30 @@
  * @version 1.5
  */
 public interface ILinkCreator {
-	public static final String LINK_IDENTIFIER = "linkIdentifier";
 
+	/**
+	 * @param part
+	 * @param range
+	 * @return the link element
+	 */
 	public Element makeLinkElement(EditPart part, DesignRange range);
 
+	/**
+	 * @return link identifier
+	 */
 	public String getLinkIdentifier();
 
+	/**
+	 * @param range
+	 * @return true if can call makeLinkElement
+	 */
 	public boolean canExecute(DesignRange range);
 
+	/**
+	 * @param part
+	 * @param range
+	 * @return a preview string that approximates the result
+	 * of makeLinkElement
+	 */
 	public String getSourcePreview(EditPart part, DesignRange range);
 }
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkRequest.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkRequest.java
index 4f1152e..1caa1f8 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkRequest.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkRequest.java
@@ -19,19 +19,29 @@
  * @version 1.5
  */
 public class LinkRequest extends Request {
-	private String _identifier = "";
+	private final String _identifier;
 
-	private DesignRange _range = null;
+	private final DesignRange _range;
 
+	/**
+	 * @param identifier
+	 * @param range
+	 */
 	public LinkRequest(String identifier, DesignRange range) {
 		this._identifier = identifier;
 		this._range = range;
 	}
 
+	/**
+	 * @return the identifier
+	 */
 	public String getIdentifier() {
 		return this._identifier;
 	}
 
+	/**
+	 * @return the design range
+	 */
 	public DesignRange getDesignRange() {
 		return this._range;
 	}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkUtil.java
index 271b8c1..aeeaf41 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkUtil.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkUtil.java
@@ -26,6 +26,11 @@
  * @version 1.5
  */
 public class LinkUtil {
+	/**
+	 * @param part
+	 * @param range
+	 * @return the select text if part is a text node or null.
+	 */
 	public static String getSelectedText(EditPart part, DesignRange range) {
 		if (part instanceof TextEditPart) {
 			TextEditPart textPart = (TextEditPart) part;
@@ -38,6 +43,11 @@
 		return null;
 	}
 
+	/**
+	 * @param part
+	 * @param range
+	 * @return the text from part split if it is a text node or null
+	 */
 	public static Text splitDomText(EditPart part, DesignRange range) {
 		if (part instanceof TextEditPart) {
 			Text textNode = (Text) part.getModel();
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkWizardPage.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkWizardPage.java
index f64d5e4..25e120c 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkWizardPage.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/LinkWizardPage.java
@@ -35,7 +35,7 @@
  * @author mengbo
  * @version 1.5
  */
-public class LinkWizardPage extends WizardPage {
+/*package*/ class LinkWizardPage extends WizardPage {
 	private static final String GROUP_TITLE = PDPlugin
 			.getResourceString("LinkWizardPage.GroupTitle");
 
@@ -44,16 +44,23 @@
 
 	private StyledText _text = null;
 
-	private Map _linkMap = null;
+	private final Map<String, ILinkCreator> _linkMap;
 
 	private String _linkType = null;
 
-	private EditPart _part = null;
+	private final EditPart _part;
 
-	private DesignRange _range = null;
+	private final DesignRange _range;
 
+	/**
+	 * @param pageName
+	 * @param title
+	 * @param editPart
+	 * @param range
+	 * @param linkMap
+	 */
 	public LinkWizardPage(String pageName, String title, EditPart editPart,
-			DesignRange range, Map linkMap) {
+			DesignRange range, Map<String, ILinkCreator> linkMap) {
 		super(pageName, title, null);
 		this._part = editPart;
 		this._range = range;
@@ -83,13 +90,13 @@
 		group.setLayoutData(data);
 
 		String defaultLink = "";
-		Set set = this._linkMap.keySet();
+		Set<String> set = this._linkMap.keySet();
 		int size = set.size();
 		String[] keys = new String[size];
-		Iterator itr = set.iterator();
+		Iterator<String> itr = set.iterator();
 		int i = 0;
 		while (itr.hasNext()) {
-			String key = (String) itr.next();
+			String key = itr.next();
 			keys[i++] = key;
 		}
 		Arrays.sort(keys);
@@ -113,7 +120,7 @@
 		data.heightHint = 50;
 		_text.setLayoutData(data);
 
-		ILinkCreator creator = (ILinkCreator) _linkMap.get(defaultLink);
+		ILinkCreator creator = _linkMap.get(defaultLink);
 		_linkType = creator.getLinkIdentifier();
 		String previewText = creator.getSourcePreview(_part, _range);
 		previewText = previewText == null ? "" : previewText;
@@ -132,19 +139,25 @@
 		return true;
 	}
 
+	/**
+	 * @return the link type
+	 */
 	public String getChosenLinkType() {
 		return this._linkType;
 	}
 
-	class SelectLinkListener extends SelectionAdapter {
+    class SelectLinkListener extends SelectionAdapter {
 		private String _key;
 
+		/**
+		 * @param key
+		 */
 		public SelectLinkListener(String key) {
 			this._key = key;
 		}
 
 		public void widgetSelected(SelectionEvent e) {
-			ILinkCreator creator = (ILinkCreator) _linkMap.get(this._key);
+			ILinkCreator creator = _linkMap.get(this._key);
 			_linkType = creator.getLinkIdentifier();
 			String previewText = creator.getSourcePreview(_part, _range);
 			previewText = previewText == null ? "" : previewText;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkAction.java
index ea6c413..ee8df16 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkAction.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkAction.java
@@ -13,6 +13,7 @@
 
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -64,7 +65,7 @@
 	 * @see org.eclipse.jface.action.Action#run()
 	 */
 	public void run() {
-		Map map = calAvailableLinkCreator();
+		Map<String, ILinkCreator> map = calAvailableLinkCreator();
 		if (map.size() > 1) {
 			CreateLinkWizard wizard = new CreateLinkWizard(_editPart, _range,
 					map);
@@ -78,10 +79,10 @@
 		}
 		// else must be html link
 		else if (map.size() == 1) {
-			Set set = map.entrySet();
-			Iterator itr = set.iterator();
+			Set<Map.Entry<String, ILinkCreator>> set = map.entrySet();
+			Iterator<Map.Entry<String,ILinkCreator>> itr = set.iterator();
 			while (itr.hasNext()) {
-				ILinkCreator creator = (ILinkCreator) itr.next();
+				ILinkCreator creator =  itr.next().getValue();
 				_linkType = creator.getLinkIdentifier();
 			}
 		}
@@ -199,14 +200,14 @@
 		return null;
 	}
 
-	private Map calAvailableLinkCreator() {
-		Map map = new HashMap();
-		ILinkCreator[] linkCreators = ExtensionReader.getAllLinkHandlers();
-		for (int i = 0, size = linkCreators.length; i < size; i++) {
-			String identifier = linkCreators[i].getLinkIdentifier();
-			boolean canExecute = linkCreators[i].canExecute(_range);
+	private Map<String, ILinkCreator> calAvailableLinkCreator() {
+		Map<String, ILinkCreator> map = new HashMap<String, ILinkCreator>();
+		List<ILinkCreator> linkCreators = ExtensionReader.getAllLinkHandlers();
+		for (ILinkCreator linkCreator : linkCreators) {
+			String identifier = linkCreator.getLinkIdentifier();
+			boolean canExecute = linkCreator.canExecute(_range);
 			if (canExecute) {
-				map.put(identifier, linkCreators[i]);
+				map.put(identifier, linkCreator);
 			}
 		}
 		return map;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkCommand.java
index 9ccd1d1..7c4835f 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkCommand.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/link/MakeLinkCommand.java
@@ -11,6 +11,8 @@
  *******************************************************************************/
 package org.eclipse.jst.pagedesigner.actions.link;
 
+import java.util.List;
+
 import org.eclipse.gef.EditPart;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jst.pagedesigner.PDPlugin;
@@ -35,6 +37,12 @@
 
 	private Element _ele = null;
 
+	/**
+	 * @param identifier
+	 * @param viewer
+	 * @param part
+	 * @param range
+	 */
 	public MakeLinkCommand(String identifier, IHTMLGraphicalViewer viewer,
 			EditPart part, DesignRange range) {
 		super(identifier, viewer);
@@ -50,10 +58,9 @@
 	 * @see org.eclipse.gef.commands.Command#canExecute()
 	 */
 	public boolean canExecute() {
-		ILinkCreator[] creators = ExtensionReader.getAllLinkHandlers();
+		List<ILinkCreator> creators = ExtensionReader.getAllLinkHandlers();
 		if (creators != null) {
-			for (int i = 0, size = creators.length; i < size; i++) {
-				ILinkCreator linkCreator = creators[i];
+			for (ILinkCreator linkCreator : creators) {
 				String identifier = linkCreator.getLinkIdentifier();
 				if (this._identifier.equalsIgnoreCase(identifier)) {
 					this._linkcreator = linkCreator;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/AlignSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/AlignSupport.java
index e1ac246..aaab7e9 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/AlignSupport.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/AlignSupport.java
@@ -23,7 +23,7 @@
  */
 public class AlignSupport {
 
-	public static final String[] ALIGN_VALUES = new String[] {
+	private static final String[] ALIGN_VALUES = new String[] {
 			PDPlugin.getResourceString("AlignSupport.ActionLabel.Left"), //$NON-NLS-1$
 			PDPlugin.getResourceString("AlignSupport.ActionLabel.Center"), //$NON-NLS-1$
 			PDPlugin.getResourceString("AlignSupport.ActionLabel.Right"), //$NON-NLS-1$
@@ -32,6 +32,10 @@
 
 	private static Element[] _nodes = null;
 
+	/**
+	 * @param menu
+	 * @param viewer
+	 */
 	public static void createAlignActions(IMenuManager menu,
 			IHTMLGraphicalViewer viewer) {
 		for (int i = 0; i < ALIGN_VALUES.length; i++) {
@@ -42,6 +46,9 @@
 		}
 	}
 
+	/**
+	 * @param nodes
+	 */
 	public static void setAlignNodes(Element[] nodes) {
 		if (_nodes != nodes) {
 			_nodes = nodes;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ChangeStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ChangeStyleAction.java
index 81ae111..d710e3c 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ChangeStyleAction.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ChangeStyleAction.java
@@ -28,11 +28,13 @@
  * @author mengbo
  */
 public class ChangeStyleAction extends DesignerToolBarAction {
-	private String _expectedTag;
+	private final String _expectedTag;
 
 	/**
 	 * @param text
+	 * @param name 
 	 * @param image
+	 * @param style 
 	 */
 	public ChangeStyleAction(String text, String name, ImageDescriptor image,
 			int style) {
@@ -41,6 +43,13 @@
 		this.setImageDescriptor(image);
 	}
 
+	/**
+	 * @param text
+	 * @param name
+	 * @param enabled
+	 * @param disabled
+	 * @param style
+	 */
 	public ChangeStyleAction(String text, String name, ImageDescriptor enabled,
 			ImageDescriptor disabled, int style) {
 		super(text, style);
@@ -49,13 +58,6 @@
 		setDisabledImageDescriptor(disabled);
 	}
 
-	protected String getExpectedCSSProperty() {
-		return null;
-	}
-
-	protected String getExpectedCSSPropertyValue() {
-		return null;
-	}
 
 	protected boolean isApplied(DOMRange range) {
 		if (range == null) {
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/DesignerToolBarAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/DesignerToolBarAction.java
index 2e506a4..3e241e3 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/DesignerToolBarAction.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/DesignerToolBarAction.java
@@ -66,12 +66,10 @@
 		}
 	}
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.texteditor.IUpdate#update()
+	/**
+	 * Update the status
 	 */
-	public void updateStatus() {
+	protected void updateStatus() {
 		DesignRange range = _viewer.getRangeSelection();
 		DOMRange domRange = null;
 		if (range != null) {
@@ -86,8 +84,16 @@
 		}
 	}
 
+	/**
+	 * @param range
+	 * @return ??
+	 */
 	protected abstract boolean isApplied(DOMRange range);
 
+	/**
+	 * @param viewer
+	 * @return true if this action can run
+	 */
 	protected boolean canRun(IHTMLGraphicalViewer viewer) {
 		if (viewer != null && viewer.isInRangeMode()
 				&& viewer.getModel().getDocument().hasChildNodes()) {
@@ -99,6 +105,9 @@
 		return false;
 	}
 
+	/**
+	 * @param viewer
+	 */
 	public void setViewer(IHTMLGraphicalViewer viewer) {
 		if (viewer == _viewer) {
 			return;
@@ -131,6 +140,9 @@
 		}
 	}
 
+	/**
+	 * @return the command for this action or null
+	 */
 	protected abstract Command getCommand();
 
 	/**
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/HTagsInsertGroupAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/HTagsInsertGroupAction.java
index ec5ee27..28352ca 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/HTagsInsertGroupAction.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/HTagsInsertGroupAction.java
@@ -24,7 +24,6 @@
 import org.eclipse.jst.pagedesigner.IHTMLConstants;
 import org.eclipse.jst.pagedesigner.PDPlugin;
 import org.eclipse.jst.pagedesigner.dom.DOMRange;
-import org.eclipse.jst.pagedesigner.viewer.DesignRange;
 import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Menu;
@@ -38,6 +37,10 @@
 
 	private static Map _actions = new HashMap();
 
+	/**
+	 * @param image
+	 * @param style
+	 */
 	public HTagsInsertGroupAction(ImageDescriptor image, int style) {
 		super(
 				PDPlugin
@@ -74,6 +77,10 @@
 		return null;
 	}
 
+	/**
+	 * @param parent
+	 * @param name
+	 */
 	protected void addActionToMenu(Menu parent, String name) {
 		DesignerToolBarAction action;
 		if (_actions.get(name) == null) {
@@ -114,15 +121,6 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.InsertTagChangeStyleAction#supportSingle(org.eclipse.jst.pagedesigner.dom.DOMRange)
-	 */
-	protected boolean supportSingle() {
-		return true;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
 	 * @see org.eclipse.jst.pagedesigner.editors.actions.DesignerToolBarAction#canRun(org.eclipse.jst.pagedesigner.dom.DOMRange)
 	 */
 	protected boolean isApplied(DOMRange range) {
@@ -132,15 +130,6 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see org.eclipse.jst.pagedesigner.commands.range.InsertTagChangeStyleAction#setEnabled(org.eclipse.jst.pagedesigner.viewer.DesignRange)
-	 */
-	public void setStatus(DesignRange range) {
-		this.setEnabled(true);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
 	 * @see org.eclipse.jface.action.IAction#run()
 	 */
 	public void run() {
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/InsertTagChangeStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/InsertTagChangeStyleAction.java
index fd03625..7624a2b 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/InsertTagChangeStyleAction.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/InsertTagChangeStyleAction.java
@@ -26,6 +26,7 @@
 public class InsertTagChangeStyleAction extends ChangeStyleAction {
 	/**
 	 * @param text
+	 * @param tag 
 	 * @param image
 	 * @param style
 	 */
@@ -44,36 +45,14 @@
 		return null;
 	}
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.texteditor.IUpdate#update()
-	 */
-	public void update() {
-		if (_viewer == null) {
-			this.setChecked(false);
-			this.setEnabled(false);
-			return;
-		}
-		if (!_viewer.isInRangeMode()) {
-			// XXX: later we may support in range mode.
-			this.setChecked(false);
-			this.setEnabled(false);
-			return;
-		}
-		DesignRange range = _viewer.getRangeSelection();
-		if (range == null || !range.isValid()) {
-			this.setChecked(false);
-			this.setEnabled(false);
-			return;
-		}
-		setEnabled(range);
-	}
+	@Override
+    protected void updateState() 
+	{
+        setEnabled(getDesignRange());
+    }
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ui.texteditor.IUpdate#update()
+	/**
+	 * @param range
 	 */
 	public void setEnabled(DesignRange range) {
 		DOMRange domRange = null;
@@ -90,7 +69,7 @@
 
 	private boolean canRun(DOMRange range) {
 		if (range != null) {
-			if (EditModelQuery.isSame(range) && !supportSingle()) {
+			if (EditModelQuery.isSame(range)) {
 				return false;
 			}
 			boolean ordered = range.isOrdered();
@@ -109,8 +88,4 @@
 		}
         return false;
 	}
-
-	protected boolean supportSingle() {
-		return false;
-	}
 }
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphStyleAction.java
index bcc8a21..5cefa47 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphStyleAction.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphStyleAction.java
@@ -44,6 +44,12 @@
 		setImageDescriptor(image);
 	}
 
+	/**
+	 * @param text
+	 * @param node
+	 * @param image
+	 * @param style
+	 */
 	public ParagraphStyleAction(String text, Node node, ImageDescriptor image,
 			int style) {
 		super(text, style);
@@ -82,6 +88,10 @@
         return false;
 	}
 
+	/**
+	 * @param common
+	 * @return ??? 
+	 */
 	protected boolean containsTag(Node common) {
 		// the lowest common block parent is the container to apply style.
 		if (_applyingNode == null) {
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphSupport.java
index 52616e4..2d03548 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphSupport.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/ParagraphSupport.java
@@ -47,12 +47,13 @@
 			PDPlugin.getResourceString("ParagraphSupport.CommandLabel.P"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H1"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H2"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H3"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H4"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H5"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.H6"), PDPlugin.getResourceString("ParagraphSupport.CommandLabel.PRE") //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$ //$NON-NLS-8$
 	};
 
-	public static int getCurrentParagraphMode(DesignRange range) {
-		return 0;
-	}
-
+	/**
+	 * @param man
+	 * @param range
+	 * @param viewer
+	 */
 	public static void createParagraphActions(IMenuManager man,
-			DesignRange range, int currentMode, IHTMLGraphicalViewer viewer) {
+			DesignRange range, IHTMLGraphicalViewer viewer) {
 		ParagraphStyleAction action = new NoneParagraphStyleAction(
 				PDPlugin
 						.getResourceString("ParagraphSupport.CommandLabel.None"), tags, null, IAction.AS_CHECK_BOX); //$NON-NLS-1$
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeActionGroup.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeActionGroup.java
index 4203ccc..ac453f9 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeActionGroup.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeActionGroup.java
@@ -193,14 +193,13 @@
 				.getResourceString("ActionGroup.Submenu.ParagraphFormat"));//$NON-NLS-1$
 		submenu.add(action);
 		// Add the submenu.
-		final int mode = ParagraphSupport.getCurrentParagraphMode(selection);
 
 		submenu.addMenuListener(new IMenuListener() {
 
 			public void menuAboutToShow(IMenuManager manager) {
 				submenu.removeAll();
 				ParagraphSupport.createParagraphActions(submenu, selection,
-						mode, viewer);
+						viewer);
 			}
 		});
 		menu.appendToGroup(PageDesignerActionConstants.GROUP_STYLE, submenu);
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleAction.java
index ba633ab..2346403 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleAction.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleAction.java
@@ -21,6 +21,10 @@
 public class RangeStyleAction extends Action {
 	/**
 	 * @param text
+	 * @param range 
+	 * @param htmlTag 
+	 * @param cssProperty 
+	 * @param cssValue 
 	 */
 	public RangeStyleAction(String text, DesignRange range, String htmlTag,
 			String cssProperty, String cssValue) {
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleSupport.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleSupport.java
index 754870a..60f2364 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleSupport.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/actions/range/RangeStyleSupport.java
@@ -20,20 +20,24 @@
  * @version 1.5
  */
 public class RangeStyleSupport {
-	public static final String[] ActionLabel = new String[] {
+	private static final String[] ActionLabel = new String[] {
 			PDPlugin.getResourceString("RangeStyleSupport.ActionLabel.Bold"),//$NON-NLS-1$
 			PDPlugin.getResourceString("RangeStyleSupport.ActionLabel.Italic"),//$NON-NLS-1$
 			PDPlugin
 					.getResourceString("RangeStyleSupport.ActionLabel.Underline"), }; //$NON-NLS-1$
 
-	public static final String[] HtmlTag = new String[] { "STRONG", "I", "U", }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+	private static final String[] HtmlTag = new String[] { "STRONG", "I", "U", }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 
-	public static final String[] CSSProperty = new String[] {
+	private static final String[] CSSProperty = new String[] {
 			"font-weight", "font-style", "text-decoration", }; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 
-	public static final String[] CSSValue = new String[] { "bolder", "italic",
+	private static final String[] CSSValue = new String[] { "bolder", "italic",
 			"underline", };
 
+	/**
+	 * @param menu
+	 * @param range
+	 */
 	public static void createRangeStyleActions(IMenuManager menu,
 			DesignRange range) {
 		for (int i = 0; i < ActionLabel.length; i++) {
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignResizeComponentCommand.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignResizeComponentCommand.java
index 40c23a8..2124d94 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignResizeComponentCommand.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/commands/DesignResizeComponentCommand.java
@@ -21,7 +21,7 @@
 import org.eclipse.jface.text.source.SourceViewer;
 import org.eclipse.jst.pagedesigner.css2.property.ICSSPropertyID;
 import org.eclipse.jst.pagedesigner.editors.HTMLEditor;
-import org.eclipse.jst.pagedesigner.viewer.HTMLGraphicalViewer;
+import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
 import org.w3c.dom.Element;
 
 /**
@@ -54,7 +54,7 @@
 		if (part != null) {
 			EditPartViewer viewer = ((ScalableRootEditPart) part.getParent())
 					.getViewer();
-			HTMLEditor editor = ((HTMLEditor) ((DefaultEditDomain) ((HTMLGraphicalViewer) viewer)
+			HTMLEditor editor = ((HTMLEditor) ((DefaultEditDomain) ((IHTMLGraphicalViewer) viewer)
 					.getEditDomain()).getEditorPart());
 			_viewer = editor.getTextEditor().getTextViewer();
 		}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/AbstractTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/AbstractTagConverter.java
index 0d34b94..8c9054c 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/AbstractTagConverter.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/AbstractTagConverter.java
@@ -56,6 +56,7 @@
 	private boolean _needBorderDecorator;
 
 	/**
+	 * @param host 
 	 * 
 	 */
 	public AbstractTagConverter(Element host) {
@@ -193,6 +194,10 @@
         // need to review this
 	}
 
+	/**
+	 * @param node
+	 * @return true if the node should be ignored for  conversion purposes
+	 */
 	protected boolean shouldIgnore(Node node) {
 		int nodeType = node.getNodeType();
 		switch (nodeType) {
@@ -209,6 +214,8 @@
 	/**
 	 * utility method for those converter that only converts the host tag's name
 	 * and directly copy children.
+	 * @param src 
+	 * @param dest 
 	 * 
 	 */
 	protected void copyChildren(Element src, Element dest) {
@@ -223,6 +230,8 @@
 
 	/**
 	 * utility method for those converter that directly copy children.
+	 * @param src 
+	 * @param dest 
 	 * 
 	 */
 	protected void dumCopyChildren(Element src, Element dest) {
@@ -271,6 +280,10 @@
 		return getDestDocument().createTextNode(text);
 	}
 
+	/**
+	 * @param original
+	 * @return the mapped String  TODO: currently does nothing
+	 */
 	protected String mapURL(String original) {
 		// TODO: how to map URL? such as original url look like:
 		// getContext().getPath()+...
@@ -279,6 +292,10 @@
 
 	// TODO: FIXME: XXX:
 	// if the value is expression, we may want to do something here!!!
+	/**
+	 * @param value
+	 * @return value mapped based on EL expression
+	 */
 	protected String mapValue(String value) {
 		if (value == null) {
 			return null;
@@ -362,6 +379,9 @@
 		return this._needBorderDecorator;
 	}
 
+	/**
+	 * @param b
+	 */
 	public void setNeedBorderDecorator(boolean b) {
 		this._needBorderDecorator = b;
 	}
@@ -394,14 +414,23 @@
 		this._mode = mode;
 	}
 
+	/**
+	 * @return true if the converter mode is preview
+	 */
 	public final boolean isPreviewMode() {
 		return this._mode == IConverterFactory.MODE_PREVIEW;
 	}
 
+	/**
+	 * @return true if the converter mode is designer
+	 */
 	public final boolean isDesignerMode() {
 		return this._mode == IConverterFactory.MODE_DESIGNER;
 	}
 
+	/**
+	 * @return the converter mode
+	 */
 	public final int getMode() {
 		return this._mode;
 	}
@@ -434,6 +463,9 @@
 		return this._minWidth;
 	}
 
+	/**
+	 * @param minWidth
+	 */
 	public void setMinWidth(int minWidth) {
 		this._minWidth = minWidth;
 	}
@@ -447,10 +479,18 @@
 		return this._minHeight;
 	}
 
+	/**
+	 * @param minHeight
+	 */
 	public void setMinHeight(int minHeight) {
 		this._minHeight = minHeight;
 	}
 
+	/**
+	 * @param element
+	 * @param attrname
+	 * @return the attribute on element with the name attrname
+	 */
 	public static boolean hasAttribute(Element element, String attrname) {
 		return element.hasAttribute(attrname);
 	}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConvertPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConvertPosition.java
index 97f2ba8..130ec40 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConvertPosition.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConvertPosition.java
@@ -20,11 +20,13 @@
  * @version 1.5
  */
 public class ConvertPosition {
-	Node _parentNode;
+	private final Node _parentNode;
 
-	int _index;
+	private final int _index;
 
 	/**
+	 * @param parent \
+	 * @param index 
 	 * 
 	 */
 	public ConvertPosition(Node parent, int index) {
@@ -32,10 +34,16 @@
 		this._index = index;
 	}
 
+	/**
+	 * @return the parent node
+	 */
 	public Node getParentNode() {
 		return _parentNode;
 	}
 
+	/**
+	 * @return the index
+	 */
 	public int getIndex() {
 		return _index;
 	}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFacRegistryReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFacRegistryReader.java
index 21f3d88..147850e 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFacRegistryReader.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFacRegistryReader.java
@@ -12,6 +12,7 @@
 package org.eclipse.jst.pagedesigner.converter;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.eclipse.core.runtime.CoreException;
@@ -27,18 +28,22 @@
  * @version 1.5
  */
 public class ConverterFacRegistryReader {
-	static IConverterFactory[] _handlers = null;
+	private static List<IConverterFactory> _handlers = null;
 
-	public static synchronized IConverterFactory[] getAllHandlers() {
+	/**
+	 * @return the list of handlers.  The list is not modifiable and will
+	 * throw exceptions if it is attempted.
+	 */
+	public static synchronized List<IConverterFactory> getAllHandlers() {
 		if (_handlers == null) {
 			_handlers = readAllHandlers();
 		}
-		return _handlers;
+		return Collections.unmodifiableList(_handlers);
 
 	}
 
-	private static IConverterFactory[] readAllHandlers() {
-		List result = new ArrayList();
+	private static List<IConverterFactory> readAllHandlers() {
+		List result = new ArrayList<IConverterFactory>();
 		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
 				.getExtensionPoint(PDPlugin.getPluginId(),
 						IJMTConstants.EXTENSION_POINT_PAGEDESIGNER);
@@ -68,9 +73,7 @@
 				}
 			}
 		}
-		IConverterFactory[] ret = new IConverterFactory[result.size()];
-		result.toArray(ret);
-		return ret;
+		return result;
 	}
 
 }
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFactoryRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFactoryRegistry.java
index 5a54c1b..4cbeafe 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFactoryRegistry.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterFactoryRegistry.java
@@ -41,18 +41,27 @@
 		_factories.add(new JSPConverterFactory());
 		_factories.add(new HTMLConverterFactory());
 
-		IConverterFactory facs[] = ConverterFacRegistryReader.getAllHandlers();
+		List<IConverterFactory> facs = ConverterFacRegistryReader.getAllHandlers();
 		if (facs != null) {
-			for (int i = 0; i < facs.length; i++) {
-				addFactory(facs[i]);
+			for (IConverterFactory fac : facs) {
+				addFactory(fac);
 			}
 		}
 	}
 
+	/**
+	 * @param fac
+	 */
 	public void addFactory(IConverterFactory fac) {
 		_factories.add(fac);
 	}
 
+	/**
+	 * @param ele
+	 * @param mode
+	 * @param targetDocument
+	 * @return the new btag converter
+	 */
 	public ITagConverter createTagConverter(Element ele, int mode,
 			IDOMDocument targetDocument) {
 		ITagConverter converter = internalCreateTagConverter(ele, mode);
@@ -62,7 +71,12 @@
 		return converter;
 	}
 
-	public ITagConverter internalCreateTagConverter(Element ele, int mode) {
+	/**
+	 * @param ele
+	 * @param mode
+	 * @return the new tag converter
+	 */
+	protected final ITagConverter internalCreateTagConverter(Element ele, int mode) {
 		String uri = CMUtil.getElementNamespaceURI(ele);
 		// first round, match uri
 		for (int i = 0, size = _factories.size(); i < size; i++) {
@@ -118,6 +132,9 @@
 				"palette/GENERIC/small/PD_Palette_Default.gif");
 	}
 
+	/**
+	 * @return the singleton instance of the registry
+	 */ 
 	public static ConverterFactoryRegistry getInstance() {
 		if (_instance == null) {
 			_instance = new ConverterFactoryRegistry();
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterUtil.java
index 2dd2678..ade2b79 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterUtil.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/ConverterUtil.java
@@ -83,6 +83,11 @@
 		return true;
 	}
 
+	/**
+	 * @param document
+	 * @param text
+	 * @return the descripton element in the document containing text
+	 */
 	public static Element createDescriptionElement(IDOMDocument document,
 			String text) {
 		if (document == null) {
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DefaultUnknownTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DefaultUnknownTagConverter.java
index 397fcf7..7050685 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DefaultUnknownTagConverter.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DefaultUnknownTagConverter.java
@@ -25,6 +25,7 @@
 
 	/**
 	 * @param host
+	 * @param mode 
 	 */
 	public DefaultUnknownTagConverter(Element host, int  mode) {
 		super(host);
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumTagConverter.java
index 43c987e..455bc85 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumTagConverter.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/DumTagConverter.java
@@ -20,13 +20,17 @@
  */
 public class DumTagConverter extends AbstractTagConverter {
 	/**
-	 * 
+	 * @param host 
+	 * @param needBorder 
 	 */
 	public DumTagConverter(Element host, boolean needBorder) {
 		this(host);
 		this.setNeedBorderDecorator(needBorder);
 	}
 
+	/**
+	 * @param host
+	 */
 	public DumTagConverter(Element host) {
 		super(host);
 	}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter.java
index 4b4a8a6..51a6c1d 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter.java
@@ -35,6 +35,8 @@
 	private int _mode;
 
 	/**
+	 * @param host 
+	 * @param labelProvider 
 	 * 
 	 */
 	public HiddenTagConverter(Element host, ILabelProvider labelProvider) {
@@ -153,6 +155,9 @@
 		this._mode = mode;
 	}
 
+	/**
+	 * @return the mode
+	 */
 	public int getMode() {
 		return _mode;
 	}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter2.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter2.java
index cd09809..f51af22 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter2.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/HiddenTagConverter2.java
@@ -33,6 +33,10 @@
 
 	private Image _image;
 
+	/**
+	 * @param host
+	 * @param image
+	 */
 	public HiddenTagConverter2(Element host, Image image) {
 		super(host);
 		this._image = image;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IConverterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IConverterFactory.java
index 002a7b0..f8aebf2 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IConverterFactory.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/IConverterFactory.java
@@ -18,13 +18,20 @@
  * @version 1.5
  */
 public interface IConverterFactory {
+	/**
+	 * indicates designer mode 
+	 */
 	public static final int MODE_DESIGNER = 0;
 
+	/**
+	 * indicates preview mode
+	 */
 	public static final int MODE_PREVIEW = 1;
 
 	/**
 	 * 
 	 * @param element
+	 * @param mode 
 	 * @return null if this factory don't support this element
 	 */
 	public ITagConverter createConverter(Element element, int mode);
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/PreferenceReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/PreferenceReader.java
index 71b2830..ea9dc4e 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/PreferenceReader.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/PreferenceReader.java
@@ -16,12 +16,24 @@
  * @version 1.5
  */
 public class PreferenceReader {
+	/**
+	 * expression type
+	 */
 	public final static int FULL_EXPRESSION_TYPE = 0;
 
+    /**
+     * expression type
+     */
 	public final static int LAST_EXPRESSION_TYPE = 1;
 
+    /**
+     * expression type
+     */
 	public final static int REAL_VALUE_TYPE = 2;
 
+	/**
+	 * @return the map value type
+	 */
 	public static int getMapValueType() {
 		return LAST_EXPRESSION_TYPE;
 	}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/IncludeTagConverterPreview.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/IncludeTagConverterPreview.java
index cc9de36..73aa825 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/IncludeTagConverterPreview.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/converter/jsp/IncludeTagConverterPreview.java
@@ -30,6 +30,7 @@
 import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.PageVariableAdapterFactory;
 import org.eclipse.jst.pagedesigner.preview.PageExpressionContext;
 import org.eclipse.jst.pagedesigner.preview.PreviewConvertContext;
+import org.eclipse.wst.sse.core.StructuredModelManager;
 import org.eclipse.wst.sse.core.internal.util.URIResolver;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMDocument;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
@@ -51,6 +52,7 @@
 
 	/**
 	 * @param host
+	 * @param fileAttrname 
 	 */
 	public IncludeTagConverterPreview(Element host, String fileAttrname) {
 		super(host);
@@ -77,6 +79,10 @@
         return previewFile(file);
 	}
 
+	/**
+	 * @param includedPath
+	 * @return the IFile corresponding to the IPath
+	 */
 	public IFile getFile(IPath includedPath) {
 		IWorkspaceRoot workspaceRoot = ResourcesPlugin.getWorkspace().getRoot();
 		IProject[] projects = workspaceRoot.getProjects();
@@ -95,13 +101,17 @@
 		return null;
 	}
 
+	/**
+	 * @param file
+	 * @return the Element
+	 */
 	public Element previewFile(IFile file) {
 		IDOMModel xmlModel = null;
 		DocumentPageVariableAdapter provider = null;
 		boolean pushedPageVarProvider = false;
 		try {
 
-			xmlModel = (IDOMModel) PDPlugin.getModelManager().getModelForRead(
+			xmlModel = (IDOMModel) StructuredModelManager.getModelManager().getModelForRead(
 					file);
 			if (xmlModel != null) {
 				IDOMDocument doc = xmlModel.getDocument();
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFontManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFontManager.java
index 3fc1c94..a47a81f 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFontManager.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/css2/font/CSSFontManager.java
@@ -64,27 +64,25 @@
 	}
 
 	private CacheManager _cacheManager = new CacheManager(
-			new ICacheEntryCreator() {
-				public Object createEntry(Object key) {
+			new ICacheEntryCreator<CSSFont, Font>() {
+				public Font createEntry(CSSFont key) {
 					if (DEBUG) {
 						_totalFont++;
 						System.out.println("TotalFont++: " + _totalFont);
 					}
-					CSSFont cssfont = (CSSFont) key;
-
-					Font font = new Font(null, cssFontToLocalFont(cssfont
-							.getFontFamily()), (int) Math.round(cssfont
+					Font font = new Font(null, cssFontToLocalFont(key
+							.getFontFamily()), (int) Math.round(key
 							.getFontSize()
-							/ FONT_SCALE), cssfont.getSwtFontStyle());
+							/ FONT_SCALE), key.getSwtFontStyle());
 					return font;
 				}
 
-				public void dispose(Object key, Object entry) {
+				public void dispose(CSSFont key, Font entry) {
 					if (DEBUG) {
 						_totalFont--;
 						System.out.println("TotalFont--: " + _totalFont);
 					}
-					((Font) entry).dispose();
+					entry.dispose();
 
 				}
 			}, CACHESIZE);
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalSelectionDropTargetListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalSelectionDropTargetListener.java
index 91ff8b5..08594c8 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalSelectionDropTargetListener.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dnd/internal/LocalSelectionDropTargetListener.java
@@ -24,7 +24,7 @@
 import org.eclipse.jst.jsf.common.ui.internal.guiutils.Alerts;
 import org.eclipse.jst.pagedesigner.PDPlugin;
 import org.eclipse.jst.pagedesigner.dnd.LocalDropRequest;
-import org.eclipse.jst.pagedesigner.viewer.HTMLGraphicalViewer;
+import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
 import org.eclipse.swt.dnd.DND;
 import org.eclipse.swt.dnd.DropTargetEvent;
 import org.eclipse.ui.views.navigator.LocalSelectionTransfer;
@@ -107,7 +107,7 @@
 	 * @see org.eclipse.swt.dnd.DropTargetListener#drop(org.eclipse.swt.dnd.DropTargetEvent)
 	 */
 	public void drop(DropTargetEvent event) {
-		String path = ((HTMLGraphicalViewer) getViewer()).getModel()
+		String path = ((IHTMLGraphicalViewer) getViewer()).getModel()
 				.getBaseLocation();
 		IWorkspace workspace = ResourcesPlugin.getWorkspace();
 		IWorkspaceRoot root = workspace.getRoot();
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DTManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DTManager.java
index 5db2db9..f62e2a5 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DTManager.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/DTManager.java
@@ -29,7 +29,7 @@
 public class DTManager {
 
 	private static DTManager instance;
-	private IDTInfoFactory dtInfoFactory;
+	private IDTInfoFactory _dtInfoFactory;
 
 	private DTManager() {
         // no external instantiation
@@ -108,10 +108,10 @@
 	 * @return An IDTInfoFactory instance for the specified namespace URI.
 	 */
 	protected IDTInfoFactory getDTInfoFactory(String nsURI) {
-		if (dtInfoFactory == null) {
-			dtInfoFactory = new DefaultDTInfoFactory();
+		if (_dtInfoFactory == null) {
+			_dtInfoFactory = new DefaultDTInfoFactory();
 		}
-		return dtInfoFactory;
+		return _dtInfoFactory;
 	}
 
 }
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/AbstractTransformOperation.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/AbstractTransformOperation.java
index 48f1a80..9352d60 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/AbstractTransformOperation.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/dtmanager/converter/operations/AbstractTransformOperation.java
@@ -160,7 +160,7 @@
 			Node curNode = childNodes.item(i);
 			if (curNode.getNodeType() == Node.ELEMENT_NODE) {
 				String curNodeName = curNode.getLocalName();
-				if (curNode != null && curNodeName.equals(tagName)) {
+				if (curNodeName != null && curNodeName.equals(tagName)) {
 					childElements.add(curNode);
 				}
 			}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SimpleGraphicalEditor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SimpleGraphicalEditor.java
index 5865a27..510a604 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SimpleGraphicalEditor.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/SimpleGraphicalEditor.java
@@ -52,8 +52,8 @@
 import org.eclipse.jst.pagedesigner.editors.actions.DesignerUndoRedoAction;
 import org.eclipse.jst.pagedesigner.editors.actions.RelatedViewActionGroup;
 import org.eclipse.jst.pagedesigner.editors.palette.DesignerPaletteCustomizer;
-import org.eclipse.jst.pagedesigner.editors.palette.DesignerPaletteViewerProvider;
 import org.eclipse.jst.pagedesigner.editors.palette.DesignerPaletteRootFactory;
+import org.eclipse.jst.pagedesigner.editors.palette.DesignerPaletteViewerProvider;
 import org.eclipse.jst.pagedesigner.jsp.core.internal.pagevar.DocumentPageVariableAdapter;
 import org.eclipse.jst.pagedesigner.jsp.core.pagevar.adapter.PageVariableAdapterFactory;
 import org.eclipse.jst.pagedesigner.parts.CSSStyleAdapterFactory;
@@ -61,7 +61,6 @@
 import org.eclipse.jst.pagedesigner.parts.HTMLEditPartsFactory;
 import org.eclipse.jst.pagedesigner.parts.RefresherFactory;
 import org.eclipse.jst.pagedesigner.utils.SelectionHelper;
-import org.eclipse.jst.pagedesigner.viewer.HTMLGraphicalViewer;
 import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
 import org.eclipse.swt.events.MouseAdapter;
 import org.eclipse.swt.events.MouseEvent;
@@ -94,7 +93,7 @@
 
     private HTMLEditor _delegate;
 
-	private HTMLGraphicalViewer _viewer;
+	private IHTMLGraphicalViewer _viewer;
 
 	private IStructuredModel _model;
 
@@ -143,7 +142,7 @@
 	}
 
 	protected void createGraphicalViewer(Composite parent) {
-		_viewer = new HTMLGraphicalViewer(this);
+		_viewer = IHTMLGraphicalViewer.Factory.createGraphicalViewer(this);
 		Control control = _viewer.createControl(parent);
 		PlatformUI.getWorkbench().getHelpSystem().setHelp(control,
 				PDPlugin.getResourceString("SimpleGraphicalEditor.help.id"));
@@ -526,7 +525,7 @@
 				updateActions(getSelectionActions());
 				if (selection instanceof IStructuredSelection && //
 						!(((IStructuredSelection) selection).getFirstElement() instanceof DocumentEditPart)) {
-					((HTMLGraphicalViewer) viewerViewer)
+					((IHTMLGraphicalViewer) viewerViewer)
 							.updateRangeSelection(selection);
 				}
 			}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ChangeStyleAction.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ChangeStyleAction.java
index 2a2e784..70e5a68 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ChangeStyleAction.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/actions/ChangeStyleAction.java
@@ -18,6 +18,7 @@
 import org.eclipse.jst.pagedesigner.commands.range.ApplyStyleCommand;
 import org.eclipse.jst.pagedesigner.range.RangeUtil;
 import org.eclipse.jst.pagedesigner.viewer.DesignRange;
+import org.eclipse.jst.pagedesigner.viewer.HTMLGraphicalViewerListenenerAdapter;
 import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
 import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewerListener;
 import org.eclipse.ui.texteditor.IUpdate;
@@ -26,24 +27,12 @@
  * @author mengbo
  */
 public abstract class ChangeStyleAction extends Action implements IUpdate {
-	protected IHTMLGraphicalViewer _viewer;
+	private IHTMLGraphicalViewer _viewer;
 
-	String _expectedTag;
+	private String _expectedTag;
 
-	String _expectedCSSProperty;
-
-	String _expectedCSSPropertyValue;
-
-	IHTMLGraphicalViewerListener _listener = new IHTMLGraphicalViewerListener() {
-		/*
-		 * (non-Javadoc)
-		 * 
-		 * @see org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewerListener#selectionAboutToChange()
-		 */
-		public void selectionAboutToChange() {
-            // do nothing
-		}
-
+	private IHTMLGraphicalViewerListener _listener = new HTMLGraphicalViewerListenenerAdapter() 
+	{
 		/*
 		 * (non-Javadoc)
 		 * 
@@ -65,7 +54,9 @@
 
 	/**
 	 * @param text
+	 * @param name 
 	 * @param image
+	 * @param style 
 	 */
 	public ChangeStyleAction(String text, String name, ImageDescriptor image,
 			int style) {
@@ -74,16 +65,19 @@
 		this.setImageDescriptor(image);
 	}
 
+	/**
+	 * @param viewer
+	 */
 	public void setViewer(IHTMLGraphicalViewer viewer) {
 		if (viewer == _viewer) {
 			return;
 		}
 		if (_viewer != null) {
-			_viewer.removeSelectionChangedListener(_listener);
+			_viewer.removeHTMLViewerListener(_listener);
 		}
 		_viewer = viewer;
 		if (_viewer != null) {
-			_viewer.addSelectionChangedListener(_listener);
+			_viewer.addHTMLViewerListener(_listener);
 		}
 		update();
 	}
@@ -91,27 +85,59 @@
 	/**
 	 * 
 	 */
-	public void update() {
-		if (_viewer == null) {
-			this.setChecked(false);
-			this.setEnabled(false);
-			return;
-		}
-		if (!_viewer.isInRangeMode()) {
-			// XXX: later we may support in range mode.
-			this.setChecked(false);
-			this.setEnabled(false);
-			return;
-		}
-		DesignRange range = _viewer.getRangeSelection();
-		if (range == null || !range.isValid()) {
-			this.setChecked(false);
-			this.setEnabled(false);
-			return;
-		}
-		updateStatus(RangeUtil.normalize(range));
+	public void update() 
+	{
+	    boolean update = checkForUpdateAndMaybeDisableState();
+	    
+	    if (update)
+	    {
+	        updateState();
+	    }
 	}
 
+   /**
+    * Update the state 
+    */
+	protected void updateState()
+    {
+       DesignRange range = _viewer.getRangeSelection();
+       updateStatus(RangeUtil.normalize(range));
+    }
+
+	/**
+	 * Update the checked/enabled state
+	 * @return true if we should update status
+	 */
+	protected final boolean checkForUpdateAndMaybeDisableState()
+	{
+        if (_viewer == null) {
+            this.setChecked(false);
+            this.setEnabled(false);
+            return false;
+        }
+        if (!_viewer.isInRangeMode()) {
+            // XXX: later we may support in range mode.
+            this.setChecked(false);
+            this.setEnabled(false);
+            return false;
+        }
+        DesignRange range = _viewer.getRangeSelection();
+        if (range == null || !range.isValid()) {
+            this.setChecked(false);
+            this.setEnabled(false);
+            return false;
+        }
+        return true;
+	}
+	
+
+	/**
+	 * @return the viewer's current design range
+	 */
+	protected final DesignRange getDesignRange()
+	{
+	    return _viewer.getRangeSelection();
+	}
 	/**
 	 * @param range
 	 */
@@ -162,17 +188,17 @@
 	}
 
 	/**
-	 * @return
+	 * @return  the expected property value
 	 */
 	protected abstract String getExpectedCSSPropertyValue();
 
 	/**
-	 * @return
+	 * @return  the expected property
 	 */
 	protected abstract String getExpectedCSSProperty();
 
 	/**
-	 * @return
+	 * @return the expected tag
 	 */
 	protected String getExpectedTag() {
 		return _expectedTag;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizerDialog.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizerDialog.java
index 2f64b2b..a46fbbf 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizerDialog.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteCustomizerDialog.java
@@ -179,12 +179,12 @@
 		 */
 		public void update() {
 			//boolean enabled = false;
-			PaletteEntry entry = getSelectedPaletteEntry();
-			if (entry != null) {
+//			PaletteEntry entry = getSelectedPaletteEntry();
+//			if (entry != null) {
 				// if (getCustomizer() instanceof DesignerPaletteCustomizer)
 				// enabled = ((DesignerPaletteCustomizer)
 				// getCustomizer()).canExport(entry);
-			}
+//			}
 			setEnabled(true);
 		}
 
@@ -297,7 +297,7 @@
 	 * Content provider for dialog.
 	 * Displays only {@link TaglibPaletteDrawer}s
 	 */
-	private class DesignerPaletteContentProvider implements ITreeContentProvider {
+	private static class DesignerPaletteContentProvider implements ITreeContentProvider {
 
 		public Object[] getChildren(Object parentElement) {
 			if (parentElement instanceof DesignerPaletteRoot){
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewerProvider.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewerProvider.java
index b836d30..203e40f 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewerProvider.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/DesignerPaletteViewerProvider.java
@@ -83,7 +83,7 @@
 		return pViewer;
 	}
 	
-	private class HideTagLibAction extends Action {
+	private static class HideTagLibAction extends Action {
 		private DrawerEditPart tagLib;
 		
 		/**
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/PaletteInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/PaletteInfo.java
index c65cdeb..0cfd389 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/PaletteInfo.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/PaletteInfo.java
@@ -33,12 +33,33 @@
  * @generated
  */
 public interface PaletteInfo extends EObject {
+	/**
+	 * the trait id name
+	 */
 	public static final String TRAIT_ID				= "paletteInfo";
+	/**
+	 * the display label name
+	 */
 	public static final String TRAIT_DISPLAY_LABEL 	= "display-label";
+	/**
+	 * the trait description name
+	 */
 	public static final String TRAIT_DESCRIPTION 	= "description";
+	/**
+	 * the expert trait
+	 */
 	public static final String TRAIT_IS_EXPERT 		= "expert";
+	/**
+	 * the hiddent trait
+	 */
 	public static final String TRAIT_IS_HIDDEN 		= "hidden";
+	/**
+	 * the small icon trait
+	 */
 	public static final String TRAIT_SMALL_ICON 	= "small-icon";
+	/**
+	 * the large icon trait
+	 */
 	public static final String TRAIT_LARGE_ICON 	= "large-icon";
 
 	/**
@@ -284,6 +305,7 @@
 
 	/**
 	 * <!-- begin-user-doc -->
+     * @return true if the expert flag is set 
 	 * <!-- end-user-doc -->
 	 * @model kind="operation"
 	 * @generated
@@ -292,6 +314,7 @@
 
 	/**
 	 * <!-- begin-user-doc -->
+     * @return true if the hidden flag is set 
 	 * <!-- end-user-doc -->
 	 * @model kind="operation"
 	 * @generated
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/PaletteInfos.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/PaletteInfos.java
index 684a78d..4afcd23 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/PaletteInfos.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/PaletteInfos.java
@@ -27,6 +27,9 @@
  * @generated
  */
 public interface PaletteInfos extends EObject {
+	/**
+	 * the palette infos trait id
+	 */
 	public static final String TRAIT_ID				= "paletteInfos";
 	/**
 	 * <!-- begin-user-doc -->
@@ -54,6 +57,8 @@
 
 	/**
 	 * <!-- begin-user-doc -->
+     * @param id 
+     * @return the palette info by id 
 	 * <!-- end-user-doc -->
 	 * @model idRequired="true"
 	 * @generated
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/TagCreationInfo.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/TagCreationInfo.java
index 5ce6f92..dba7e5d 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/TagCreationInfo.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/TagCreationInfo.java
@@ -28,6 +28,9 @@
  * @generated
  */
 public interface TagCreationInfo extends EObject {
+	/**
+	 * the name of the trait id
+	 */
 	public static final String TRAIT_ID = "tag-create";
 	/**
 	 * <!-- begin-user-doc -->
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfoImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfoImpl.java
index 37f4f93..a916e68 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfoImpl.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfoImpl.java
@@ -2,7 +2,7 @@
  * <copyright>
  * </copyright>
  *
- * $Id: PaletteInfoImpl.java,v 1.5 2007/04/16 19:55:08 itrimble Exp $
+ * $Id: PaletteInfoImpl.java,v 1.6 2007/09/25 00:31:41 cbateman Exp $
  */
 package org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl;
 
@@ -31,7 +31,7 @@
  * The following features are implemented:
  * <ul>
  *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfoImpl#getId <em>Id</em>}</li>
- *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfoImpl#getTag <em>Tag</em>}</li>
+ *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfoImpl#getTag() <em>Tag</em>}</li>
  *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfoImpl#getDisplayLabel <em>Display Label</em>}</li>
  *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfoImpl#getDescription <em>Description</em>}</li>
  *   <li>{@link org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl.PaletteInfoImpl#getExpert <em>Expert</em>}</li>
@@ -322,9 +322,9 @@
 	 * @generated NOT
 	 */
 	private EObject getTagTraitValue(final String tagName, final String traitKey) {
-		Entity tag = getTag(tagName);
-		if (tag != null){
-			for (Iterator it=tag.getTraits().iterator();it.hasNext();){
+		Entity tag_ = getTag(tagName);
+		if (tag_ != null){
+			for (Iterator it=tag_.getTraits().iterator();it.hasNext();){
 				Trait trait = (Trait)it.next();
 				if (traitKey.equals(trait.getId()))
 					return trait.getValue(); 	
@@ -361,9 +361,9 @@
 	 */
 	private Entity findTag(Model model, String tagid) {
 		for (Iterator it=model.getChildEntities().iterator();it.hasNext();){
-			Entity tag = (Entity)it.next();
-			if (tagid.equals(tag.getId()))
-					return tag;
+			Entity tag_ = (Entity)it.next();
+			if (tagid.equals(tag_.getId()))
+					return tag_;
 		}
 		return null;
 	}
@@ -517,6 +517,7 @@
 
 	/**
 	 * <!-- begin-user-doc -->
+     * @return the tag creation info 
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfosFactoryImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfosFactoryImpl.java
index 4d68fe7..4b1af20 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfosFactoryImpl.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfosFactoryImpl.java
@@ -2,7 +2,7 @@
  * <copyright>
  * </copyright>
  *
- * $Id: PaletteInfosFactoryImpl.java,v 1.3 2007/04/16 19:55:08 itrimble Exp $
+ * $Id: PaletteInfosFactoryImpl.java,v 1.4 2007/09/25 00:32:06 cbateman Exp $
  */
 package org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl;
 
@@ -36,6 +36,7 @@
 	/**
 	 * Creates the default factory implementation.
 	 * <!-- begin-user-doc -->
+     * @return the palette info factory 
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
@@ -140,6 +141,7 @@
 
 	/**
 	 * <!-- begin-user-doc -->
+     * @return the palette info package 
 	 * <!-- end-user-doc -->
 	 * @deprecated
 	 * @generated
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfosPackageImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfosPackageImpl.java
index 53bebb0..88acc00 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfosPackageImpl.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/PaletteInfosPackageImpl.java
@@ -2,7 +2,7 @@
  * <copyright>
  * </copyright>
  *
- * $Id: PaletteInfosPackageImpl.java,v 1.3 2007/04/16 19:55:08 itrimble Exp $
+ * $Id: PaletteInfosPackageImpl.java,v 1.4 2007/09/25 00:32:06 cbateman Exp $
  */
 package org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl;
 
@@ -112,6 +112,7 @@
 	 * <p>Invocation of this method will not affect any packages that have
 	 * already been initialized.
 	 * <!-- begin-user-doc -->
+     * @return the palette info package 
 	 * <!-- end-user-doc -->
 	 * @see #eNS_URI
 	 * @see #createPackageContents()
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/TagCreationTemplateImpl.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/TagCreationTemplateImpl.java
index 1250ab1..d4b9955 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/TagCreationTemplateImpl.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/impl/TagCreationTemplateImpl.java
@@ -2,7 +2,7 @@
  * <copyright>
  * </copyright>
  *
- * $Id: TagCreationTemplateImpl.java,v 1.3 2007/04/16 19:55:08 itrimble Exp $
+ * $Id: TagCreationTemplateImpl.java,v 1.4 2007/09/25 00:32:06 cbateman Exp $
  */
 package org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.impl;
 
@@ -76,6 +76,9 @@
 
 	/**
 	 * <!-- begin-user-doc -->
+     * @param newTemplate 
+     * @param msgs 
+     * @return the notification chain 
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/util/PaletteInfosSwitch.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/util/PaletteInfosSwitch.java
index 0a980ac..8ef782e 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/util/PaletteInfosSwitch.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editors/palette/paletteinfos/internal/util/PaletteInfosSwitch.java
@@ -2,7 +2,7 @@
  * <copyright>
  * </copyright>
  *
- * $Id: PaletteInfosSwitch.java,v 1.2 2007/04/16 19:55:16 itrimble Exp $
+ * $Id: PaletteInfosSwitch.java,v 1.3 2007/09/25 00:31:06 cbateman Exp $
  */
 package org.eclipse.jst.pagedesigner.editors.palette.paletteinfos.internal.util;
 
@@ -57,6 +57,7 @@
 	/**
 	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
 	 * <!-- begin-user-doc -->
+     * @param theEObject 
 	 * <!-- end-user-doc -->
 	 * @return the first non-null result returned by a <code>caseXXX</code> call.
 	 * @generated
@@ -68,6 +69,8 @@
 	/**
 	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
 	 * <!-- begin-user-doc -->
+     * @param theEClass 
+     * @param theEObject 
 	 * <!-- end-user-doc -->
 	 * @return the first non-null result returned by a <code>caseXXX</code> call.
 	 * @generated
@@ -76,18 +79,18 @@
 		if (theEClass.eContainer() == modelPackage) {
 			return doSwitch(theEClass.getClassifierID(), theEObject);
 		}
-		else {
-			List eSuperTypes = theEClass.getESuperTypes();
-			return
-				eSuperTypes.isEmpty() ?
-					defaultCase(theEObject) :
-					doSwitch((EClass)eSuperTypes.get(0), theEObject);
-		}
+        List eSuperTypes = theEClass.getESuperTypes();
+        return
+        	eSuperTypes.isEmpty() ?
+        		defaultCase(theEObject) :
+        		doSwitch((EClass)eSuperTypes.get(0), theEObject);
 	}
 
 	/**
 	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that result.
 	 * <!-- begin-user-doc -->
+     * @param classifierID 
+     * @param theEObject 
 	 * <!-- end-user-doc -->
 	 * @return the first non-null result returned by a <code>caseXXX</code> call.
 	 * @generated
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PolicyHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PolicyHelper.java
index 2496013..79b8f7f 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PolicyHelper.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/editpolicies/PolicyHelper.java
@@ -16,7 +16,7 @@
 import org.eclipse.jface.action.IStatusLineManager;
 import org.eclipse.jst.jsf.common.ui.internal.logging.Logger;
 import org.eclipse.jst.pagedesigner.PDPlugin;
-import org.eclipse.jst.pagedesigner.viewer.HTMLGraphicalViewer;
+import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
 
 /**
  * @author mengbo
@@ -24,10 +24,14 @@
 public class PolicyHelper {
 	private static Logger _log = PDPlugin.getLogger(PolicyHelper.class);
 
+	/**
+	 * @param part
+	 * @return the current viewer's status line manager or null
+	 */
 	public static IStatusLineManager getStatusLineManager(EditPart part) {
 		EditPartViewer v = part.getViewer();
-		if (v instanceof HTMLGraphicalViewer) {
-			HTMLGraphicalViewer htmlviewer = (HTMLGraphicalViewer) v;
+		if (v instanceof IHTMLGraphicalViewer) {
+			IHTMLGraphicalViewer htmlviewer = (IHTMLGraphicalViewer) v;
 			IStatusLineManager m = htmlviewer.getStatusLineManager();
 			if (m == null) {
 				_log.info("Warn.PolicyHelper.0", (String) null); //$NON-NLS-1$
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFacRegistryReader.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFacRegistryReader.java
index 5e91f07..e0e1b7b 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFacRegistryReader.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFacRegistryReader.java
@@ -12,6 +12,7 @@
 package org.eclipse.jst.pagedesigner.elementedit;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.eclipse.core.runtime.CoreException;
@@ -27,20 +28,20 @@
  * @version 1.5
  */
 public class ElementEditFacRegistryReader {
-	static IElementEditFactory[] _handlers = null;
+	private static List<IElementEditFactory> _handlers = null;
 
 	/**
-	 * @return all available handers for the ext-pt
+	 * @return all available handers for the ext-pt.  List is not
+	 * modifiable
 	 */
-	public static synchronized IElementEditFactory[] getAllHandlers() {
+	public static synchronized List<IElementEditFactory> getAllHandlers() {
 		if (_handlers == null) {
 			_handlers = readAllHandlers();
 		}
-		return _handlers;
-
+		return Collections.unmodifiableList(_handlers);
 	}
 
-	private static IElementEditFactory[] readAllHandlers() {
+	private static List<IElementEditFactory> readAllHandlers() {
 		List result = new ArrayList();
 		IExtensionPoint extensionPoint = Platform.getExtensionRegistry()
 				.getExtensionPoint(PDPlugin.getPluginId(),
@@ -71,9 +72,7 @@
 				}
 			}
 		}
-		IElementEditFactory[] ret = new IElementEditFactory[result.size()];
-		result.toArray(ret);
-		return ret;
+		return result;
 	}
 
 }
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFactoryRegistry.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFactoryRegistry.java
index 198a4c3..7ca7daf 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFactoryRegistry.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/elementedit/ElementEditFactoryRegistry.java
@@ -36,11 +36,14 @@
 		addFactory(new HTMLElementEditFactory());
         addFactory(new JSPElementEditFactory());
 
-		IElementEditFactory facs[] = ElementEditFacRegistryReader
-				.getAllHandlers();
-		if (facs != null) {
-			for (int i = 0; i < facs.length; i++) {
-				addFactory(facs[i]);
+		List<IElementEditFactory> facs = 
+		    ElementEditFacRegistryReader.getAllHandlers();
+
+		if (facs != null) 
+		{
+			for (IElementEditFactory fac : facs) 
+			{
+				addFactory(fac);
 			}
 		}
 	}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/extensionpoint/IContextMenuItemContributor.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/extensionpoint/IContextMenuItemContributor.java
index 51dd66d..83bd334 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/extensionpoint/IContextMenuItemContributor.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/extensionpoint/IContextMenuItemContributor.java
@@ -23,10 +23,22 @@
  */
 
 public interface IContextMenuItemContributor {
+	/**
+	 * @param uri
+	 */
 	void setURI(String uri);
 
+	/**
+	 * @return the uri
+	 */
 	String getURI();
 
+	/**
+	 * @param manager
+	 * @param selection
+	 * @param model
+	 * @param parentUI
+	 */
 	void fillContextMenu(IMenuManager manager, ISelection selection,
 			IStructuredModel model, Control parentUI);
 }
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/CSSStyleAdapterFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/CSSStyleAdapterFactory.java
index 3e0eee9..1ba1fd0 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/CSSStyleAdapterFactory.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/CSSStyleAdapterFactory.java
@@ -43,7 +43,7 @@
 	}
 
 	/**
-	 * @return
+	 * @return the factory instance
 	 */
 	public static CSSStyleAdapterFactory getInstance() {
         // TODO: this 'singleton' is broken
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/EditProxyAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/EditProxyAdapter.java
index 9cd7ff0..cac1252 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/EditProxyAdapter.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/EditProxyAdapter.java
@@ -28,7 +28,7 @@
 	ElementEditPart _part;
 
 	/**
-	 * 
+	 * @param part 
 	 */
 	public EditProxyAdapter(ElementEditPart part) {
 		_part = part;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/ElementEditPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/ElementEditPart.java
index be35c7d..408d1d6 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/ElementEditPart.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/ElementEditPart.java
@@ -133,8 +133,7 @@
 	}
 
 	/**
-	 * @param node
-	 * @return
+	 * @return the associated element edit
 	 */
 	public IElementEdit getElementEdit() {
 		// XXX: should we cache it?
@@ -186,16 +185,16 @@
 	 * @see org.eclipse.gef.editparts.AbstractEditPart#getModelChildren()
 	 */
 	protected List getModelChildren() {
-		List children = new ArrayList(_tagConverter.getChildModeList());
+		List children_ = new ArrayList(_tagConverter.getChildModeList());
         
         for (Iterator it = _tagConverter.getNonVisualChildren().iterator(); it.hasNext();)
         {
             Element nonVisualChild = (Element) it.next();
-            children.add(DTManager.getInstance().getTagConverter(nonVisualChild,
+            children_.add(DTManager.getInstance().getTagConverter(nonVisualChild,
                 IConverterFactory.MODE_DESIGNER,
                 this.getDestDocumentForDesign()));
         }
-        return children;
+        return children_;
 	}
 
 	/*
@@ -242,6 +241,7 @@
 
 	/**
 	 * called by the
+	 * @param recursive
 	 * 
 	 */
 	public void refreshModelChange(boolean recursive) {
@@ -261,6 +261,9 @@
 		refresh(false);
 	}
 
+	/**
+	 * @param recursive
+	 */
 	public void refresh(boolean recursive) {
 		if (!_tagConverter.isVisualByHTML()) {
 			_tagConverter.convertRefresh(null);
@@ -374,7 +377,8 @@
 	}
 
 	/**
-	 * @return
+	 * @return true if we are in range mode and this is in 
+	 * the selection range
 	 */
 	public boolean isRangeSelected() {
 		IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) this.getViewer();
@@ -398,7 +402,7 @@
 	}
 
 	/**
-	 * @return
+	 * @return true if our model node can have direct text children
 	 */
 	public boolean canHaveDirectTextChild() {
 		return CMUtil.canHaveDirectTextChild(this._elementNode);
@@ -546,7 +550,7 @@
 	}
 
 	/**
-	 * @return
+	 * @return the associated tag converter
 	 */
 	public ITagConverter getTagConvert() {
 		return _tagConverter;
@@ -575,7 +579,7 @@
 	}
 
 	/**
-	 * @return
+	 * @return true this part's node has non whitespace child nodes
 	 */
 	public boolean haveNonWhitespaceTextChild() {
 		List children1 = this.getChildren();
@@ -600,6 +604,9 @@
         return _nonVisualElementBar;
     }
 
+    /**
+     * @return the element menu bar for this element
+     */
     public ElementMenuBar getElementMenuBar() {
         return getNonVisualElementBar();
     }
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/HTMLEditPartsFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/HTMLEditPartsFactory.java
index ec44b37..66dd085 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/HTMLEditPartsFactory.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/HTMLEditPartsFactory.java
@@ -25,6 +25,9 @@
 public class HTMLEditPartsFactory implements EditPartFactory {
 	private IDOMDocument _destDocument;
 
+	/**
+	 * @param destDoc
+	 */
 	public HTMLEditPartsFactory(IDOMDocument destDoc) {
 		this._destDocument = destDoc;
 	}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NodeEditPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NodeEditPart.java
index 8b122db..653ba15 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NodeEditPart.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NodeEditPart.java
@@ -56,6 +56,9 @@
 		this._destDocument = doc;
 	}
 
+	/**
+	 * @return to owner document of this part's model node
+	 */
 	public IDOMDocument getDestDocumentForDesign() {
 		if (this._destDocument == null) {
 			return (IDOMDocument) this.getIDOMNode().getOwnerDocument();
@@ -158,12 +161,15 @@
 	}
 
 	/**
-	 * @return
+	 * @return the model node as an IDOMNode
 	 */
 	public IDOMNode getIDOMNode() {
 		return ((IDOMNode) getModel());
 	}
 
+    /**
+     * @return the model node as a node
+     */
     public Node getDOMNode()
     {
         return ((Node)getModel());
@@ -189,7 +195,7 @@
 	 * if a EditPart don't support caret inside it, and don't can't have child
 	 * edit part, then we call it as a widget.
 	 * 
-	 * @return
+	 * @return true if this part represents a widget
 	 */
 	public boolean isWidget() {
 		return false; // child class must override.
@@ -199,30 +205,36 @@
 	 * whether this EditPart allow the selection range to have one edge in the
 	 * edit part and one edge outside the edit part.
 	 * 
-	 * @return
+	 * @return true if selection range across is allowed
 	 */
 	public boolean allowSelectionRangeAcross() {
 		return true;
 	}
 
 	/**
-	 * @return
+	 * @return true if this part is resizable
 	 */
 	public boolean isResizable() {
 		return false;
 	}
     
+    /**
+     * @return true if drag is active on this part
+     */
     public boolean isDragActive() {
         return _isDragActive;
     }
     
+    /**
+     * @param newValue
+     */
     public void setDragActive(boolean newValue)
     {
         _isDragActive = newValue;
     }
     
     /**
-     * @param defaultCursor
+     * @param mouseLocation
      * @return this edit part's cursor or null if this edit part
      * does not wish to specify a specific cursor (the default
      * should be used).  
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NonVisualComponentEditPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NonVisualComponentEditPart.java
index 1bc6b08..5ce56b4 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NonVisualComponentEditPart.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/NonVisualComponentEditPart.java
@@ -23,11 +23,16 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 
+/**
+ * Represents a node that is non-visual in the runtime rendering
+ * but which may wish to have a meta-representation on the design canvas.
+ *
+ */
 public class NonVisualComponentEditPart extends NodeEditPart 
 {
     protected IFigure createFigure() 
     {
-        IFigure figure = new ImageFigure(getTagConverter().getVisualImage())
+        IFigure figure_ = new ImageFigure(getTagConverter().getVisualImage())
         {
 
             protected void paintFigure(Graphics graphics) {
@@ -42,8 +47,8 @@
             
         };
         
-        figure.setMinimumSize(new Dimension(0,0));
-        return figure;
+        figure_.setMinimumSize(new Dimension(0,0));
+        return figure_;
     }
 
     public void notifyChanged(INodeNotifier notifier, int eventType,
@@ -59,6 +64,9 @@
                 null);
     }
 
+    /**
+     * @return the tag converter
+     */
     protected ITagConverter getTagConverter()
     {
     	ITagConverter tagConverter = (ITagConverter)getModel();
@@ -69,6 +77,9 @@
     	return tagConverter;
     }
     
+    /**
+     * @return the host element for this edit part
+     */
     protected Element getModelElement()
     {
         return getTagConverter().getHostElement();
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/Refresher.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/Refresher.java
index 3f6f120..67e62f2 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/Refresher.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/Refresher.java
@@ -13,7 +13,7 @@
 
 import org.eclipse.gef.EditPart;
 import org.eclipse.jst.pagedesigner.css2.ICSSStyle;
-import org.eclipse.jst.pagedesigner.viewer.HTMLGraphicalViewer;
+import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
 import org.eclipse.wst.sse.core.internal.provisional.INodeAdapter;
 import org.eclipse.wst.sse.core.internal.provisional.INodeNotifier;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMElement;
@@ -70,7 +70,7 @@
 
 			part = (EditPart) node.getAdapterFor(EditPart.class);
 			if (part != null) {
-				((HTMLGraphicalViewer) part.getViewer()).clearSelectionRange();
+				((IHTMLGraphicalViewer) part.getViewer()).clearSelectionRange();
 			}
 		}
 	}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/RefresherFactory.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/RefresherFactory.java
index 04aa76e..bb9c599 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/RefresherFactory.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/RefresherFactory.java
@@ -20,7 +20,7 @@
  * @version 1.5
  */
 public class RefresherFactory extends AbstractAdapterFactory {
-	Refresher refresher = new Refresher();
+	private final Refresher refresher = new Refresher();
 
 	RefresherFactory() {
 		super(Refresher.class, true);
@@ -36,6 +36,9 @@
 
 	static RefresherFactory _instance = new RefresherFactory();
 
+	/**
+	 * @return the factory singleton
+	 */
 	public static RefresherFactory getInstance() {
 		return _instance;
 	}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/TextEditPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/TextEditPart.java
index dc4ec9d..60377b5 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/TextEditPart.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/parts/TextEditPart.java
@@ -96,10 +96,9 @@
 		}
 	}
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jst.pagedesigner.css2.provider.ICSSTextProvider#getCSSStyle()
+
+	/**
+	 * @return the associated css style for this text node
 	 */
 	public ICSSStyle getCSSStyle() {
 		IFigure figure1 = this.getFigure();
@@ -124,7 +123,7 @@
 	 * This method return the really value that is going to be presented to
 	 * user. EditPartPosition's offset is referencing this value.
 	 * 
-	 * @return
+	 * @return the text data
 	 * @see org.eclipse.jst.pagedesigner.viewer.DesignPosition
 	 */
 	public String getTextData() {
@@ -139,7 +138,7 @@
 	/**
 	 * check what part of this text node is in the range selection.
 	 * 
-	 * @return
+	 * @return text node ranges
 	 */
 	public int[] getSelectedRange() {
 		IHTMLGraphicalViewer viewer = (IHTMLGraphicalViewer) this.getViewer();
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PageExpressionContext.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PageExpressionContext.java
index 9e26c21..83d190d 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PageExpressionContext.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/PageExpressionContext.java
@@ -69,22 +69,38 @@
 		_prj = prj;
 	}
 
+	/**
+	 * reset the context.
+	 */
 	public static void reset() {
 		_current = null;
 	}
 
+	/**
+	 * Initialize the current context
+	 * @param prj
+	 */
 	public static void initialize(IProject prj) {
 		_current = new PageExpressionContext(prj);
 	}
 
+	/**
+	 * @return the current context
+	 */
 	public static PageExpressionContext getCurrent() {
 		return _current;
 	}
 
+	/**
+	 * @param provider
+	 */
 	public void pushPageVarProvider(IPageVariablesProvider provider) {
 		_pageVarProviders.add(provider);
 	}
 
+	/**
+	 * @param provider
+	 */
 	public void popPageVarProvider(IPageVariablesProvider provider) {
 		try {
 			_pageVarProviders.remove(_pageVarProviders.size() - 1);
@@ -99,12 +115,12 @@
 	 * handles
 	 * 
 	 * @param expression
-	 * @param pageVars
-	 * @param jspFile
+	 * @param expectedClass 
 	 * @param options
 	 *            XXX: not used today. In the future, we may support things like
 	 *            locale in options
-	 * @return
+	 * @return the result of evaluating the expression
+	 * @throws ELException 
 	 */
 	public Object evaluateExpression(String expression, Class expectedClass,
 			Map options) throws ELException {
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/WindowsIEBrowser.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/WindowsIEBrowser.java
index 6bf32d5..2901f70 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/WindowsIEBrowser.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/preview/WindowsIEBrowser.java
@@ -18,26 +18,37 @@
 import org.eclipse.swt.browser.ProgressListener;
 import org.eclipse.swt.widgets.Composite;
 
+/**
+ * Models the windows IE browser for preview
+ *
+ */
 public class WindowsIEBrowser implements ProgressListener {
 	private Browser _browser;
 
-	private File _file;
-
+	/**
+	 * @param composite
+	 * @param i
+	 */
 	public void create(Composite composite, int i) {
 		_browser = new Browser(composite, i);
 		_browser.addProgressListener(this);
 	}
 
+	/**
+	 * @param file
+	 */
 	public synchronized void loadFile(File file) {
 		if (_browser == null) {
 			return;
 		}
-        _file = file;
         String s = "file:" + file.getAbsolutePath();
         _browser.setUrl(s);
         return;
 	}
 
+	/**
+	 * dispose the instance
+	 */
 	public void dispose() {
 		if (_browser == null) {
 			return;
@@ -51,16 +62,12 @@
         // do nothing
 	}
 
-	public synchronized void completed(ProgressEvent progressevent) {
-		if (_file != null) {
-			// XXX: don't delete, for debug purpose.
-			// _file.delete();
-			// _file = null;
-		}
+	public void completed(ProgressEvent progressevent) {
+	    // do nothing
 	}
 
 	/**
-	 * 
+	 * @return the underlying swt Browser instance
 	 */
 	public Browser getBrowser() {
 		return _browser;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/range/RangeUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/range/RangeUtil.java
index 9febaaa..1d85654 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/range/RangeUtil.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/range/RangeUtil.java
@@ -17,15 +17,8 @@
 
 import org.eclipse.gef.EditPart;
 import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
-import org.eclipse.jst.pagedesigner.parts.TextEditPart;
 import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
 import org.eclipse.jst.pagedesigner.viewer.DesignRange;
-import org.eclipse.jst.pagedesigner.viewer.TextPosition;
-import org.eclipse.wst.xml.core.internal.provisional.document.IDOMText;
-import org.w3c.dom.DocumentFragment;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.Text;
 
 /**
  * @author mengbo
@@ -38,19 +31,27 @@
 	 *            can't be null
 	 * @param reference
 	 *            can't be null
+	 * @return ??
 	 */
-	public static Node appendAfter(Node child, Node reference) {
-		Node next = reference.getNextSibling();
-		if (next == null)
-        {
-			return reference.getParentNode().appendChild(child);
-        }
-        return reference.getParentNode().insertBefore(child, next);
-	}
+    //TODO: dead
+//	private static Node appendAfter(Node child, Node reference) {
+//		Node next = reference.getNextSibling();
+//		if (next == null)
+//        {
+//			return reference.getParentNode().appendChild(child);
+//        }
+//        return reference.getParentNode().insertBefore(child, next);
+//	}
 
-	public static Node insertBefore(Node child, Node reference) {
-		return reference.getParentNode().insertBefore(child, reference);
-	}
+	/**
+	 * @param child
+	 * @param reference
+	 * @return ??
+	 */
+    // TODO: dead
+//	private static Node insertBefore(Node child, Node reference) {
+//		return reference.getParentNode().insertBefore(child, reference);
+//	}
 
 	/**
 	 * Insert a node into the specified position. The node can be an element or
@@ -59,38 +60,39 @@
 	 * @param node
 	 * @param position
 	 */
-	public static Node insertElement(DesignPosition position, Element node) {
-		EditPart containerEditPart = position.getContainerPart();
-		int offset = position.getOffset();
-
-		if (containerEditPart instanceof TextEditPart) {
-			TextEditPart textPart = (TextEditPart) containerEditPart;
-			String textData = textPart.getTextData();
-			Node textNode = (Node) textPart.getModel();
-			if (offset == 0)
-				return insertBefore(node, textNode);
-			else if (offset == textData.length())
-				return appendAfter(node, textNode);
-			else {
-				// inserting the element in the middle of text.
-				String before = textData.substring(0, offset);
-				String after = textData.substring(offset);
-
-				// XXX: don't know whether setNodeValue() will do all those
-				// escape or not.
-				textNode.setNodeValue(after);
-				Node newnode = insertBefore(node, textNode);
-
-				// XXX: don't know whether createTextNode() will do all those
-				// escape or not
-				Text t = textNode.getOwnerDocument().createTextNode(before);
-
-				insertBefore(t, newnode);
-				return newnode;
-			}
-		}
-        return insertIntoEditPart(containerEditPart, node, offset);
-	}
+	// TODO: dead
+//	private static Node insertElement(DesignPosition position, Element node) {
+//		EditPart containerEditPart = position.getContainerPart();
+//		int offset = position.getOffset();
+//
+//		if (containerEditPart instanceof TextEditPart) {
+//			TextEditPart textPart = (TextEditPart) containerEditPart;
+//			String textData = textPart.getTextData();
+//			Node textNode = (Node) textPart.getModel();
+//			if (offset == 0)
+//				return insertBefore(node, textNode);
+//			else if (offset == textData.length())
+//				return appendAfter(node, textNode);
+//			else {
+//				// inserting the element in the middle of text.
+//				String before = textData.substring(0, offset);
+//				String after = textData.substring(offset);
+//
+//				// XXX: don't know whether setNodeValue() will do all those
+//				// escape or not.
+//				textNode.setNodeValue(after);
+//				Node newnode = insertBefore(node, textNode);
+//
+//				// XXX: don't know whether createTextNode() will do all those
+//				// escape or not
+//				Text t = textNode.getOwnerDocument().createTextNode(before);
+//
+//				insertBefore(t, newnode);
+//				return newnode;
+//			}
+//		}
+//        return insertIntoEditPart(containerEditPart, node, offset);
+//	}
 
 	/**
 	 * @param containerEditPart
@@ -98,49 +100,51 @@
 	 * @param offset
 	 * @return
 	 */
-	private static Node insertIntoEditPart(EditPart containerEditPart,
-			Node node, int offset) {
-		Node parent = (Node) containerEditPart.getModel();
-		List childParts = containerEditPart.getChildren();
-		if (offset >= childParts.size()) {
-			// to the end of parent
-			return parent.appendChild(node);
-		}
-        Node child = (Node) ((EditPart) childParts.get(offset)).getModel();
-        return insertBefore(node, child);
-	}
+	// TODO: dead
+//	private static Node insertIntoEditPart(EditPart containerEditPart,
+//			Node node, int offset) {
+//		Node parent = (Node) containerEditPart.getModel();
+//		List childParts = containerEditPart.getChildren();
+//		if (offset >= childParts.size()) {
+//			// to the end of parent
+//			return parent.appendChild(node);
+//		}
+//        Node child = (Node) ((EditPart) childParts.get(offset)).getModel();
+//        return insertBefore(node, child);
+//	}
 
-	public static TextPosition insertText(DesignPosition position, String data) {
-		// TODO: never read EditPart containerEditPart = position.getContainerPart();
-
-		position = moveIntoText(position);
-		int offset = position.getOffset();
-
-		if (position.getContainerPart() instanceof TextEditPart) {
-			// it is guaranteeed that now the containing edit part is text node.
-			TextEditPart textPart = (TextEditPart) position.getContainerPart();
-			String textData = textPart.getTextData();
-			String before = textData.substring(0, offset);
-			String after = textData.substring(offset);
-			if (data.startsWith(" ") && before.endsWith(" ")) {
-				before = before.substring(0, before.length() - 1) + "&nbsp;";
-			}
-			if (after.startsWith(" ") && data.endsWith(" ")) {
-				data = data.substring(0, data.length() - 1) + (char) 160;
-			}
-			String nextData = before + data + after;
-			IDOMText text = (IDOMText) textPart.getModel();
-			text.setData(nextData);
-			return new TextPosition(text, offset + data.length());
-		}
-        // can't merge into a neighboring text node. So create a text node
-        // of it's own
-        EditPart part = position.getContainerPart();
-        Node parent = (Node) part.getModel();
-        Text text = parent.getOwnerDocument().createTextNode(data);
-        insertIntoEditPart(part, text, offset);
-        return new TextPosition((IDOMText) text, offset);
-	}
+	// TODO: dead
+//	private static TextPosition insertText(DesignPosition position, String data) {
+//		// TODO: never read EditPart containerEditPart = position.getContainerPart();
+//
+//		position = moveIntoText(position);
+//		int offset = position.getOffset();
+//
+//		if (position.getContainerPart() instanceof TextEditPart) {
+//			// it is guaranteeed that now the containing edit part is text node.
+//			TextEditPart textPart = (TextEditPart) position.getContainerPart();
+//			String textData = textPart.getTextData();
+//			String before = textData.substring(0, offset);
+//			String after = textData.substring(offset);
+//			if (data.startsWith(" ") && before.endsWith(" ")) {
+//				before = before.substring(0, before.length() - 1) + "&nbsp;";
+//			}
+//			if (after.startsWith(" ") && data.endsWith(" ")) {
+//				data = data.substring(0, data.length() - 1) + (char) 160;
+//			}
+//			String nextData = before + data + after;
+//			IDOMText text = (IDOMText) textPart.getModel();
+//			text.setData(nextData);
+//			return new TextPosition(text, offset + data.length());
+//		}
+//        // can't merge into a neighboring text node. So create a text node
+//        // of it's own
+//        EditPart part = position.getContainerPart();
+//        Node parent = (Node) part.getModel();
+//        Text text = parent.getOwnerDocument().createTextNode(data);
+//        insertIntoEditPart(part, text, offset);
+//        return new TextPosition((IDOMText) text, offset);
+//	}
 
 	/**
 	 * Try to make the position move into a text node.
@@ -148,27 +152,28 @@
 	 * @param position
 	 * @return
 	 */
-	public static DesignPosition moveIntoText(DesignPosition position) {
-		EditPart container = position.getContainerPart();
-		if (container instanceof TextEditPart)
-			return position;
-		if (position.getOffset() > 0) {
-			EditPart pre = (EditPart) container.getChildren().get(
-					position.getOffset() - 1);
-			if (pre instanceof TextEditPart) {
-				return new DesignPosition(pre, ((TextEditPart) pre)
-						.getTextData().length());
-			}
-		}
-		if (position.getOffset() < container.getChildren().size()) {
-			EditPart next = (EditPart) container.getChildren().get(
-					position.getOffset());
-			if (next instanceof TextEditPart) {
-				return new DesignPosition(next, 0);
-			}
-		}
-		return position;
-	}
+    // TODO: dead
+//	private static DesignPosition moveIntoText(DesignPosition position) {
+//		EditPart container = position.getContainerPart();
+//		if (container instanceof TextEditPart)
+//			return position;
+//		if (position.getOffset() > 0) {
+//			EditPart pre = (EditPart) container.getChildren().get(
+//					position.getOffset() - 1);
+//			if (pre instanceof TextEditPart) {
+//				return new DesignPosition(pre, ((TextEditPart) pre)
+//						.getTextData().length());
+//			}
+//		}
+//		if (position.getOffset() < container.getChildren().size()) {
+//			EditPart next = (EditPart) container.getChildren().get(
+//					position.getOffset());
+//			if (next instanceof TextEditPart) {
+//				return new DesignPosition(next, 0);
+//			}
+//		}
+//		return position;
+//	}
 
 	/**
 	 * try to move the position up to not inside a text. if the position is at 0
@@ -177,32 +182,34 @@
 	 * @param position
 	 * @return
 	 */
-	public static DesignPosition moveOutFromText(DesignPosition position) {
-		EditPart container = position.getContainerPart();
-		if (container instanceof TextEditPart) {
-			int offset = position.getOffset();
-			String text = ((TextEditPart) container).getTextData();
-			if (offset == 0) {
-				return new DesignPosition(container.getParent(), container
-						.getParent().getChildren().indexOf(container));
-			} else if (offset == text.length()) {
-				return new DesignPosition(container.getParent(), container
-						.getParent().getChildren().indexOf(container) + 1);
-			}
-		}
-		return position;
-	}
+    // TODO: dead
+//	private static DesignPosition moveOutFromText(DesignPosition position) {
+//		EditPart container = position.getContainerPart();
+//		if (container instanceof TextEditPart) {
+//			int offset = position.getOffset();
+//			String text = ((TextEditPart) container).getTextData();
+//			if (offset == 0) {
+//				return new DesignPosition(container.getParent(), container
+//						.getParent().getChildren().indexOf(container));
+//			} else if (offset == text.length()) {
+//				return new DesignPosition(container.getParent(), container
+//						.getParent().getChildren().indexOf(container) + 1);
+//			}
+//		}
+//		return position;
+//	}
 
-	public static void insertDocumentFragment(DesignPosition position,
-			DocumentFragment fragment) {
-		// FIXME: NOT DONE.
-	}
+//	private static void insertDocumentFragment(DesignPosition position,
+//			DocumentFragment fragment) {
+//		// FIXME: NOT DONE.
+//	}
 
 	/**
 	 * Test whether the range intersect with the part.
 	 * 
 	 * @param range
 	 * @param part
+	 * @return true if thereis an intersection
 	 */
 	public static boolean intersect(DesignRange range, EditPart part) {
 		if (range == null || !range.isValid())
@@ -231,7 +238,7 @@
 	 * without constructing a new one.
 	 * 
 	 * @param range
-	 * @return
+	 * @return the normalized range
 	 */
 	public static DesignRange normalize(DesignRange range) {
 		if (range == null || !range.isValid()) {
@@ -254,7 +261,7 @@
 	 * @return 0 means equal. 1 Means p1 is after p2. -1 means p1 is before p2.
 	 *         Integer.MIN_VALUE means some error and can't compare.
 	 */
-	public static int compareDesignPosition(DesignPosition p1, DesignPosition p2) {
+	private static int compareDesignPosition(DesignPosition p1, DesignPosition p2) {
 		if (!p1.isValid() || !p2.isValid())
 			return Integer.MIN_VALUE;
 		if (p1.equals(p2))
@@ -330,7 +337,7 @@
 	 * @param part2
 	 * @return
 	 */
-	public static EditPart findCommonAncester(EditPart part1, EditPart part2) {
+	private static EditPart findCommonAncester(EditPart part1, EditPart part2) {
 		if (part1 == part2) {
 			return part1;
 		}
@@ -355,6 +362,10 @@
 
 	}
 
+	/**
+	 * @param range
+	 * @return the common ancestor
+	 */
 	public static EditPart findCommonAncestor(DesignRange range) {
 		if (!range.isValid()) {
 			return null;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeDragTracker.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeDragTracker.java
index 162c499..bca561c 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeDragTracker.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeDragTracker.java
@@ -29,7 +29,6 @@
 import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
 import org.eclipse.jst.pagedesigner.viewer.DesignRange;
 import org.eclipse.jst.pagedesigner.viewer.EditPartPositionHelper;
-import org.eclipse.jst.pagedesigner.viewer.HTMLGraphicalViewer;
 import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
 import org.eclipse.swt.graphics.Cursor;
 
@@ -261,6 +260,9 @@
 		this.editpart = part;
 	}
 
+	/**
+	 * @return the html graphical viewer
+	 */
 	public IHTMLGraphicalViewer getHTMLGraphicalViewer() {
 		return (IHTMLGraphicalViewer) getCurrentViewer();
 	}
@@ -300,10 +302,7 @@
 		} else {
 			getHTMLGraphicalViewer().setRange(position, position);
 		}
-		if (getHTMLGraphicalViewer() instanceof HTMLGraphicalViewer) {
-			((HTMLGraphicalViewer) getHTMLGraphicalViewer())
-					.updateHorizontalPos();
-		}
+		getHTMLGraphicalViewer().updateHorizontalPos();
 	}
 
     protected boolean handleHover() {
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeSelectionTool.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeSelectionTool.java
index c5da846..c5d5df1 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeSelectionTool.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/tools/RangeSelectionTool.java
@@ -36,7 +36,6 @@
 import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
 import org.eclipse.jst.pagedesigner.parts.NodeEditPart;
 import org.eclipse.jst.pagedesigner.requests.LocationModifierRequest;
-import org.eclipse.jst.pagedesigner.viewer.HTMLGraphicalViewer;
 import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.KeyEvent;
@@ -152,8 +151,8 @@
 						(IHTMLGraphicalViewer) this.getCurrentViewer());
 				e.doit = false;
 			} else {
-				if (getCurrentViewer() instanceof HTMLGraphicalViewer
-						&& ((HTMLGraphicalViewer) getCurrentViewer())
+				if (getCurrentViewer() instanceof IHTMLGraphicalViewer
+						&& ((IHTMLGraphicalViewer) getCurrentViewer())
 								.isInRangeMode()
 						&& (!Character.isIdentifierIgnorable(e.character) && !Character
 								.isISOControl(e.character))
@@ -174,8 +173,8 @@
 			command.execute();
 			e.doit = false;
 			if (command instanceof ICaretPositionMover) {
-				if (getCurrentViewer() instanceof HTMLGraphicalViewer) {
-					((HTMLGraphicalViewer) getCurrentViewer())
+				if (getCurrentViewer() instanceof IHTMLGraphicalViewer) {
+					((IHTMLGraphicalViewer) getCurrentViewer())
 							.updateHorizontalPos();
 				}
 			}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CacheManager.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CacheManager.java
index 5f513f4..5483281 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CacheManager.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/CacheManager.java
@@ -34,6 +34,10 @@
 	// keep track of LRU
 	LinkedList _keys = new LinkedList();
 
+	/**
+	 * @param creator
+	 * @param maxSize
+	 */
 	public CacheManager(ICacheEntryCreator creator, int maxSize) {
 		_creator = creator;
 		_maxSize = maxSize;
@@ -42,6 +46,10 @@
 		}
 	}
 
+	/**
+	 * @param key
+	 * @return the cache entry for key
+	 */
 	public Object getEntry(Object key) {
 		Object result = _map.get(key);
 		if (result == null) {
@@ -62,6 +70,9 @@
         return result;
 	}
 
+	/**
+	 * Dispose the cache
+	 */
 	public void disposeAll() {
 		_keys.clear();
 		for (Iterator iter = _map.keySet().iterator(); iter.hasNext();) {
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/DOMUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/DOMUtil.java
index c266580..098d285 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/DOMUtil.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/DOMUtil.java
@@ -26,6 +26,12 @@
  * @author mengbo
  */
 public class DOMUtil {
+	/**
+	 * @param parent
+	 * @param tag
+	 * @return the list of child elements  of parent that are Elements
+	 * and that have name 'tag' ignoring case
+	 */
 	public static List getChildElementsByTagIgnoreCase(Element parent,
 			String tag) {
 		List ret = new ArrayList();
@@ -44,7 +50,8 @@
 
 	/**
 	 * @param ele
-	 * @return
+	 * @return the element value of the TEXT_NODE children of element
+	 * concat'd together
 	 */
 	public static String getTextElementValue(Element ele) {
 		StringBuffer buffer = new StringBuffer();
@@ -63,7 +70,8 @@
 	/**
 	 * @param element
 	 * @param string
-	 * @return
+	 * @return the attribute named string on element ignoring case in the comparison
+	 * or null if not found
 	 */
 	public static String getAttributeIgnoreCase(Element element, String string) {
 		NamedNodeMap map = element.getAttributes();
@@ -77,9 +85,9 @@
 	}
 
 	/**
-	 * @param tr
-	 * @param strings
-	 * @return
+	 * @param parent
+	 * @param tags
+	 * @return the list of children of parent with name in tags ignoring case
 	 */
 	public static List getChildrenByTagsIgnoreCase(Element parent, String[] tags) {
 		List result = new ArrayList();
@@ -99,10 +107,17 @@
 		return result;
 	}
 
+	/**
+	 * @param ele
+	 */
 	public static void removeAllChildren(Element ele) {
 		((ElementImpl) ele).removeChildNodes();
 	}
 
+	/**
+	 * @param ele
+	 * @param value
+	 */
 	public static void setTextElementValue(Element ele, String value) {
 		removeAllChildren(ele);
 		Text txt = ele.getOwnerDocument().createTextNode(value);
@@ -110,10 +125,11 @@
 	}
 
 	/**
-	 * @param htmlElement
-	 * @param string
-	 * @param i
-	 * @return
+	 * @param ele 
+	 * @param attr 
+	 * @param defaultvalue 
+	 * @return the integer attribute of ele called attr.  Default value
+	 * is returned if the attribute is not found.
 	 */
 	public static int getIntAttributeIgnoreCase(Element ele, String attr,
 			int defaultvalue) {
@@ -135,7 +151,7 @@
 	 * get all child elements
 	 * 
 	 * @param ele
-	 * @return
+	 * @return the list of element children of type ELEMENT_NODE
 	 */
 	public static List getElementChildren(Element ele) {
 		List ret = new ArrayList();
@@ -154,7 +170,8 @@
 	 * 
 	 * @param ele
 	 * @param attrName
-	 * @return
+	 * @return true if element has attribute called attrName ignoring
+	 * case  in the comparison.
 	 */
 	public static boolean hasAttribute(Element ele, String attrName) {
 		NamedNodeMap map = ele.getAttributes();
@@ -167,6 +184,10 @@
 		return false;
 	}
 
+	/**
+	 * @param node
+	 * @param sb
+	 */
 	public static void nodeToString(Node node, StringBuffer sb) {
 		int type = node.getNodeType();
 		switch (type) {
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/EntityMap.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/EntityMap.java
index 14b7213..0b68bad 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/EntityMap.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/EntityMap.java
@@ -20,6 +20,10 @@
 public class EntityMap {
 	private static Logger _log = PDPlugin.getLogger(EntityMap.class);
 
+	/**
+	 * @param s
+	 * @return s translated for HTML entities.
+	 */
 	public static String translate(String s) {
 		char[] array = s.toCharArray();
 		StringBuffer buffer = new StringBuffer();
@@ -64,6 +68,8 @@
 	 * Translate entity maps and compact whitespace. For heading and training
 	 * space, will not trim, only compact (making multiple whitespace to become
 	 * a single ' ' char).
+	 * @param s 
+	 * @return the result string.
 	 */
 	public static String translateAndCompact(String s) {
 		char[] array = s.toCharArray();
@@ -121,6 +127,8 @@
 	 * 
 	 * @param s
 	 *            the form &#number or &letterordigit without the trailing ";"
+	 * @param strBuf 
+	 * @return true  the translation can be done
 	 */
 	public static boolean translateEntity(String s, StringBuffer strBuf) {
 		int i = HTMLSpecialCharHelper.getSpecial(s); // HTMLSpecialCharHelper
@@ -160,7 +168,7 @@
 	 * 
 	 * @param n
 	 * @return
-	 * @see http://www.w3.org/Talks/1999/0830-tutorial-unicode-mjd/slide27-0.html
+	 * see http://www.w3.org/Talks/1999/0830-tutorial-unicode-mjd/slide27-0.html
 	 */
 	private static char replaceBadEntity(char n) {
 		if (n < 132 || n > 156)
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLSpecialCharHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLSpecialCharHelper.java
index 9e2a880..4959198 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLSpecialCharHelper.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLSpecialCharHelper.java
@@ -34,260 +34,260 @@
 	static {
 		_table = new Hashtable(256);
 
-		_table.put(new Integer(34), "&quot;"); //$NON-NLS-1$
-		_table.put(new Integer(38), "&amp;"); //$NON-NLS-1$
-		_table.put(new Integer(60), "&lt;"); //$NON-NLS-1$
-		_table.put(new Integer(62), "&gt;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(34), "&quot;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(38), "&amp;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(60), "&lt;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(62), "&gt;"); //$NON-NLS-1$
 
-		_table.put(new Integer(160), "&nbsp;"); //$NON-NLS-1$
-		_table.put(new Integer(161), "&iexcl;"); //$NON-NLS-1$
-		_table.put(new Integer(162), "&cent;"); //$NON-NLS-1$
-		_table.put(new Integer(163), "&pound;"); //$NON-NLS-1$
-		_table.put(new Integer(164), "&curren;"); //$NON-NLS-1$
-		_table.put(new Integer(165), "&yen;"); //$NON-NLS-1$
-		_table.put(new Integer(166), "&brvbar;"); //$NON-NLS-1$
-		_table.put(new Integer(167), "&sect;"); //$NON-NLS-1$
-		_table.put(new Integer(168), "&uml;"); //$NON-NLS-1$
-		_table.put(new Integer(169), "&copy;"); //$NON-NLS-1$
-		_table.put(new Integer(170), "&ordf;"); //$NON-NLS-1$
-		_table.put(new Integer(171), "&laquo;"); //$NON-NLS-1$
-		_table.put(new Integer(172), "&not;"); //$NON-NLS-1$
-		_table.put(new Integer(173), "&shy;"); //$NON-NLS-1$
-		_table.put(new Integer(174), "&reg;"); //$NON-NLS-1$
-		_table.put(new Integer(175), "&macr;"); //$NON-NLS-1$
-		_table.put(new Integer(176), "&deg;"); //$NON-NLS-1$
-		_table.put(new Integer(177), "&plusmn;"); //$NON-NLS-1$
-		_table.put(new Integer(178), "&sup2;"); //$NON-NLS-1$
-		_table.put(new Integer(179), "&sup3;"); //$NON-NLS-1$
-		_table.put(new Integer(180), "&acute;"); //$NON-NLS-1$
-		_table.put(new Integer(181), "&micro;"); //$NON-NLS-1$
-		_table.put(new Integer(182), "&para;"); //$NON-NLS-1$
-		_table.put(new Integer(183), "&middot;"); //$NON-NLS-1$
-		_table.put(new Integer(184), "&cedil;"); //$NON-NLS-1$
-		_table.put(new Integer(185), "&sup1;"); //$NON-NLS-1$
-		_table.put(new Integer(186), "&ordm;"); //$NON-NLS-1$
-		_table.put(new Integer(187), "&raquo;"); //$NON-NLS-1$
-		_table.put(new Integer(188), "&frac14;"); //$NON-NLS-1$
-		_table.put(new Integer(189), "&frac12;"); //$NON-NLS-1$
-		_table.put(new Integer(190), "&frac34;"); //$NON-NLS-1$
-		_table.put(new Integer(191), "&iquest;"); //$NON-NLS-1$
-		_table.put(new Integer(192), "&Agrave;"); //$NON-NLS-1$
-		_table.put(new Integer(193), "&Aacute;"); //$NON-NLS-1$
-		_table.put(new Integer(194), "&Acirc;"); //$NON-NLS-1$
-		_table.put(new Integer(195), "&Atilde;"); //$NON-NLS-1$
-		_table.put(new Integer(196), "&Auml;"); //$NON-NLS-1$
-		_table.put(new Integer(197), "&Aring;"); //$NON-NLS-1$
-		_table.put(new Integer(198), "&AElig;"); //$NON-NLS-1$
-		_table.put(new Integer(199), "&Ccedil;"); //$NON-NLS-1$
-		_table.put(new Integer(200), "&Egrave;"); //$NON-NLS-1$
-		_table.put(new Integer(201), "&Eacute;"); //$NON-NLS-1$
-		_table.put(new Integer(202), "&Ecirc;"); //$NON-NLS-1$
-		_table.put(new Integer(203), "&Euml;"); //$NON-NLS-1$
-		_table.put(new Integer(204), "&Igrave;"); //$NON-NLS-1$
-		_table.put(new Integer(205), "&Iacute;"); //$NON-NLS-1$
-		_table.put(new Integer(206), "&Icirc;"); //$NON-NLS-1$
-		_table.put(new Integer(207), "&Iuml;"); //$NON-NLS-1$
-		_table.put(new Integer(208), "&ETH;"); //$NON-NLS-1$
-		_table.put(new Integer(209), "&Ntilde;"); //$NON-NLS-1$
-		_table.put(new Integer(210), "&Ograve;"); //$NON-NLS-1$
-		_table.put(new Integer(211), "&Oacute;"); //$NON-NLS-1$
-		_table.put(new Integer(212), "&Ocirc;"); //$NON-NLS-1$
-		_table.put(new Integer(213), "&Otilde;"); //$NON-NLS-1$
-		_table.put(new Integer(214), "&Ouml;"); //$NON-NLS-1$
-		_table.put(new Integer(215), "&times;"); //$NON-NLS-1$
-		_table.put(new Integer(216), "&Oslash;"); //$NON-NLS-1$
-		_table.put(new Integer(217), "&Ugrave;"); //$NON-NLS-1$
-		_table.put(new Integer(218), "&Uacute;"); //$NON-NLS-1$
-		_table.put(new Integer(219), "&Ucirc;"); //$NON-NLS-1$
-		_table.put(new Integer(220), "&Uuml;"); //$NON-NLS-1$
-		_table.put(new Integer(221), "&Yacute;"); //$NON-NLS-1$
-		_table.put(new Integer(222), "&THORN;"); //$NON-NLS-1$
-		_table.put(new Integer(223), "&szlig;"); //$NON-NLS-1$
-		_table.put(new Integer(224), "&agrave;"); //$NON-NLS-1$
-		_table.put(new Integer(225), "&aacute;"); //$NON-NLS-1$
-		_table.put(new Integer(226), "&acirc;"); //$NON-NLS-1$
-		_table.put(new Integer(227), "&atilde;"); //$NON-NLS-1$
-		_table.put(new Integer(228), "&auml;"); //$NON-NLS-1$
-		_table.put(new Integer(229), "&aring;"); //$NON-NLS-1$
-		_table.put(new Integer(230), "&aelig;"); //$NON-NLS-1$
-		_table.put(new Integer(231), "&ccedil;"); //$NON-NLS-1$
-		_table.put(new Integer(232), "&egrave;"); //$NON-NLS-1$
-		_table.put(new Integer(233), "&eacute;"); //$NON-NLS-1$
-		_table.put(new Integer(234), "&ecirc;"); //$NON-NLS-1$
-		_table.put(new Integer(235), "&euml;"); //$NON-NLS-1$
-		_table.put(new Integer(236), "&igrave;"); //$NON-NLS-1$
-		_table.put(new Integer(237), "&iacute;"); //$NON-NLS-1$
-		_table.put(new Integer(238), "&icirc;"); //$NON-NLS-1$
-		_table.put(new Integer(239), "&iuml;"); //$NON-NLS-1$
-		_table.put(new Integer(240), "&eth;"); //$NON-NLS-1$
-		_table.put(new Integer(241), "&ntilde;"); //$NON-NLS-1$
-		_table.put(new Integer(242), "&ograve;"); //$NON-NLS-1$
-		_table.put(new Integer(243), "&oacute;"); //$NON-NLS-1$
-		_table.put(new Integer(244), "&ocirc;"); //$NON-NLS-1$
-		_table.put(new Integer(245), "&otilde;"); //$NON-NLS-1$
-		_table.put(new Integer(246), "&ouml;"); //$NON-NLS-1$
-		_table.put(new Integer(247), "&divide;"); //$NON-NLS-1$
-		_table.put(new Integer(248), "&oslash;"); //$NON-NLS-1$
-		_table.put(new Integer(249), "&ugrave;"); //$NON-NLS-1$
-		_table.put(new Integer(250), "&uacute;"); //$NON-NLS-1$
-		_table.put(new Integer(251), "&ucirc;"); //$NON-NLS-1$
-		_table.put(new Integer(252), "&uuml;"); //$NON-NLS-1$
-		_table.put(new Integer(253), "&yacute;"); //$NON-NLS-1$
-		_table.put(new Integer(254), "&thorn;"); //$NON-NLS-1$
-		_table.put(new Integer(255), "&yuml;"); //$NON-NLS-1$
-		_table.put(new Integer(402), "&fnof;"); //$NON-NLS-1$
-		_table.put(new Integer(913), "&Alpha;"); //$NON-NLS-1$
-		_table.put(new Integer(914), "&Beta;"); //$NON-NLS-1$
-		_table.put(new Integer(915), "&Gamma;"); //$NON-NLS-1$
-		_table.put(new Integer(916), "&Delta;"); //$NON-NLS-1$
-		_table.put(new Integer(917), "&Epsilon;"); //$NON-NLS-1$
-		_table.put(new Integer(918), "&Zeta;"); //$NON-NLS-1$
-		_table.put(new Integer(919), "&Eta;"); //$NON-NLS-1$
-		_table.put(new Integer(920), "&Theta;"); //$NON-NLS-1$
-		_table.put(new Integer(921), "&Iota;"); //$NON-NLS-1$
-		_table.put(new Integer(922), "&Kappa;"); //$NON-NLS-1$
-		_table.put(new Integer(923), "&Lambda;"); //$NON-NLS-1$
-		_table.put(new Integer(924), "&Mu;"); //$NON-NLS-1$
-		_table.put(new Integer(925), "&Nu;"); //$NON-NLS-1$
-		_table.put(new Integer(926), "&Xi;"); //$NON-NLS-1$
-		_table.put(new Integer(927), "&Omicron;"); //$NON-NLS-1$
-		_table.put(new Integer(928), "&Pi;"); //$NON-NLS-1$
-		_table.put(new Integer(929), "&Rho;"); //$NON-NLS-1$
-		_table.put(new Integer(931), "&Sigma;"); //$NON-NLS-1$
-		_table.put(new Integer(932), "&Tau;"); //$NON-NLS-1$
-		_table.put(new Integer(933), "&Upsilon;"); //$NON-NLS-1$
-		_table.put(new Integer(934), "&Phi;"); //$NON-NLS-1$
-		_table.put(new Integer(935), "&Chi;"); //$NON-NLS-1$
-		_table.put(new Integer(936), "&Psi;"); //$NON-NLS-1$
-		_table.put(new Integer(937), "&Omega;"); //$NON-NLS-1$
-		_table.put(new Integer(945), "&alpha;"); //$NON-NLS-1$
-		_table.put(new Integer(946), "&beta;"); //$NON-NLS-1$
-		_table.put(new Integer(947), "&gamma;"); //$NON-NLS-1$
-		_table.put(new Integer(948), "&delta;"); //$NON-NLS-1$
-		_table.put(new Integer(949), "&epsilon;"); //$NON-NLS-1$
-		_table.put(new Integer(950), "&zeta;"); //$NON-NLS-1$
-		_table.put(new Integer(951), "&eta;"); //$NON-NLS-1$
-		_table.put(new Integer(952), "&theta;"); //$NON-NLS-1$
-		_table.put(new Integer(953), "&iota;"); //$NON-NLS-1$
-		_table.put(new Integer(954), "&kappa;"); //$NON-NLS-1$
-		_table.put(new Integer(955), "&lambda;"); //$NON-NLS-1$
-		_table.put(new Integer(956), "&mu;"); //$NON-NLS-1$
-		_table.put(new Integer(957), "&nu;"); //$NON-NLS-1$
-		_table.put(new Integer(958), "&xi;"); //$NON-NLS-1$
-		_table.put(new Integer(959), "&omicron;"); //$NON-NLS-1$
-		_table.put(new Integer(960), "&pi;"); //$NON-NLS-1$
-		_table.put(new Integer(961), "&rho;"); //$NON-NLS-1$
-		_table.put(new Integer(962), "&sigmaf;"); //$NON-NLS-1$
-		_table.put(new Integer(963), "&sigma;"); //$NON-NLS-1$
-		_table.put(new Integer(964), "&tau;"); //$NON-NLS-1$
-		_table.put(new Integer(965), "&upsilon;"); //$NON-NLS-1$
-		_table.put(new Integer(966), "&phi;"); //$NON-NLS-1$
-		_table.put(new Integer(967), "&chi;"); //$NON-NLS-1$
-		_table.put(new Integer(968), "&psi;"); //$NON-NLS-1$
-		_table.put(new Integer(969), "&omega;"); //$NON-NLS-1$
-		_table.put(new Integer(977), "&thetasym;"); //$NON-NLS-1$
-		_table.put(new Integer(978), "&upsih;"); //$NON-NLS-1$
-		_table.put(new Integer(982), "&piv;"); //$NON-NLS-1$
-		_table.put(new Integer(8226), "&bull;"); //$NON-NLS-1$
-		_table.put(new Integer(8230), "&hellip;"); //$NON-NLS-1$
-		_table.put(new Integer(8242), "&prime;"); //$NON-NLS-1$
-		_table.put(new Integer(8243), "&Prime;"); //$NON-NLS-1$
-		_table.put(new Integer(8254), "&oline;"); //$NON-NLS-1$
-		_table.put(new Integer(8260), "&frasl;"); //$NON-NLS-1$
-		_table.put(new Integer(8472), "&weierp;"); //$NON-NLS-1$
-		_table.put(new Integer(8465), "&image;"); //$NON-NLS-1$
-		_table.put(new Integer(8476), "&real;"); //$NON-NLS-1$
-		_table.put(new Integer(8482), "&trade;"); //$NON-NLS-1$
-		_table.put(new Integer(8501), "&alefsym;"); //$NON-NLS-1$
-		_table.put(new Integer(8592), "&larr;"); //$NON-NLS-1$
-		_table.put(new Integer(8593), "&uarr;"); //$NON-NLS-1$
-		_table.put(new Integer(8594), "&rarr;"); //$NON-NLS-1$
-		_table.put(new Integer(8595), "&darr;"); //$NON-NLS-1$
-		_table.put(new Integer(8596), "&harr;"); //$NON-NLS-1$
-		_table.put(new Integer(8629), "&crarr;"); //$NON-NLS-1$
-		_table.put(new Integer(8656), "&lArr;"); //$NON-NLS-1$
-		_table.put(new Integer(8657), "&uArr;"); //$NON-NLS-1$
-		_table.put(new Integer(8658), "&rArr;"); //$NON-NLS-1$
-		_table.put(new Integer(8659), "&dArr;"); //$NON-NLS-1$
-		_table.put(new Integer(8660), "&hArr;"); //$NON-NLS-1$
-		_table.put(new Integer(8704), "&forall;"); //$NON-NLS-1$
-		_table.put(new Integer(8706), "&part;"); //$NON-NLS-1$
-		_table.put(new Integer(8707), "&exist;"); //$NON-NLS-1$
-		_table.put(new Integer(8709), "&empty;"); //$NON-NLS-1$
-		_table.put(new Integer(8711), "&nabla;"); //$NON-NLS-1$
-		_table.put(new Integer(8712), "&isin;"); //$NON-NLS-1$
-		_table.put(new Integer(8713), "&notin;"); //$NON-NLS-1$
-		_table.put(new Integer(8715), "&ni;"); //$NON-NLS-1$
-		_table.put(new Integer(8719), "&prod;"); //$NON-NLS-1$
-		_table.put(new Integer(8722), "&sum;"); //$NON-NLS-1$
-		_table.put(new Integer(8722), "&minus;"); //$NON-NLS-1$
-		_table.put(new Integer(8727), "&lowast;"); //$NON-NLS-1$
-		_table.put(new Integer(8730), "&radic;"); //$NON-NLS-1$
-		_table.put(new Integer(8733), "&prop;"); //$NON-NLS-1$
-		_table.put(new Integer(8734), "&infin;"); //$NON-NLS-1$
-		_table.put(new Integer(8736), "&ang;"); //$NON-NLS-1$
-		_table.put(new Integer(8869), "&and;"); //$NON-NLS-1$
-		_table.put(new Integer(8870), "&or;"); //$NON-NLS-1$
-		_table.put(new Integer(8745), "&cap;"); //$NON-NLS-1$
-		_table.put(new Integer(8746), "&cup;"); //$NON-NLS-1$
-		_table.put(new Integer(8747), "&int;"); //$NON-NLS-1$
-		_table.put(new Integer(8756), "&there4;"); //$NON-NLS-1$
-		_table.put(new Integer(8764), "&sim;"); //$NON-NLS-1$
-		_table.put(new Integer(8773), "&cong;"); //$NON-NLS-1$
-		_table.put(new Integer(8773), "&asymp;"); //$NON-NLS-1$
-		_table.put(new Integer(8800), "&ne;"); //$NON-NLS-1$
-		_table.put(new Integer(8801), "&equiv;"); //$NON-NLS-1$
-		_table.put(new Integer(8804), "&le;"); //$NON-NLS-1$
-		_table.put(new Integer(8805), "&ge;"); //$NON-NLS-1$
-		_table.put(new Integer(8834), "&sub;"); //$NON-NLS-1$
-		_table.put(new Integer(8835), "&sup;"); //$NON-NLS-1$
-		_table.put(new Integer(8836), "&nsub;"); //$NON-NLS-1$
-		_table.put(new Integer(8838), "&sube;"); //$NON-NLS-1$
-		_table.put(new Integer(8839), "&supe;"); //$NON-NLS-1$
-		_table.put(new Integer(8853), "&oplus;"); //$NON-NLS-1$
-		_table.put(new Integer(8855), "&otimes;"); //$NON-NLS-1$
-		_table.put(new Integer(8869), "&perp;"); //$NON-NLS-1$
-		_table.put(new Integer(8901), "&sdot;"); //$NON-NLS-1$
-		_table.put(new Integer(8968), "&lceil;"); //$NON-NLS-1$
-		_table.put(new Integer(8969), "&rceil;"); //$NON-NLS-1$
-		_table.put(new Integer(8970), "&lfloor;"); //$NON-NLS-1$
-		_table.put(new Integer(8971), "&rfloor;"); //$NON-NLS-1$
-		_table.put(new Integer(9001), "&lang;"); //$NON-NLS-1$
-		_table.put(new Integer(9002), "&rang;"); //$NON-NLS-1$
-		_table.put(new Integer(9674), "&loz;"); //$NON-NLS-1$
-		_table.put(new Integer(9824), "&spades;"); //$NON-NLS-1$
-		_table.put(new Integer(9827), "&clubs;"); //$NON-NLS-1$
-		_table.put(new Integer(9829), "&hearts;"); //$NON-NLS-1$
-		_table.put(new Integer(9830), "&diams;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(160), "&nbsp;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(161), "&iexcl;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(162), "&cent;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(163), "&pound;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(164), "&curren;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(165), "&yen;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(166), "&brvbar;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(167), "&sect;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(168), "&uml;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(169), "&copy;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(170), "&ordf;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(171), "&laquo;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(172), "&not;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(173), "&shy;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(174), "&reg;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(175), "&macr;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(176), "&deg;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(177), "&plusmn;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(178), "&sup2;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(179), "&sup3;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(180), "&acute;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(181), "&micro;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(182), "&para;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(183), "&middot;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(184), "&cedil;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(185), "&sup1;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(186), "&ordm;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(187), "&raquo;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(188), "&frac14;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(189), "&frac12;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(190), "&frac34;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(191), "&iquest;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(192), "&Agrave;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(193), "&Aacute;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(194), "&Acirc;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(195), "&Atilde;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(196), "&Auml;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(197), "&Aring;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(198), "&AElig;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(199), "&Ccedil;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(200), "&Egrave;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(201), "&Eacute;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(202), "&Ecirc;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(203), "&Euml;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(204), "&Igrave;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(205), "&Iacute;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(206), "&Icirc;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(207), "&Iuml;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(208), "&ETH;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(209), "&Ntilde;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(210), "&Ograve;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(211), "&Oacute;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(212), "&Ocirc;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(213), "&Otilde;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(214), "&Ouml;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(215), "&times;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(216), "&Oslash;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(217), "&Ugrave;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(218), "&Uacute;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(219), "&Ucirc;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(220), "&Uuml;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(221), "&Yacute;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(222), "&THORN;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(223), "&szlig;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(224), "&agrave;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(225), "&aacute;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(226), "&acirc;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(227), "&atilde;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(228), "&auml;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(229), "&aring;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(230), "&aelig;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(231), "&ccedil;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(232), "&egrave;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(233), "&eacute;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(234), "&ecirc;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(235), "&euml;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(236), "&igrave;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(237), "&iacute;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(238), "&icirc;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(239), "&iuml;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(240), "&eth;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(241), "&ntilde;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(242), "&ograve;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(243), "&oacute;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(244), "&ocirc;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(245), "&otilde;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(246), "&ouml;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(247), "&divide;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(248), "&oslash;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(249), "&ugrave;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(250), "&uacute;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(251), "&ucirc;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(252), "&uuml;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(253), "&yacute;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(254), "&thorn;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(255), "&yuml;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(402), "&fnof;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(913), "&Alpha;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(914), "&Beta;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(915), "&Gamma;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(916), "&Delta;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(917), "&Epsilon;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(918), "&Zeta;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(919), "&Eta;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(920), "&Theta;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(921), "&Iota;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(922), "&Kappa;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(923), "&Lambda;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(924), "&Mu;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(925), "&Nu;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(926), "&Xi;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(927), "&Omicron;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(928), "&Pi;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(929), "&Rho;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(931), "&Sigma;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(932), "&Tau;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(933), "&Upsilon;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(934), "&Phi;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(935), "&Chi;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(936), "&Psi;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(937), "&Omega;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(945), "&alpha;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(946), "&beta;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(947), "&gamma;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(948), "&delta;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(949), "&epsilon;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(950), "&zeta;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(951), "&eta;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(952), "&theta;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(953), "&iota;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(954), "&kappa;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(955), "&lambda;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(956), "&mu;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(957), "&nu;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(958), "&xi;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(959), "&omicron;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(960), "&pi;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(961), "&rho;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(962), "&sigmaf;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(963), "&sigma;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(964), "&tau;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(965), "&upsilon;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(966), "&phi;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(967), "&chi;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(968), "&psi;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(969), "&omega;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(977), "&thetasym;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(978), "&upsih;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(982), "&piv;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8226), "&bull;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8230), "&hellip;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8242), "&prime;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8243), "&Prime;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8254), "&oline;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8260), "&frasl;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8472), "&weierp;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8465), "&image;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8476), "&real;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8482), "&trade;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8501), "&alefsym;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8592), "&larr;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8593), "&uarr;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8594), "&rarr;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8595), "&darr;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8596), "&harr;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8629), "&crarr;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8656), "&lArr;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8657), "&uArr;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8658), "&rArr;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8659), "&dArr;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8660), "&hArr;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8704), "&forall;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8706), "&part;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8707), "&exist;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8709), "&empty;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8711), "&nabla;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8712), "&isin;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8713), "&notin;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8715), "&ni;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8719), "&prod;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8722), "&sum;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8722), "&minus;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8727), "&lowast;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8730), "&radic;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8733), "&prop;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8734), "&infin;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8736), "&ang;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8869), "&and;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8870), "&or;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8745), "&cap;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8746), "&cup;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8747), "&int;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8756), "&there4;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8764), "&sim;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8773), "&cong;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8773), "&asymp;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8800), "&ne;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8801), "&equiv;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8804), "&le;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8805), "&ge;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8834), "&sub;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8835), "&sup;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8836), "&nsub;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8838), "&sube;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8839), "&supe;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8853), "&oplus;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8855), "&otimes;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8869), "&perp;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8901), "&sdot;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8968), "&lceil;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8969), "&rceil;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8970), "&lfloor;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8971), "&rfloor;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(9001), "&lang;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(9002), "&rang;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(9674), "&loz;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(9824), "&spades;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(9827), "&clubs;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(9829), "&hearts;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(9830), "&diams;"); //$NON-NLS-1$
 
-		_table.put(new Integer(338), "&OElig;"); //$NON-NLS-1$
-		_table.put(new Integer(339), "&oelig;"); //$NON-NLS-1$
-		_table.put(new Integer(352), "&Scaron;"); //$NON-NLS-1$
-		_table.put(new Integer(353), "&scaron;"); //$NON-NLS-1$
-		_table.put(new Integer(376), "&Yuml;"); //$NON-NLS-1$
-		_table.put(new Integer(710), "&circ;"); //$NON-NLS-1$
-		_table.put(new Integer(732), "&tilde;"); //$NON-NLS-1$
-		_table.put(new Integer(8194), "&ensp;"); //$NON-NLS-1$
-		_table.put(new Integer(8195), "&emsp;"); //$NON-NLS-1$
-		_table.put(new Integer(8201), "&thinsp;"); //$NON-NLS-1$
-		_table.put(new Integer(8204), "&zwnj;"); //$NON-NLS-1$
-		_table.put(new Integer(8205), "&zwj;"); //$NON-NLS-1$
-		_table.put(new Integer(8206), "&lrm;"); //$NON-NLS-1$
-		_table.put(new Integer(8207), "&rlm;"); //$NON-NLS-1$
-		_table.put(new Integer(8211), "&ndash;"); //$NON-NLS-1$
-		_table.put(new Integer(151), "&mdash;"); //$NON-NLS-1$
-		_table.put(new Integer(8216), "&lsquo;"); //$NON-NLS-1$
-		_table.put(new Integer(8217), "&rsquo;"); //$NON-NLS-1$
-		_table.put(new Integer(8218), "&sbquo;"); //$NON-NLS-1$
-		_table.put(new Integer(8220), "&ldquo;"); //$NON-NLS-1$
-		_table.put(new Integer(8221), "&rdquo;"); //$NON-NLS-1$
-		_table.put(new Integer(8222), "&bdquo;"); //$NON-NLS-1$
-		_table.put(new Integer(8224), "&dagger;"); //$NON-NLS-1$
-		_table.put(new Integer(8225), "&Dagger;"); //$NON-NLS-1$
-		_table.put(new Integer(8240), "&permil;"); //$NON-NLS-1$
-		_table.put(new Integer(8249), "&lsaquo;"); //$NON-NLS-1$
-		_table.put(new Integer(8250), "&rsaquo;"); //$NON-NLS-1$
-		_table.put(new Integer(8364), "&euro;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(338), "&OElig;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(339), "&oelig;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(352), "&Scaron;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(353), "&scaron;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(376), "&Yuml;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(710), "&circ;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(732), "&tilde;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8194), "&ensp;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8195), "&emsp;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8201), "&thinsp;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8204), "&zwnj;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8205), "&zwj;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8206), "&lrm;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8207), "&rlm;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8211), "&ndash;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(151), "&mdash;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8216), "&lsquo;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8217), "&rsquo;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8218), "&sbquo;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8220), "&ldquo;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8221), "&rdquo;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8222), "&bdquo;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8224), "&dagger;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8225), "&Dagger;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8240), "&permil;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8249), "&lsaquo;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8250), "&rsaquo;"); //$NON-NLS-1$
+		_table.put(Integer.valueOf(8364), "&euro;"); //$NON-NLS-1$
 
 		_reverse = new Hashtable(256);
 		for (Enumeration e = _table.keys(); e.hasMoreElements();) {
@@ -300,12 +300,18 @@
 	}
 
 	/**
+	 * @param ch 
 	 * @return if not in the special list
 	 */
 	public static String getSpecial(int ch) {
-		return (String) _table.get(new Integer(ch));
+		return (String) _table.get(Integer.valueOf(ch));
 	}
 
+	/**
+	 * @param str
+	 * @return the code value corresponding to the string or null
+	 * if string is unknown
+	 */
 	public static int getSpecial(String str) {
 		Integer result = (Integer) _reverse.get(str);
 		if (result == null) {
@@ -314,6 +320,13 @@
         return result.intValue();
 	}
 
+	/**
+	 * @param str
+	 * @param start
+	 * @param end
+	 * @param writer
+	 * @throws IOException
+	 */
 	public static void encode(String str, int start, int end, Writer writer)
 			throws IOException {
 		for (int i = start; i < end; i++) {
@@ -333,10 +346,22 @@
 		}
 	}
 
+	/**
+	 * @param str
+	 * @param result
+	 * @return the encoded string buffer
+	 */
 	public static StringBuffer encode(String str, StringBuffer result) {
 		return encode(str, 0, str.length(), result);
 	}
 
+	/**
+	 * @param str
+	 * @param start
+	 * @param end
+	 * @param result
+	 * @return the encoded string buffer
+	 */
 	public static StringBuffer encode(String str, int start, int end,
 			StringBuffer result) {
 		for (int i = start; i < end; i++) {
@@ -357,11 +382,25 @@
 		return result;
 	}
 
+	/**
+	 * @param str
+	 * @param buffer
+	 * @return the decoded string buffer
+	 * @throws RuntimeException
+	 */
 	public static StringBuffer decode(String str, StringBuffer buffer)
 			throws RuntimeException {
 		return decode(str, 0, str.length(), buffer);
 	}
 
+	/**
+	 * @param str
+	 * @param start
+	 * @param end
+	 * @param buffer
+	 * @return the decoded string buffer
+	 * @throws RuntimeException
+	 */
 	public static StringBuffer decode(String str, int start, int end,
 			StringBuffer buffer) throws RuntimeException {
 		int pos = start;
@@ -398,6 +437,10 @@
 		return buffer;
 	}
 
+	/**
+	 * @param entityRef
+	 * @return the code for the decoded entity reference
+	 */
 	public static int decodeEntity(String entityRef) {
 		Integer result = (Integer) _reverse.get(entityRef);
 		if (result != null) {
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLUtil.java
index f469858..a4400d2 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLUtil.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/HTMLUtil.java
@@ -24,7 +24,7 @@
 	 * check whether a char is a HTML whitespace.
 	 * 
 	 * @param ch
-	 * @return
+	 * @return true if ch is considered to be HTML whitespace
 	 * @see <a href="http://www.w3.org/TR/html4/struct/text.html#h-9.1">white
 	 *      space </a>
 	 */
@@ -35,7 +35,7 @@
 
 	/**
 	 * @param text
-	 * @return
+	 * @return true if the entire string is considered to be HTML whitespace
 	 */
 	public static boolean isHTMLWhitespaceString(String text) {
 		for (int i = 0, size = text.length(); i < size; i++) {
@@ -46,7 +46,10 @@
 		return true;
 	}
 
-	public static final String[] HiddenTags = new String[] {
+	/**
+	 * the HTML tags considered to be hidden
+	 */
+	static final String[] HiddenTags = new String[] {
 			IHTMLConstants.TAG_APPLET, IHTMLConstants.TAG_AREA,
 			IHTMLConstants.TAG_BASE, IHTMLConstants.TAG_BASEFONT,
 			IHTMLConstants.TAG_HEAD, IHTMLConstants.TAG_IFRAME,
@@ -56,6 +59,10 @@
 			IHTMLConstants.TAG_STYLE, IHTMLConstants.TAG_TITLE,
 			IHTMLConstants.TAG_PARAM };
 
+	/**
+	 * @param tag
+	 * @return true if the tag name is not in the list of hidden tags
+	 */
 	public static boolean isVisualHtmlElement(String tag) {
 		return !Arrays.asList(HiddenTags).contains(tag.toLowerCase());
 	}
@@ -66,10 +73,10 @@
 	 * tag close.
 	 * <p>
 	 * For consequent whitespace, will compact them.
-	 * 
-	 * @param data
-	 * @return
-	 * @see http://www.w3.org/TR/html4/struct/text.html#h-9.1
+	 * @param textNode 
+	 * @param s 
+	 * @return the compacted string
+	 * see http://www.w3.org/TR/html4/struct/text.html#h-9.1
 	 */
 	// XXX: currently, the whitespace handling is in this class, in the future
 	// may consider move it
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ICacheEntryCreator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ICacheEntryCreator.java
index 8edf749..a63faee 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ICacheEntryCreator.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ICacheEntryCreator.java
@@ -11,8 +11,21 @@
  *******************************************************************************/
 package org.eclipse.jst.pagedesigner.utils;
 
-public interface ICacheEntryCreator {
-	public Object createEntry(Object key);
+/**
+ * Identifies a factory/dispose advisor for cache entries
+ * @param <KEY> 
+ * @param <ENTRY> 
+ */
+public interface ICacheEntryCreator<KEY,ENTRY> {
+	/**
+	 * @param key
+	 * @return the created entry
+	 */
+	public ENTRY createEntry(KEY key);
 
-	public void dispose(Object key, Object entry);
+	/**
+	 * @param key
+	 * @param entry
+	 */
+	public void dispose(KEY key, ENTRY entry);
 }
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/IntFlexArray.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/IntFlexArray.java
index 0e2ccc1..4c50dcf 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/IntFlexArray.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/IntFlexArray.java
@@ -22,16 +22,26 @@
 
 	int size = 0;
 
+	/**
+	 * Create a new flex array with default capacity
+	 */
 	public IntFlexArray() {
 		this(10);
 	}
 
+	/**
+	 * @param initCapacity
+	 */
 	public IntFlexArray(int initCapacity) {
 		if (initCapacity <= 0)
 			initCapacity = 10;
 		array = new int[initCapacity];
 	}
 
+	/**
+	 * @param idx
+	 * @param obj
+	 */
 	public void setAt(int idx, int obj) {
 		ensureCapacity(idx + 1);
 		array[idx] = obj;
@@ -39,12 +49,19 @@
 			size = idx + 1;
 	}
 
+	/**
+	 * @param idx
+	 * @return the value at idx or 0 if idx is out of bounds
+	 */
 	public int getAt(int idx) {
 		if (idx < array.length)
 			return array[idx];
         return 0;
 	}
 
+	/**
+	 * @return the current size of the array
+	 */
 	public int getSize() {
 		return size;
 	}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JavaUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JavaUtil.java
index 2cc3eb7..1734707 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JavaUtil.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/JavaUtil.java
@@ -29,7 +29,7 @@
 	 * 
 	 * @param javaProject
 	 * @param parent
-	 * @return
+	 * @return the path in javaProject or new Path("") if not found on a class path
 	 * @author mengbo
 	 */
 	public static IPath getPathOnClasspath(IJavaProject javaProject,
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/NodeLocationComparator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/NodeLocationComparator.java
index 87cf105..571819a 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/NodeLocationComparator.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/NodeLocationComparator.java
@@ -26,19 +26,22 @@
 public class NodeLocationComparator implements Comparator {
 	private final static Map orders = new HashMap();
 
-	private final static Integer DEFAULT_ORDER = new Integer(Integer.MAX_VALUE);
+	private final static Integer DEFAULT_ORDER = Integer.valueOf(Integer.MAX_VALUE);
 
 	private static NodeLocationComparator _instance = new NodeLocationComparator();
 	static {
-		orders.put("taglib", new Integer(0));
-		orders.put("directive.taglib", new Integer(0));
-		orders.put("head", new Integer(1));
+		orders.put("taglib", Integer.valueOf(0));
+		orders.put("directive.taglib", Integer.valueOf(0));
+		orders.put("head", Integer.valueOf(1));
 	}
 
 	private NodeLocationComparator() {
         // no external instantiation
 	}
 
+	/**
+	 * @return the singleton
+	 */
 	public static NodeLocationComparator getInstance() {
 		return _instance;
 	}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/PreviewUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/PreviewUtil.java
index 3faf608..1a76aba 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/PreviewUtil.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/PreviewUtil.java
@@ -20,6 +20,7 @@
 import java.util.Map;
 import java.util.MissingResourceException;
 import java.util.PropertyResourceBundle;
+import java.util.Map.Entry;
 
 import org.eclipse.core.resources.IContainer;
 import org.eclipse.core.resources.IFile;
@@ -47,26 +48,67 @@
 			.getProperty("line.separator"); //$NON-NLS-1$
 
 	/** web root path */
-	public static String WEBROOT_PATH = null;
+	private final static String WEBROOT_PATH = null;
 
 	/** the file being previewed */
-	public static IFile CURRENT_FILE = null;
+	private static IFile CURRENT_FILE = null;
 
 	/** the property bundel */
-	public static PropertyResourceBundle BUNDLE = null;
+	private static PropertyResourceBundle BUNDLE = null;
 
 	/** the property bundel map used for loadbundle preview action */
-	public static Map BUNDLE_MAP = null;
+	private static Map BUNDLE_MAP = null;
 
 	/** the variable name used for loadbundel preview action */
-	public static String VAR = null;
+	private static String VAR = null;
 
 	/** key is prefix value is uri */
 	private static Map _taglibMap = new HashMap();
 
-	// TODO: dead? private static final String PAGE_EXTEND = "_jsppreview_.html"; //$NON-NLS-1$
 
 	/**
+	 * @return the current bundle
+	 */
+	public static final PropertyResourceBundle getBUNDLE() {
+        return BUNDLE;
+    }
+
+    /**
+     * @param bundle
+     */
+    public static final void setBUNDLE(PropertyResourceBundle bundle) {
+        BUNDLE = bundle;
+    }
+
+    /**
+     * @return the current bundle map
+     */
+    public static final Map getBUNDLE_MAP() {
+        return BUNDLE_MAP;
+    }
+
+    /**
+     * @param bundle_map
+     */
+    public static final void setBUNDLE_MAP(Map bundle_map) {
+        BUNDLE_MAP = bundle_map;
+    }
+
+    /**
+     * @return the current variable
+     */
+    public static final String getVAR() {
+        return VAR;
+    }
+
+    /**
+     * @param var
+     */
+    public static final void setVAR(String var) {
+        VAR = var;
+    }
+
+    /**
 	 * @return Returns the _taglibMap.
 	 */
 	public static Map getTaglibMap() {
@@ -86,6 +128,7 @@
 	 * 
 	 * @param map
 	 *            tag attribute map
+	 * @return the attribute string
 	 */
 	public static String getAttributesAsString(Map map) {
 		return getAttributesAsString(map, true);
@@ -96,6 +139,7 @@
 	 * 
 	 * @param uri
 	 *            taglib uri
+	 * @return the path as a string
 	 */
 	public static String getPathFromURI(String uri) {
 		if (uri == null) {
@@ -134,6 +178,7 @@
 	 * 
 	 * @param attrValue
 	 *            expression
+	 * @return the value
 	 */
 	public static String getValueOFEP(String attrValue) {
 		if (attrValue != null) {
@@ -176,16 +221,18 @@
 	 *            tag attribute map
 	 * @param flag
 	 *            state
+	 * @return the attributes as a single string
 	 */
-	public static String getAttributesAsString(Map map, boolean flag) {
+	private static String getAttributesAsString(Map<String, String> map, boolean flag) {
 		if (map == null) {
 			return null;
 		}
 
 		StringBuffer stringbuffer = new StringBuffer();
-		for (Iterator e = map.keySet().iterator(); e.hasNext();) {
-			String attrName = (String) e.next();
-			String attrValue = (String) map.get(attrName);
+		for (Iterator<Entry<String, String>> e = map.entrySet().iterator(); e.hasNext();) {
+		    Map.Entry<String,String> entry = e.next();
+			String attrName = entry.getKey();
+			String attrValue = entry.getValue();
 			attrValue = getValueOFEP(attrValue);
 			if (ICSSPropertyID.ATTR_SRC.equalsIgnoreCase(attrName)
 					|| ICSSPropertyID.ATTR_HREF.equalsIgnoreCase(attrName)
@@ -229,6 +276,7 @@
 	 * 
 	 * @param nodeMap
 	 *            NamedNodeMap type
+	 * @return the map
 	 */
 	public static Map getAttributeMap(NamedNodeMap nodeMap) {
 		if (nodeMap != null) {
@@ -252,7 +300,7 @@
 	/**
 	 * @param result
 	 * @param editorInput
-	 * @return
+	 * @return the file
 	 */
 	public static File toFile(StringBuffer result, IEditorInput editorInput) {
 		try {
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ProjectResolver.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ProjectResolver.java
index 2433df1..ff81f21 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ProjectResolver.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/ProjectResolver.java
@@ -45,6 +45,10 @@
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
+/**
+ * A URIResolver implementation
+ *
+ */
 public class ProjectResolver implements URIResolver {
 	private static final String TLD_TAG_URI = "uri";
 
@@ -66,12 +70,16 @@
 	 * project.getAdapter(URIResolver.class) to obtain a URIResolver aware of
 	 * the Project's special requirements. Note that a URIResolver may not be
 	 * returned at all so manually creating this object may still be required.
+	 * @param project
 	 */
 	public ProjectResolver(IProject project) {
 		super();
 		_project = project;
 	}
 
+	/**
+	 * @param path
+	 */
 	public void seekTld(IFolder path) {
 		if (path == null) {
 			return;
@@ -104,6 +112,9 @@
 		}
 	}
 
+	/**
+	 * @param path
+	 */
 	public void seekTld(File path) {
 		if (path == null || !path.isDirectory()) {
 			return;
@@ -140,12 +151,16 @@
 		}
 	}
 
+	/**
+	 * @param tldFile
+	 * @return the uri for the tld in tldFile or null
+	 */
 	public String getURIfromTLD(File tldFile) {
 
 		if (tldFile == null) {
 			return null;
 		}
-		IDOMModel tldModel;
+		IDOMModel tldModel = null;
 
 		InputStream in = null;
 		try {
@@ -156,7 +171,7 @@
 //		IDOMModel xmlModel = null;
 
 		try {
-			tldModel = (IDOMModel) PDPlugin.getModelManager().getModelForRead(
+			tldModel = (IDOMModel) StructuredModelManager.getModelManager().getModelForRead(
 					tldFile.getAbsolutePath(), in, null);
 			NodeList uriList = tldModel.getDocument().getElementsByTagName(
 					TLD_TAG_URI);
@@ -170,11 +185,20 @@
 			_log.error("RenderingTraverser.Error.IO", e1);
 		} finally {
 			ResourceUtils.ensureClosed(in);
+			
+			if (tldModel != null)
+			{
+			    tldModel.releaseFromRead();
+			}
 		}
 
 		return null;
 	}
 
+	/**
+	 * @param tldFile
+	 * @return the URI for the TLD in tldFile or null
+	 */
 	public String getURIfromTLD(IFile tldFile) {
 		if (tldFile == null) {
 			return null;
@@ -198,6 +222,9 @@
 		return null;
 	}
 
+	/**
+	 * initialize the map of tlds
+	 */
 	public void initTldMap() {
 		if (_uriMap == null) {
 			_uriMap = new HashMap();
@@ -424,7 +451,7 @@
 		// a.) if path has a device, and if it begins with IPath.SEPARATOR,
 		// remove it
 		final String device = path.getDevice();
-		if ((device != null) && (device.length() > 0)) {
+		if (device != null && device.length() > 0) {
 			if (device.charAt(0) == IPath.SEPARATOR) {
 				final String newDevice = device.substring(1);
 				newPath = path.setDevice(newDevice);
@@ -432,12 +459,17 @@
 		}
 		// b.) if it has a hostname, it is UNC name... Any java or eclipse api
 		// helps it ??
-		if (path != null && host != null && host.length() != 0) {
+		if (newPath != null && host != null && host.length() != 0) {
 			IPath uncPath = new Path(host);
 			uncPath = uncPath.append(path);
 			newPath = uncPath.makeUNC(true);
 		}
-		return newPath.toString();
+		
+		if (newPath != null)
+		{
+		    return newPath.toString();
+		}
+		return path.toString();
 	}
 
 	/**
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectManyHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectManyHelper.java
index 5fead43..a7f3ff6 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectManyHelper.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/SelectManyHelper.java
@@ -12,8 +12,10 @@
 package org.eclipse.jst.pagedesigner.utils;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.eclipse.jst.jsf.core.internal.tld.CMUtil;
 import org.eclipse.jst.jsf.core.internal.tld.IJSFConstants;
@@ -31,37 +33,29 @@
  * @author mengbo
  */
 public class SelectManyHelper {
-//	private static final String OPTION_VISUAL_PREFIX = "option: "; //$NON-NLS-1$
-//
-//	private static final String OPTION_VISUAL_PREFIX_BINDING = "option(binding): "; //$NON-NLS-1$
-//
-//	private static final String OPTION_VISUAL_PREFIX_VALUE = "option(value): "; //$NON-NLS-1$
 
-	private static final String NO_VALUE = "<no value>"; //$NON-NLS-1$
+	private final static Set<String> JSF_SELECT_TAGS, HTML_SELECT_TAGS;
 
-	public static HashSet JSF_SELECT_TAGS, HTML_SELECT_TAGS;
-
-	public static HashSet HTML_SELECT_TAG_OPTIONS, JSF_SELECT_TAG_OPTIONS;
 
 	static {
-		HTML_SELECT_TAGS = new HashSet(10);
-		HTML_SELECT_TAGS.add(IHTMLConstants.TAG_SELECT);
-		HTML_SELECT_TAGS.add(IHTMLConstants.TAG_OPTGROUP);
-		HTML_SELECT_TAG_OPTIONS = new HashSet(10);
-		HTML_SELECT_TAG_OPTIONS.add(IHTMLConstants.TAG_OPTGROUP);
-		HTML_SELECT_TAG_OPTIONS.add(IHTMLConstants.TAG_OPTION);
-
-		JSF_SELECT_TAG_OPTIONS = new HashSet(10);
-		JSF_SELECT_TAG_OPTIONS.add(IJSFConstants.TAG_SELECTITEM);
-		JSF_SELECT_TAG_OPTIONS.add(IJSFConstants.TAG_SELECTITEMS);
-		JSF_SELECT_TAGS = new HashSet(10);
-		JSF_SELECT_TAGS.add(IJSFConstants.TAG_SELECTONELISTBOX);
-		JSF_SELECT_TAGS.add(IJSFConstants.TAG_SELECTONEMENU);
-		JSF_SELECT_TAGS.add(IJSFConstants.TAG_SELECTMANYLISTBOX);//
-		JSF_SELECT_TAGS.add(IJSFConstants.TAG_SELECTMANYMENU);//
-		JSF_SELECT_TAGS.add(IJSFConstants.TAG_SELECTMANYCHECKBOX);
+		Set<String> tempSet = new HashSet<String>(4);
+		tempSet.add(IHTMLConstants.TAG_SELECT);
+		tempSet.add(IHTMLConstants.TAG_OPTGROUP);
+		HTML_SELECT_TAGS = Collections.unmodifiableSet(tempSet);
+		
+		tempSet = new HashSet(8);
+		tempSet.add(IJSFConstants.TAG_SELECTONELISTBOX);
+		tempSet.add(IJSFConstants.TAG_SELECTONEMENU);
+		tempSet.add(IJSFConstants.TAG_SELECTMANYLISTBOX);//
+		tempSet.add(IJSFConstants.TAG_SELECTMANYMENU);//
+		tempSet.add(IJSFConstants.TAG_SELECTMANYCHECKBOX);
+		JSF_SELECT_TAGS = Collections.unmodifiableSet(tempSet);
 	}
 
+	/**
+	 * @param node
+	 * @return the select option children of node
+	 */
 	public static Object[] getSelectOptions(Element node) {
 		if (node == null) {
 			return null;
@@ -115,6 +109,10 @@
 		return null;
 	}
 
+	/**
+	 * @param node
+	 * @return the selection option children of node as strings
+	 */
 	public static String[] getSelectOptionsString(Element node) {
 		if (node == null) {
 			return null;
@@ -144,6 +142,10 @@
 		return (String[]) result.toArray(new String[] {});
 	}
 
+	/**
+	 * @param node
+	 * @return true if node has select option children
+	 */
 	public static boolean hasSelectOptions(Element node) {
 		if (node == null) {
 			return false;
@@ -177,6 +179,10 @@
 		return false;
 	}
 
+	/**
+	 * @param node
+	 * @return true if node is a core or HTML select tag
+	 */
 	public static boolean supportSections(Element node) {
 		String uri = CMUtil.getElementNamespaceURI(node);
 		if (ITLDConstants.URI_JSF_HTML.equals(uri)) {
@@ -187,24 +193,4 @@
 		}
 		return false;
 	}
-
-	public static String getJsfSelectionVisualLabel(Element element) {
-		/*
-		 * if (ele.getAttribute(ICSSPropertyID.ATTR_ITEMLABEL) != null) { return
-		 * OPTION_VISUAL_PREFIX +
-		 * ele.getAttribute(ICSSPropertyID.ATTR_ITEMLABEL); //$NON-NLS-1$ } else
-		 * if (ele.getAttribute(ICSSPropertyID.ATTR_BINDING) != null) { return
-		 * OPTION_VISUAL_PREFIX_BINDING +
-		 * ele.getAttribute(ICSSPropertyID.ATTR_BINDING); //$NON-NLS-1$ } else
-		 * if (ele.getAttribute(ICSSPropertyID.ATTR_ITEMVALUE) != null) { return
-		 * OPTION_VISUAL_PREFIX_VALUE +
-		 * ele.getAttribute(ICSSPropertyID.ATTR_ITEMVALUE); //$NON-NLS-1$ }
-		 * 
-		 * return NO_VALUE; //$NON-NLS-1$
-		 */
-		if (element != null) {
-			return element.getNodeName();
-		}
-        return NO_VALUE;
-	}
 }
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/WebAppUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/WebAppUtil.java
index 35dd36f..d3971e2 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/WebAppUtil.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/WebAppUtil.java
@@ -26,6 +26,11 @@
 public class WebAppUtil {
 	private final static String FACES_SERVLET_NAME = "javax.faces.webapp.FacesServlet";
 
+	/**
+	 * @param url
+	 * @param openedFile
+	 * @return the transformed url
+	 */
 	public static String transformJSPURL(String url, IFile openedFile) {
 		boolean canSupportJSF = JSPUtil.supportTaglib(
 				ITLDConstants.URI_JSF_HTML, openedFile);
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/XMLUtil.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/XMLUtil.java
index 7a98425..7638cd4 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/XMLUtil.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/utils/XMLUtil.java
@@ -35,13 +35,18 @@
 import org.eclipse.jst.pagedesigner.PDPlugin;
 import org.w3c.dom.Document;
 
+/**
+ * 
+ *
+ */
 public class XMLUtil {
 	private static Logger _log = PDPlugin.getLogger(XMLUtil.class);
 
 	/**
 	 * Returns a DocumentBuilder capable of creating a DOM Document from input.
 	 * 
-	 * @return
+	 * @return a new instance of a document builder or null if an exception
+	 * occurs on creation
 	 */
 	public synchronized static DocumentBuilder getDocumentBuilder() {
 		DocumentBuilder result = null;
@@ -54,21 +59,6 @@
 		return result;
 	}
 
-	public synchronized static DocumentBuilder getDocumentBuilder(
-			boolean validating) {
-		DocumentBuilder result = null;
-		try {
-			DocumentBuilderFactory instance = DocumentBuilderFactory
-					.newInstance();
-			instance.setValidating(validating);
-			result = instance.newDocumentBuilder();
-		} catch (ParserConfigurationException e) {
-			// "Error in create documentBuilder"
-			_log.info("XMLUtil.Error.0", e); //$NON-NLS-1$
-		}
-		return result;
-	}
-
 	/**
 	 * Transforms a DOM document into a lightly-formatted UTF-8 represntation
 	 * and outputs it to an outputstream
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/InlineEditingNavigationMediator.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/InlineEditingNavigationMediator.java
index 696dc30..f41da6d 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/InlineEditingNavigationMediator.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/validation/caret/InlineEditingNavigationMediator.java
@@ -24,7 +24,7 @@
 import org.eclipse.jst.pagedesigner.parts.DocumentEditPart;
 import org.eclipse.jst.pagedesigner.tools.ExposeHelper;
 import org.eclipse.jst.pagedesigner.viewer.DesignPosition;
-import org.eclipse.jst.pagedesigner.viewer.HTMLGraphicalViewer;
+import org.eclipse.jst.pagedesigner.viewer.IHTMLGraphicalViewer;
 import org.w3c.dom.Document;
 import org.w3c.dom.Node;
 
@@ -149,11 +149,11 @@
 	public EditPart getConstainedEditableContainer(DesignPosition position,
 			Point p, GraphicalViewer viewer) {
 		Rectangle rect = new Rectangle(p.x, p.y, 1, 1);
-		Viewport port = ((HTMLGraphicalViewer) viewer).getViewport();
+		Viewport port = ((IHTMLGraphicalViewer) viewer).getViewport();
 
 		Point viewLocation = port.getViewLocation();
 		Point lastLocation = viewLocation.getCopy();
-		new ExposeHelper((HTMLGraphicalViewer) viewer).exposeArea(rect);
+		new ExposeHelper((IHTMLGraphicalViewer) viewer).exposeArea(rect);
 		viewLocation = port.getViewLocation();
 		Dimension offset = lastLocation.getDifference(viewLocation);
 
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/AbstractDropLocationStrategy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/AbstractDropLocationStrategy.java
index 62b283b..6dbeb64 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/AbstractDropLocationStrategy.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/AbstractDropLocationStrategy.java
@@ -33,6 +33,9 @@
 {
     private final EditPartViewer        _viewer;
     
+    /**
+     * @param viewer
+     */
     public AbstractDropLocationStrategy(EditPartViewer viewer)
     {
         _viewer = viewer;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretPositionResolver.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretPositionResolver.java
index d3f5ea3..27aae69 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretPositionResolver.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretPositionResolver.java
@@ -34,6 +34,11 @@
 
 	private static CaretPositionResolver _instance;
 
+	/**
+	 * @param validator
+	 * @param point
+	 * @return the singleton instance
+	 */
 	public static CaretPositionResolver getInstance(
 			IPositionMediator validator, Point point) {
 		if (_instance == null) {
@@ -268,7 +273,7 @@
 	 * 
 	 * @param rect
 	 * @param point
-	 * @return
+	 * @return the X distance
 	 */
 	public static int getXDistance(Rectangle rect, Point point) {
 		if (rect.getRight().x <= point.x) {
@@ -287,7 +292,7 @@
 	 * 
 	 * @param rect
 	 * @param point
-	 * @return
+	 * @return the X distance
 	 */
 	public static int toXMiddle(Rectangle rect, Point point) {
 		return (point.x - (rect.x + rect.getRight().x) / 2);
@@ -299,12 +304,17 @@
 	 * 
 	 * @param rect
 	 * @param point
-	 * @return
+	 * @return the Y distance
 	 */
 	public static int toYMiddle(Rectangle rect, Point point) {
 		return (point.y - (rect.y + rect.getBottom().y) / 2);
 	}
 
+	/**
+	 * @param rect
+	 * @param point
+	 * @return the Y distance
+	 */
 	public static int getYDistance(Rectangle rect, Point point) {
 		if (rect.y + rect.height <= point.y) {
 			return point.y - (rect.y + rect.height);
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretUpdater.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretUpdater.java
index 95f6742..dde0d69 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretUpdater.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/CaretUpdater.java
@@ -37,7 +37,7 @@
  * 
  * @author mengbo
  */
-public class CaretUpdater implements IHTMLGraphicalViewerListener,
+/*package*/ class CaretUpdater implements IHTMLGraphicalViewerListener,
 		FigureListener {
 //	private static final Logger _log = PDPlugin.getLogger(CaretUpdater.class);
 
@@ -45,6 +45,9 @@
 
 	private boolean _viewerBatchChanging = false;
 
+	/**
+	 * the width value of the caret in pixels
+	 */
 	public static final int CARET_WIDTH = 2;
 
 	/**
@@ -53,15 +56,19 @@
 	 */
 	private IFigure _trackFigure;
 
-	//TODO: dead? private Polyline _rangeStartCaret;
-
+	/**
+	 * @param viewer
+	 */
 	public CaretUpdater(IHTMLGraphicalViewer viewer) {
 		_viewer = viewer;
 		setup();
 	}
 
+	/**
+	 * set up the
+	 */
 	public void setup() {
-		_viewer.addSelectionChangedListener(this);
+		_viewer.addHTMLViewerListener(this);
 	}
 
 	/**
@@ -98,14 +105,15 @@
 		}
 	}
 
+	/**
+	 * dispose the instance
+	 */
 	public void dispose() {
-		_viewer.removeSelectionChangedListener(this);
+		_viewer.removeHTMLViewerListener(this);
 	}
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.jface.viewers.ISelectionChangedListener#selectionChanged(org.eclipse.jface.viewers.SelectionChangedEvent)
+	/**
+	 * Update the selection
 	 */
 	public void updateSelection() {
 		setCaretVisible(false);
@@ -130,12 +138,14 @@
 	private void updateRangeSelection() {
 		// FIXME: optimization needed here. Normally should not repaint the
 		// whole page.
-		// TODO: dead?? DesignRange range = _viewer.getRangeSelection();
 		((GraphicalEditPart) _viewer.getRootEditPart()).getFigure().repaint();
 		((GraphicalEditPart) _viewer.getRootEditPart()).getFigure()
 				.getUpdateManager().performUpdate();
 	}
 
+	/**
+	 * update the caret
+	 */
 	public void updateCaret() {
 		if (_trackFigure != null) {
 			_trackFigure.removeFigureListener(this);
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DefaultDropLocationStrategy.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DefaultDropLocationStrategy.java
index 2e3bf6f..38f27cf 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DefaultDropLocationStrategy.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DefaultDropLocationStrategy.java
@@ -28,22 +28,38 @@
 import org.eclipse.jst.pagedesigner.parts.ElementEditPart;
 import org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator;
 
+/**
+ * A default implementation of the drop location strategy
+ * @author cbateman
+ *
+ */
 public class DefaultDropLocationStrategy extends AbstractDropLocationStrategy 
 {
     // the amount of vertical offset below the mouse pointer to place
     // the upper left of the drop hint tooltip
     private static final int DROP_HINT_VERTICAL_OFFSET = 20;
 
+    /**
+     * @param viewer
+     */
     public DefaultDropLocationStrategy(EditPartViewer viewer) {
         super(viewer);
     }
 
+    /* (non-Javadoc)
+     * @see org.eclipse.jst.pagedesigner.viewer.AbstractDropLocationStrategy#calculateDesignPosition(org.eclipse.gef.EditPart, org.eclipse.draw2d.geometry.Point, org.eclipse.jst.pagedesigner.validation.caret.IPositionMediator)
+     */
+    @Override
     public DesignPosition calculateDesignPosition(EditPart host, Point p,
             IPositionMediator validator) {
         return EditPartPositionHelper.findEditPartPosition(
                 host, p, validator);
     }
 
+    /* (non-Javadoc)
+     * @see org.eclipse.jst.pagedesigner.viewer.AbstractDropLocationStrategy#showTargetFeedback(org.eclipse.gef.EditPart, org.eclipse.jst.pagedesigner.viewer.DesignPosition, org.eclipse.gef.requests.DropRequest)
+     */
+    @Override
     public List showTargetFeedback(EditPart host, DesignPosition position, DropRequest request) 
     {
         List feedback = new ArrayList(4);
@@ -55,6 +71,10 @@
 
     
     
+    /**
+     * @param rect
+     * @return the default rectangle figure for the requested visual rectangle
+     */
     protected final RectangleFigure showFeedbackRect(Rectangle rect) {
         RectangleFigure pf = createFeedbackFigure();
         pf.translateToRelative(rect);
@@ -62,6 +82,11 @@
         return pf;
     }
     
+    /**
+     * @param position
+     * @return the bounding rectangle for the caret at the current
+     * position in absolute coords
+     */
     protected Rectangle createCaretBounds(DesignPosition position)
     {
         Rectangle rect = EditPartPositionHelper
@@ -73,6 +98,9 @@
         return rect;
     }
     
+    /**
+     * @return the newly created feedback figure
+     */
     protected RectangleFigure createFeedbackFigure() 
     {
         RectangleFigure feedbackFigure = new RectangleFigure();
@@ -90,6 +118,9 @@
      * Shows a label in a position relative to the drop marker
      * that hints where the new component will be dropped in
      * respect of components already there
+     * @param mousePosition 
+     * @param position 
+     * @return the drop hint label
      */
     protected final Label showDropHintLabel(Point mousePosition, DesignPosition position)
     {
@@ -128,6 +159,10 @@
         return dropHintLabel;
     }
     
+    /**
+     * @param position
+     * @return the drop hint text for the current position
+     */
     protected String getDropHintText(DesignPosition position)
     {
         StringBuffer buffer = new StringBuffer("Place");
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignPosition.java
index 3e10f32..237c656 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignPosition.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignPosition.java
@@ -21,6 +21,9 @@
  * @author mengbo
  */
 public class DesignPosition {
+	/**
+	 * a singleton that can be used as an invalid position
+	 */
 	public static final DesignPosition INVALID = new DesignPosition(null, -1);
 
 	private EditPart _containerPart;
@@ -41,12 +44,15 @@
 	/**
 	 * if _containerPart is null, means it is invalid
 	 * 
-	 * @return
+	 * @return the container edit part
 	 */
 	public EditPart getContainerPart() {
 		return _containerPart;
 	}
 
+	/**
+	 * @return the container node
+	 */
 	public Node getContainerNode() {
 		if (_containerPart != null) {
 			return (Node) _containerPart.getModel();
@@ -57,12 +63,15 @@
 	/**
 	 * if offset < 0, means it is invalid.
 	 * 
-	 * @return
+	 * @return the offset
 	 */
 	public int getOffset() {
 		return _offset;
 	}
 
+	/**
+	 * @return true if the design position is valid
+	 */
 	public boolean isValid() {
 		return (_containerPart != null) && (_offset >= 0);
 	}
@@ -71,7 +80,9 @@
 	 * This method should not be called when is text node.
 	 * 
 	 * @param forward
-	 * @return
+	 * @return the sibling part one to right in the tree if 
+	 * forward == true, one to the left if forward == false.  May
+	 * return null if position is invalid or there is no valid sibling.
 	 */
 	public EditPart getSiblingEditPart(boolean forward) {
 		if (!isValid()) {
@@ -92,7 +103,7 @@
 	 * factory method
 	 * 
 	 * @param part
-	 * @return
+	 * @return a design position one before part
 	 */
 	public static DesignPosition createPositionBeforePart(EditPart part) {
 		EditPart parent = part.getParent();
@@ -108,7 +119,7 @@
 	 * factory method
 	 * 
 	 * @param part
-	 * @return
+	 * @return the design position for one after part
 	 */
 	public static DesignPosition createPositionAfterPart(EditPart part) {
 		EditPart parent = part.getParent();
@@ -126,6 +137,11 @@
 	 * @see java.lang.Object#equals(java.lang.Object)
 	 */
 	public boolean equals(Object obj) {
+	    if (obj == this)
+	    {
+	        return true;
+	    }
+	    
 		if (obj instanceof DesignPosition) {
 			DesignPosition p = (DesignPosition) obj;
 
@@ -136,10 +152,15 @@
 		return false;
 	}
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
+	
+	@Override
+    public int hashCode() {
+	    return System.identityHashCode(_containerPart) ^ System.identityHashCode(Integer.valueOf(_offset));
+    }
+
+	/**
+	 * @param buffer
+	 * @return the buffer with the debug dump
 	 */
 	public StringBuffer debugDump(StringBuffer buffer) {
 //		try {
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRange.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRange.java
index 468defa..a4a0939 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRange.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRange.java
@@ -16,33 +16,37 @@
 /**
  * @author mengbo
  */
-public class DesignRange implements ISelection {
-	public DesignPosition _start;
+public class DesignRange implements ISelection 
+{
+    private final DesignPosition _start;
+    private final DesignPosition _end;
 
-	public DesignPosition _end;
-
+	/**
+	 * @param start
+	 * @param end
+	 */
 	public DesignRange(DesignPosition start, DesignPosition end) {
 		_start = start;
 		_end = end;
 	}
 
+	/**
+	 * @return the start position in the range
+	 */
 	public DesignPosition getStartPosition() {
 		return _start;
 	}
 
+	/**
+	 * @return the end position in the range
+	 */
 	public DesignPosition getEndPosition() {
 		return _end;
 	}
 
-	// public boolean isCollapsed()
-	// {
-	// }
-
-	// public boolean fullyContains(EditPart part)
-	// {
-	//        
-	// }
-
+	/**
+	 * @return true if the range is valid
+	 */
 	public boolean isValid() {
 		return _start != null && _start.isValid() && _end != null
 				&& _end.isValid();
@@ -58,6 +62,10 @@
 		return !isValid() || _start.equals(_end);
 	}
 
+	/**
+	 * @param buffer
+	 * @return a buffer with the debug dum
+	 */
 	public StringBuffer debugDump(StringBuffer buffer) {
 		if (_start != null) {
 			buffer.append("Start: ").append(_start);
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRefPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRefPosition.java
index d02733f..da6e305 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRefPosition.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/DesignRefPosition.java
@@ -23,7 +23,7 @@
 
 	/**
 	 * @param part
-	 * @param offset
+	 * @param caretIsAfter
 	 */
 	public DesignRefPosition(EditPart part, boolean caretIsAfter) {
 		super(part.getParent(), 0);
@@ -33,6 +33,9 @@
 		_caretIsAtRight = caretIsAfter;
 	}
 
+	/**
+	 * @return the reference edit part
+	 */
 	public EditPart getRefPart() {
 		return _refPart;
 	}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/EditPartPositionHelper.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/EditPartPositionHelper.java
index 0e88f0c..423b6df 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/EditPartPositionHelper.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/EditPartPositionHelper.java
@@ -531,29 +531,29 @@
 	 * @return
 	 */
 	private static EditPart tryTwoWays(DesignPosition position,
-			List caretRefResult) {
+			List<Boolean> caretRefResult) {
 		EditPart result = null;
 		// Sibling first:
 		Node node = EditModelQuery.getInstance().getSibling(
 				DOMPositionHelper.toDOMPosition(position), true);
 		if (node != null && !EditModelQuery.isTransparentText(node)) {
 			result = Target.resolvePart(node);
-			caretRefResult.add(new Boolean(false));
+			caretRefResult.add(Boolean.FALSE);
 		} else {
 			node = EditModelQuery.getInstance().getSibling(
 					DOMPositionHelper.toDOMPosition(position), false);
 			if (node != null && !EditModelQuery.isTransparentText(node)) {
 				result = Target.resolvePart(node);
-				caretRefResult.add(new Boolean(true));
+				caretRefResult.add(Boolean.TRUE);
 			}
 		}
 		if (result == null) {
 			if (getConcretePart(position, false) != null) {
 				result = getConcretePart(position, false);
-				caretRefResult.add(new Boolean(true));
+				caretRefResult.add(Boolean.TRUE);
 			} else if (getConcretePart(position, true) != null) {
 				result = getConcretePart(position, true);
-				caretRefResult.add(new Boolean(false));
+				caretRefResult.add(Boolean.FALSE);
 			}
 		}
 		return result;
@@ -564,13 +564,13 @@
 	 * still need to improve whitespace tags's layout furthure more.
 	 */
 	private static EditPart getNextConcretPart(DesignPosition position,
-			List caretIsAtRightTest) {
+			List<Boolean> caretIsAtRightTest) {
 		EditPart result = null;
 		boolean caretIsAtRight = true;
 		if (position instanceof DesignRefPosition) {
 			caretIsAtRight = ((DesignRefPosition) position).caretIsAtRight();
 			result = ((DesignRefPosition) position).getRefPart();
-			caretIsAtRightTest.add(new Boolean(caretIsAtRight));
+			caretIsAtRightTest.add(Boolean.valueOf(caretIsAtRight));
 		}
 		if (result == null
 				|| EditModelQuery.isTransparentText(Target.resolveNode(result))) {
@@ -637,13 +637,13 @@
 	}
 
 	private static Rectangle getRefRect(DesignPosition position) {
-		List caretLocation = new ArrayList();
+		List<Boolean> caretLocation = new ArrayList<Boolean>();
 		EditPart part = getNextConcretPart(position, caretLocation);
 		LayoutPart layoutPart;
 		Rectangle rect = null;
 		if (part != null) {
 			layoutPart = new LayoutPart(part, null);
-			boolean caretIsAtRight = ((Boolean) caretLocation.get(0))
+			boolean caretIsAtRight = caretLocation.get(0)
 					.booleanValue();
 			final int CARET_OFFSET = 1;
 			Rectangle bounds = null;
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/FlowBoxLine.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/FlowBoxLine.java
index bfc0e12..5e45ac1 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/FlowBoxLine.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/FlowBoxLine.java
@@ -14,6 +14,7 @@
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Iterator;
+import java.util.Map;
 
 import org.eclipse.core.runtime.Assert;
 import org.eclipse.draw2d.geometry.Point;
@@ -54,6 +55,11 @@
 
 	private Point _point;
 
+	/**
+	 * @param rect
+	 * @param validator
+	 * @param point
+	 */
 	public FlowBoxLine(Rectangle rect, IPositionMediator validator, Point point) {
 		_x = rect.x;
 		_y = rect.y;
@@ -91,14 +97,25 @@
 		return _y;
 	}
 
-	public HashMap getPartsList() {
+	/**
+	 * @return the part list
+	 */
+	public Map getPartsList() {
 		return _parts;
 	}
 
+	/**
+	 * @return the right bottom coordiate
+	 */
 	public Point getRightBottom() {
 		return new Point(_x + _width, _y + _height);
 	}
 
+	/**
+	 * @param part
+	 * @param point
+	 * @return layout part added
+	 */
 	public boolean addLayoutPart(EditPart part, Point point) {
 		Assert.isTrue(part != null && point != null);
 		Rectangle rect = null;
@@ -127,24 +144,45 @@
 		return true;
 	}
 
+	/**
+	 * @param lPart
+	 * @return true if layout part is within the right bottom corner of the line
+	 */
 	public boolean interact(LayoutPart lPart) {
 		Rectangle rect = lPart.getAbsoluteBounds();
 		return !(rect.getBottom().y <= _y || getRightBottom().y <= rect.y);
 	}
 
+	/**
+	 * @param part
+	 * @return true if the line contains part
+	 */
 	public boolean contains(EditPart part) {
 		return _parts.containsKey(part);
 	}
 
+	/**
+	 * @param part
+	 * @return true if the line contains part
+	 */
 	public boolean contains(LayoutPart part) {
 		return _parts.containsValue(part);
 	}
 
+	/**
+	 * @param part
+	 * @return the layout part for part
+	 */
 	public LayoutPart getLayoutPart(EditPart part) {
 		return (LayoutPart) _parts.get(part);
 	}
 
-	// For vertical movement, we need to see if there is part cover p.x.
+	// 
+	/**
+	 * For vertical movement, we need to see if there is part cover p.x.
+	 * 
+	 * @return the closest edit part
+	 */
 	public EditPart getClosestPart() {
 		if (_parts.isEmpty()) {
 			return null;
@@ -187,6 +225,9 @@
 		return lineYOffset > partYOffset;
 	}
 
+	/**
+	 * @return the bounding rectangle of the line
+	 */
 	public Rectangle getBounds() {
 		return new Rectangle(_x, _y, _width, _height);
 	}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewer.java
index ed7082f..7080136 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewer.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewer.java
@@ -11,6 +11,7 @@
  *******************************************************************************/
 package org.eclipse.jst.pagedesigner.viewer;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import org.eclipse.draw2d.FigureCanvas;
@@ -47,27 +48,22 @@
  * 
  * @author mengbo
  */
-public class HTMLGraphicalViewer extends ScrollingGraphicalViewer implements
+/*package*/ class HTMLGraphicalViewer extends ScrollingGraphicalViewer implements
 		IHTMLGraphicalViewer, CaretPositionTracker {
 	private IEditorPart _parentPart;
-
 	private Caret _caret;
-
 	// initially nothing selected, treat as object selectin mode.
 	private boolean _rangeMode = false;
-
 	private DesignRange _selectionRange = null;
-
 	private int _inBatch = 0;
-
-	private CaretUpdater _caretUpdater = null;
-
+	private final CaretUpdater _caretUpdater;
 	private int _xOffset;
-
+	private final List<IHTMLGraphicalViewerListener>  _htmlViewerListeners;
 	// private ListenerList _postSelectionChangedListeners = new
 	// ListenerList(1);
 
 	/**
+	 * @param parent 
 	 * 
 	 */
 	public HTMLGraphicalViewer(IEditorPart parent) {
@@ -75,14 +71,36 @@
 		// CaretUpdater is not fully initialized yet, since this time the
 		// viewport is not
 		// initialized yet, and we need add listener to range model change.
+        _htmlViewerListeners = new ArrayList<IHTMLGraphicalViewerListener>();
 		_caretUpdater = new CaretUpdater(this);
 	}
 
 	/**
-	 * @return Returns the _caretUpdater.
+	 * Adds listener both as a selection changed listener and as an
+	 * {@link IHTMLGraphicalViewerListener}.  Callers of this method
+	 * need not call addSelectionChangedListener.
+	 * @param listener
 	 */
-	public CaretUpdater getCaretUpdater() {
-		return _caretUpdater;
+	public void addHTMLViewerListener(IHTMLGraphicalViewerListener listener)
+	{
+	    addSelectionChangedListener(listener);
+	    
+	    if (!_htmlViewerListeners.contains(listener))
+	    {
+	        _htmlViewerListeners.add(listener);
+	    }
+	}
+	
+	/**
+	 * Removes listener both as a selection changed listener and as an
+     * {@link IHTMLGraphicalViewerListener}.  Callers of this method
+     * need not call removeSelectionChangedListener.
+	 * @param listener
+	 */
+	public void removeHTMLViewerListener(IHTMLGraphicalViewerListener listener)
+	{
+	    removeSelectionChangedListener(listener);
+	    _htmlViewerListeners.remove(listener);
 	}
 
 	public Viewport getViewport() {
@@ -102,6 +120,9 @@
         return null;
 	}
 
+	/**
+	 * @return the status line manager
+	 */
 	public IStatusLineManager getStatusLineManager() {
 		if (_parentPart == null) {
 			return null;
@@ -127,7 +148,7 @@
 	/**
 	 * this method normally should only be called when in object selection mode.
 	 * 
-	 * @return
+	 * @return the edit part that has primary selection or null if none
 	 */
 	public EditPart getPrimarySelectedNode() {
 		List list = this.getSelectedEditParts();
@@ -218,26 +239,26 @@
 	 * 
 	 */
 	private void fireSelectionAboutToChange() {
-		Object listeners[] = selectionListeners.toArray();
-		for (int i = 0, n = selectionListeners.size(); i < n; i++) {
-			if (listeners[i] instanceof IHTMLGraphicalViewerListener) {
-				IHTMLGraphicalViewerListener l = (IHTMLGraphicalViewerListener) listeners[i];
-				l.selectionAboutToChange();
-			}
+		IHTMLGraphicalViewerListener listeners[] = 
+		    _htmlViewerListeners.toArray(new IHTMLGraphicalViewerListener[0]);
+
+		for (int i = 0; i < listeners.length; i++) 
+		{
+			listeners[i].selectionAboutToChange();
 		}
 	}
 
 	/**
 	 * 
 	 */
-	private void fireSelectionChangeFinished() {
-		Object listeners[] = selectionListeners.toArray();
-		for (int i = 0, n = selectionListeners.size(); i < n; i++) {
-			if (listeners[i] instanceof IHTMLGraphicalViewerListener) {
-				IHTMLGraphicalViewerListener l = (IHTMLGraphicalViewerListener) listeners[i];
-				l.selectionChangeFinished();
-			}
-		}
+	private void fireSelectionChangeFinished()
+	{
+        IHTMLGraphicalViewerListener listeners[] = 
+            _htmlViewerListeners.toArray(new IHTMLGraphicalViewerListener[0]);
+        for (int i = 0; i < listeners.length; i++) 
+        {
+            listeners[i].selectionChangeFinished();
+        }
 	}
 
 	/*
@@ -273,10 +294,9 @@
 		// else we don't support, ignore
 	}
 
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.gef.ui.parts.AbstractEditPartViewer#setSelection(org.eclipse.jface.viewers.ISelection)
+
+	/**
+	 * @param newSelection
 	 */
 	public void updateRangeSelection(ISelection newSelection) {
 		if (newSelection instanceof IStructuredSelection && //
@@ -474,6 +494,9 @@
 		this._xOffset = xoffset;
 	}
 
+	/**
+	 * 
+	 */
 	public void updateHorizontalPos() {
 		Caret caret = getCaret();
 		if (caret != null && !caret.isDisposed() && isInRangeMode()) {
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewerListenenerAdapter.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewerListenenerAdapter.java
new file mode 100644
index 0000000..11e2c33
--- /dev/null
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/HTMLGraphicalViewerListenenerAdapter.java
@@ -0,0 +1,26 @@
+package org.eclipse.jst.pagedesigner.viewer;
+
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+
+/**
+ * @author cbateman
+ * 
+ * Default adapter class for IHTMLGraphicalViewerListener
+ *
+ */
+public abstract class HTMLGraphicalViewerListenenerAdapter implements
+        IHTMLGraphicalViewerListener {
+
+    public void selectionAboutToChange() {
+        // do nothing -- override to implement
+    }
+
+    public void selectionChangeFinished() {
+        // do nothing -- override to implement
+    }
+
+    public void selectionChanged(SelectionChangedEvent event) {
+        // do nothing == override to implement
+    }
+
+}
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewer.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewer.java
index 44e8452..6ee3ce4 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewer.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewer.java
@@ -13,24 +13,56 @@
 
 import org.eclipse.draw2d.Viewport;
 import org.eclipse.gef.GraphicalViewer;
+import org.eclipse.jface.action.IStatusLineManager;
+import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.swt.widgets.Caret;
+import org.eclipse.ui.IEditorPart;
 import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel;
 
 /**
  * @author mengbo
  */
-public interface IHTMLGraphicalViewer extends GraphicalViewer {
+public interface IHTMLGraphicalViewer extends GraphicalViewer 
+{
+    /**
+     * Factory for IHTMLGraphicalViewers
+     *
+     */
+    static class Factory
+    {
+        /**
+         * @param part 
+         * @return a new graphical viewer for part
+         */
+        public static IHTMLGraphicalViewer createGraphicalViewer(IEditorPart part)
+        {
+            return new HTMLGraphicalViewer(part);
+        }
+    }
+
+	/**
+	 * @return the dom model
+	 */
 	public IDOMModel getModel();
 
+	/**
+	 * ensure we are in range selection mode
+	 */
 	public void ensureRangeSelectionMode();
 
+	/**
+	 * 
+	 */
 	public void ensureObjectSelectionMode();
 
 	/**
-	 * @return
+	 * @return true if in range mode
 	 */
 	public boolean isInRangeMode();
 
+	/**
+	 * @return the current selection range
+	 */
 	public DesignRange getRangeSelection();
 
 	/**
@@ -44,6 +76,9 @@
 	 */
 	public void setRangeEndPosition(DesignPosition position);
 
+	/**
+	 * @return the caret
+	 */
 	public Caret getCaret();
 
 	/**
@@ -59,5 +94,46 @@
 	 */
 	public void selectionChanged();
 
+	/**
+	 * @return the view port
+	 */
 	public Viewport getViewport();
+	
+	/**
+	 * @return the status line manager
+	 */
+	public IStatusLineManager getStatusLineManager();
+	
+	/**
+	 * @param newSelection
+	 */
+	public void updateRangeSelection(ISelection newSelection);
+	
+	/**
+	 * Update the horizontal position
+	 */
+	public void updateHorizontalPos();
+
+	/**
+	 * Clear the selection to null. When the model is modified, the selection is
+     * invalid, so we need to clear the selection. We change the selection
+     * directly, it won't need to fire selectionchange event to other part.
+     */
+	public void clearSelectionRange();
+
+	/**
+     * Adds listener both as a selection changed listener and as an
+     * {@link IHTMLGraphicalViewerListener}.  Callers of this method
+     * need not call addSelectionChangedListener.
+     * @param listener
+     */
+    public void addHTMLViewerListener(IHTMLGraphicalViewerListener listener);
+    
+    /**
+     * Removes listener both as a selection changed listener and as an
+     * {@link IHTMLGraphicalViewerListener}.  Callers of this method
+     * need not call removeSelectionChangedListener.
+     * @param listener
+     */
+    public void removeHTMLViewerListener(IHTMLGraphicalViewerListener listener);
 }
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewerListener.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewerListener.java
index 6d16c47..0d48ca9 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewerListener.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/IHTMLGraphicalViewerListener.java
@@ -17,7 +17,14 @@
  * @author mengbo
  */
 public interface IHTMLGraphicalViewerListener extends ISelectionChangedListener {
+	/**
+	 * Fired before selection changes
+	 */
 	public void selectionAboutToChange();
 
+	/**
+	 * Fired after selection changed listeners have all been processed
+	 * for a change
+	 */
 	public void selectionChangeFinished();
 }
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/LayoutPart.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/LayoutPart.java
index 28c74de..15b3998 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/LayoutPart.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/LayoutPart.java
@@ -38,7 +38,7 @@
 /**
  * @author mengbo
  */
-public class LayoutPart {
+public final  class LayoutPart {
 	private final static int MAX_OFFSET_TO_EDGE = 10;
 
 	private EditPart _part;
@@ -96,8 +96,7 @@
 	/**
 	 * Try to get the closest flowbox absolute bounds.
 	 * 
-	 * @param point
-	 * @return
+	 * @return the bounding rectangle
 	 */
 	public Rectangle getAbsoluteBounds() {
 		Rectangle bounds = null;
@@ -111,8 +110,8 @@
 	/**
 	 * Get box's absolute bounds.
 	 * 
-	 * @param point
-	 * @return
+	 * @param box
+	 * @return the box's bounding rectangle
 	 */
 	public Rectangle getAbsoluteBounds(FlowBox box) {
 		if (box != null) {
@@ -180,12 +179,15 @@
 	 * The point is whitin the bounds of the figure.
 	 * 
 	 * @param point
-	 * @return
+	 * @return true if point is the absolute bounds of this
 	 */
 	public boolean contains(Point point) {
 		return getAbsoluteBounds().contains(point);
 	}
 
+	/**
+	 * @return the design position
+	 */
 	public DesignPosition resolveTextPosition() {
 		DesignPosition result = null;
 		if (_part instanceof TextEditPart
@@ -208,16 +210,18 @@
 		return result;
 	}
 
+	/**
+	 * @param validator
+	 * @return resolve the design position using validator
+	 */
 	public DesignPosition resolvePosition(IPositionMediator validator) {
 		DesignPosition result;
 		if ((result = resolveTextPosition()) == null) {
-			boolean atPointLeft = false;
-			boolean atPointRight = false;
-			atPointLeft = isBeforePoint(_point);
-			atPointRight = isAfterPoint(_point);
-			if (!(atPointLeft ^ atPointRight)) {
-			    // TODO: and...?
-			}
+			boolean atPointLeft = isBeforePoint(_point);
+//			boolean atPointRight = isAfterPoint(_point);
+//			if (atPointLeft == atPointRight) {
+//			    // TODO: and...?
+//			}
 			Target target = new Target(getPart());
 			if (validator.isValidPosition(new DOMRefPosition(target.getNode(),
 					atPointLeft))) {
@@ -242,7 +246,7 @@
 //		return ((GraphicalEditPart) _part).getFigure();
 //	}
 
-	public boolean isAfterPoint(Point point) {
+	private boolean isAfterPoint(Point point) {
 		boolean result = false;
 		FlowBox flowBox = getLine(0);
 		if (IHTMLConstants.TAG_BR.equalsIgnoreCase(Target.resolveNode(_part)
@@ -273,14 +277,7 @@
 
 	}
 
-	/**
-	 * EditPart is at point's left
-	 * 
-	 * @param part
-	 * @param point
-	 * @return
-	 */
-	public boolean isBeforePoint(Point point) {
+	/*package*/ boolean isBeforePoint(Point point) {
 		boolean result = false;
 		FlowBox flowBox = getLastLine();
 		if (flowBox != null) {
@@ -305,11 +302,11 @@
 		// return !isAfterPoint(point);
 	}
 
-	public boolean isBeforePoint() {
+	/*package*/ boolean isBeforePoint() {
 		return isBeforePoint(_point);
 	}
 
-	public boolean atLeftPart(Point point) {
+	/*package*/ boolean atLeftPart(Point point) {
 		FlowBox flowBox = getBox();
 		if (flowBox != null) {
 			Rectangle boxRect = getAbsoluteBounds(flowBox);
@@ -318,21 +315,22 @@
 		return true;
 	}
 
-	public boolean isAfterPoint() {
+	/*package*/ boolean isAfterPoint() {
 		return isAfterPoint(_point);
 	}
 
-	public boolean atSameLine(Point point) {
-		Rectangle bounds = getAbsoluteBounds();
-		return bounds.contains(bounds.getTop().x, point.y);
-	}
+	// TODO: dead but possibly useful?
+//	private boolean atSameLine(Point point) {
+//		Rectangle bounds = getAbsoluteBounds();
+//		return bounds.contains(bounds.getTop().x, point.y);
+//	}
 
-	public boolean atSameRow(Point point) {
+	/*package*/ boolean atSameRow(Point point) {
 		Rectangle bounds = getAbsoluteBounds();
 		return bounds.contains(point.x, bounds.getRight().y);
 	}
 
-	public static Rectangle getBounds(FlowBox box) {
+	/*package*/ static Rectangle getBounds(FlowBox box) {
 		return new Rectangle(box._x, box._y, box.getWidth(), box.getHeight());
 	}
 
@@ -383,13 +381,11 @@
 
 	/**
 	 * To search for none empty string, this is not final.
+	 * @param part 
+	 * @return the edit part
 	 * 
-	 * @param lineBox
-	 * @param host
-	 * @param rect
-	 * @param validator
 	 */
-	public static EditPart getConcretePart(EditPart part) {
+	/*package*/ static EditPart getConcretePart(EditPart part) {
 		if (part != null) {
 			Node node = Target.resolveNode(part);
 			Node child = node.getFirstChild();
@@ -407,16 +403,19 @@
 
 	/**
 	 * To search for none empty string, this is not final.
+	 * Equivalent to getConcretePart(getPart())
 	 * 
-	 * @param lineBox
-	 * @param host
-	 * @param rect
-	 * @param validator
+	 * @return the edit part
+	 * 
 	 */
 	public EditPart getConcretePart() {
 		return getConcretePart(_part);
 	}
 
+	/**
+	 * @param node
+	 * @return the node
+	 */
 	public static Node getConcreteNode(Node node) {
 		if (node != null) {
 			Node child = node.getFirstChild();
@@ -430,6 +429,9 @@
 		return null;
 	}
 
+	/**
+	 * @return true if is close to edge
+	 */
 	public boolean isCloseToEdgeFromOutSide() {
 		boolean result = false;
 		if (EditModelQuery.isBlockNode(Target.resolveNode(_part))) {
@@ -449,7 +451,10 @@
 		return getAbsoluteBounds().getTop().y >= _point.y;
 	}
 
-	public boolean isInline() {
+	/**
+	 * @return tru if getPart() is considered inline
+	 */
+	/*package*/ boolean isInline() {
 		return EditModelQuery.isInline(Target.resolveNode(_part));
 	}
 
diff --git a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/TextPosition.java b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/TextPosition.java
index a88c86b..46850b4 100644
--- a/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/TextPosition.java
+++ b/jsf/plugins/org.eclipse.jst.pagedesigner/src/org/eclipse/jst/pagedesigner/viewer/TextPosition.java
@@ -39,7 +39,7 @@
 	/**
 	 * if _containerPart is null, means it is invalid
 	 * 
-	 * @return
+	 * @return the text node
 	 */
 	public IDOMText getTextNode() {
 		return _containerNode;
@@ -48,12 +48,15 @@
 	/**
 	 * if offset < 0, means it is invalid.
 	 * 
-	 * @return
+	 * @return the offset
 	 */
 	public int getOffset() {
 		return _offset;
 	}
 
+	/**
+	 * @return if this position is considered valid
+	 */
 	public boolean isValid() {
 		return _containerNode != null && _offset >= 0;
 	}
@@ -71,4 +74,14 @@
 		}
 		return false;
 	}
+
+    @Override
+    public int hashCode() 
+    {
+        // match hash code to equals criteria
+        return System.identityHashCode(getTextNode()) 
+                ^ System.identityHashCode(Integer.valueOf(getOffset()));
+    }
+	
+	
 }
