[112522] Need snippets extension point
diff --git a/org.eclipse.wst.common.snippets/.options b/org.eclipse.wst.common.snippets/.options
new file mode 100644
index 0000000..2c67355
--- /dev/null
+++ b/org.eclipse.wst.common.snippets/.options
@@ -0,0 +1,6 @@
+org.eclipse.wst.common.snippets/debug=false
+org.eclipse.wst.common.snippets/debug/tracefilter=
+org.eclipse.wst.common.snippets/debug/definition_persistence=false
+org.eclipse.wst.common.snippets/debug/drag_and_drop=false
+org.eclipse.wst.common.snippets/debug/palette_selection=false
+org.eclipse.wst.common.snippets/debug/viewer_content=false
diff --git a/org.eclipse.wst.common.snippets/META-INF/MANIFEST.MF b/org.eclipse.wst.common.snippets/META-INF/MANIFEST.MF
index d6b1413..24a7bda 100644
--- a/org.eclipse.wst.common.snippets/META-INF/MANIFEST.MF
+++ b/org.eclipse.wst.common.snippets/META-INF/MANIFEST.MF
@@ -6,17 +6,17 @@
 Bundle-Activator: org.eclipse.wst.common.snippets.internal.SnippetsPlugin
 Bundle-Vendor: Eclipse.org
 Bundle-Localization: plugin
-Export-Package: org.eclipse.wst.common.snippets.internal,
+Export-Package: org.eclipse.wst.common.snippets.core,
+ org.eclipse.wst.common.snippets.internal,
  org.eclipse.wst.common.snippets.internal.actions,
  org.eclipse.wst.common.snippets.internal.dnd,
  org.eclipse.wst.common.snippets.internal.editors,
  org.eclipse.wst.common.snippets.internal.model,
  org.eclipse.wst.common.snippets.internal.palette,
- org.eclipse.wst.common.snippets.internal.provisional,
- org.eclipse.wst.common.snippets.internal.provisional.insertions,
  org.eclipse.wst.common.snippets.internal.team,
  org.eclipse.wst.common.snippets.internal.ui,
- org.eclipse.wst.common.snippets.internal.util
+ org.eclipse.wst.common.snippets.internal.util,
+ org.eclipse.wst.common.snippets.ui
 Require-Bundle: org.eclipse.gef,
  org.eclipse.ui.ide,
  org.eclipse.ui.workbench.texteditor,
diff --git a/org.eclipse.wst.common.snippets/component.xml b/org.eclipse.wst.common.snippets/component.xml
index 904bd4e..5550dde 100644
--- a/org.eclipse.wst.common.snippets/component.xml
+++ b/org.eclipse.wst.common.snippets/component.xml
@@ -4,4 +4,13 @@
 	<component-depends unrestricted="true"/>
 	<plugin id="org.eclipse.wst.common.snippets"  fragment="false" />
 	<description url="http://eclipse.org/webtools/wst/components/common/overview/snippets/overview.html" />
+	<package name="org.eclipse.wst.common.snippets.core">
+		<type name="ISnippetCategory" implement="false" />
+		<type name="ISnippetEntry" implement="false" />
+		<type name="ISnippetItem" implement="false" />
+	</package>
+	<package name="org.eclipse.wst.common.snippets.ui">
+		<type name="DefaultSnippetInsertion" subclass="true" instantiate="true" />
+		<type name="ISnippetInsertion" implement="false" />
+	</package>
 </component>
diff --git a/org.eclipse.wst.common.snippets/schema/SnippetContributions.exsd b/org.eclipse.wst.common.snippets/schema/SnippetContributions.exsd
index 9d64ef2..4f62fb1 100644
--- a/org.eclipse.wst.common.snippets/schema/SnippetContributions.exsd
+++ b/org.eclipse.wst.common.snippets/schema/SnippetContributions.exsd
@@ -27,7 +27,7 @@
                </documentation>
             </annotation>
          </attribute>
-         <attribute name="icon" type="string">
+         <attribute name="smallicon" type="string">
             <annotation>
                <documentation>
                   The small icon to show for this category.  The value of this attributes specifies a path relative to the plugin&apos;s installation folder.
@@ -58,10 +58,10 @@
                </documentation>
             </annotation>
          </attribute>
-         <attribute name="filetypes" type="string">
+         <attribute name="extensions" type="string">
             <annotation>
                <documentation>
-                  A list of file types identical to that used to register editors.  If the Snippets View has its drawer visibility tied to the active editor, the drawer will be hidden unless the filename from the active editor matches a value from this attribute&apos;s value.  More than one value may be specified if separated by commas.
+                  A list of filename extensions identical to that used to register editors.  If the Snippets View has its drawer visibility tied to the active editor, the drawer will be hidden unless the filename from the active editor matches a value from this attribute&apos;s value.  More than one value may be specified if separated by commas.
                </documentation>
             </annotation>
          </attribute>
@@ -100,14 +100,7 @@
                </documentation>
             </annotation>
          </attribute>
-         <attribute name="editorclass" type="string">
-            <annotation>
-               <documentation>
-                  An implementation of org.eclipse.wst.common.snippets.editors.ISnippetEditor.  When the user brings up the Customizer dialog, selecting an item from the left-hand tree will display an editing page on the right.  Snippets will provide controls for editing the name and description of an item in addition to any controls provided by the editorclass.  A new instance of the class is used for every item being edited.  The default class, org.eclipse.wst.common.snippets.editors.VariableItemEditor provides a table for creating and editing variables and a text editor for the content.
-               </documentation>
-            </annotation>
-         </attribute>
-         <attribute name="icon" type="string">
+         <attribute name="smallicon" type="string">
             <annotation>
                <documentation>
                   The small icon to show for this item.  The value of this attributes specifies a path relative to the plugin&apos;s installation folder.
@@ -202,14 +195,14 @@
    &lt;extension
          point=&quot;org.eclipse.wst.common.snippets.SnippetContributions&quot;&gt;
       &lt;category
-            icon=&quot;icons/tag-jsp.gif&quot;
+            smallicon=&quot;icons/tag-jsp.gif&quot;
             label=&quot;JSP&quot;
             description=&quot;Java Server Pages&quot;
             id=&quot;org.eclipse.wst.jsp.category0&quot;
             contenttypes=&quot;org.eclipse.wst.jsp.core.jspsource&quot;
-            filetypes=&quot;*.jsp, *.jsf, *.jspf&quot;&gt;
+            extensions=&quot;*.jsp, *.jsf, *.jspf&quot;&gt;
         &lt;item
-              icon=&quot;icons/tag-generic.gif&quot;
+              smallicon=&quot;icons/tag-generic.gif&quot;
               label=&quot;%jsp_hidden_comment&quot;
               id=&quot;org.eclipse.wst.jsp.jsp_hidden_comment&quot;&gt;
            &lt;content&gt;
@@ -224,7 +217,7 @@
            &lt;/content&gt;
         &lt;/item&gt;
         &lt;item
-              icon=&quot;icons/jsptaglib.gif&quot;
+              smallicon=&quot;icons/jsptaglib.gif&quot;
               label=&quot;%jsp_taglib_directive&quot;
               class=&quot;org.eclipse.wst.common.snippets.insertions.PrependInsertion&quot;
               id=&quot;org.eclipse.wst.jsp.jsp_taglib_directive&quot;&gt;
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ISnippetCategory.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/core/ISnippetCategory.java
similarity index 60%
rename from org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ISnippetCategory.java
rename to org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/core/ISnippetCategory.java
index a2f5f09..b5d9960 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ISnippetCategory.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/core/ISnippetCategory.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
+ * Copyright (c) 2005 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,20 +8,8 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
-
-
-package org.eclipse.wst.common.snippets.internal;
-
-import java.util.List;
-
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetsEntry;
+package org.eclipse.wst.common.snippets.core;
 
 public interface ISnippetCategory extends ISnippetsEntry {
-
-	void add(ISnippetItem item);
-
-	List getChildren();
-
-	void remove(ISnippetItem item);
+	ISnippetItem[] getItems();
 }
\ No newline at end of file
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/core/ISnippetItem.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/core/ISnippetItem.java
new file mode 100644
index 0000000..a0d3b49
--- /dev/null
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/core/ISnippetItem.java
@@ -0,0 +1,33 @@
+/*******************************************************************************
+ * Copyright (c) 2005 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.snippets.core;
+
+/**
+ * A snippet item is the actual object draggable from the Snippets view.
+ */
+public interface ISnippetItem extends ISnippetsEntry {
+	/**
+	 * @return the category holding this item
+	 */
+	ISnippetCategory getCategory();
+
+	/**
+	 * @return the content string for this item; the text inserted may not be
+	 *         identical
+	 */
+	String getContentString();
+
+	/**
+	 * @return an array containing all of the valid variables for this item
+	 */
+	ISnippetVariable[] getVariables();
+}
\ No newline at end of file
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ISnippetVariable.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/core/ISnippetVariable.java
similarity index 64%
rename from org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ISnippetVariable.java
rename to org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/core/ISnippetVariable.java
index ce15049..6522fe0 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ISnippetVariable.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/core/ISnippetVariable.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
+ * Copyright (c) 2005 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -8,34 +8,22 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
-package org.eclipse.wst.common.snippets.internal;
+package org.eclipse.wst.common.snippets.core;
 
 public interface ISnippetVariable {
 	/**
-	 * Gets the defaultValue.
-	 * 
-	 * @return Returns a String
+	 * @return Returns the default value for this variable
 	 */
 	String getDefaultValue();
 
 	/**
-	 * Gets the description.
-	 * 
-	 * @return Returns a String
+	 * @return Returns the description of this variable
 	 */
 	String getDescription();
 
 	/**
-	 * Gets the id.
 	 * 
-	 * @return Returns a String
-	 */
-	String getId();
-
-	/**
-	 * Gets the name.
-	 * 
-	 * @return Returns a String
+	 * @return Returns the name of this variable.
 	 */
 	String getName();
 }
\ No newline at end of file
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/core/ISnippetsEntry.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/core/ISnippetsEntry.java
new file mode 100644
index 0000000..0681581
--- /dev/null
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/core/ISnippetsEntry.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+
+package org.eclipse.wst.common.snippets.core;
+
+/**
+ * A Snippets Entry is an abstract notion encapsulating the values used to
+ * represent Snippet Items and Containers. No object implements only this
+ * interface.
+ */
+
+public interface ISnippetsEntry {
+
+	/**
+	 * Denotes that this entry was contributed by a plug-in
+	 */
+	String SNIPPET_SOURCE_PLUGINS = "PLUGINS"; //$NON-NLS-1$
+
+	/**
+	 * Denotes that this entry was created by the user
+	 */
+	String SNIPPET_SOURCE_USER = "USER"; //$NON-NLS-1$
+
+	/**
+	 * Denotes that this entry was discovered within the workspace
+	 * 
+	 */
+	String SNIPPET_SOURCE_WORKSPACE = "WORKSPACE"; //$NON-NLS-1$
+
+	/**
+	 * @return a longer description to display for this item
+	 */
+	String getDescription();
+	
+	String[] getFilters();
+
+	/**
+	 * @return the label to display for this item
+	 */
+	String getLabel();
+
+	/**
+	 * @return the object defining where this entry originated from. Valid
+	 *         values are instances of CategoryFileInfo and PluginRecord.
+	 */
+	Object getSourceDescriptor();
+
+	/**
+	 * @return the type of the source descriptor. Valid values are
+	 *         SNIPPET_SOURCE_PLUGINS, SNIPPET_SOURCE_USER, and
+	 *         SNIPPET_SOURCE_WORKSPACE.
+	 */
+	Object getSourceType();
+}
\ No newline at end of file
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/Debug.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/Debug.java
deleted file mode 100644
index f5ba01e..0000000
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/Debug.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.common.snippets.internal;
-
-/**
- * <p>
- * SSE Snippets Plug-in Debug flags
- * </p>
- * <p>
- * This class contains constants only; it is not intended to be extended.
- * </p>
- */
-public class Debug {
-	/**
-	 * Controls debugging output for loading/storing of the Snippets model
-	 */
-	public static final boolean debugDefinitionPersistence = false;
-
-	/**
-	 * Controls debugging output for drag and drop processing
-	 */
-	public static final boolean debugDragAndDrop = false;
-
-	/**
-	 * Controls debugging output for selection within the view
-	 */
-	public static final boolean debugPaletteSelection = false;
-	/**
-	 * Controls debugging output for replacement of the model's category list
-	 */
-	public static final boolean debugViewerContent = false;
-}
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/EntrySorter.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/EntrySorter.java
index 33f87b4..8486189 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/EntrySorter.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/EntrySorter.java
@@ -16,8 +16,9 @@
 import java.util.Arrays;
 import java.util.List;
 
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetsEntry;
+import org.eclipse.wst.common.snippets.core.ISnippetCategory;
+import org.eclipse.wst.common.snippets.core.ISnippetItem;
+import org.eclipse.wst.common.snippets.core.ISnippetsEntry;
 import org.eclipse.wst.common.snippets.internal.util.Sorter;
 
 public class EntrySorter extends Sorter {
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ISnippetManager.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ISnippetManager.java
index 7db68ce..fe11c6e 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ISnippetManager.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ISnippetManager.java
@@ -10,7 +10,7 @@
  *******************************************************************************/
 package org.eclipse.wst.common.snippets.internal;
 
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetsEntry;
+import org.eclipse.wst.common.snippets.core.ISnippetsEntry;
 
 /**
  * <p>
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/Logger.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/Logger.java
index c3b7578..7b3131c 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/Logger.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/Logger.java
@@ -23,6 +23,23 @@
  * plugin. Other plugins should make their own copy, with appropriate ID.
  */
 public class Logger {
+	/**
+	 * Controls debugging output for loading/storing of the Snippets model
+	 */
+	public static final boolean DEBUG_DEFINITION_PERSISTENCE = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.common.snippets/debug/definition_persistence")); //$NON-NLS-1$
+	/**
+	 * Controls debugging output for drag and drop processing
+	 */
+	public static final boolean DEBUG_DRAG_AND_DROP = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.common.snippets/debug/drag_and_drop")); //$NON-NLS-1$
+	/**
+	 * Controls debugging output for selection within the view
+	 */
+	public static final boolean DEBUG_PALETTE_SELECTION = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.common.snippets/debug/palette_selection")); //$NON-NLS-1$
+	/**
+	 * Controls debugging output for replacement of the model's category list
+	 */
+	public static final boolean DEBUG_VIEWER_CONTENT = "true".equalsIgnoreCase(Platform.getDebugOption("org.eclipse.wst.common.snippets/debug/viewer_content")); //$NON-NLS-1$
+
 	public static final int ERROR = IStatus.ERROR; // 4
 	public static final int ERROR_DEBUG = 200 + ERROR;
 	private static Plugin fPlugin = SnippetsPlugin.getDefault();
@@ -31,10 +48,10 @@
 	public static final int INFO_DEBUG = 200 + INFO;
 
 	public static final int OK = IStatus.OK; // 0
-
 	public static final int OK_DEBUG = 200 + OK;
 
 	private static final String TRACEFILTER_LOCATION = "/debug/tracefilter"; //$NON-NLS-1$
+
 	public static final int WARNING = IStatus.WARNING; // 2
 	public static final int WARNING_DEBUG = 200 + WARNING;
 
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/SnippetDefinitions.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/SnippetDefinitions.java
index 2ad7bc0..aebf16e 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/SnippetDefinitions.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/SnippetDefinitions.java
@@ -14,7 +14,10 @@
 import java.util.Iterator;
 import java.util.List;
 
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
+import org.eclipse.wst.common.snippets.core.ISnippetCategory;
+import org.eclipse.wst.common.snippets.core.ISnippetItem;
+import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteDrawer;
+import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteItem;
 
 
 /**
@@ -52,7 +55,7 @@
 	public ISnippetCategory getCategory(String id) {
 		Iterator iterator = getCategories().iterator();
 		while (iterator.hasNext()) {
-			ISnippetCategory category = (ISnippetCategory) iterator.next();
+			SnippetPaletteDrawer category = (SnippetPaletteDrawer) iterator.next();
 			if (category.getId().equals(id))
 				return category;
 		}
@@ -68,7 +71,7 @@
 	public ISnippetItem getItem(String id) {
 		Iterator iterator = getItems().iterator();
 		while (iterator.hasNext()) {
-			ISnippetItem item = (ISnippetItem) iterator.next();
+			SnippetPaletteItem item = (SnippetPaletteItem) iterator.next();
 			if (item.getId().equals(id))
 				return item;
 		}
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/SnippetsPlugin.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/SnippetsPlugin.java
index fd7f1c0..4ddd3a2 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/SnippetsPlugin.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/SnippetsPlugin.java
@@ -44,13 +44,13 @@
 		String VERSION = "version"; //$NON-NLS-1$
 		String VIEW_ID = "org.eclipse.wst.common.snippets.internal.ui.SnippetsView"; //$NON-NLS-1$
 	}
-	
-	public static final String BUNDLE_ID = "org.eclipse.wst.common.snippets";  //$NON-NLS-1$
+
+	public static final String BUNDLE_ID = "org.eclipse.wst.common.snippets"; //$NON-NLS-1$
 
 	/**
 	 * The shared instance
 	 */
-	private static SnippetsPlugin fInstance;	
+	private static SnippetsPlugin fInstance;
 
 	/**
 	 * Returns the shared instance.
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/VariableInsertionDialog.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/VariableInsertionDialog.java
index ddf9250..49ace3b 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/VariableInsertionDialog.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/VariableInsertionDialog.java
@@ -34,7 +34,9 @@
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Text;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
+import org.eclipse.wst.common.snippets.core.ISnippetItem;
+import org.eclipse.wst.common.snippets.core.ISnippetVariable;
+import org.eclipse.wst.common.snippets.internal.palette.SnippetVariable;
 import org.eclipse.wst.common.snippets.internal.ui.StringPropertyTableViewer;
 import org.eclipse.wst.common.snippets.internal.ui.ValueChangedListener;
 import org.eclipse.wst.common.snippets.internal.util.StringUtils;
@@ -262,7 +264,7 @@
 			return null;
 		ISnippetVariable[] variables = fItem.getVariables();
 		for (int i = 0; i < variables.length; i++) {
-			if (variables[i].getId().equals(id))
+			if (((SnippetVariable) variables[i]).getId().equals(id))
 				return variables[i];
 		}
 		return null;
@@ -280,8 +282,8 @@
 	protected void populateTableViewer() {
 		ISnippetVariable[] variables = fItem.getVariables();
 		for (int i = 0; i < variables.length; i++) {
-			fTableViewer.getColumnData()[0].put(variables[i].getId(), variables[i].getName());
-			fTableViewer.getColumnData()[1].put(variables[i].getId(), variables[i].getDefaultValue());
+			fTableViewer.getColumnData()[0].put(((SnippetVariable) variables[i]).getId(), ((SnippetVariable) variables[i]).getName());
+			fTableViewer.getColumnData()[1].put(((SnippetVariable) variables[i]).getId(), ((SnippetVariable) variables[i]).getDefaultValue());
 		}
 	}
 
@@ -290,7 +292,7 @@
 		String text = fItem.getContentString();
 		ISnippetVariable[] variables = fItem.getVariables();
 		for (int i = 0; i < variables.length; i++) {
-			String value = (String) fTableViewer.getColumnData()[1].get(variables[i].getId());
+			String value = (String) fTableViewer.getColumnData()[1].get(((SnippetVariable) variables[i]).getId());
 			text = StringUtils.replace(text, "${" + variables[i].getName() + "}", value); //$NON-NLS-1$ //$NON-NLS-2$
 		}
 
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/VariableItemHelper.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/VariableItemHelper.java
index b7ded7e..979a2a5 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/VariableItemHelper.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/VariableItemHelper.java
@@ -16,7 +16,7 @@
 import org.eclipse.swt.events.DisposeEvent;
 import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
+import org.eclipse.wst.common.snippets.core.ISnippetItem;
 
 public class VariableItemHelper {
 
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/actions/AbstractCategoryAction.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/actions/AbstractCategoryAction.java
index 1e21bfe..ad6fc79 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/actions/AbstractCategoryAction.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/actions/AbstractCategoryAction.java
@@ -15,9 +15,9 @@
 import org.eclipse.gef.palette.PaletteEntry;
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.dialogs.IInputValidator;
-import org.eclipse.wst.common.snippets.internal.ISnippetCategory;
+import org.eclipse.wst.common.snippets.core.ISnippetCategory;
+import org.eclipse.wst.common.snippets.core.ISnippetItem;
 import org.eclipse.wst.common.snippets.internal.SnippetsMessages;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
 import org.eclipse.wst.common.snippets.internal.ui.SnippetsView;
 
 public abstract class AbstractCategoryAction extends Action {
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/actions/AbstractItemAction.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/actions/AbstractItemAction.java
index 781ea05..ea45a39 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/actions/AbstractItemAction.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/actions/AbstractItemAction.java
@@ -14,8 +14,8 @@
 import org.eclipse.gef.GraphicalViewer;
 import org.eclipse.gef.palette.PaletteEntry;
 import org.eclipse.jface.action.Action;
-import org.eclipse.wst.common.snippets.internal.ISnippetCategory;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
+import org.eclipse.wst.common.snippets.core.ISnippetCategory;
+import org.eclipse.wst.common.snippets.core.ISnippetItem;
 
 
 public abstract class AbstractItemAction extends Action {
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/actions/DeleteCategoryAction.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/actions/DeleteCategoryAction.java
index 30a739f..860816b 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/actions/DeleteCategoryAction.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/actions/DeleteCategoryAction.java
@@ -12,7 +12,7 @@
 
 import org.eclipse.gef.EditPart;
 import org.eclipse.gef.palette.PaletteContainer;
-import org.eclipse.wst.common.snippets.internal.ISnippetCategory;
+import org.eclipse.wst.common.snippets.core.ISnippetCategory;
 import org.eclipse.wst.common.snippets.internal.SnippetDefinitions;
 import org.eclipse.wst.common.snippets.internal.SnippetsMessages;
 import org.eclipse.wst.common.snippets.internal.SnippetsPlugin;
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/actions/DeleteItemAction.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/actions/DeleteItemAction.java
index 9cc36cc..9106b9b 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/actions/DeleteItemAction.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/actions/DeleteItemAction.java
@@ -13,9 +13,9 @@
 import org.eclipse.gef.EditPart;
 import org.eclipse.gef.GraphicalViewer;
 import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.wst.common.snippets.internal.ISnippetCategory;
 import org.eclipse.wst.common.snippets.internal.SnippetsMessages;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
+import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteDrawer;
+import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteItem;
 
 public class DeleteItemAction extends AbstractItemAction {
 
@@ -36,10 +36,10 @@
 
 	public void run() {
 		super.run();
-		ISnippetItem item = (ISnippetItem) getEntry();
+		SnippetPaletteItem item = (SnippetPaletteItem) getEntry();
 		EditPart itemPart = (EditPart) getViewer().getEditPartRegistry().get(item);
 		if (itemPart != null) {
-			ISnippetCategory category = item.getCategory();
+			SnippetPaletteDrawer category = (SnippetPaletteDrawer) item.getCategory();
 			EditPart categoryPart = itemPart.getParent();
 			category.remove(item);
 			categoryPart.refresh();
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/actions/LibraryItemUtility.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/actions/LibraryItemUtility.java
index eb3ee3b..4312b9a 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/actions/LibraryItemUtility.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/actions/LibraryItemUtility.java
@@ -12,19 +12,23 @@
 
 package org.eclipse.wst.common.snippets.internal.actions;
 
-import org.eclipse.wst.common.snippets.internal.ISnippetVariable;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
+import org.eclipse.wst.common.snippets.core.ISnippetItem;
+import org.eclipse.wst.common.snippets.core.ISnippetVariable;
+import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteItem;
 
 
 public class LibraryItemUtility {
 
-	public static void copyAttributes(ISnippetItem source, ISnippetItem target) {
+	public static void copyAttributes(ISnippetItem sourceItem, ISnippetItem targetItem) {
+		SnippetPaletteItem source = (SnippetPaletteItem) sourceItem;
+		SnippetPaletteItem target = (SnippetPaletteItem) targetItem;
+
 		target.setCategoryName(source.getCategoryName());
 		target.setClassName(source.getClassName());
 		target.setContentString(source.getContentString());
 		target.setDescription(source.getDescription());
 		target.setEditorClassName(source.getEditorClassName());
-		target.setIconName(source.getIconName());
+		target.setIconName(source.getSmallIconName());
 		target.setId(source.getId());
 		target.setLabel(source.getLabel());
 		target.setLargeIconName(source.getLargeIconName());
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/dnd/VariableTextDropAction.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/dnd/SnippetTextDropAction.java
similarity index 97%
rename from org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/dnd/VariableTextDropAction.java
rename to org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/dnd/SnippetTextDropAction.java
index 20ac163..890c6ac 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/dnd/VariableTextDropAction.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/dnd/SnippetTextDropAction.java
@@ -23,11 +23,11 @@
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.ui.IEditorPart;
 import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.common.snippets.core.ISnippetItem;
 import org.eclipse.wst.common.snippets.internal.VariableItemHelper;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
 import org.eclipse.wst.common.snippets.internal.ui.EntryDeserializer;
 
-public class VariableTextDropAction {
+public class SnippetTextDropAction {
 
 	protected String getInsertString(Shell host, ISnippetItem item) {
 		return VariableItemHelper.getInsertString(host, item, false);
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/dnd/VariableTextTransfer.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/dnd/SnippetTextTransfer.java
similarity index 82%
rename from org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/dnd/VariableTextTransfer.java
rename to org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/dnd/SnippetTextTransfer.java
index 2f42512..6a1ce48 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/dnd/VariableTextTransfer.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/dnd/SnippetTextTransfer.java
@@ -12,9 +12,9 @@
 
 import org.eclipse.swt.dnd.ByteArrayTransfer;
 
-public class VariableTextTransfer extends ByteArrayTransfer {
+public class SnippetTextTransfer extends ByteArrayTransfer {
 
-	private static VariableTextTransfer instance;
+	private static SnippetTextTransfer instance;
 
 	private static final String LOCAL_NAME = "Text with Variables" + System.currentTimeMillis(); //$NON-NLS-1$
 	private static final int LOCAL_TYPE = registerType(LOCAL_NAME);
@@ -22,9 +22,9 @@
 	private static String[] names = null;
 	private static int types[] = null;
 
-	public static VariableTextTransfer getTransferInstance() {
+	public static SnippetTextTransfer getTransferInstance() {
 		if (instance == null) {
-			instance = new VariableTextTransfer();
+			instance = new SnippetTextTransfer();
 			init();
 		}
 		return instance;
@@ -35,7 +35,7 @@
 		names = new String[]{LOCAL_NAME};
 	}
 
-	private VariableTextTransfer() {
+	private SnippetTextTransfer() {
 		super();
 	}
 
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/editors/ISnippetEditor.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/editors/ISnippetEditor.java
index 08c325c..9f2f8db 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/editors/ISnippetEditor.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/editors/ISnippetEditor.java
@@ -14,11 +14,14 @@
 import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
+import org.eclipse.wst.common.snippets.core.ISnippetItem;
+import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteItem;
 
 /**
  * A snippet editor is responsible for creating the interface from which a
  * user modifies a snippet item or category.
+ * 
+ * This interface is not meant to be implemented by clients.
  */
 public interface ISnippetEditor {
 
@@ -26,14 +29,16 @@
 	 * Adds a modify listener to this editor. Typically the UI surrounding
 	 * this editor will listen for modifications.
 	 * 
-	 * @param listener the to be added
+	 * @param listener
+	 *            the to be added
 	 */
 	void addModifyListener(ModifyListener listener);
 
 	/**
 	 * Fill-in the contents of an editing Dialog.
 	 * 
-	 * @param parent the parent composite for the editor's control
+	 * @param parent
+	 *            the parent composite for the editor's control
 	 * @return the main control provided by the editor
 	 */
 	Control createContents(Composite parent);
@@ -48,16 +53,19 @@
 	/**
 	 * Remove a modify listener from this editor. Typically the UI surrounding
 	 * this editor will listen for modifications.
-	 * @param listener the to be added
+	 * 
+	 * @param listener
+	 *            the to be added
 	 */
 	void removeModifyListener(ModifyListener listener);
 
 	/**
 	 * Set the ISnippetItem to edit.
 	 * 
-	 * @param item the item to edit
+	 * @param item
+	 *            the item to edit
 	 */
-	void setItem(ISnippetItem item);
+	void setItem(SnippetPaletteItem item);
 
 	/**
 	 * Update the ISnippetItem being edited, usually because the values of the
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/editors/VariableItemEditor.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/editors/VariableItemEditor.java
index 71ea449..34bf948 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/editors/VariableItemEditor.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/editors/VariableItemEditor.java
@@ -52,13 +52,14 @@
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Label;
-import org.eclipse.ui.help.WorkbenchHelp;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.wst.common.snippets.core.ISnippetItem;
+import org.eclipse.wst.common.snippets.core.ISnippetVariable;
 import org.eclipse.wst.common.snippets.internal.IHelpContextIds;
-import org.eclipse.wst.common.snippets.internal.ISnippetVariable;
 import org.eclipse.wst.common.snippets.internal.Logger;
 import org.eclipse.wst.common.snippets.internal.SnippetsMessages;
+import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteItem;
 import org.eclipse.wst.common.snippets.internal.palette.SnippetVariable;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
 import org.eclipse.wst.common.snippets.internal.ui.StringPropertyTableViewer;
 import org.eclipse.wst.common.snippets.internal.ui.ValueChangedListener;
 import org.eclipse.wst.common.snippets.internal.util.Sorter;
@@ -200,7 +201,7 @@
 	}
 
 	protected StyledText content = null;
-	protected ISnippetItem fItem = null;
+	protected SnippetPaletteItem fItem = null;
 	protected StringPropertyTableViewer fTableViewer = null;
 	private ModifyListener modifyListener = null;
 
@@ -218,7 +219,7 @@
 		// create the contents of the variable editing dialog
 
 		// the container for the variables fTableViewer and new/remove buttons
-		WorkbenchHelp.setHelp(parent, IHelpContextIds.DIALOG_EDIT_VARITEM);
+		PlatformUI.getWorkbench().getHelpSystem().setHelp(parent, IHelpContextIds.DIALOG_EDIT_VARITEM);
 
 		Composite variableComposite = new Composite(parent, SWT.NONE);
 		variableComposite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
@@ -253,7 +254,7 @@
 		// description, and default value.
 		ISnippetVariable[] variables = fItem.getVariables();
 		for (int i = 0; i < variables.length; i++) {
-			ISnippetVariable var = variables[i];
+			SnippetVariable var = (SnippetVariable) variables[i];
 			fTableViewer.getColumnData()[0].put(var.getId(), var.getName());
 			if (var.getDescription() != null)
 				fTableViewer.getColumnData()[1].put(var.getId(), var.getDescription());
@@ -500,7 +501,7 @@
 		});
 	}
 
-	public void setItem(ISnippetItem item) {
+	public void setItem(SnippetPaletteItem item) {
 		fItem = item;
 	}
 
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/model/SnippetManager.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/model/SnippetManager.java
index d0259d1..3c4c210 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/model/SnippetManager.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/model/SnippetManager.java
@@ -22,25 +22,21 @@
 
 import javax.xml.parsers.DocumentBuilder;
 
-import org.eclipse.core.resources.IWorkspaceRunnable;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
 import org.eclipse.gef.palette.PaletteContainer;
-import org.eclipse.wst.common.snippets.internal.Debug;
+import org.eclipse.wst.common.snippets.core.ISnippetCategory;
+import org.eclipse.wst.common.snippets.core.ISnippetsEntry;
 import org.eclipse.wst.common.snippets.internal.IEntryChangeListener;
-import org.eclipse.wst.common.snippets.internal.ISnippetCategory;
 import org.eclipse.wst.common.snippets.internal.ISnippetManager;
 import org.eclipse.wst.common.snippets.internal.Logger;
 import org.eclipse.wst.common.snippets.internal.SnippetDefinitions;
 import org.eclipse.wst.common.snippets.internal.SnippetsPlugin;
 import org.eclipse.wst.common.snippets.internal.palette.ModelFactoryForPlugins;
 import org.eclipse.wst.common.snippets.internal.palette.ModelFactoryForUser;
+import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteDrawer;
+import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteItem;
 import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteRoot;
 import org.eclipse.wst.common.snippets.internal.palette.UserModelDumper;
 import org.eclipse.wst.common.snippets.internal.palette.WorkspaceModelDumper;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetsEntry;
 import org.eclipse.wst.common.snippets.internal.team.CategoryFileInfo;
 import org.eclipse.wst.common.snippets.internal.util.CommonXML;
 import org.w3c.dom.Document;
@@ -104,13 +100,13 @@
 		List categories = defs.getCategories();
 		ISnippetsEntry match = null;
 		for (int i = 0; match == null && i < categories.size(); i++) {
-			ISnippetCategory category = (ISnippetCategory) categories.get(i);
+			SnippetPaletteDrawer category = (SnippetPaletteDrawer) categories.get(i);
 			if (category.getId().equals(id)) {
 				match = category;
 			}
 			else {
 				for (int j = 0; match == null && j < category.getChildren().size(); j++) {
-					ISnippetsEntry item = (ISnippetsEntry) category.getChildren().get(j);
+					SnippetPaletteItem item = (SnippetPaletteItem) category.getChildren().get(j);
 					if (item.getId().equals(id)) {
 						match = item;
 					}
@@ -157,7 +153,12 @@
 				for (int i = 0; i < hiddenIDs.length; i++) {
 					ISnippetsEntry entry = findEntry(definitions, hiddenIDs[i]);
 					if (entry != null) {
-						entry.setVisible(false);
+						if (entry instanceof SnippetPaletteItem) {
+							((SnippetPaletteItem) entry).setVisible(false);
+						}
+						if (entry instanceof SnippetPaletteDrawer) {
+							((SnippetPaletteDrawer) entry).setVisible(false);
+						}
 					}
 				}
 			}
@@ -191,14 +192,14 @@
 		// break
 		// this into extensions with providers)
 		SnippetDefinitions pluginDefs = ModelFactoryForPlugins.getInstance().loadCurrent();
-		if (Debug.debugDefinitionPersistence)
+		if (Logger.DEBUG_DEFINITION_PERSISTENCE)
 			System.out.println("SnippetManager loaded " + pluginDefs.getCategories().size() + " categories from plug-ins"); //$NON-NLS-1$ //$NON-NLS-2$
 		SnippetDefinitions userDefs = ModelFactoryForUser.getInstance().loadCurrent();
-		if (Debug.debugDefinitionPersistence)
+		if (Logger.DEBUG_DEFINITION_PERSISTENCE)
 			System.out.println("SnippetManager loaded " + userDefs.getCategories().size() + " records for categories from user.xml"); //$NON-NLS-1$ //$NON-NLS-2$
 		// SnippetDefinitions sharedDefs =
 		// ModelFactoryForWorkspace.getInstance().loadCurrent();
-		// if (Debug.debugDefinitionPersistence)
+		// if (Logger.debugDefinitionPersistence)
 		// System.out.println("SnippetManager loaded " +
 		// userDefs.getCategories().size() + " records for categories from
 		// workspace"); //$NON-NLS-1$ //$NON-NLS-2$
@@ -210,7 +211,7 @@
 		// Merge plugin drawers by replacing the placeholder drawers with the
 		// ones generated from the plugins
 		for (int i = 0; i < pluginDefs.getCategories().size(); i++) {
-			ISnippetCategory category = (ISnippetCategory) pluginDefs.getCategories().get(i);
+			SnippetPaletteDrawer category = (SnippetPaletteDrawer) pluginDefs.getCategories().get(i);
 			String id = category.getId();
 			ISnippetsEntry existingEntry = findEntry(defs, id);
 			int existingIndex = defs.getCategories().indexOf(existingEntry);
@@ -233,7 +234,7 @@
 		// well.
 		Iterator it = defs.getCategories().iterator();
 		while (it.hasNext()) {
-			ISnippetCategory category = (ISnippetCategory) it.next();
+			SnippetPaletteDrawer category = (SnippetPaletteDrawer) it.next();
 			if (category.getSourceType() != ISnippetsEntry.SNIPPET_SOURCE_USER && category.getChildren().isEmpty())
 				it.remove();
 		}
@@ -290,7 +291,7 @@
 				results = (String[]) names.toArray(results);
 			}
 		}
-		if (Debug.debugDefinitionPersistence)
+		if (Logger.DEBUG_DEFINITION_PERSISTENCE)
 			System.out.println("SnippetManager remembered " + results.length + " hidden categories"); //$NON-NLS-1$ //$NON-NLS-2$
 		return results;
 	}
@@ -334,12 +335,12 @@
 
 		// save the list of categories to not see
 		saveHiddenState();
-		if (Debug.debugDefinitionPersistence)
+		if (Logger.DEBUG_DEFINITION_PERSISTENCE)
 			System.out.println("SnippetManager saved hidden state"); //$NON-NLS-1$
 
 		// save the model
 		UserModelDumper.getInstance().write(getDefinitions());
-		if (Debug.debugDefinitionPersistence)
+		if (Logger.DEBUG_DEFINITION_PERSISTENCE)
 			System.out.println("SnippetManager wrote user records"); //$NON-NLS-1$
 		List categories = getDefinitions().getCategories();
 		final List workspaceCategories = new ArrayList();
@@ -352,22 +353,16 @@
 				}
 			}
 		}
-		IWorkspaceRunnable operation = new IWorkspaceRunnable() {
-
-			public void run(IProgressMonitor monitor) throws CoreException {
-				for (int i = 0; i < workspaceCategories.size(); i++) {
-					CategoryFileInfo info = (CategoryFileInfo) workspaceCategories.get(i);
-					if (Debug.debugDefinitionPersistence)
-						System.out.println("save workspace category: " + info.getCategory().getLabel()); //$NON-NLS-1$
-					WorkspaceModelDumper.getInstance().write(info.getCategory(), info.getFile());
-				}
+		for (int i = 0; i < workspaceCategories.size(); i++) {
+			CategoryFileInfo info = (CategoryFileInfo) workspaceCategories.get(i);
+			try {
+				if (Logger.DEBUG_DEFINITION_PERSISTENCE)
+					System.out.println("save workspace category: " + info.getCategory().getLabel()); //$NON-NLS-1$
+				WorkspaceModelDumper.getInstance().write(info.getCategory(), info.getFile());
 			}
-		};
-		try {
-			ResourcesPlugin.getWorkspace().run(operation, new NullProgressMonitor());
-		}
-		catch (Exception e) {
-			Logger.logException(e);
+			catch (Exception e) {
+				Logger.logException(e);
+			}
 		}
 	}
 
@@ -382,12 +377,12 @@
 			List itemIDs = new ArrayList(0);
 			// collect all of the hidden entry IDs
 			for (int i = 0; i < getDefinitions().getCategories().size(); i++) {
-				ISnippetCategory category = (ISnippetCategory) getDefinitions().getCategories().get(i);
+				SnippetPaletteDrawer category = (SnippetPaletteDrawer) getDefinitions().getCategories().get(i);
 				if (!category.isVisible() && !categoryIDs.contains(category.getId())) {
 					categoryIDs.add(category.getId());
 				}
 				for (int j = 0; j < category.getChildren().size(); j++) {
-					ISnippetsEntry entry = (ISnippetsEntry) category.getChildren().get(j);
+					SnippetPaletteItem entry = (SnippetPaletteItem) category.getChildren().get(j);
 					if (!entry.isVisible() && !itemIDs.contains(entry.getId())) {
 						itemIDs.add(entry.getId());
 					}
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/AbstractModelFactory.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/AbstractModelFactory.java
index e0a6c19..74e503e 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/AbstractModelFactory.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/AbstractModelFactory.java
@@ -15,14 +15,11 @@
 import java.util.List;
 
 import org.eclipse.gef.palette.PaletteDrawer;
-import org.eclipse.wst.common.snippets.internal.ISnippetCategory;
-import org.eclipse.wst.common.snippets.internal.ISnippetVariable;
+import org.eclipse.wst.common.snippets.core.ISnippetVariable;
+import org.eclipse.wst.common.snippets.core.ISnippetsEntry;
 import org.eclipse.wst.common.snippets.internal.Logger;
 import org.eclipse.wst.common.snippets.internal.SnippetDefinitions;
 import org.eclipse.wst.common.snippets.internal.SnippetsPlugin;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetsEntry;
-
 
 public abstract class AbstractModelFactory {
 
@@ -33,14 +30,14 @@
 	protected void connectItemsAndCategories(SnippetDefinitions definitions) {
 		Iterator iterator = definitions.getCategories().iterator();
 		while (iterator.hasNext()) {
-			ISnippetCategory category = (ISnippetCategory) iterator.next();
+			SnippetPaletteDrawer category = (SnippetPaletteDrawer) iterator.next();
 			category.getChildren().clear();
 		}
 
 		iterator = definitions.getItems().iterator();
 		while (iterator.hasNext()) {
-			ISnippetItem item = (ISnippetItem) iterator.next();
-			ISnippetCategory parentCategory = definitions.getCategory(item.getCategoryName());
+			SnippetPaletteItem item = (SnippetPaletteItem) iterator.next();
+			SnippetPaletteDrawer parentCategory = (SnippetPaletteDrawer) definitions.getCategory(item.getCategoryName());
 			if (parentCategory != null) {
 				parentCategory.add(item);
 			}
@@ -104,27 +101,49 @@
 	public abstract SnippetDefinitions loadCurrent();
 
 	protected void migrate50to51(ISnippetsEntry entry) {
-		if (entry.getDescription() != null && entry.getDescription().length() > 0 && (entry.getLabel() == null || entry.getLabel().length() == 0 || entry.getId().equals(entry.getLabel()))) {
-			entry.setLabel(entry.getDescription());
-			entry.setDescription(""); //$NON-NLS-1$
+		if (entry.getDescription() != null && entry.getDescription().length() > 0 && (entry.getLabel() == null || entry.getLabel().length() == 0)) {
+			if (entry instanceof SnippetPaletteItem) {
+				((SnippetPaletteItem) entry).setLabel(entry.getDescription());
+				((SnippetPaletteItem) entry).setDescription(""); //$NON-NLS-1$
+			}
+			if (entry instanceof SnippetPaletteDrawer) {
+				((SnippetPaletteDrawer) entry).setLabel(entry.getDescription());
+				((SnippetPaletteDrawer) entry).setDescription(""); //$NON-NLS-1$
+			}
 		}
 	}
 
 	protected void setEntryProperty(ISnippetsEntry entry, String property, Object value) {
 		if (property == null || value == null)
 			return;
-		else if (property.equals(SnippetsPlugin.NAMES.DESCRIPTION))
-			entry.setDescription(value.toString());
-		else if (property.equals(SnippetsPlugin.NAMES.ICON))
-			entry.setIconName(value.toString());
-		else if (property.equals(SnippetsPlugin.NAMES.ID))
-			entry.setId(value.toString());
-		else if (property.equals(SnippetsPlugin.NAMES.LABEL))
-			entry.setLabel(value.toString());
-		else if (property.equals(SnippetsPlugin.NAMES.LARGEICON))
-			entry.setLargeIconName(value.toString());
-		else if (property.equals("filters")) //$NON-NLS-1$
-			entry.setFilters((String[]) value);
+		if (entry instanceof SnippetPaletteItem) {
+			if (property.equals(SnippetsPlugin.NAMES.DESCRIPTION))
+				((SnippetPaletteItem) entry).setDescription(value.toString());
+			else if (property.equals(SnippetsPlugin.NAMES.ICON))
+				((SnippetPaletteItem) entry).setIconName(value.toString());
+			else if (property.equals(SnippetsPlugin.NAMES.ID))
+				((SnippetPaletteItem) entry).setId(value.toString());
+			else if (property.equals(SnippetsPlugin.NAMES.LABEL))
+				((SnippetPaletteItem) entry).setLabel(value.toString());
+			else if (property.equals(SnippetsPlugin.NAMES.LARGEICON))
+				((SnippetPaletteItem) entry).setLargeIconName(value.toString());
+			else if (property.equals("filters")) //$NON-NLS-1$
+				((SnippetPaletteItem) entry).setFilters((String[]) value);
+		}
+		if (entry instanceof SnippetPaletteDrawer) {
+			if (property.equals(SnippetsPlugin.NAMES.DESCRIPTION))
+				((SnippetPaletteDrawer) entry).setDescription(value.toString());
+			else if (property.equals(SnippetsPlugin.NAMES.ICON))
+				((SnippetPaletteDrawer) entry).setIconName(value.toString());
+			else if (property.equals(SnippetsPlugin.NAMES.ID))
+				((SnippetPaletteDrawer) entry).setId(value.toString());
+			else if (property.equals(SnippetsPlugin.NAMES.LABEL))
+				((SnippetPaletteDrawer) entry).setLabel(value.toString());
+			else if (property.equals(SnippetsPlugin.NAMES.LARGEICON))
+				((SnippetPaletteDrawer) entry).setLargeIconName(value.toString());
+			else if (property.equals("filters")) //$NON-NLS-1$
+				((SnippetPaletteDrawer) entry).setFilters((String[]) value);
+		}
 	}
 
 	protected abstract void setProperties(SnippetPaletteDrawer category, Object source);
@@ -146,7 +165,7 @@
 		if (property == null)
 			return;
 		Object propertyValue = value;
-		if(propertyValue == null) {
+		if (propertyValue == null) {
 			propertyValue = "";
 		}
 		if (property.equals(SnippetsPlugin.NAMES.CATEGORY))
@@ -165,7 +184,7 @@
 		if (property == null)
 			return;
 		Object propertyValue = value;
-		if(propertyValue == null) {
+		if (propertyValue == null) {
 			propertyValue = "";
 		}
 		if (property.equals(SnippetsPlugin.NAMES.DEFAULT))
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/ModelFactoryForPlugins.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/ModelFactoryForPlugins.java
index 28174c6..1919c18 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/ModelFactoryForPlugins.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/ModelFactoryForPlugins.java
@@ -19,13 +19,13 @@
 import org.eclipse.core.runtime.PluginVersionIdentifier;
 import org.eclipse.gef.palette.PaletteDrawer;
 import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.wst.common.snippets.internal.Debug;
-import org.eclipse.wst.common.snippets.internal.ISnippetCategory;
-import org.eclipse.wst.common.snippets.internal.ISnippetVariable;
+import org.eclipse.wst.common.snippets.core.ISnippetCategory;
+import org.eclipse.wst.common.snippets.core.ISnippetVariable;
+import org.eclipse.wst.common.snippets.core.ISnippetsEntry;
+import org.eclipse.wst.common.snippets.internal.Logger;
 import org.eclipse.wst.common.snippets.internal.PluginRecord;
 import org.eclipse.wst.common.snippets.internal.SnippetDefinitions;
 import org.eclipse.wst.common.snippets.internal.SnippetsPlugin;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetsEntry;
 import org.eclipse.wst.common.snippets.internal.util.StringUtils;
 import org.osgi.framework.Bundle;
 
@@ -49,9 +49,10 @@
 			if (category != null) {
 				assignSource(category, definitions, element);
 				definitions.getCategories().add(category);
-				if (Debug.debugDefinitionPersistence)
-					System.out.println("Plugin reader creating category " + category.getId()); //$NON-NLS-1$
-				
+				if (Logger.DEBUG_DEFINITION_PERSISTENCE) {
+					System.out.println("Plugin reader creating category " + ((SnippetPaletteDrawer) category).getId()); //$NON-NLS-1$
+				}
+
 				// add items for category
 				IConfigurationElement[] children = element.getChildren(SnippetsPlugin.NAMES.ITEM);
 				for (int i = 0; i < children.length; i++) {
@@ -62,7 +63,7 @@
 						setProperty(item, SnippetsPlugin.NAMES.CATEGORY, element.getAttribute(SnippetsPlugin.NAMES.ID));
 						assignSource(item, definitions, element);
 						definitions.getItems().add(item);
-						if (Debug.debugDefinitionPersistence)
+						if (Logger.DEBUG_DEFINITION_PERSISTENCE)
 							System.out.println("Plugin reader creating item " + item.getId()); //$NON-NLS-1$
 					}
 				}
@@ -71,10 +72,16 @@
 	}
 
 	protected void assignSource(ISnippetsEntry entry, SnippetDefinitions definitions, IConfigurationElement element) {
-		entry.setSourceType(ISnippetsEntry.SNIPPET_SOURCE_PLUGINS);
-		((PaletteEntry) entry).setUserModificationPermission(PaletteEntry.PERMISSION_HIDE_ONLY);
 		PluginRecord record = getPluginRecordFor(definitions, element);
-		entry.setSourceDescriptor(record);
+		if (entry instanceof SnippetPaletteItem) {
+			((SnippetPaletteItem) entry).setSourceType(ISnippetsEntry.SNIPPET_SOURCE_PLUGINS);
+			((SnippetPaletteItem) entry).setSourceDescriptor(record);
+		}
+		if (entry instanceof SnippetPaletteDrawer) {
+			((SnippetPaletteDrawer) entry).setSourceType(ISnippetsEntry.SNIPPET_SOURCE_PLUGINS);
+			((SnippetPaletteDrawer) entry).setSourceDescriptor(record);
+		}
+		((PaletteEntry) entry).setUserModificationPermission(PaletteEntry.PERMISSION_HIDE_ONLY);
 	}
 
 	/*
@@ -108,7 +115,7 @@
 		PluginRecord record = new PluginRecord();
 		record.setPluginName(id);
 		record.setPluginVersion(identifier.toString());
-		if (Debug.debugDefinitionPersistence)
+		if (Logger.DEBUG_DEFINITION_PERSISTENCE)
 			System.out.println("Plugin reader creating plugin record for " + record.getPluginName() + "/" + record.getPluginVersion()); //$NON-NLS-1$ //$NON-NLS-2$
 		return record;
 	}
@@ -169,8 +176,8 @@
 				setProperty(item, SnippetsPlugin.NAMES.CONTENT, children[i].getValue());
 			else if (children[i].getName().equals(SnippetsPlugin.NAMES.VARIABLES)) {
 				Iterator iterator = createVariables(children[i].getChildren()).iterator();
-				while(iterator.hasNext()) {
-					item.addVariable((ISnippetVariable)iterator.next());
+				while (iterator.hasNext()) {
+					item.addVariable((ISnippetVariable) iterator.next());
 				}
 			}
 			else if (children[i].getName().equals(SnippetsPlugin.NAMES.VARIABLE)) {
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/ModelFactoryForUser.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/ModelFactoryForUser.java
index 2b3672d..20061e2 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/ModelFactoryForUser.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/ModelFactoryForUser.java
@@ -21,15 +21,14 @@
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.gef.palette.PaletteDrawer;
 import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.wst.common.snippets.internal.Debug;
-import org.eclipse.wst.common.snippets.internal.ISnippetCategory;
-import org.eclipse.wst.common.snippets.internal.ISnippetVariable;
+import org.eclipse.wst.common.snippets.core.ISnippetCategory;
+import org.eclipse.wst.common.snippets.core.ISnippetItem;
+import org.eclipse.wst.common.snippets.core.ISnippetVariable;
+import org.eclipse.wst.common.snippets.core.ISnippetsEntry;
 import org.eclipse.wst.common.snippets.internal.Logger;
 import org.eclipse.wst.common.snippets.internal.PluginRecord;
 import org.eclipse.wst.common.snippets.internal.SnippetDefinitions;
 import org.eclipse.wst.common.snippets.internal.SnippetsPlugin;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetsEntry;
 import org.eclipse.wst.common.snippets.internal.util.CommonXML;
 import org.eclipse.wst.common.snippets.internal.util.StringUtils;
 import org.osgi.framework.Bundle;
@@ -54,24 +53,23 @@
 	}
 
 	protected void addCategory(SnippetDefinitions definitions, Element categoryElement) {
-		ISnippetCategory category = createCategory(categoryElement);
+		SnippetPaletteDrawer category = createCategory(categoryElement);
 		if (category != null) {
 			assignSource(category, definitions, categoryElement);
-			if (category instanceof PaletteDrawer) {
-				String stateString = categoryElement.getAttribute(SnippetsPlugin.NAMES.INITIAL_STATE);
-				int state = PaletteDrawer.INITIAL_STATE_CLOSED;
-				if (stateString != null && stateString.length() > 0) {
-					try {
-						state = Integer.parseInt(stateString);
-					}
-					catch (NumberFormatException e) {
-						// leave unchanged
-					}
+			String stateString = categoryElement.getAttribute(SnippetsPlugin.NAMES.INITIAL_STATE);
+			int state = PaletteDrawer.INITIAL_STATE_CLOSED;
+			if (stateString != null && stateString.length() > 0) {
+				try {
+					state = Integer.parseInt(stateString);
 				}
-				((PaletteDrawer) category).setInitialState(state);
+				catch (NumberFormatException e) {
+					// leave unchanged
+				}
 			}
+			((PaletteDrawer) category).setInitialState(state);
+
 			definitions.getCategories().add(category);
-			if (Debug.debugDefinitionPersistence)
+			if (Logger.DEBUG_DEFINITION_PERSISTENCE)
 				System.out.println("Plugin reader creating category " + category.getId()); //$NON-NLS-1$
 			NodeList children = categoryElement.getChildNodes();
 			for (int i = 0; i < children.getLength(); i++) {
@@ -83,26 +81,43 @@
 	}
 
 	protected void addChild(SnippetDefinitions definitions, Element child) {
-		ISnippetItem item = createItem(child);
+		SnippetPaletteItem item = createItem(child);
 		if (item != null) {
 			assignSource(item, definitions, child);
 			definitions.getItems().add(item);
-			if (Debug.debugDefinitionPersistence)
+			if (Logger.DEBUG_DEFINITION_PERSISTENCE)
 				System.out.println("Plugin reader creating item " + item.getId()); //$NON-NLS-1$
 		}
 	}
 
 	protected void assignSource(ISnippetsEntry entry, SnippetDefinitions definitions, Element element) {
-		entry.setSourceType(ISnippetsEntry.SNIPPET_SOURCE_USER);
-		((PaletteEntry) entry).setUserModificationPermission(PaletteEntry.PERMISSION_FULL_MODIFICATION);
-		Object pluginRecord = createPluginRecord(definitions, element);
-		if (pluginRecord != null) {
-			entry.setSourceDescriptor(pluginRecord);
-			((PaletteEntry) entry).setUserModificationPermission(PaletteEntry.PERMISSION_HIDE_ONLY);
-			entry.setSourceType(ISnippetsEntry.SNIPPET_SOURCE_PLUGINS);
+		if (entry instanceof ISnippetItem) {
+			SnippetPaletteItem item = (SnippetPaletteItem) entry;
+			item.setSourceType(ISnippetsEntry.SNIPPET_SOURCE_USER);
+			item.setUserModificationPermission(PaletteEntry.PERMISSION_FULL_MODIFICATION);
+			Object pluginRecord = createPluginRecord(definitions, element);
+			if (pluginRecord != null) {
+				item.setSourceDescriptor(pluginRecord);
+				((PaletteEntry) entry).setUserModificationPermission(PaletteEntry.PERMISSION_HIDE_ONLY);
+				item.setSourceType(ISnippetsEntry.SNIPPET_SOURCE_PLUGINS);
+			}
+			else if (element.getAttribute(SnippetsPlugin.NAMES.SHARED).equals(SnippetsPlugin.NAMES.SHARED)) {
+				item.setSourceType(ISnippetsEntry.SNIPPET_SOURCE_WORKSPACE);
+			}
 		}
-		else if (element.getAttribute(SnippetsPlugin.NAMES.SHARED).equals(SnippetsPlugin.NAMES.SHARED)) {
-			entry.setSourceType(ISnippetsEntry.SNIPPET_SOURCE_WORKSPACE);
+		if (entry instanceof ISnippetCategory) {
+			SnippetPaletteDrawer drawer = (SnippetPaletteDrawer) entry;
+			drawer.setSourceType(ISnippetsEntry.SNIPPET_SOURCE_USER);
+			((PaletteEntry) entry).setUserModificationPermission(PaletteEntry.PERMISSION_FULL_MODIFICATION);
+			Object pluginRecord = createPluginRecord(definitions, element);
+			if (pluginRecord != null) {
+				drawer.setSourceDescriptor(pluginRecord);
+				((PaletteEntry) entry).setUserModificationPermission(PaletteEntry.PERMISSION_HIDE_ONLY);
+				drawer.setSourceType(ISnippetsEntry.SNIPPET_SOURCE_PLUGINS);
+			}
+			else if (element.getAttribute(SnippetsPlugin.NAMES.SHARED).equals(SnippetsPlugin.NAMES.SHARED)) {
+				drawer.setSourceType(ISnippetsEntry.SNIPPET_SOURCE_WORKSPACE);
+			}
 		}
 	}
 
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/ModelFactoryForWorkspace.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/ModelFactoryForWorkspace.java
index ffff0b6..5482a06 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/ModelFactoryForWorkspace.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/ModelFactoryForWorkspace.java
@@ -14,7 +14,7 @@
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.wst.common.snippets.internal.SnippetDefinitions;
 import org.eclipse.wst.common.snippets.internal.SnippetsPlugin;
-import org.eclipse.wst.common.snippets.internal.util.DocumentProvider;
+import org.eclipse.wst.common.snippets.internal.util.XMLDocumentProvider;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
@@ -57,7 +57,7 @@
 
 	public SnippetDefinitions loadFrom(IFile input) {
 		SnippetDefinitions definitions = new SnippetDefinitions();
-		DocumentProvider provider = new DocumentProvider();
+		XMLDocumentProvider provider = new XMLDocumentProvider();
 		Document document = null;
 		try {
 			provider.setInputStream(input.getContents());
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetCustomizerDialog.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetCustomizerDialog.java
index 1cbd2a6..df39345 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetCustomizerDialog.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetCustomizerDialog.java
@@ -30,7 +30,7 @@
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.FileDialog;
 import org.eclipse.swt.widgets.Shell;
-import org.eclipse.wst.common.snippets.internal.ISnippetCategory;
+import org.eclipse.wst.common.snippets.core.ISnippetCategory;
 import org.eclipse.wst.common.snippets.internal.SnippetDefinitions;
 import org.eclipse.wst.common.snippets.internal.SnippetsMessages;
 import org.eclipse.wst.common.snippets.internal.SnippetsPluginImageHelper;
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetImageDescriptorHelper.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetImageDescriptorHelper.java
index 9c2eef0..f9f5bf7 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetImageDescriptorHelper.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetImageDescriptorHelper.java
@@ -13,12 +13,10 @@
 package org.eclipse.wst.common.snippets.internal.palette;
 
 import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.wst.common.snippets.internal.ISnippetCategory;
+import org.eclipse.wst.common.snippets.core.ISnippetsEntry;
 import org.eclipse.wst.common.snippets.internal.PluginRecord;
 import org.eclipse.wst.common.snippets.internal.SnippetsPluginImageHelper;
 import org.eclipse.wst.common.snippets.internal.SnippetsPluginImages;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetsEntry;
 
 
 public class SnippetImageDescriptorHelper {
@@ -43,14 +41,14 @@
 		return getImageDescriptor(SnippetsPluginImages.IMG_OBJ_SNIPPETS);
 	}
 
-	public ImageDescriptor getImageDescriptor(ISnippetCategory category) {
+	public ImageDescriptor getImageDescriptor(SnippetPaletteDrawer category) {
 		return getImageDescriptor(category, false);
 	}
 
-	public ImageDescriptor getImageDescriptor(ISnippetCategory category, boolean largeIcon) {
-		String iconName = largeIcon ? category.getLargeIconName() : category.getIconName();
+	public ImageDescriptor getImageDescriptor(SnippetPaletteDrawer category, boolean largeIcon) {
+		String iconName = largeIcon ? category.getLargeIconName() : category.getSmallIconName();
 		if (largeIcon && (iconName == null || iconName.length() == 0))
-			iconName = category.getIconName();
+			iconName = category.getSmallIconName();
 		if (category == null || iconName == null || iconName.length() == 0)
 			return getDefaultDescriptor();
 		ImageDescriptor image = null;
@@ -68,27 +66,27 @@
 		return image;
 	}
 
-	public ImageDescriptor getImageDescriptor(ISnippetItem item) {
+	public ImageDescriptor getImageDescriptor(SnippetPaletteItem item) {
 		return getImageDescriptor(item, false);
 	}
 
-	public ImageDescriptor getImageDescriptor(ISnippetItem item, boolean largeIcon) {
+	public ImageDescriptor getImageDescriptor(SnippetPaletteItem item, boolean largeIcon) {
 		ImageDescriptor image = null;
-		String iconName = largeIcon ? item.getLargeIconName() : item.getIconName();
+		String iconName = largeIcon ? item.getLargeIconName() : item.getSmallIconName();
 		if (largeIcon && (iconName == null || iconName.length() == 0))
-			iconName = item.getIconName();
+			iconName = item.getSmallIconName();
 		if (item.getSourceType() == ISnippetsEntry.SNIPPET_SOURCE_PLUGINS) {
 			PluginRecord record = (PluginRecord) item.getSourceDescriptor();
 			if (record != null && record.getPluginName() != null) {
 				image = getInstalledImage(record.getPluginName(), iconName);
 				if (image == null && item.getCategory() != null) {
-					image = getImageDescriptor(item.getCategory(), largeIcon);
+					image = getImageDescriptor((SnippetPaletteDrawer) item.getCategory(), largeIcon);
 				}
 			}
 		}
 		else {
 			if (iconName == null || iconName.length() < 1)
-				image = getImageDescriptor(item.getCategory(), largeIcon);
+				image = getImageDescriptor((SnippetPaletteDrawer) item.getCategory(), largeIcon);
 			else
 				image = getImageDescriptor(iconName);
 		}
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetPaletteDrawer.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetPaletteDrawer.java
index 193cc90..e906976 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetPaletteDrawer.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetPaletteDrawer.java
@@ -16,9 +16,8 @@
 import org.eclipse.gef.palette.PaletteEntry;
 import org.eclipse.gef.palette.PaletteTemplateEntry;
 import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.wst.common.snippets.internal.ISnippetCategory;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
-
+import org.eclipse.wst.common.snippets.core.ISnippetCategory;
+import org.eclipse.wst.common.snippets.core.ISnippetItem;
 
 public class SnippetPaletteDrawer extends PaletteDrawer implements ISnippetCategory {
 	protected String[] fFilters = new String[0];
@@ -49,13 +48,10 @@
 		setType(PaletteDrawer.PALETTE_TYPE_DRAWER);
 	}
 
-	/**
-	 * @see ISnippetCategory#add(ISnippetItem)
-	 */
-	public void add(ISnippetItem item) {
-		super.add((PaletteEntry) item);
+	public void add(SnippetPaletteItem item) {
+		super.add(item);
 		item.setCategory(this);
-		((PaletteEntry) item).setParent(this);
+		item.setParent(this);
 	}
 
 	public String[] getFilters() {
@@ -63,15 +59,6 @@
 	}
 
 	/**
-	 * Gets the iconName.
-	 * 
-	 * @return Returns a String
-	 */
-	public String getIconName() {
-		return fIconName;
-	}
-
-	/**
 	 * Gets the id.
 	 * 
 	 * @return Returns a String
@@ -80,6 +67,10 @@
 		return fId;
 	}
 
+	public ISnippetItem[] getItems() {
+		return (ISnippetItem[]) getChildren().toArray(new ISnippetItem[0]);
+	}
+
 	public ImageDescriptor getLargeIcon() {
 		ImageDescriptor icon = super.getLargeIcon();
 		if (icon == null) {
@@ -108,6 +99,15 @@
 		return icon;
 	}
 
+	/**
+	 * Gets the iconName.
+	 * 
+	 * @return Returns a String
+	 */
+	public String getSmallIconName() {
+		return fIconName;
+	}
+
 	public Object getSourceDescriptor() {
 		return fSourceDescriptor;
 	}
@@ -119,16 +119,16 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see org.eclipse.wst.common.snippets.internal.provisional.ISnippetCategory#remove(org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem)
+	 * @see org.eclipse.wst.common.snippets.ui.ISnippetCategory#remove(org.eclipse.wst.common.snippets.ui.ISnippetItem)
 	 */
-	public void remove(ISnippetItem item) {
-		super.remove((PaletteEntry) item);
+	public void remove(SnippetPaletteItem item) {
+		super.remove(item);
 	}
 
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see org.eclipse.wst.common.snippets.internal.provisional.ISnippetsEntry#setFilters(java.lang.String[])
+	 * @see org.eclipse.wst.common.snippets.ui.ISnippetsEntry#setFilters(java.lang.String[])
 	 */
 	public void setFilters(String[] filters) {
 		fFilters = filters;
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetPaletteItem.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetPaletteItem.java
index 9767d14..a254e94 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetPaletteItem.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetPaletteItem.java
@@ -19,14 +19,13 @@
 import org.eclipse.gef.palette.PaletteContainer;
 import org.eclipse.gef.palette.PaletteTemplateEntry;
 import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.wst.common.snippets.internal.ISnippetCategory;
-import org.eclipse.wst.common.snippets.internal.ISnippetVariable;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
-
+import org.eclipse.wst.common.snippets.core.ISnippetCategory;
+import org.eclipse.wst.common.snippets.core.ISnippetItem;
+import org.eclipse.wst.common.snippets.core.ISnippetVariable;
 
 public class SnippetPaletteItem extends PaletteTemplateEntry implements ISnippetItem {
 
-	protected ISnippetCategory fCategory;
+	protected SnippetPaletteDrawer fCategory;
 	protected String fCategoryName;
 
 	protected String fClassName;
@@ -95,7 +94,7 @@
 		return fFilters;
 	}
 
-	public String getIconName() {
+	public String getSmallIconName() {
 		return fIconName;
 	}
 
@@ -142,7 +141,7 @@
 	}
 
 	public void setCategory(ISnippetCategory category) {
-		fCategory = category;
+		fCategory = (SnippetPaletteDrawer) category;
 		super.setParent((PaletteContainer) category);
 		if (fCategory == null)
 			setCategoryName(null);
@@ -169,7 +168,7 @@
 	/*
 	 * (non-Javadoc)
 	 * 
-	 * @see org.eclipse.wst.common.snippets.internal.provisional.ISnippetsEntry#setFilters(java.lang.String[])
+	 * @see org.eclipse.wst.common.snippets.ui.ISnippetsEntry#setFilters(java.lang.String[])
 	 */
 	public void setFilters(String[] filters) {
 		fFilters = filters;
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetPaletteRoot.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetPaletteRoot.java
index 1759c92..b9decdf 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetPaletteRoot.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetPaletteRoot.java
@@ -16,8 +16,8 @@
 
 import org.eclipse.gef.palette.PaletteEntry;
 import org.eclipse.gef.palette.PaletteRoot;
-import org.eclipse.wst.common.snippets.internal.Debug;
 import org.eclipse.wst.common.snippets.internal.IEntryChangeListener;
+import org.eclipse.wst.common.snippets.internal.Logger;
 import org.eclipse.wst.common.snippets.internal.SnippetDefinitions;
 import org.eclipse.wst.common.snippets.internal.model.SnippetManager;
 
@@ -68,7 +68,7 @@
 		for (int i = 0; i < children.size(); i++) {
 			((PaletteEntry) children.get(i)).setParent(this);
 		}
-		if (Debug.debugViewerContent)
+		if (Logger.DEBUG_VIEWER_CONTENT)
 			System.out.println(getClass().getName() + '@' + hashCode() + " setting categories to: " + children); //$NON-NLS-1$
 		listeners.firePropertyChange(PROPERTY_CHILDREN, oldChildren, children);
 	}
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetVariable.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetVariable.java
index 49fb3bf..8ab6795 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetVariable.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetVariable.java
@@ -12,7 +12,7 @@
 
 package org.eclipse.wst.common.snippets.internal.palette;
 
-import org.eclipse.wst.common.snippets.internal.ISnippetVariable;
+import org.eclipse.wst.common.snippets.core.ISnippetVariable;
 
 public class SnippetVariable implements ISnippetVariable {
 	protected String fDefaultValue;
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetViewer.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetViewer.java
deleted file mode 100644
index 5b0b6c9..0000000
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/SnippetViewer.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.common.snippets.internal.palette;
-
-import org.eclipse.gef.ui.palette.PaletteViewer;
-import org.eclipse.gef.ui.palette.customize.PaletteCustomizerDialog;
-
-public class SnippetViewer extends PaletteViewer {
-	private PaletteCustomizerDialog customizerDialog = null;
-
-	public PaletteCustomizerDialog getCustomizerDialog() {
-		if (customizerDialog == null) {
-			customizerDialog = new SnippetCustomizerDialog(getControl().getShell(), getCustomizer(), getPaletteRoot());
-		}
-		return customizerDialog;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/UserModelDumper.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/UserModelDumper.java
index cfe9db5..34addc8 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/UserModelDumper.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/UserModelDumper.java
@@ -18,22 +18,20 @@
 
 import org.eclipse.core.runtime.Platform;
 import org.eclipse.gef.palette.PaletteDrawer;
-import org.eclipse.wst.common.snippets.internal.Debug;
-import org.eclipse.wst.common.snippets.internal.ISnippetCategory;
-import org.eclipse.wst.common.snippets.internal.ISnippetVariable;
+import org.eclipse.wst.common.snippets.core.ISnippetCategory;
+import org.eclipse.wst.common.snippets.core.ISnippetItem;
+import org.eclipse.wst.common.snippets.core.ISnippetVariable;
+import org.eclipse.wst.common.snippets.core.ISnippetsEntry;
 import org.eclipse.wst.common.snippets.internal.Logger;
 import org.eclipse.wst.common.snippets.internal.PluginRecord;
 import org.eclipse.wst.common.snippets.internal.SnippetDefinitions;
 import org.eclipse.wst.common.snippets.internal.SnippetsPlugin;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetsEntry;
 import org.eclipse.wst.common.snippets.internal.util.CommonXML;
 import org.eclipse.wst.common.snippets.internal.util.StringUtils;
 import org.osgi.framework.Bundle;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
-
 public class UserModelDumper {
 
 	private static UserModelDumper dumper = null;
@@ -53,15 +51,25 @@
 	 * Save the properties known for ISnippetsEntry
 	 */
 	protected void assignEntryProperties(ISnippetsEntry entry, Element owningElement) {
-		owningElement.setAttribute(SnippetsPlugin.NAMES.ID, entry.getId());
-		if (entry.getIconName() != null)
-			owningElement.setAttribute(SnippetsPlugin.NAMES.ICON, entry.getIconName());
+		if (entry instanceof SnippetPaletteDrawer) {
+			owningElement.setAttribute(SnippetsPlugin.NAMES.ID, ((SnippetPaletteDrawer) entry).getId());
+			if (((SnippetPaletteDrawer) entry).getSmallIconName() != null)
+				owningElement.setAttribute(SnippetsPlugin.NAMES.ICON, ((SnippetPaletteDrawer) entry).getSmallIconName());
+			if (entry.getLabel() != null)
+				owningElement.setAttribute(SnippetsPlugin.NAMES.LABEL, entry.getLabel());
+			if (((SnippetPaletteDrawer) entry).getLargeIconName() != null)
+				owningElement.setAttribute(SnippetsPlugin.NAMES.LARGEICON, ((SnippetPaletteDrawer) entry).getLargeIconName());
+		}
+		if (entry instanceof SnippetPaletteItem) {
+			owningElement.setAttribute(SnippetsPlugin.NAMES.ID, ((SnippetPaletteItem) entry).getId());
+			if (((SnippetPaletteItem) entry).getSmallIconName() != null)
+				owningElement.setAttribute(SnippetsPlugin.NAMES.ICON, ((SnippetPaletteItem) entry).getSmallIconName());
+			if (entry.getLabel() != null)
+				owningElement.setAttribute(SnippetsPlugin.NAMES.LABEL, entry.getLabel());
+			if (((SnippetPaletteItem) entry).getLargeIconName() != null)
+				owningElement.setAttribute(SnippetsPlugin.NAMES.LARGEICON, ((SnippetPaletteItem) entry).getLargeIconName());
+		}
 		owningElement.appendChild(createDescription(owningElement.getOwnerDocument(), entry.getDescription()));
-		// new in V5.1
-		if (entry.getLabel() != null)
-			owningElement.setAttribute(SnippetsPlugin.NAMES.LABEL, entry.getLabel());
-		if (entry.getLargeIconName() != null)
-			owningElement.setAttribute(SnippetsPlugin.NAMES.LARGEICON, entry.getLargeIconName());
 	}
 
 	/**
@@ -87,7 +95,7 @@
 		// if the category came from a plugin, only store a placeholder
 		// to maintain the ordering [it will be reloaded in subsequent
 		// sessions directly from the plugin definitions]
-		element.setAttribute(SnippetsPlugin.NAMES.ID, category.getId());
+		element.setAttribute(SnippetsPlugin.NAMES.ID, ((SnippetPaletteDrawer) category).getId());
 		if (category instanceof PaletteDrawer) {
 			element.setAttribute(SnippetsPlugin.NAMES.INITIAL_STATE, Integer.toString(((PaletteDrawer) category).getInitialState()));
 		}
@@ -104,15 +112,15 @@
 		if (category.getSourceType() == ISnippetsEntry.SNIPPET_SOURCE_USER) {
 			assignEntryProperties(category, element);
 
-			for (int i = 0; i < category.getChildren().size(); i++) {
-				ISnippetItem item = (ISnippetItem) category.getChildren().get(i);
+			for (int i = 0; i < category.getItems().length; i++) {
+				ISnippetItem item = category.getItems()[i];
 				Element child = createItem(doc, item);
 				element.appendChild(child);
 			}
 		}
 
-		if (Debug.debugDefinitionPersistence)
-			System.out.println("User item writer saving category " + category.getId()); //$NON-NLS-1$
+		if (Logger.DEBUG_DEFINITION_PERSISTENCE)
+			System.out.println("User item writer saving category " + ((SnippetPaletteDrawer) category).getId()); //$NON-NLS-1$
 		return element;
 	}
 
@@ -165,19 +173,19 @@
 		Element element = doc.createElement(SnippetsPlugin.NAMES.ITEM);
 		assignEntryProperties(item, element);
 		assignSourceFor(item, element);
-		element.setAttribute(SnippetsPlugin.NAMES.CATEGORY, item.getCategory().getId());
-		if (item.getClassName() != null)
-			element.setAttribute(SnippetsPlugin.NAMES.CLASSNAME, item.getClassName());
-		if (item.getEditorClassName() != null)
-			element.setAttribute(SnippetsPlugin.NAMES.EDITORCLASSNAME, item.getEditorClassName());
+		element.setAttribute(SnippetsPlugin.NAMES.CATEGORY, ((SnippetPaletteDrawer) item.getCategory()).getId());
+		if (((SnippetPaletteItem) item).getClassName() != null)
+			element.setAttribute(SnippetsPlugin.NAMES.CLASSNAME, ((SnippetPaletteItem) item).getClassName());
+		if (((SnippetPaletteItem) item).getEditorClassName() != null)
+			element.setAttribute(SnippetsPlugin.NAMES.EDITORCLASSNAME, ((SnippetPaletteItem) item).getEditorClassName());
 		element.appendChild(createContent(doc, item));
 		ISnippetVariable[] variables = item.getVariables();
 		for (int i = 0; i < variables.length; i++) {
 			Element variable = createVariable(doc, variables[i]);
 			element.appendChild(variable);
 		}
-		if (Debug.debugDefinitionPersistence)
-			System.out.println("User item writer saving item " + item.getCategory().getId() + ":" + item.getId()); //$NON-NLS-1$ //$NON-NLS-2$
+		if (Logger.DEBUG_DEFINITION_PERSISTENCE)
+			System.out.println("User item writer saving item " + ((SnippetPaletteDrawer) item.getCategory()).getId() + ":" + ((SnippetPaletteItem) item).getId()); //$NON-NLS-1$ //$NON-NLS-2$
 		return element;
 	}
 
@@ -189,7 +197,7 @@
 		Element element = doc.createElement(SnippetsPlugin.NAMES.PLUGIN);
 		element.setAttribute(SnippetsPlugin.NAMES.NAME, record.getPluginName());
 		element.setAttribute(SnippetsPlugin.NAMES.VERSION, record.getPluginVersion());
-		if (Debug.debugDefinitionPersistence)
+		if (Logger.DEBUG_DEFINITION_PERSISTENCE)
 			System.out.println("User item writer saving plugin record " + record.getPluginName() + "/" + record.getPluginVersion()); //$NON-NLS-1$ //$NON-NLS-2$
 		return element;
 	}
@@ -199,7 +207,7 @@
 	 */
 	protected Element createVariable(Document doc, ISnippetVariable variable) {
 		Element element = doc.createElement(SnippetsPlugin.NAMES.VARIABLE);
-		element.setAttribute(SnippetsPlugin.NAMES.ID, variable.getId());
+		element.setAttribute(SnippetsPlugin.NAMES.ID, ((SnippetVariable) variable).getId());
 		if (variable.getName() != null)
 			element.setAttribute(SnippetsPlugin.NAMES.NAME, variable.getName());
 		if (variable.getDefaultValue() != null)
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/WorkspaceModelDumper.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/WorkspaceModelDumper.java
index 26b6e9c..d22b99c 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/WorkspaceModelDumper.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/palette/WorkspaceModelDumper.java
@@ -21,19 +21,17 @@
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.wst.common.snippets.internal.Debug;
-import org.eclipse.wst.common.snippets.internal.ISnippetCategory;
-import org.eclipse.wst.common.snippets.internal.ISnippetVariable;
+import org.eclipse.wst.common.snippets.core.ISnippetCategory;
+import org.eclipse.wst.common.snippets.core.ISnippetItem;
+import org.eclipse.wst.common.snippets.core.ISnippetVariable;
+import org.eclipse.wst.common.snippets.core.ISnippetsEntry;
 import org.eclipse.wst.common.snippets.internal.Logger;
 import org.eclipse.wst.common.snippets.internal.PluginRecord;
 import org.eclipse.wst.common.snippets.internal.SnippetsPlugin;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetsEntry;
 import org.eclipse.wst.common.snippets.internal.util.CommonXML;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
-
 public class WorkspaceModelDumper {
 
 	private static WorkspaceModelDumper dumper = null;
@@ -53,12 +51,21 @@
 	 * Save the properties known for ISnippetsEntry
 	 */
 	protected void assignEntryProperties(ISnippetsEntry entry, Element owningElement) {
-		owningElement.setAttribute(SnippetsPlugin.NAMES.ID, entry.getId());
-		owningElement.setAttribute(SnippetsPlugin.NAMES.ICON, entry.getIconName());
+		if (entry instanceof SnippetPaletteDrawer) {
+			SnippetPaletteDrawer drawer = (SnippetPaletteDrawer) entry;
+			owningElement.setAttribute(SnippetsPlugin.NAMES.ID, drawer.getId());
+			owningElement.setAttribute(SnippetsPlugin.NAMES.ICON, drawer.getSmallIconName());
+			owningElement.setAttribute(SnippetsPlugin.NAMES.LABEL, drawer.getLabel());
+			owningElement.setAttribute(SnippetsPlugin.NAMES.LARGEICON, drawer.getLargeIconName());
+		}
+		if (entry instanceof SnippetPaletteItem) {
+			SnippetPaletteItem item = (SnippetPaletteItem) entry;
+			owningElement.setAttribute(SnippetsPlugin.NAMES.ID, item.getId());
+			owningElement.setAttribute(SnippetsPlugin.NAMES.ICON, item.getSmallIconName());
+			owningElement.setAttribute(SnippetsPlugin.NAMES.LABEL, item.getLabel());
+			owningElement.setAttribute(SnippetsPlugin.NAMES.LARGEICON, item.getLargeIconName());
+		}
 		owningElement.appendChild(createDescription(owningElement.getOwnerDocument(), entry.getDescription()));
-		// new in V5.1
-		owningElement.setAttribute(SnippetsPlugin.NAMES.LABEL, entry.getLabel());
-		owningElement.setAttribute(SnippetsPlugin.NAMES.LARGEICON, entry.getLargeIconName());
 	}
 
 	/**
@@ -79,7 +86,7 @@
 		// if the category came from a plugin, only store a placeholder
 		// to maintain the ordering [it will be reloaded in subsequent
 		// sessions directly from the plugin definitions]
-		element.setAttribute(SnippetsPlugin.NAMES.ID, category.getId());
+		element.setAttribute(SnippetsPlugin.NAMES.ID, ((SnippetPaletteDrawer) category).getId());
 		String[] filters = category.getFilters();
 		if (filters.length > 0) {
 			String filtersAttr = filters[0];
@@ -93,15 +100,15 @@
 		if (category.getSourceType() == ISnippetsEntry.SNIPPET_SOURCE_WORKSPACE) {
 			assignEntryProperties(category, element);
 
-			for (int i = 0; i < category.getChildren().size(); i++) {
-				ISnippetItem item = (ISnippetItem) category.getChildren().get(i);
+			for (int i = 0; i < category.getItems().length; i++) {
+				ISnippetItem item = category.getItems()[i];
 				Element child = createItem(doc, item);
 				element.appendChild(child);
 			}
 		}
 
-		if (Debug.debugDefinitionPersistence)
-			System.out.println("User item writer saving category " + category.getId()); //$NON-NLS-1$
+		if (Logger.DEBUG_DEFINITION_PERSISTENCE)
+			System.out.println("User item writer saving category " + ((SnippetPaletteDrawer) category).getId()); //$NON-NLS-1$
 		return element;
 	}
 
@@ -143,17 +150,17 @@
 		Element element = doc.createElement(SnippetsPlugin.NAMES.ITEM);
 		assignEntryProperties(item, element);
 		assignSourceFor(item, element);
-		element.setAttribute(SnippetsPlugin.NAMES.CATEGORY, item.getCategory().getId());
-		element.setAttribute(SnippetsPlugin.NAMES.CLASSNAME, item.getClassName());
-		element.setAttribute(SnippetsPlugin.NAMES.EDITORCLASSNAME, item.getEditorClassName());
+		element.setAttribute(SnippetsPlugin.NAMES.CATEGORY, ((SnippetPaletteDrawer) item.getCategory()).getId());
+		element.setAttribute(SnippetsPlugin.NAMES.CLASSNAME, ((SnippetPaletteItem) item).getClassName());
+		element.setAttribute(SnippetsPlugin.NAMES.EDITORCLASSNAME, ((SnippetPaletteItem) item).getEditorClassName());
 		element.appendChild(createContent(doc, item));
 		ISnippetVariable[] variables = item.getVariables();
 		for (int i = 0; i < variables.length; i++) {
 			Element variable = createVariable(doc, variables[i]);
 			element.appendChild(variable);
 		}
-		if (Debug.debugDefinitionPersistence)
-			System.out.println("User item writer saving item " + item.getCategory().getId() + ":" + item.getId()); //$NON-NLS-1$ //$NON-NLS-2$
+		if (Logger.DEBUG_DEFINITION_PERSISTENCE)
+			System.out.println("User item writer saving item " + ((SnippetPaletteDrawer) item.getCategory()).getId() + ":" + ((SnippetPaletteItem) item).getId()); //$NON-NLS-1$ //$NON-NLS-2$
 		return element;
 	}
 
@@ -165,7 +172,7 @@
 		Element element = doc.createElement(SnippetsPlugin.NAMES.PLUGIN);
 		element.setAttribute(SnippetsPlugin.NAMES.NAME, record.getPluginName());
 		element.setAttribute(SnippetsPlugin.NAMES.VERSION, record.getPluginVersion());
-		if (Debug.debugDefinitionPersistence)
+		if (Logger.DEBUG_DEFINITION_PERSISTENCE)
 			System.out.println("User item writer saving plugin record " + record.getPluginName() + "/" + record.getPluginVersion()); //$NON-NLS-1$ //$NON-NLS-2$
 		return element;
 	}
@@ -175,7 +182,7 @@
 	 */
 	protected Element createVariable(Document doc, ISnippetVariable variable) {
 		Element element = doc.createElement(SnippetsPlugin.NAMES.VARIABLE);
-		element.setAttribute(SnippetsPlugin.NAMES.ID, variable.getId());
+		element.setAttribute(SnippetsPlugin.NAMES.ID, ((SnippetVariable) variable).getId());
 		element.setAttribute(SnippetsPlugin.NAMES.NAME, variable.getName());
 		element.setAttribute(SnippetsPlugin.NAMES.DEFAULT, variable.getDefaultValue());
 		element.appendChild(createDescription(doc, variable.getDescription()));
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/provisional/ISnippetItem.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/provisional/ISnippetItem.java
deleted file mode 100644
index dd99d5e..0000000
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/provisional/ISnippetItem.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.wst.common.snippets.internal.provisional;
-
-import org.eclipse.wst.common.snippets.internal.ISnippetCategory;
-import org.eclipse.wst.common.snippets.internal.ISnippetVariable;
-
-/**
- * A snippet item is the actual object draggable from the Snippets view.
- * 
- * This interface is not meant to be implemented by clients.
- */
-public interface ISnippetItem extends ISnippetsEntry {
-
-	/**
-	 * @param the variable to add
-	 * @deprecated assumes that all implementions support this style of
-	 *             variables
-	 */
-	void addVariable(ISnippetVariable variable);
-
-	/**
-	 * @return the category holding this item
-	 * @deprecated
-	 */
-	ISnippetCategory getCategory();
-
-	/**
-	 * @return the name of the category holding this item. This is a handle
-	 *         only method; the category need not exist yet.
-	 * @deprecated assumes that all implementions support this style of
-	 *             variables
-	 */
-	String getCategoryName();
-
-	/**
-	 * @return the ISnippetInsertion class to be used with this item
-	 * @deprecated
-	 */
-	String getClassName();
-
-	/**
-	 * @return the content string for this item; the text inserted may not be
-	 *         identical
-	 */
-	String getContentString();
-
-	/**
-	 * @return the ISnippetEditor class to be used with this item
-	 * @deprecated
-	 */
-	String getEditorClassName();
-
-	/**
-	 * @return an array containing all of the valid variables for this item
-	 * @deprecated assumes that all implementions support this style of
-	 *             variables
-	 */
-	ISnippetVariable[] getVariables();
-
-	/**
-	 * @param the variable to remove. If the variable is not a know variable
-	 *            of this item, it is ignored.
-	 * 
-	 * @deprecated assumes that all implementions support this style of
-	 *             variables
-	 */
-	void removeVariable(ISnippetVariable variable);
-
-	/**
-	 * @param the category for this item
-	 * @deprecated - should not be changeable
-	 */
-	void setCategory(ISnippetCategory category);
-
-	/**
-	 * @param the name of the category holding this item. This is a handle
-	 *            only method; the category need not exist yet.
-	 * @deprecated - should not be changeable
-	 */
-	void setCategoryName(String name);
-
-	/**
-	 * @param the name of the insertion class for this item
-	 * 
-	 * @deprecated - should not be changeable
-	 */
-	void setClassName(String className);
-
-	/**
-	 * @param the new content string for this item
-	 * @deprecated - should not be changeable
-	 */
-	void setContentString(String content);
-
-	/**
-	 * @param the name of the editor class for this item
-	 * 
-	 * @deprecated - should not be changeable
-	 */
-	void setEditorClassName(String editorClassName);
-}
\ No newline at end of file
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/provisional/ISnippetsEntry.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/provisional/ISnippetsEntry.java
deleted file mode 100644
index 6e3d84f..0000000
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/provisional/ISnippetsEntry.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.wst.common.snippets.internal.provisional;
-
-/**
- * A Snippets Entry is an abstract notion encapsulating the values used to
- * represent Snippet Items and Containers. No object implements only this
- * interface.
- * 
- * This interface is not meant to be implemented by clients.
- */
-
-public interface ISnippetsEntry {
-
-	/**
-	 * Denotes that this entry was contributed by a plug-in
-	 */
-	final String SNIPPET_SOURCE_PLUGINS = "PLUGINS"; //$NON-NLS-1$
-
-	/**
-	 * Denotes that this entry was created by the user
-	 */
-	final String SNIPPET_SOURCE_USER = "USER"; //$NON-NLS-1$
-
-	/**
-	 * Denotes that this entry was discovered within the workspace
-	 * @deprecated
-	 */
-	final String SNIPPET_SOURCE_WORKSPACE = "WORKSPACE"; //$NON-NLS-1$
-
-	/**
-	 * @return the (lengthy) text description shown to the user for this entry
-	 */
-	String getDescription();
-
-	/**
-	 * @return the filters for which this entry will be shown (when filtering
-	 *         is enabled)
-	 */
-	String[] getFilters();
-
-	/**
-	 * @return the path to the icon image for this entry, relative to the
-	 *         entry's contributing plugin installation path or relative to
-	 *         the Snippets plugin's installation path
-	 */
-	String getIconName();
-
-	/**
-	 * @return a unique ID for this entry
-	 */
-	String getId();
-
-	/**
-	 * @return the (short) string shown to the user for this entry
-	 */
-	String getLabel();
-
-	/**
-	 * @return the path to a large icon image for this entry, relative to the
-	 *         entry's contributing plugin installation path or relative to
-	 *         the Snippets plugin's installation path, or null if one is not
-	 *         specified.
-	 */
-	String getLargeIconName();
-
-	/**
-	 * @return the object defining where this entry originated from. Valid
-	 *         values are instances of CategoryFileInfo and PluginRecord.
-	 */
-	Object getSourceDescriptor();
-
-	/**
-	 * @return the type of the source descriptor. Valid values are
-	 *         SNIPPET_SOURCE_PLUGINS, SNIPPET_SOURCE_USER, and
-	 *         SNIPPET_SOURCE_WORKSPACE.
-	 */
-	Object getSourceType();
-
-	/**
-	 * @return whether this entry is currently visible to the user or not
-	 */
-	boolean isVisible();
-
-	/**
-	 * @param description
-	 * @deprecated
-	 */
-	void setDescription(String description);
-
-	/**
-	 * @param filters
-	 * @deprecated
-	 */
-	void setFilters(String[] filters);
-
-	/**
-	 * @param icon
-	 * @deprecated
-	 */
-	void setIconName(String icon);
-
-	/**
-	 * @param id
-	 * @deprecated
-	 */
-	void setId(String id);
-
-	/**
-	 * @param label the (short) string shown to the user for this entry
-	 * @deprecated
-	 */
-	void setLabel(String label);
-
-	/**
-	 * @param icon
-	 * @deprecated
-	 */
-	void setLargeIconName(String icon);
-
-	/**
-	 * @param descriptor
-	 * @deprecated
-	 */
-	void setSourceDescriptor(Object descriptor);
-
-	/**
-	 * @param type
-	 * @deprecated
-	 */
-	void setSourceType(Object type);
-
-	/**
-	 * @param visible
-	 * @deprecated
-	 */
-	void setVisible(boolean visible);
-}
\ No newline at end of file
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/provisional/insertions/AbstractInsertion.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/provisional/insertions/AbstractInsertion.java
deleted file mode 100644
index dbe9aa0..0000000
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/provisional/insertions/AbstractInsertion.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.wst.common.snippets.internal.provisional.insertions;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-import org.eclipse.jface.text.BadLocationException;
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.IDocumentExtension4;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.texteditor.IDocumentProvider;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.wst.common.snippets.internal.Logger;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetsInsertion;
-import org.eclipse.wst.common.snippets.internal.util.StringUtils;
-
-
-/**
- * An abstract insertion class that understands placing the snippet's content
- * string into a text editor.
- */
-public abstract class AbstractInsertion implements ISnippetsInsertion {
-	private IEditorPart activeEditorPart = null;
-
-	private ISnippetItem fItem = null;
-	private Transfer[] supportedTransfers = null;
-
-	/**
-	 * default constructor
-	 */
-	public AbstractInsertion() {
-		super();
-	}
-
-	/**
-	 * @return An array of Transfer objects supported by this insertion for
-	 *         Drag and Drop.
-	 */
-	protected Transfer[] createTransfers() {
-		return new Transfer[]{TextTransfer.getInstance()};
-	}
-
-	/**
-	 * @param part
-	 * @param textEditor
-	 * @param document
-	 * @param textSelection
-	 * @throws BadLocationException
-	 */
-	protected void doInsert(IEditorPart part, ITextEditor textEditor, IDocument document, ITextSelection textSelection) throws BadLocationException {
-		String replacement = getInsertString(part.getEditorSite().getShell());
-		if (replacement != null && (replacement.length() > 0 || textSelection.getLength() > 0)) {
-			// Update EOLs (bug 80231)
-			replacement = StringUtils.replace(replacement, "\r\n", "\n");
-			replacement = StringUtils.replace(replacement, "\r", "\n");
-
-			String preferredEOL = null;
-			if (document instanceof IDocumentExtension4) {
-				preferredEOL = ((IDocumentExtension4) document).getDefaultLineDelimiter();
-			}
-			else {
-				Method getLineDelimiter = null;
-				try {
-					getLineDelimiter = document.getClass().getMethod("getLineDelimiter", new Class[0]); //$NON-NLS-1$
-				}
-				catch (NoSuchMethodException e) {
-					// nothing, not unusual
-				}
-				if (getLineDelimiter != null) {
-					try {
-						preferredEOL = (String) getLineDelimiter.invoke(document, new Object[0]);
-					}
-					catch (IllegalAccessException e) {
-						// nothing, not unusual for a non-visible method
-					}
-					catch (InvocationTargetException e) {
-						// nothing, not unusual for a protected implementation
-					}
-				}
-
-			}
-			if (preferredEOL == null) {
-				preferredEOL = System.getProperty("line.separator");
-			}
-			if (!"\n".equals(preferredEOL) && preferredEOL != null) {
-				replacement = StringUtils.replace(replacement, "\n", preferredEOL);
-			}
-
-			document.replace(textSelection.getOffset(), textSelection.getLength(), replacement);
-		}
-	}
-
-	/**
-	 * Gets the activeEditorPart.
-	 * 
-	 * @return the active IEditorPart
-	 */
-	public IEditorPart getActiveEditorPart() {
-		return activeEditorPart;
-	}
-
-	/**
-	 * Return the string intended to be inserted; used by double-click
-	 * behavior
-	 * 
-	 * @param host
-	 *            a shell from which UI elements may be opened to help
-	 *            determine what String to return
-	 * 
-	 * @return the String to be inserted
-	 */
-	public String getInsertString(Shell host) {
-		return ""; //$NON-NLS-1$
-	}
-
-
-	/**
-	 * Gets the Item.
-	 * 
-	 * @return the ISnippetItem
-	 */
-	public ISnippetItem getItem() {
-		return fItem;
-	}
-
-	public Transfer[] getTransfers() {
-		if (supportedTransfers == null)
-			supportedTransfers = createTransfers();
-		return supportedTransfers;
-	}
-
-	/**
-	 * Applies the current ISnippetItem to the given IEditorPart
-	 */
-	public void insert(IEditorPart editorPart) {
-		if (editorPart == null)
-			return;
-		if (editorPart instanceof ITextEditor) {
-			// find the text widget, its Document, and the current selection
-			ITextEditor editor = (ITextEditor) editorPart;
-			if (editor.isEditable()) {
-				IDocumentProvider docprovider = editor.getDocumentProvider();
-				ISelectionProvider selprovider = editor.getSelectionProvider();
-				if (docprovider != null && selprovider != null) {
-					IDocument document = docprovider.getDocument(editorPart.getEditorInput());
-					ISelection selection = selprovider.getSelection();
-					if (document != null && selection != null && selection instanceof ITextSelection) {
-						ITextSelection textSel = (ITextSelection) selection;
-						try {
-							doInsert(editorPart, editor, document, textSel);
-						}
-						catch (Exception t) {
-							Logger.logException("Could not insert " + getItem().getId(), t); //$NON-NLS-1$
-							editor.getSite().getShell().getDisplay().beep();
-						}
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Sets the activeEditorPart.
-	 * 
-	 * @param activeEditorPart
-	 *            The activeEditorPart to set
-	 */
-	public void setActiveEditorPart(IEditorPart newActiveEditorPart) {
-		this.activeEditorPart = newActiveEditorPart;
-	}
-
-	/**
-	 * Sets the fItem.
-	 * 
-	 * @param fItem
-	 *            The ISnippetItem to use
-	 */
-	public void setItem(ISnippetItem item) {
-		this.fItem = item;
-	}
-}
\ No newline at end of file
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/provisional/insertions/VariableInsertion.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/provisional/insertions/VariableInsertion.java
deleted file mode 100644
index 2580281..0000000
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/provisional/insertions/VariableInsertion.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-
-package org.eclipse.wst.common.snippets.internal.provisional.insertions;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-
-import org.eclipse.jface.text.IDocument;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.swt.dnd.DragSourceEvent;
-import org.eclipse.swt.dnd.TextTransfer;
-import org.eclipse.swt.dnd.Transfer;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.texteditor.ITextEditor;
-import org.eclipse.wst.common.snippets.internal.Logger;
-import org.eclipse.wst.common.snippets.internal.SnippetsPlugin;
-import org.eclipse.wst.common.snippets.internal.VariableItemHelper;
-import org.eclipse.wst.common.snippets.internal.dnd.VariableTextTransfer;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
-import org.eclipse.wst.common.snippets.internal.ui.EntrySerializer;
-import org.eclipse.wst.common.snippets.internal.util.StringUtils;
-
-/**
- * An insertion implementation that supports ISnippetVariables. The content
- * string of the item can contain markers, in the form ${+variable+}, that
- * will be replaced with user-supplied values at insertion time.
- */
-public class VariableInsertion extends AbstractInsertion {
-
-	/**
-	 * Default public constructor
-	 */
-	public VariableInsertion() {
-		super();
-	}
-
-	protected Transfer[] createTransfers() {
-		return new Transfer[]{VariableTextTransfer.getTransferInstance(), TextTransfer.getInstance()};
-	}
-
-	public void dragSetData(DragSourceEvent event, ISnippetItem item) {
-		boolean isSimpleText = TextTransfer.getInstance().isSupportedType(event.dataType);
-		if (isSimpleText) {
-			// set variable values to ""
-			IWorkbenchWindow window = SnippetsPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
-			Shell shell = null;
-			if (window != null) {
-				shell = window.getShell();
-			}
-			String content = VariableItemHelper.getInsertString(shell, item);
-			// Update EOLs (bug 80231)
-			String systemEOL = System.getProperty("line.separator");
-			content = StringUtils.replace(content, "\r\n", "\n");
-			content = StringUtils.replace(content, "\r", "\n");
-			if (!"\n".equals(systemEOL) && systemEOL != null) {
-				content = StringUtils.replace(content, "\n", systemEOL);
-			}
-			event.data = content;
-		}
-		else {
-			/*
-			 * All complex insertions send an XML encoded version of the item
-			 * itself as the data. The drop action must use this to prompt the
-			 * user for the correct insertion data
-			 */
-			event.data = EntrySerializer.getInstance().toXML(item);
-		}
-	}
-
-	public String getInsertString(Shell host) {
-		if (getItem() == null)
-			return ""; //$NON-NLS-1$
-		String insertString = null;
-		ISnippetItem item = getItem();
-		if (item.getVariables().length > 0) {
-			insertString = VariableItemHelper.getInsertString(host, item);
-		}
-		else {
-			insertString = StringUtils.replace(item.getContentString(), "${cursor}", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		}
-		return insertString;
-	}
-
-	public void insert(IEditorPart editorPart) {
-		IEditorPart anEditorPart = editorPart;
-		if (anEditorPart == null)
-			return;
-		if (anEditorPart instanceof ITextEditor) {
-			super.insert(editorPart);
-		}
-		else {
-			// MultiPageEditorPart has no accessors for the source EditorPart
-			ITextEditor textEditor = null;
-			if (anEditorPart instanceof ITextEditor) {
-				textEditor = (ITextEditor) anEditorPart;
-			}
-			else {
-				textEditor = (ITextEditor) anEditorPart.getAdapter(ITextEditor.class);
-			}
-			if (textEditor != null) {
-				if (textEditor.isEditable()) {
-					IDocument document = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput());
-					ISelection selection = textEditor.getSelectionProvider().getSelection();
-					if (document != null && selection instanceof ITextSelection) {
-						ITextSelection textSel = (ITextSelection) selection;
-						try {
-							doInsert(anEditorPart, textEditor, document, textSel);
-						}
-						catch (Exception t) {
-							Logger.logException("Could not insert " + getItem().getId(), t); //$NON-NLS-1$
-							textEditor.getSite().getShell().getDisplay().beep();
-						}
-					}
-				}
-			}
-			else {
-				// any errors here probably aren't really exceptional
-				Method getTextEditor = null;
-				try {
-					getTextEditor = anEditorPart.getClass().getMethod("getTextEditor", new Class[0]); //$NON-NLS-1$
-				}
-				catch (NoSuchMethodException e) {
-					// nothing, not unusual
-				}
-				Object editor = null;
-				if (getTextEditor != null) {
-					try {
-						editor = getTextEditor.invoke(anEditorPart, new Object[0]);
-					}
-					catch (IllegalAccessException e) {
-						// nothing, not unusual for a non-visible method
-					}
-					catch (InvocationTargetException e) {
-						// nothing, not unusual for a protected implementation
-					}
-					if (editor instanceof IEditorPart && editor != anEditorPart)
-						insert((IEditorPart) editor);
-				}
-			}
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/team/CategoryFileInfo.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/team/CategoryFileInfo.java
index c69b184..4c0a579 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/team/CategoryFileInfo.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/team/CategoryFileInfo.java
@@ -11,7 +11,7 @@
 package org.eclipse.wst.common.snippets.internal.team;
 
 import org.eclipse.core.resources.IFile;
-import org.eclipse.wst.common.snippets.internal.ISnippetCategory;
+import org.eclipse.wst.common.snippets.core.ISnippetCategory;
 
 
 /**
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/team/SnippetDefinitionResourceChangeListener.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/team/SnippetDefinitionResourceChangeListener.java
index cbe3a7e..e2f1543 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/team/SnippetDefinitionResourceChangeListener.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/team/SnippetDefinitionResourceChangeListener.java
@@ -31,11 +31,12 @@
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.gef.palette.PaletteDrawer;
 import org.eclipse.gef.palette.PaletteEntry;
-import org.eclipse.wst.common.snippets.internal.ISnippetCategory;
+import org.eclipse.wst.common.snippets.core.ISnippetCategory;
 import org.eclipse.wst.common.snippets.internal.Logger;
 import org.eclipse.wst.common.snippets.internal.SnippetDefinitions;
 import org.eclipse.wst.common.snippets.internal.model.SnippetManager;
 import org.eclipse.wst.common.snippets.internal.palette.ModelFactoryForWorkspace;
+import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteDrawer;
 
 
 /**
@@ -160,7 +161,7 @@
 		int oldIndex = -1;
 		List categories = SnippetManager.getInstance().getPaletteRoot().getChildren();
 		for (int i = 0; i < categories.size(); i++) {
-			if (((ISnippetCategory) categories.get(i)).getId().equals(info.getCategory().getId())) {
+			if (((SnippetPaletteDrawer) categories.get(i)).getId().equals(((SnippetPaletteDrawer) info.getCategory()).getId())) {
 				SnippetManager.getInstance().getPaletteRoot().remove((PaletteEntry) categories.get(i));
 				oldIndex = i;
 				break;
@@ -187,7 +188,7 @@
 		}
 		CategoryFileInfo result = new CategoryFileInfo(this, file, category);
 		if (category != null)
-			category.setSourceDescriptor(result);
+			((SnippetPaletteDrawer) category).setSourceDescriptor(result);
 		return result;
 	}
 
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/EntryDeserializer.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/EntryDeserializer.java
index 7eee245..5ef1da1 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/EntryDeserializer.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/EntryDeserializer.java
@@ -15,14 +15,12 @@
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 
-import org.eclipse.wst.common.snippets.internal.Debug;
-import org.eclipse.wst.common.snippets.internal.ISnippetVariable;
-import org.eclipse.wst.common.snippets.internal.SnippetDefinitions;
+import org.eclipse.wst.common.snippets.core.ISnippetVariable;
+import org.eclipse.wst.common.snippets.core.ISnippetsEntry;
+import org.eclipse.wst.common.snippets.internal.Logger;
 import org.eclipse.wst.common.snippets.internal.SnippetsPlugin;
 import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteItem;
 import org.eclipse.wst.common.snippets.internal.palette.SnippetVariable;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetsEntry;
 import org.eclipse.wst.common.snippets.internal.util.CommonXML;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -33,8 +31,6 @@
 
 
 public class EntryDeserializer {
-
-
 	private static EntryDeserializer reader = null;
 
 	public synchronized static EntryDeserializer getInstance() {
@@ -44,20 +40,13 @@
 		return reader;
 	}
 
-	protected EntryDeserializer() {
+	private EntryDeserializer() {
 		super();
 	}
 
-	protected void addItem(SnippetDefinitions definitions, Element element) {
-		SnippetPaletteItem item = createItem(element);
-		// item.setPluginRecord(getPluginRecord(definitions, element));
-		definitions.getItems().add(item);
-	}
-
-	protected void assignEntryProperties(Element element, ISnippetsEntry entry) {
+	private void assignEntryProperties(Element element, SnippetPaletteItem entry) {
 		entry.setId(element.getAttribute(SnippetsPlugin.NAMES.ID));
 		entry.setIconName(element.getAttribute(SnippetsPlugin.NAMES.ICON));
-		// new in V5.1
 		String description = createDescription(element);
 		String label = element.getAttribute(SnippetsPlugin.NAMES.LABEL);
 		if ((label == null || label.length() == 0) && description != null) {
@@ -68,15 +57,15 @@
 		entry.setLabel(label);
 	}
 
-	protected String createContent(Node item) {
+	private String createContent(Node item) {
 		return readCDATAofChild(item, SnippetsPlugin.NAMES.CONTENT);
 	}
 
-	protected String createDescription(Node entryElement) {
+	private String createDescription(Node entryElement) {
 		return readCDATAofChild(entryElement, SnippetsPlugin.NAMES.DESCRIPTION);
 	}
 
-	protected SnippetPaletteItem createItem(Element element) {
+	private SnippetPaletteItem createItem(Element element) {
 		SnippetPaletteItem item = new SnippetPaletteItem(element.getAttribute(SnippetsPlugin.NAMES.ID));
 		assignEntryProperties(element, item);
 		item.setContentString(createContent(element));
@@ -93,12 +82,12 @@
 					item.addVariable(var);
 			}
 		}
-		if (Debug.debugDefinitionPersistence)
+		if (Logger.DEBUG_DEFINITION_PERSISTENCE)
 			System.out.println("User item reader creating item " + item.getId()); //$NON-NLS-1$
 		return item;
 	}
 
-	protected ISnippetVariable createVariable(Element element) {
+	private ISnippetVariable createVariable(Element element) {
 		SnippetVariable var = new SnippetVariable();
 		var.setId(element.getAttribute(SnippetsPlugin.NAMES.ID));
 		var.setName(element.getAttribute(SnippetsPlugin.NAMES.NAME));
@@ -117,7 +106,7 @@
 				while (child.getNodeType() != Node.ELEMENT_NODE)
 					child = child.getNextSibling();
 				if (child.getNodeName().equals(SnippetsPlugin.NAMES.ITEM)) {
-					ISnippetItem item = createItem((Element) child);
+					SnippetPaletteItem item = createItem((Element) child);
 					item.setCategoryName(null);
 					item.setCategory(null);
 					item.setClassName(null);
@@ -142,7 +131,7 @@
 	 * <node><otherChild/><childName><wrong element/> <![CDATA[ RETURNED
 	 * TEXT]]> </childName> </node>
 	 */
-	protected String readCDATAofChild(Node node, String childName) {
+	private String readCDATAofChild(Node node, String childName) {
 		NodeList children = node.getChildNodes();
 		for (int i = 0; i < children.getLength(); i++) {
 			Node child = children.item(i);
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/EntrySerializer.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/EntrySerializer.java
index 7749a73..215045d 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/EntrySerializer.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/EntrySerializer.java
@@ -14,14 +14,14 @@
 
 import java.io.ByteArrayOutputStream;
 
-import org.eclipse.wst.common.snippets.internal.Debug;
-import org.eclipse.wst.common.snippets.internal.ISnippetCategory;
-import org.eclipse.wst.common.snippets.internal.ISnippetVariable;
+import org.eclipse.wst.common.snippets.core.ISnippetItem;
+import org.eclipse.wst.common.snippets.core.ISnippetVariable;
+import org.eclipse.wst.common.snippets.core.ISnippetsEntry;
 import org.eclipse.wst.common.snippets.internal.Logger;
-import org.eclipse.wst.common.snippets.internal.PluginRecord;
 import org.eclipse.wst.common.snippets.internal.SnippetsPlugin;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetsEntry;
+import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteDrawer;
+import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteItem;
+import org.eclipse.wst.common.snippets.internal.palette.SnippetVariable;
 import org.eclipse.wst.common.snippets.internal.util.CommonXML;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -38,36 +38,44 @@
 		return writer;
 	}
 
-	protected EntrySerializer() {
+	private EntrySerializer() {
 		super();
 	}
 
 	/**
 	 * Save the properties known for ISnippetsEntry
 	 */
-	protected void assignEntryProperties(ISnippetsEntry entry, Element owningElement) {
-		owningElement.setAttribute(SnippetsPlugin.NAMES.ID, entry.getId());
-		if (entry.getIconName() != null)
-			owningElement.setAttribute(SnippetsPlugin.NAMES.ICON, entry.getIconName());
+	private void assignEntryProperties(ISnippetsEntry entry, Element owningElement) {
+		if (entry instanceof SnippetPaletteItem) {
+			SnippetPaletteItem item = (SnippetPaletteItem) entry;
+			owningElement.setAttribute(SnippetsPlugin.NAMES.ID, item.getId());
+			if (item.getSmallIconName() != null)
+				owningElement.setAttribute(SnippetsPlugin.NAMES.ICON, item.getSmallIconName());
+		}
+		if (entry instanceof SnippetPaletteDrawer) {
+			SnippetPaletteDrawer drawer = (SnippetPaletteDrawer) entry;
+			owningElement.setAttribute(SnippetsPlugin.NAMES.ID, drawer.getId());
+			if (drawer.getSmallIconName() != null)
+				owningElement.setAttribute(SnippetsPlugin.NAMES.ICON, drawer.getSmallIconName());
+		}
 		if (entry.getDescription() != null)
 			owningElement.appendChild(createDescription(owningElement.getOwnerDocument(), entry.getDescription()));
-		// new in V5.1
 		if (entry.getLabel() != null)
 			owningElement.setAttribute(SnippetsPlugin.NAMES.LABEL, entry.getLabel());
 	}
 
 	/**
-	 * Create and save the properties known for LibraryCategories
+	 * Create and save the properties known for Snippet Categories
 	 */
-	protected Element createCategory(Document doc, ISnippetCategory category) {
+	private Element createCategory(Document doc, SnippetPaletteDrawer category) {
 		Element element = doc.createElement(SnippetsPlugin.NAMES.CATEGORY);
 		assignEntryProperties(category, element);
 		for (int i = 0; i < category.getChildren().size(); i++) {
-			ISnippetItem item = (ISnippetItem) category.getChildren().get(i);
+			SnippetPaletteItem item = (SnippetPaletteItem) category.getChildren().get(i);
 			Element child = createItem(doc, item);
 			element.appendChild(child);
 		}
-		if (Debug.debugDefinitionPersistence)
+		if (Logger.DEBUG_DEFINITION_PERSISTENCE)
 			System.out.println("User item writer saving category " + category.getId()); //$NON-NLS-1$
 		return element;
 	}
@@ -76,7 +84,7 @@
 	 * Create and save the content property of a ISnippetItem - always place
 	 * it in a CDATA section for consistency
 	 */
-	protected Element createContent(Document doc, ISnippetItem item) {
+	private Element createContent(Document doc, ISnippetItem item) {
 		Element element = doc.createElement(SnippetsPlugin.NAMES.CONTENT);
 		element.appendChild(doc.createCDATASection(item.getContentString()));
 		return element;
@@ -86,7 +94,7 @@
 	 * Create and save the content property of a ISnippetItem - always place
 	 * it in a CDATA section for consistency
 	 */
-	protected Element createDescription(Document doc, String description) {
+	private Element createDescription(Document doc, String description) {
 		Element element = doc.createElement(SnippetsPlugin.NAMES.DESCRIPTION);
 		if (description != null)
 			element.appendChild(doc.createCDATASection(description));
@@ -98,12 +106,12 @@
 	/**
 	 * Create and save the properties known for LibraryItems
 	 */
-	protected Element createItem(Document doc, ISnippetItem item) {
+	private Element createItem(Document doc, SnippetPaletteItem item) {
 		Element element = doc.createElement(SnippetsPlugin.NAMES.ITEM);
 		assignEntryProperties(item, element);
 		// JAXP is very picky about null values
 		if (item.getCategory() != null)
-			element.setAttribute(SnippetsPlugin.NAMES.CATEGORY, item.getCategory().getId());
+			element.setAttribute(SnippetsPlugin.NAMES.CATEGORY, ((SnippetPaletteDrawer) item.getCategory()).getId());
 		if (item.getClassName() != null)
 			element.setAttribute(SnippetsPlugin.NAMES.CLASSNAME, item.getClassName());
 		if (item.getEditorClassName() != null)
@@ -115,30 +123,17 @@
 			Element variable = createVariable(doc, variables[i]);
 			element.appendChild(variable);
 		}
-		if (Debug.debugDefinitionPersistence)
-			System.out.println("User item writer saving item " + item.getCategory().getId() + ":" + item.getId()); //$NON-NLS-1$ //$NON-NLS-2$
-		return element;
-	}
-
-	/**
-	 * Save the list of plugins already seen as there may no longer be
-	 * references to them in the remaining categories and items
-	 */
-	protected Element createPluginRecord(Document doc, PluginRecord record) {
-		Element element = doc.createElement(SnippetsPlugin.NAMES.PLUGIN);
-		element.setAttribute(SnippetsPlugin.NAMES.NAME, record.getPluginName());
-		element.setAttribute(SnippetsPlugin.NAMES.VERSION, record.getPluginVersion());
-		if (Debug.debugDefinitionPersistence)
-			System.out.println("User item writer saving plugin record " + record.getPluginName() + "/" + record.getPluginVersion()); //$NON-NLS-1$ //$NON-NLS-2$
+		if (Logger.DEBUG_DEFINITION_PERSISTENCE)
+			System.out.println("User item writer saving item " + ((SnippetPaletteDrawer) item.getCategory()).getId() + ":" + item.getId()); //$NON-NLS-1$ //$NON-NLS-2$
 		return element;
 	}
 
 	/**
 	 * Create and save the values for a ISnippetVariable
 	 */
-	protected Element createVariable(Document doc, ISnippetVariable variable) {
+	private Element createVariable(Document doc, ISnippetVariable variable) {
 		Element element = doc.createElement(SnippetsPlugin.NAMES.VARIABLE);
-		element.setAttribute(SnippetsPlugin.NAMES.ID, variable.getId());
+		element.setAttribute(SnippetsPlugin.NAMES.ID, ((SnippetVariable) variable).getId());
 		if (variable.getName() != null)
 			element.setAttribute(SnippetsPlugin.NAMES.NAME, variable.getName());
 		if (variable.getDefaultValue() != null)
@@ -153,12 +148,12 @@
 		ByteArrayOutputStream output = new ByteArrayOutputStream();
 
 		if (entry instanceof ISnippetItem) {
-			ISnippetItem item = (ISnippetItem) entry;
+			SnippetPaletteItem item = (SnippetPaletteItem) entry;
 			Element itemElement = createItem(document, item);
 			document.getDocumentElement().appendChild(itemElement);
 		}
 		else {
-			ISnippetCategory category = (ISnippetCategory) entry;
+			SnippetPaletteDrawer category = (SnippetPaletteDrawer) entry;
 			Element categoryElement = createCategory(document, category);
 			document.getDocumentElement().appendChild(categoryElement);
 		}
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/SnippetDrawerEntryPage.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/SnippetDrawerEntryPage.java
index 77e5015..0571ef2 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/SnippetDrawerEntryPage.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/SnippetDrawerEntryPage.java
@@ -47,9 +47,10 @@
 import org.eclipse.ui.dialogs.ElementListSelectionDialog;
 import org.eclipse.ui.dialogs.ListSelectionDialog;
 import org.eclipse.ui.help.WorkbenchHelp;
+import org.eclipse.wst.common.snippets.core.ISnippetsEntry;
 import org.eclipse.wst.common.snippets.internal.IHelpContextIds;
 import org.eclipse.wst.common.snippets.internal.SnippetsMessages;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetsEntry;
+import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteDrawer;
 import org.eclipse.wst.common.snippets.internal.util.VisibilityUtil;
 
 public class SnippetDrawerEntryPage extends DrawerEntryPage {
@@ -338,19 +339,19 @@
 	}
 
 	protected void refreshEntryFilters() {
-		ISnippetsEntry snippetEntry = (ISnippetsEntry) getEntry();
+		SnippetPaletteDrawer snippetDrawer = (SnippetPaletteDrawer) getEntry();
 		if (fAlwaysShowButton.getSelection()) {
-			snippetEntry.setFilters(new String[]{"*"}); //$NON-NLS-1$
-			snippetEntry.setVisible(true);
+			snippetDrawer.setFilters(new String[]{"*"}); //$NON-NLS-1$
+			snippetDrawer.setVisible(true);
 		}
 		else if (fAlwaysHideButton.getSelection()) {
-			snippetEntry.setFilters(new String[]{"!"}); //$NON-NLS-1$
-			snippetEntry.setVisible(false);
+			snippetDrawer.setFilters(new String[]{"!"}); //$NON-NLS-1$
+			snippetDrawer.setVisible(false);
 		}
 		else {
 			if (fContentTypes.length == 0) {
-				snippetEntry.setFilters(new String[]{"-"}); //$NON-NLS-1$
-				snippetEntry.setVisible(false);
+				snippetDrawer.setFilters(new String[]{"-"}); //$NON-NLS-1$
+				snippetDrawer.setVisible(false);
 			}
 			else {
 				String[] filters = new String[fContentTypes.length];
@@ -367,8 +368,8 @@
 					visible = VisibilityUtil.isContentType(input, filters);
 				}
 
-				snippetEntry.setFilters(filters);
-				snippetEntry.setVisible(visible);
+				snippetDrawer.setFilters(filters);
+				snippetDrawer.setVisible(visible);
 			}
 		}
 	}
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/SnippetTemplateEntryPage.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/SnippetTemplateEntryPage.java
index e6ae449..efd144d 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/SnippetTemplateEntryPage.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/SnippetTemplateEntryPage.java
@@ -10,19 +10,15 @@
  *******************************************************************************/
 package org.eclipse.wst.common.snippets.internal.ui;
 
-import org.eclipse.core.runtime.Platform;
 import org.eclipse.gef.palette.PaletteEntry;
 import org.eclipse.gef.ui.palette.customize.DefaultEntryPage;
 import org.eclipse.swt.events.ModifyEvent;
 import org.eclipse.swt.events.ModifyListener;
 import org.eclipse.swt.widgets.Composite;
-import org.eclipse.wst.common.snippets.internal.Logger;
-import org.eclipse.wst.common.snippets.internal.PluginRecord;
+import org.eclipse.wst.common.snippets.core.ISnippetsEntry;
 import org.eclipse.wst.common.snippets.internal.editors.ISnippetEditor;
 import org.eclipse.wst.common.snippets.internal.editors.VariableItemEditor;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetsEntry;
-import org.osgi.framework.Bundle;
+import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteItem;
 
 
 public class SnippetTemplateEntryPage extends DefaultEntryPage implements ModifyListener {
@@ -36,11 +32,11 @@
 
 	public void createControl(Composite parent, PaletteEntry entry) {
 		super.createControl(parent, entry);
-		editor = getEditor((ISnippetItem) entry);
+		editor = getEditor((SnippetPaletteItem) entry);
 		if (editor != null) {
 			snippetsCustomizer.activeEditors.add(editor);
 			editor.addModifyListener(this);
-			editor.setItem((ISnippetItem) entry);
+			editor.setItem((SnippetPaletteItem) entry);
 			editor.createContents((Composite) getControl());
 			// it can't be known in advance since the editor is unknown as
 			// well
@@ -48,58 +44,10 @@
 		}
 	}
 
-	protected ISnippetEditor getEditor(ISnippetItem item) {
+	protected ISnippetEditor getEditor(SnippetPaletteItem item) {
 		ISnippetEditor snippetEditor = null;
-
-		String editorClassName = item.getEditorClassName();
-
-		// ignore the version
-		Bundle bundle = null;
-		if (item.getSourceType() == ISnippetsEntry.SNIPPET_SOURCE_PLUGINS) {
-			PluginRecord pluginRecord = (PluginRecord) item.getSourceDescriptor();
-			if (pluginRecord != null) {
-				bundle = Platform.getBundle(pluginRecord.getPluginName());
-			}
-		}
-
-		boolean editorSpecified = editorClassName != null && editorClassName.length() > 0;
-
-		if (editorSpecified) {
-			Class theClass = null;
-			try {
-				if (editorClassName != null && editorClassName.length() > 0) {
-					if ( bundle != null && bundle.getState() != Bundle.UNINSTALLED) {
-						theClass = bundle.loadClass(editorClassName);
-					} else {
-						ClassLoader classLoader = getClass().getClassLoader();
-						theClass = classLoader != null ? classLoader.loadClass(editorClassName) : Class.forName(editorClassName); 
-					}
-				}
-			}
-			catch (ClassNotFoundException e) {
-				Logger.logException("Could not load ISnippetEditor class", e); //$NON-NLS-1$
-			}
-			if (theClass != null) {
-				try {
-					snippetEditor = (ISnippetEditor) theClass.newInstance();
-				}
-				catch (IllegalAccessException e) {
-					Logger.logException("Could not access ISnippetEditor class", e); //$NON-NLS-1$
-				}
-				catch (InstantiationException e) {
-					Logger.logException("Could not instantiate ISnippetEditor class", e); //$NON-NLS-1$
-				}
-			}
-		}
-
-		if (snippetEditor == null && !editorSpecified) {
-			try {
-				snippetEditor = (ISnippetEditor) DEFAULT_EDITOR_CLASS.newInstance();
-			}
-			catch (IllegalAccessException e) {
-			}
-			catch (InstantiationException e) {
-			}
+		if (item.getSourceType() != ISnippetsEntry.SNIPPET_SOURCE_PLUGINS) {
+			snippetEditor = new VariableItemEditor();
 		}
 		return snippetEditor;
 	}
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/SnippetVariableTableViewer.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/SnippetVariableTableViewer.java
index c447a4a..ab53f50 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/SnippetVariableTableViewer.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/SnippetVariableTableViewer.java
@@ -15,20 +15,19 @@
 import java.util.Hashtable;
 import java.util.List;
 
+import org.eclipse.jface.viewers.ArrayContentProvider;
 import org.eclipse.jface.viewers.CellEditor;
 import org.eclipse.jface.viewers.ColumnWeightData;
 import org.eclipse.jface.viewers.ICellModifier;
 import org.eclipse.jface.viewers.ILabelProviderListener;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.IStructuredContentProvider;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.ITableLabelProvider;
 import org.eclipse.jface.viewers.SelectionChangedEvent;
 import org.eclipse.jface.viewers.TableLayout;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.widgets.Composite;
@@ -36,7 +35,8 @@
 import org.eclipse.swt.widgets.Table;
 import org.eclipse.swt.widgets.TableColumn;
 import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.wst.common.snippets.internal.ISnippetVariable;
+import org.eclipse.wst.common.snippets.core.ISnippetVariable;
+import org.eclipse.wst.common.snippets.internal.palette.SnippetVariable;
 
 
 /**
@@ -94,18 +94,7 @@
 			}
 		});
 
-		fTableViewer.setContentProvider(new IStructuredContentProvider() {
-
-			public void dispose() {
-			}
-
-			public Object[] getElements(Object inputElement) {
-				return ((List) inputElement).toArray();
-			}
-
-			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
-			}
-		});
+		fTableViewer.setContentProvider(new ArrayContentProvider());
 
 		fTableViewer.setLabelProvider(new ITableLabelProvider() {
 
@@ -122,7 +111,7 @@
 			public String getColumnText(Object element, int columnIndex) {
 				if (element == null)
 					return null;
-				ISnippetVariable var = (ISnippetVariable) element;
+				SnippetVariable var = (SnippetVariable) element;
 				if (columnIndex == 0)
 					return var.getId();
 				else if (columnIndex == 1)
@@ -161,15 +150,15 @@
 
 			public Object getValue(Object element, String property) {
 				if (property.equals("id")) //$NON-NLS-1$
-					return ((ISnippetVariable) element).getId();
+					return ((SnippetVariable) element).getId();
 				else if (property.equals("value")) //$NON-NLS-1$
-					return fValues.get(((ISnippetVariable) element).getId());
+					return fValues.get(((SnippetVariable) element).getId());
 				return ""; //$NON-NLS-1$
 			}
 
 			public void modify(Object element, String property, Object value) {
 				TableItem item = (TableItem) element;
-				ISnippetVariable var = (ISnippetVariable) item.getData();
+				SnippetVariable var = (SnippetVariable) item.getData();
 				if (property.equals("value")) { //$NON-NLS-1$
 					String oldValue = (String) fValues.get(var.getId());
 					fValues.put(var.getId(), value);
@@ -236,7 +225,7 @@
 	}
 
 	public String getValue(ISnippetVariable var) {
-		return getValue(var.getId());
+		return getValue(((SnippetVariable) var).getId());
 	}
 
 	public String getValue(String id) {
@@ -266,7 +255,7 @@
 		if (fLibraryVariables != null) {
 			fValues = null;
 			for (int i = 0; i < fLibraryVariables.size(); i++) {
-				ISnippetVariable var = (ISnippetVariable) fLibraryVariables.get(i);
+				SnippetVariable var = (SnippetVariable) fLibraryVariables.get(i);
 				getValues().put(var.getId(), var.getDefaultValue());
 			}
 		}
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/SnippetsCustomizer.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/SnippetsCustomizer.java
index 0534f6c..23eda7e 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/SnippetsCustomizer.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/SnippetsCustomizer.java
@@ -19,7 +19,8 @@
 import org.eclipse.gef.palette.PaletteTemplateEntry;
 import org.eclipse.gef.ui.palette.PaletteCustomizer;
 import org.eclipse.gef.ui.palette.customize.EntryPage;
-import org.eclipse.wst.common.snippets.internal.ISnippetCategory;
+import org.eclipse.wst.common.snippets.core.ISnippetCategory;
+import org.eclipse.wst.common.snippets.core.ISnippetsEntry;
 import org.eclipse.wst.common.snippets.internal.Logger;
 import org.eclipse.wst.common.snippets.internal.editors.ISnippetEditor;
 import org.eclipse.wst.common.snippets.internal.model.SnippetManager;
@@ -27,7 +28,6 @@
 import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteDrawerFactory;
 import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteItem;
 import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteItemFactory;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetsEntry;
 
 
 public class SnippetsCustomizer extends PaletteCustomizer {
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/SnippetsView.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/SnippetsView.java
index 38880f8..8118a69 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/SnippetsView.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/ui/SnippetsView.java
@@ -59,9 +59,10 @@
 import org.eclipse.ui.PartInitException;
 import org.eclipse.ui.help.WorkbenchHelp;
 import org.eclipse.ui.part.ViewPart;
-import org.eclipse.wst.common.snippets.internal.Debug;
+import org.eclipse.wst.common.snippets.core.ISnippetCategory;
+import org.eclipse.wst.common.snippets.core.ISnippetItem;
+import org.eclipse.wst.common.snippets.core.ISnippetsEntry;
 import org.eclipse.wst.common.snippets.internal.IHelpContextIds;
-import org.eclipse.wst.common.snippets.internal.ISnippetCategory;
 import org.eclipse.wst.common.snippets.internal.Logger;
 import org.eclipse.wst.common.snippets.internal.PluginRecord;
 import org.eclipse.wst.common.snippets.internal.SnippetDefinitions;
@@ -73,17 +74,15 @@
 import org.eclipse.wst.common.snippets.internal.actions.DeleteCategoryAction;
 import org.eclipse.wst.common.snippets.internal.actions.DeleteItemAction;
 import org.eclipse.wst.common.snippets.internal.model.SnippetManager;
+import org.eclipse.wst.common.snippets.internal.palette.SnippetCustomizerDialog;
 import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteDrawer;
 import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteItem;
 import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteItemFactory;
 import org.eclipse.wst.common.snippets.internal.palette.SnippetPaletteRoot;
-import org.eclipse.wst.common.snippets.internal.palette.SnippetViewer;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetItem;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetsEntry;
-import org.eclipse.wst.common.snippets.internal.provisional.ISnippetsInsertion;
-import org.eclipse.wst.common.snippets.internal.provisional.insertions.VariableInsertion;
 import org.eclipse.wst.common.snippets.internal.util.UserDrawerSelector;
 import org.eclipse.wst.common.snippets.internal.util.VisibilityUtil;
+import org.eclipse.wst.common.snippets.ui.DefaultSnippetInsertion;
+import org.eclipse.wst.common.snippets.ui.ISnippetInsertion;
 import org.osgi.framework.Bundle;
 
 public class SnippetsView extends ViewPart {
@@ -142,7 +141,7 @@
 
 	protected class InsertAction extends Action {
 		public InsertAction() {
-			super(SnippetsMessages.Insert___); 
+			super(SnippetsMessages.Insert___);
 			setImageDescriptor(SnippetsPluginImageHelper.getInstance().getImageDescriptor(SnippetsPluginImages.IMG_ELCL_INSERT));
 			setHoverImageDescriptor(SnippetsPluginImageHelper.getInstance().getImageDescriptor(SnippetsPluginImages.IMG_CLCL_INSERT));
 			setDisabledImageDescriptor(SnippetsPluginImageHelper.getInstance().getImageDescriptor(SnippetsPluginImages.IMG_DLCL_INSERT));
@@ -155,13 +154,13 @@
 		}
 	}
 
-	protected class InsertionHelper {
+	class InsertionHelper {
 		protected InsertionHelper() {
 			super();
 		}
 
-		protected ISnippetsInsertion getInsertion(ISnippetItem item) {
-			ISnippetsInsertion insertion = null;
+		protected ISnippetInsertion getInsertion(SnippetPaletteItem item) {
+			ISnippetInsertion insertion = null;
 			String className = item.getClassName();
 
 			PluginRecord record = null;
@@ -187,7 +186,7 @@
 				}
 				if (theClass != null) {
 					try {
-						insertion = (ISnippetsInsertion) theClass.newInstance();
+						insertion = (ISnippetInsertion) theClass.newInstance();
 					}
 					catch (IllegalAccessException e) {
 						Logger.logException("Could not access Insertion class", e); //$NON-NLS-1$
@@ -198,24 +197,15 @@
 				}
 			}
 			if (insertion == null) {
-				try {
-					insertion = (ISnippetsInsertion) DEFAULT_INSERTION_CLASS.newInstance();
-				}
-				catch (IllegalAccessException e) {
-					Logger.logException("Could not access Insertion class", e); //$NON-NLS-1$
-				}
-				catch (InstantiationException e) {
-					Logger.logException("Could not instantiate Insertion class", e); //$NON-NLS-1$
-				}
+				insertion = new DefaultSnippetInsertion();
 			}
 			return insertion;
 		}
 
-		public boolean insert(ISnippetItem item, IEditorPart editorPart) {
-			ISnippetsInsertion insertion = getInsertion(item);
+		public boolean insert(SnippetPaletteItem item, IEditorPart editorPart) {
+			ISnippetInsertion insertion = getInsertion(item);
 			if (insertion != null) {
 				insertion.setItem(item);
-				insertion.setActiveEditorPart(editorPart);
 				insertion.insert(editorPart);
 				return true;
 			}
@@ -228,10 +218,10 @@
 			// doesn't detect if hitpoint is on internal scrollbars
 			if (e.button == 1) {
 				EditPart part = SnippetsView.this.getViewer().findObjectAt(new Point(e.x, e.y));
-				ISnippetItem item = null;
+				SnippetPaletteItem item = null;
 				if (part != null) {
-					if (part.getModel() instanceof ISnippetItem)
-						item = (ISnippetItem) part.getModel();
+					if (part.getModel() instanceof SnippetPaletteItem)
+						item = (SnippetPaletteItem) part.getModel();
 				}
 				if (item != null)
 					insert(item);
@@ -276,7 +266,6 @@
 	}
 
 	protected class PasteAction extends Action {
-
 		public PasteAction() {
 			super(SnippetsMessages.Paste_4); //$NON-NLS-1$
 			setImageDescriptor(SnippetsPluginImageHelper.getInstance().getImageDescriptor(SnippetsPluginImages.IMG_ELCL_PASTE));
@@ -325,16 +314,16 @@
 					else
 						return;
 				}
-				if (entry instanceof ISnippetItem) {
-					ISnippetItem item = (ISnippetItem) entry;
-					if (destination instanceof ISnippetCategory) {
-						item.setId(destination.getId() + System.currentTimeMillis());
-						((ISnippetCategory) destination).add(item);
+				if (entry instanceof SnippetPaletteItem) {
+					SnippetPaletteItem item = (SnippetPaletteItem) entry;
+					if (destination instanceof SnippetPaletteDrawer) {
+						item.setId(((SnippetPaletteDrawer) destination).getId() + System.currentTimeMillis());
+						((SnippetPaletteDrawer) destination).add(item);
 						EditPart container = (EditPart) getViewer().getEditPartRegistry().get(destination);
 						container.refresh();
 					}
 					else if (destination instanceof ISnippetItem) {
-						ISnippetCategory category = ((ISnippetItem) destination).getCategory();
+						SnippetPaletteDrawer category = (SnippetPaletteDrawer) ((ISnippetItem) destination).getCategory();
 						item.setId("item_" + System.currentTimeMillis()); //$NON-NLS-1$
 						category.add(item);
 						EditPart container = (EditPart) getViewer().getEditPartRegistry().get(category);
@@ -409,7 +398,7 @@
 		}
 
 		public void dragFinished(DragSourceEvent event) {
-			if (Debug.debugDragAndDrop)
+			if (Logger.DEBUG_DRAG_AND_DROP)
 				System.out.println("drag finished"); //$NON-NLS-1$
 		}
 
@@ -417,8 +406,8 @@
 			if (getSelectedEntry() == null)
 				return;
 			if (getSelectedEntry() instanceof ISnippetItem) {
-				ISnippetsInsertion insertion = insertionHelper.getInsertion((ISnippetItem) getSelectedEntry());
-				insertion.setActiveEditorPart(getSite().getPage().getActiveEditor());
+				ISnippetInsertion insertion = insertionHelper.getInsertion((SnippetPaletteItem) getSelectedEntry());
+				insertion.setEditorPart(getSite().getPage().getActiveEditor());
 				insertion.dragSetData(event, (ISnippetItem) getSelectedEntry());
 			}
 			else {
@@ -430,7 +419,7 @@
 		}
 
 		public void dragStart(DragSourceEvent event) {
-			if (Debug.debugDragAndDrop)
+			if (Logger.DEBUG_DRAG_AND_DROP)
 				System.out.println("drag begun"); //$NON-NLS-1$
 		}
 
@@ -444,8 +433,6 @@
 		}
 	}
 
-	public static final Class DEFAULT_INSERTION_CLASS = VariableInsertion.class;
-
 	protected Clipboard clipboard = null;
 
 	protected Action copyAction = null;
@@ -482,11 +469,21 @@
 		getTransferDragSourceListeners().add(listener);
 	}
 
+	private PaletteCustomizerDialog fPaletteCustomizerDialog = null;
+
 	/*
 	 * @see IWorkbenchPart#createPartControl(Composite)
 	 */
 	public void createPartControl(Composite parent) {
-		fViewer = new SnippetViewer();
+		fViewer = new PaletteViewer() {
+			public PaletteCustomizerDialog getCustomizerDialog() {
+				if (fPaletteCustomizerDialog == null) {
+					fPaletteCustomizerDialog = new SnippetCustomizerDialog(getControl().getShell(), getCustomizer(), getPaletteRoot());
+				}
+				return fPaletteCustomizerDialog;
+			}
+		};
+
 		fViewer.enableVerticalScrollbar(true);
 
 		fViewer.createControl(parent);
@@ -510,9 +507,10 @@
 		fViewer.getContextMenu().setRemoveAllWhenShown(true);
 
 		fViewer.setCustomizer(new SnippetsCustomizer());
-		PaletteViewerPreferences libraryPreferences = new DefaultPaletteViewerPreferences(SnippetsPlugin.getDefault().getPreferenceStore());
+
+		PaletteViewerPreferences palettePreferences = new DefaultPaletteViewerPreferences(SnippetsPlugin.getDefault().getPreferenceStore());
 		SnippetsPlugin.getDefault().getPreferenceStore().setDefault(PaletteViewerPreferences.PREFERENCE_AUTO_COLLAPSE, PaletteViewerPreferences.COLLAPSE_ALWAYS);
-		fViewer.setPaletteViewerPreferences(libraryPreferences);
+		fViewer.setPaletteViewerPreferences(palettePreferences);
 
 		fViewer.setPaletteRoot(getRoot());
 
@@ -745,12 +743,12 @@
 
 	public void insert() {
 		if (getSelectedEntry() != null && getSelectedEntry() instanceof ISnippetItem) {
-			ISnippetItem item = (ISnippetItem) getSelectedEntry();
+			SnippetPaletteItem item = (SnippetPaletteItem) getSelectedEntry();
 			insert(item);
 		}
 	}
 
-	public void insert(ISnippetItem item) {
+	public void insert(SnippetPaletteItem item) {
 		insertionHelper.insert(item, getSite().getPage().getActiveEditor());
 	}
 
@@ -779,7 +777,7 @@
 	}
 
 	public void setSelectedEntry(ISnippetsEntry entry) {
-		if (Debug.debugPaletteSelection) {
+		if (Logger.DEBUG_PALETTE_SELECTION) {
 			if (fSelectedEntry == entry)
 				System.out.println("selection notification: " + entry + " (duplicated)"); //$NON-NLS-1$ //$NON-NLS-2$
 			else
@@ -788,7 +786,7 @@
 		if (fSelectedEntry == entry) {
 			return;
 		}
-		if (Debug.debugPaletteSelection)
+		if (Logger.DEBUG_PALETTE_SELECTION)
 			System.out.println("processing selection: " + entry); //$NON-NLS-1$
 		fSelectedEntry = entry;
 		updateDragSource();
@@ -809,11 +807,11 @@
 	protected void updateDragSource() {
 		Transfer[] supportedTypes = null;
 		if (getSelectedEntry() != null && getSelectedEntry() instanceof ISnippetItem) {
-			ISnippetItem item = (ISnippetItem) getSelectedEntry();
-			ISnippetsInsertion insertion = insertionHelper.getInsertion(item);
+			SnippetPaletteItem item = (SnippetPaletteItem) getSelectedEntry();
+			ISnippetInsertion insertion = insertionHelper.getInsertion(item);
 			if (insertion != null) {
 				insertion.setItem(item);
-				insertion.setActiveEditorPart(getSite().getPage().getActiveEditor());
+				insertion.setEditorPart(getSite().getPage().getActiveEditor());
 				supportedTypes = insertion.getTransfers();
 			}
 		}
@@ -859,7 +857,7 @@
 		if (addTextTransfer) {
 			addTextTransferListener();
 		}
-		if (Debug.debugDragAndDrop)
+		if (Logger.DEBUG_DRAG_AND_DROP)
 			System.out.println("" + getTransferDragSourceListeners().size() + " transfer types"); //$NON-NLS-1$ //$NON-NLS-2$
 	}
 }
\ No newline at end of file
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/util/Sorter.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/util/Sorter.java
index 6a0bdbe..3a5b56c 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/util/Sorter.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/util/Sorter.java
@@ -12,8 +12,6 @@
  *******************************************************************************/
 package org.eclipse.wst.common.snippets.internal.util;
 
-
-
 /**
  * The SortOperation takes a collection of objects and returns a sorted
  * collection of these objects. Concrete instances of this class provide the
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/util/VisibilityUtil.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/util/VisibilityUtil.java
index f07a165..d2e651b 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/util/VisibilityUtil.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/util/VisibilityUtil.java
@@ -31,20 +31,20 @@
  */
 public class VisibilityUtil {
 	public static boolean isContentType(IEditorInput input, String[] filterContentTypes) {
-		boolean match = false;
+		boolean isMatch = false;
 		if (filterContentTypes == null) {
-			match = true;
+			isMatch = true;
 		}
 		else if (filterContentTypes.length >= 1) {
 			String firstFilter = filterContentTypes[0];
 			if (firstFilter.compareTo("*") == 0) //$NON-NLS-1$
-				match = true;
+				isMatch = true;
 			else if (firstFilter.compareTo("!") == 0) //$NON-NLS-1$
-				match = false;
+				isMatch = false;
 			else if (firstFilter.compareTo("-") == 0) //$NON-NLS-1$
-				match = false;
+				isMatch = false;
 			else {
-				match = false;
+				isMatch = false;
 				InputStream contents = null;
 				IContentDescription contentDesc = null;
 				try {
@@ -96,7 +96,7 @@
 							for (int i = 0; i < filterContentTypes.length; i++) {
 								IContentType contentType = Platform.getContentTypeManager().getContentType(filterContentTypes[i]);
 								if (contentType != null && currentContentType.isKindOf(contentType)) {
-									match = true;
+									isMatch = true;
 									break;
 								}
 							}
@@ -115,7 +115,7 @@
 								String filterContentTypeName = filterContentTypes[i];
 								IContentType filterContentType = Platform.getContentTypeManager().getContentType(filterContentTypeName);
 								if (filterContentType != null && contentTypes[j].isKindOf(filterContentType)) {
-									match = true;
+									isMatch = true;
 									break;
 								}
 							}
@@ -141,6 +141,6 @@
 				}
 			}
 		}
-		return match;
+		return isMatch;
 	}
 }
\ No newline at end of file
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/util/DocumentProvider.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/util/XMLDocumentProvider.java
similarity index 98%
rename from org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/util/DocumentProvider.java
rename to org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/util/XMLDocumentProvider.java
index 219d2e6..6655e5a 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/util/DocumentProvider.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/util/XMLDocumentProvider.java
@@ -47,7 +47,7 @@
  * from within a .JAR file (***read-only***)
  */
 
-public class DocumentProvider {
+public class XMLDocumentProvider {
 	/**
 	 * 
 	 * @param args
@@ -56,7 +56,7 @@
 	public static void main(String[] args) {
 		if (args.length < 2)
 			return;
-		DocumentProvider p = new DocumentProvider();
+		XMLDocumentProvider p = new XMLDocumentProvider();
 		p.setFileName(args[0]);
 		p.setRootElementName(args[1]);
 		p.getDocument();
@@ -74,7 +74,7 @@
 	protected String rootElementName = null;
 
 
-	public DocumentProvider() {
+	public XMLDocumentProvider() {
 		super();
 	}
 
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/ui/DefaultSnippetInsertion.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/ui/DefaultSnippetInsertion.java
new file mode 100644
index 0000000..3af8269
--- /dev/null
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/ui/DefaultSnippetInsertion.java
@@ -0,0 +1,247 @@
+/*******************************************************************************
+ * Copyright (c) 2004 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.wst.common.snippets.ui;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import org.eclipse.jface.text.BadLocationException;
+import org.eclipse.jface.text.IDocument;
+import org.eclipse.jface.text.IDocumentExtension4;
+import org.eclipse.jface.text.ITextSelection;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.swt.dnd.DragSourceEvent;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.IEditorPart;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.texteditor.IDocumentProvider;
+import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.wst.common.snippets.core.ISnippetItem;
+import org.eclipse.wst.common.snippets.internal.Logger;
+import org.eclipse.wst.common.snippets.internal.SnippetsPlugin;
+import org.eclipse.wst.common.snippets.internal.VariableItemHelper;
+import org.eclipse.wst.common.snippets.internal.dnd.SnippetTextTransfer;
+import org.eclipse.wst.common.snippets.internal.ui.EntrySerializer;
+import org.eclipse.wst.common.snippets.internal.util.StringUtils;
+
+/**
+ * An insertion implementation that supports ISnippetVariables. The content
+ * string of the item can contain markers, in the form ${+variable+}, that
+ * will be replaced with user-supplied values at insertion time.
+ */
+public class DefaultSnippetInsertion implements ISnippetInsertion {
+	private IEditorPart fEditorPart;
+	private ISnippetItem fItem = null;
+	private Transfer[] fSupportedTransfers = null;
+
+	public DefaultSnippetInsertion() {
+		super();
+	}
+
+	protected Transfer[] createTransfers() {
+		return new Transfer[]{SnippetTextTransfer.getTransferInstance(), TextTransfer.getInstance()};
+	}
+
+	/**
+	 * @param editorPart
+	 * @param textEditor
+	 * @param document
+	 * @param textSelection
+	 * @throws BadLocationException
+	 */
+	protected void doInsert(IEditorPart editorPart, ITextEditor textEditor, IDocument document, ITextSelection textSelection) throws BadLocationException {
+		String replacement = getInsertString(editorPart.getEditorSite().getShell());
+		if (replacement != null && (replacement.length() > 0 || textSelection.getLength() > 0)) {
+			// Update EOLs (bug 80231)
+			replacement = StringUtils.replace(replacement, "\r\n", "\n");
+			replacement = StringUtils.replace(replacement, "\r", "\n");
+
+			String preferredEOL = null;
+			if (document instanceof IDocumentExtension4) {
+				preferredEOL = ((IDocumentExtension4) document).getDefaultLineDelimiter();
+			}
+			else {
+				Method getLineDelimiter = null;
+				try {
+					getLineDelimiter = document.getClass().getMethod("getLineDelimiter", new Class[0]); //$NON-NLS-1$
+				}
+				catch (NoSuchMethodException e) {
+					// nothing, not unusual
+				}
+				if (getLineDelimiter != null) {
+					try {
+						preferredEOL = (String) getLineDelimiter.invoke(document, new Object[0]);
+					}
+					catch (IllegalAccessException e) {
+						// nothing, not unusual for a non-visible method
+					}
+					catch (InvocationTargetException e) {
+						// nothing, not unusual for a protected implementation
+					}
+				}
+
+			}
+			if (preferredEOL == null) {
+				preferredEOL = System.getProperty("line.separator");
+			}
+			if (!"\n".equals(preferredEOL) && preferredEOL != null) {
+				replacement = StringUtils.replace(replacement, "\n", preferredEOL);
+			}
+
+			document.replace(textSelection.getOffset(), textSelection.getLength(), replacement);
+		}
+	}
+
+	public void dragSetData(DragSourceEvent event, ISnippetItem item) {
+		boolean isSimpleText = TextTransfer.getInstance().isSupportedType(event.dataType);
+		if (isSimpleText) {
+			// set variable values to ""
+			IWorkbenchWindow window = SnippetsPlugin.getDefault().getWorkbench().getActiveWorkbenchWindow();
+			Shell shell = null;
+			if (window != null) {
+				shell = window.getShell();
+			}
+			String content = VariableItemHelper.getInsertString(shell, item);
+			// Update EOLs (bug 80231)
+			String systemEOL = System.getProperty("line.separator");
+			content = StringUtils.replace(content, "\r\n", "\n");
+			content = StringUtils.replace(content, "\r", "\n");
+			if (!"\n".equals(systemEOL) && systemEOL != null) {
+				content = StringUtils.replace(content, "\n", systemEOL);
+			}
+			event.data = content;
+		}
+		else {
+			/*
+			 * All complex insertions send an XML encoded version of the item
+			 * itself as the data. The drop action must use this to prompt the
+			 * user for the correct insertion data
+			 */
+			event.data = EntrySerializer.getInstance().toXML(item);
+		}
+	}
+
+	protected String getInsertString(Shell host) {
+		if (getItem() == null)
+			return ""; //$NON-NLS-1$
+		String insertString = null;
+		ISnippetItem item = getItem();
+		if (item.getVariables().length > 0) {
+			insertString = VariableItemHelper.getInsertString(host, item);
+		}
+		else {
+			insertString = StringUtils.replace(item.getContentString(), "${cursor}", ""); //$NON-NLS-1$ //$NON-NLS-2$
+		}
+		return insertString;
+	}
+
+	/**
+	 * Gets the Item.
+	 * 
+	 * @return the ISnippetItem
+	 */
+	public final ISnippetItem getItem() {
+		return fItem;
+	}
+
+	public Transfer[] getTransfers() {
+		if (fSupportedTransfers == null)
+			fSupportedTransfers = createTransfers();
+		return fSupportedTransfers;
+	}
+
+	public void insert(IEditorPart editorPart) {
+		if (editorPart == null)
+			return;
+		ITextEditor textEditor = null;
+
+		if (editorPart instanceof ITextEditor) {
+			textEditor = (ITextEditor) editorPart;
+		}
+		if (textEditor == null) {
+			// MultiPageEditorPart has no accessors for the source
+			textEditor = (ITextEditor) editorPart.getAdapter(ITextEditor.class);
+		}
+		if (textEditor == null) {
+			// any errors here probably aren't really exceptional
+			Method getTextEditor = null;
+			try {
+				getTextEditor = editorPart.getClass().getMethod("getTextEditor", new Class[0]); //$NON-NLS-1$
+			}
+			catch (NoSuchMethodException e) {
+				// nothing, not unusual
+			}
+			Object editor = null;
+			if (getTextEditor != null) {
+				try {
+					editor = getTextEditor.invoke(editorPart, new Object[0]);
+				}
+				catch (IllegalAccessException e) {
+					// nothing, not unusual for a non-visible method
+				}
+				catch (InvocationTargetException e) {
+					// nothing, not unusual for a protected implementation
+				}
+				if (editor instanceof IEditorPart && editor != editorPart && editor instanceof ITextEditor) {
+					textEditor = (ITextEditor) editor;
+				}
+			}
+		}
+		if (textEditor != null) {
+			insertIntoTextEditor(textEditor);
+		}
+	}
+
+	private void insertIntoTextEditor(ITextEditor editor) {
+		// find the text widget, its Document, and the current selection
+		if (editor.isEditable()) {
+			IDocumentProvider docprovider = editor.getDocumentProvider();
+			ISelectionProvider selprovider = editor.getSelectionProvider();
+			if (docprovider != null && selprovider != null) {
+				IDocument document = docprovider.getDocument(editor.getEditorInput());
+				ISelection selection = selprovider.getSelection();
+				if (document != null && selection != null && selection instanceof ITextSelection) {
+					ITextSelection textSel = (ITextSelection) selection;
+					try {
+						doInsert(editor, editor, document, textSel);
+					}
+					catch (Exception t) {
+						Logger.logException("Could not insert " + getItem(), t); //$NON-NLS-1$
+						editor.getSite().getShell().getDisplay().beep();
+					}
+				}
+			}
+		}
+	}
+
+
+	/**
+	 * Sets the fItem.
+	 * 
+	 * @param fItem
+	 *            The ISnippetItem to use
+	 */
+	public final void setItem(ISnippetItem item) {
+		fItem = item;
+	}
+
+	public IEditorPart getEditorPart() {
+		return fEditorPart;
+	}
+
+	public void setEditorPart(IEditorPart editorPart) {
+		fEditorPart = editorPart;
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/provisional/ISnippetsInsertion.java b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/ui/ISnippetInsertion.java
similarity index 74%
rename from org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/provisional/ISnippetsInsertion.java
rename to org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/ui/ISnippetInsertion.java
index f286acf..482178a 100644
--- a/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/internal/provisional/ISnippetsInsertion.java
+++ b/org.eclipse.wst.common.snippets/src/org/eclipse/wst/common/snippets/ui/ISnippetInsertion.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004 IBM Corporation and others.
+ * Copyright (c) 2005 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -9,26 +9,26 @@
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 
-
-package org.eclipse.wst.common.snippets.internal.provisional;
+package org.eclipse.wst.common.snippets.ui;
 
 import org.eclipse.swt.dnd.DragSourceEvent;
 import org.eclipse.swt.dnd.Transfer;
 import org.eclipse.ui.IEditorPart;
+import org.eclipse.wst.common.snippets.core.ISnippetItem;
 
 /**
  * An insertion class is responsible for inserting a snippet item's contents
  * into editors. Implementors are responsible for supporting the drag-and-drop
  * mechanism and inserting the snippet's text into a given editor part.
  */
-public interface ISnippetsInsertion {
+public interface ISnippetInsertion {
 
 	/**
 	 * The data is required from the drag source.
 	 * 
 	 * <p>
 	 * The following fields in the DragSourceEvent should be examined/updated
-	 * by the LibraryInsertion object:
+	 * by the Insertion object:
 	 * <ul>
 	 * <li>dataType - (in) the type of data requested. This is a TransferData
 	 * object and can be used with the Transfer subclasses.
@@ -40,8 +40,10 @@
 	 * Subclasses should check which Transfer types are supported and set the
 	 * data accordingly.
 	 * 
-	 * @param event - the information associated with the drag set data event
-	 * @param item - the ISnippetItem instance from which to derive the data
+	 * @param event -
+	 *            the information associated with the drag set data event
+	 * @param item -
+	 *            the ISnippetItem instance from which to derive the data
 	 */
 	void dragSetData(DragSourceEvent event, ISnippetItem item);
 
@@ -58,21 +60,19 @@
 	/**
 	 * Insert the current ISnippetItem's insertion String to the given
 	 * IEditorPart. Used by double-click behavior.
-	 * @param editorPart the editor part into which to insert
+	 * 
+	 * @param editorPart
+	 *            the editor part into which to insert
 	 */
 	void insert(IEditorPart editorPart);
 
-	/**
-	 * The active editorpart in the workbench window. May be used as a clue
-	 * for determining which Transfer types to allow.
-	 * 
-	 * @param activeEditorPart the editor part which is active
-	 */
-	void setActiveEditorPart(IEditorPart activeEditorPart);
+	void setEditorPart(IEditorPart targetPart);
 
 	/**
 	 * Use this ISnippetItem
-	 * @param item the item to insert
+	 * 
+	 * @param item
+	 *            the item to insert
 	 */
 	void setItem(ISnippetItem item);
 }
\ No newline at end of file