diff --git a/bundles/org.eclipse.wst.ws.service.policy.ui/schema/servicePolicyui.exsd b/bundles/org.eclipse.wst.ws.service.policy.ui/schema/servicePolicyui.exsd
index 3826bf5..1d90aac 100644
--- a/bundles/org.eclipse.wst.ws.service.policy.ui/schema/servicePolicyui.exsd
+++ b/bundles/org.eclipse.wst.ws.service.policy.ui/schema/servicePolicyui.exsd
@@ -156,6 +156,13 @@
                </documentation>
             </annotation>
          </attribute>
+         <attribute name="defaultData" type="boolean" use="default" value="true">
+            <annotation>
+               <documentation>
+                  Indicates if this enumeration operation should store it&apos;s persistent data as the default for the service policy.  A service policy can only have one default state data.
+               </documentation>
+            </annotation>
+         </attribute>
       </complexType>
    </element>
 
@@ -173,6 +180,13 @@
                </documentation>
             </annotation>
          </attribute>
+         <attribute name="defaultData" type="boolean" use="default" value="true">
+            <annotation>
+               <documentation>
+                  Indicates if this selection operation should store it&apos;s persistent data as the default for the service policy.  A service policy can only have one default state data.  This attribute is ignored if the icon attribute is set to true, since all icon attribute operation must store their data as default service policy data.
+               </documentation>
+            </annotation>
+         </attribute>
       </complexType>
    </element>
 
@@ -231,7 +245,6 @@
             <annotation>
                <documentation>
                   The plugin id that the enclosed quick fix actions apply to.  This is the id that will match the plugin id from the IStatus of a ServicePolicy object.
-
                </documentation>
             </annotation>
          </attribute>
diff --git a/bundles/org.eclipse.wst.ws.service.policy.ui/src/org/eclipse/wst/ws/internal/service/policy/ui/BaseOperationImpl.java b/bundles/org.eclipse.wst.ws.service.policy.ui/src/org/eclipse/wst/ws/internal/service/policy/ui/BaseOperationImpl.java
new file mode 100644
index 0000000..f3de96d
--- /dev/null
+++ b/bundles/org.eclipse.wst.ws.service.policy.ui/src/org/eclipse/wst/ws/internal/service/policy/ui/BaseOperationImpl.java
@@ -0,0 +1,231 @@
+/*******************************************************************************
+ * Copyright (c) 2007 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ * yyyymmdd bug      Email and other contact information
+ * -------- -------- -----------------------------------------------------------
+ * 20071024   196997 pmoogk@ca.ibm.com - Peter Moogk, Initial coding of service policy
+ *******************************************************************************/
+package org.eclipse.wst.ws.internal.service.policy.ui;
+
+import java.util.List;
+
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.wst.ws.service.policy.IDescriptor;
+import org.eclipse.wst.ws.service.policy.IServicePolicy;
+import org.eclipse.wst.ws.service.policy.IStateEnumerationItem;
+import org.eclipse.wst.ws.service.policy.ServicePolicyPlatform;
+import org.eclipse.wst.ws.service.policy.ui.IEnableOperation;
+import org.eclipse.wst.ws.service.policy.ui.ILaunchOperation;
+import org.eclipse.wst.ws.service.policy.ui.ServicePolicyActivatorUI;
+import org.eclipse.wst.ws.service.policy.ui.IPolicyOperation.OperationKind;
+import org.eclipse.wst.ws.service.policy.utils.RegistryUtils;
+
+public class BaseOperationImpl 
+{
+  private String                id;
+  private IDescriptor           descriptor;
+  private OperationKind         operationKind;
+  private String                policyIdPattern;
+  private boolean               multiSelect = false;
+  private ILaunchOperation      launchOperationObject;
+  private IEnableOperation      enableOperationObject;
+  private String                enumId;
+  private IConfigurationElement enabledElement;
+  private IConfigurationElement complexElement;
+  private boolean               workspaceOnly;
+  private String                defaultItem;  
+  private boolean               useDefaultData;
+  
+  public String getId()
+  {
+    return id;
+  }
+
+  public void setId(String id)
+  {
+    this.id = id;
+  }
+  public boolean isWorkspaceOnly()
+  {
+    return workspaceOnly;
+  }
+
+  public void setWorkspaceOnly( boolean workspaceOnly )
+  {
+    this.workspaceOnly = workspaceOnly;  
+  }
+  
+  public void setSelection( boolean isIcon )
+  {
+    if( isIcon )
+    {
+      operationKind = OperationKind.iconSelection;
+    }
+    else
+    {
+      operationKind = OperationKind.selection;     
+    }
+  }
+  
+  public IDescriptor getDescriptor()
+  {
+    return descriptor;
+  }
+
+  public OperationKind getOperationKind()
+  {
+    return operationKind;
+  }
+
+  public String getEnumerationId()
+  {
+    return enumId;
+  }
+
+  public void setEnumerationId( String enumId )
+  {
+    this.enumId   = enumId;  
+    operationKind = OperationKind.enumeration;
+  }
+  
+  public String getPolicyIdPattern()
+  {
+    return policyIdPattern;
+  }
+
+  public boolean isEnabled( List<IServicePolicy> selectedPolicies )
+  {
+    boolean result = true;
+    
+    // If we don't allow multi select and multiple policies have been selected
+    // then this operation is not enabled.
+    if( !multiSelect && selectedPolicies.size() > 1 )
+    {
+      result = false;
+    }
+    
+    if( result && enabledElement != null )
+    {
+      // We have an extension for this enablement code so we will call this
+      // code.
+      if( enableOperationObject == null )
+      {
+        try
+        {
+          String enabledClassName = RegistryUtils.getAttributeName( enabledElement, "enabledclass" ); //$NON-NLS-1$
+          enableOperationObject = (IEnableOperation)enabledElement.createExecutableExtension( enabledClassName );
+        }
+        catch( Exception exc )
+        {
+          ServicePolicyActivatorUI.logError( "Error loading service policy ui \"enabled\" class.", exc );           //$NON-NLS-1$
+        }
+        
+        if( enableOperationObject != null )
+        {
+          result = enableOperationObject.isEnabled( selectedPolicies );
+        }
+      }
+    }
+    
+    return result;
+  }
+
+  public void launchOperation( IServicePolicy thisPolicy, List<IServicePolicy> selectedPolicies )
+  {
+    if( launchOperationObject == null )
+    {
+      try
+      {
+        String launchClassName = RegistryUtils.getAttributeName( complexElement, "launchclass" ); //$NON-NLS-1$
+        launchOperationObject = (ILaunchOperation)complexElement.createExecutableExtension( launchClassName );
+      }
+      catch( Exception exc )
+      {
+        ServicePolicyActivatorUI.logError( "Error loading service policy ui launch class.", exc ); //$NON-NLS-1$
+      }
+    }
+    
+    if( launchOperationObject != null )
+    {
+      launchOperationObject.launch( selectedPolicies );
+    }
+  }
+
+  public boolean isMultiSelect()
+  {
+    return multiSelect;
+  }
+
+  public void setMultiSelect(boolean multiSelect)
+  {
+    this.multiSelect = multiSelect;
+  }
+
+  public void setDescriptor(IDescriptor descriptor)
+  {
+    this.descriptor = descriptor;
+  }
+
+  public void setPolicyIdPattern(String policyIdPattern)
+  {
+    this.policyIdPattern = policyIdPattern;
+  }
+
+  public void setEnabledElement(IConfigurationElement enabledElement)
+  {
+    this.enabledElement = enabledElement;
+  }
+
+  public void setComplexElement(IConfigurationElement complexElement)
+  {
+    this.complexElement = complexElement;
+    operationKind = OperationKind.complex;
+  }
+
+  public void setDefaultItem( String defaultItem )
+  {
+    this.defaultItem = defaultItem;  
+  }
+  
+  public String getDefaultItem()
+  {
+    if( defaultItem == null )
+    {
+      ServicePolicyPlatform       platform = ServicePolicyPlatform.getInstance();
+      List<IStateEnumerationItem> enumList = platform.getStateEnumeration( enumId );
+      
+      defaultItem = enumList.get(0).getId();
+      
+      // No default item has been specified so we will search the enumeration for one.
+      // If none was specified the first item in the enumeration is used.
+      for( IStateEnumerationItem item : enumList )
+      {
+        if( item.isDefault() )
+        {
+          defaultItem = item.getId();
+          break;
+        }
+      }
+      
+    }
+      
+    return defaultItem;
+  }
+
+  public boolean isUseDefaultData()
+  {
+    return useDefaultData;
+  }
+
+  public void setUseDefaultData( boolean useDefaultData )
+  {
+    this.useDefaultData = useDefaultData;
+  }  
+  
+}
diff --git a/bundles/org.eclipse.wst.ws.service.policy.ui/src/org/eclipse/wst/ws/internal/service/policy/ui/PolicyOperationImpl.java b/bundles/org.eclipse.wst.ws.service.policy.ui/src/org/eclipse/wst/ws/internal/service/policy/ui/PolicyOperationImpl.java
index 20346cc..9b80c5f 100644
--- a/bundles/org.eclipse.wst.ws.service.policy.ui/src/org/eclipse/wst/ws/internal/service/policy/ui/PolicyOperationImpl.java
+++ b/bundles/org.eclipse.wst.ws.service.policy.ui/src/org/eclipse/wst/ws/internal/service/policy/ui/PolicyOperationImpl.java
@@ -1,186 +1,111 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
+/***************************************************************************************************
+ * Copyright (c) 2003, 2005 IBM Corporation and others. All rights reserved. This program and the
+ * accompanying materials are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20071024   196997 pmoogk@ca.ibm.com - Peter Moogk, Initial coding of service policy
- *******************************************************************************/
+ * 
+ * Contributors: IBM Corporation - initial API and implementation
+ **************************************************************************************************/
 package org.eclipse.wst.ws.internal.service.policy.ui;
 
 import java.util.List;
 
-import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.resources.IProject;
 import org.eclipse.wst.ws.service.policy.IDescriptor;
+import org.eclipse.wst.ws.service.policy.IPolicyState;
 import org.eclipse.wst.ws.service.policy.IServicePolicy;
-import org.eclipse.wst.ws.service.policy.ui.IEnableOperation;
-import org.eclipse.wst.ws.service.policy.ui.ILaunchOperation;
 import org.eclipse.wst.ws.service.policy.ui.IPolicyOperation;
-import org.eclipse.wst.ws.service.policy.ui.ServicePolicyActivatorUI;
-import org.eclipse.wst.ws.service.policy.utils.RegistryUtils;
 
 public class PolicyOperationImpl implements IPolicyOperation
 {
-  private String                id;
-  private IDescriptor            descriptor;
-  private OperationKind         operationKind;
-  private String                policyIdPattern;
-  private boolean               multiSelect = false;
-  private ILaunchOperation      launchOperationObject;
-  private IEnableOperation      enableOperationObject;
-  private String                enumId;
-  private IConfigurationElement enabledElement;
-  private IConfigurationElement complexElement;
-  private boolean               workspaceOnly;
+  private BaseOperationImpl baseOperation;
+  private IServicePolicy    policy;
   
-  public String getId()
+  public PolicyOperationImpl( BaseOperationImpl baseOperation, IServicePolicy policy )
   {
-    return id;
+    this.baseOperation = baseOperation;
+    this.policy        = policy;
+  }
+  
+  public String getDefaultItem()
+  {
+    return baseOperation.getDefaultItem();
   }
 
-  public void setId(String id)
-  {
-    this.id = id;
-  }
-  public boolean isWorkspaceOnly()
-  {
-    return workspaceOnly;
-  }
-
-  public void setWorkspaceOnly( boolean workspaceOnly )
-  {
-    this.workspaceOnly = workspaceOnly;  
-  }
-  
-  public void setSelection( boolean isIcon )
-  {
-    if( isIcon )
-    {
-      operationKind = OperationKind.iconSelection;
-    }
-    else
-    {
-      operationKind = OperationKind.selection;     
-    }
-  }
-  
   public IDescriptor getDescriptor()
   {
-    return descriptor;
-  }
-
-  public OperationKind getOperationKind()
-  {
-    return operationKind;
+    return baseOperation.getDescriptor();
   }
 
   public String getEnumerationId()
   {
-    return enumId;
+    return baseOperation.getEnumerationId();
   }
 
-  public void setEnumerationId( String enumId )
+  public String getId()
   {
-    this.enumId   = enumId;  
-    operationKind = OperationKind.enumeration;
+    return baseOperation.getId();
   }
-  
+
+  public OperationKind getOperationKind()
+  {
+    return baseOperation.getOperationKind();
+  }
+
   public String getPolicyIdPattern()
   {
-    return policyIdPattern;
+    return baseOperation.getPolicyIdPattern();
   }
 
   public boolean isEnabled( List<IServicePolicy> selectedPolicies )
   {
-    boolean result = true;
+    return baseOperation.isEnabled( selectedPolicies );
+  }
+
+  public boolean isWorkspaceOnly()
+  {
+    return baseOperation.isWorkspaceOnly();
+  }
+
+  public void launchOperation( List<IServicePolicy> selectedPolicies)
+  {
+    baseOperation.launchOperation( policy, selectedPolicies );
+  }
+
+  public IServicePolicy getServicePolicy()
+  {
+    return policy;
+  }
+
+  public String getStateItem( IProject project )
+  {
+    IPolicyState state = getState( project );
+    String       key   = baseOperation.getId();
     
-    // If we don't allow multi select and multiple policies have been selected
-    // then this operation is not enabled.
-    if( !multiSelect && selectedPolicies.size() > 1 )
+    if( baseOperation.isUseDefaultData() )
     {
-      result = false;
+      key = IPolicyState.DefaultValueKey;
     }
     
-    if( result && enabledElement != null )
+    state.putDefaultValue( key, baseOperation.getDefaultItem() );
+    return state.getValue( key );
+  }
+
+  public void setStateItem( IProject project, String stateItem )
+  {
+    IPolicyState state = getState( project );
+    String       key   = baseOperation.getId();
+    
+    if( baseOperation.isUseDefaultData() )
     {
-      // We have an extension for this enablement code so we will call this
-      // code.
-      if( enableOperationObject == null )
-      {
-        try
-        {
-          String enabledClassName = RegistryUtils.getAttributeName( enabledElement, "enabledclass" ); //$NON-NLS-1$
-          enableOperationObject = (IEnableOperation)enabledElement.createExecutableExtension( enabledClassName );
-        }
-        catch( Exception exc )
-        {
-          ServicePolicyActivatorUI.logError( "Error loading service policy ui \"enabled\" class.", exc );           //$NON-NLS-1$
-        }
-        
-        if( enableOperationObject != null )
-        {
-          result = enableOperationObject.isEnabled( selectedPolicies );
-        }
-      }
+      key = IPolicyState.DefaultValueKey;
     }
     
-    return result;
+    state.putValue( key, stateItem );
   }
-
-  public void launchOperation( List<IServicePolicy> selectedPolicies )
+  
+  private IPolicyState getState( IProject project )
   {
-    if( launchOperationObject == null )
-    {
-      try
-      {
-        String launchClassName = RegistryUtils.getAttributeName( complexElement, "launchclass" ); //$NON-NLS-1$
-        launchOperationObject = (ILaunchOperation)complexElement.createExecutableExtension( launchClassName );
-      }
-      catch( Exception exc )
-      {
-        ServicePolicyActivatorUI.logError( "Error loading service policy ui launch class.", exc ); //$NON-NLS-1$
-      }
-    }
-    
-    if( launchOperationObject != null )
-    {
-      launchOperationObject.launch( selectedPolicies );
-    }
-  }
-
-  public boolean isMultiSelect()
-  {
-    return multiSelect;
-  }
-
-  public void setMultiSelect(boolean multiSelect)
-  {
-    this.multiSelect = multiSelect;
-  }
-
-  public void setDescriptor(IDescriptor descriptor)
-  {
-    this.descriptor = descriptor;
-  }
-
-  public void setPolicyIdPattern(String policyIdPattern)
-  {
-    this.policyIdPattern = policyIdPattern;
-  }
-
-  public void setEnabledElement(IConfigurationElement enabledElement)
-  {
-    this.enabledElement = enabledElement;
-  }
-
-  public void setComplexElement(IConfigurationElement complexElement)
-  {
-    this.complexElement = complexElement;
-    operationKind = OperationKind.complex;
+    return project == null ? policy.getPolicyState() : policy.getPolicyState( project );   
   }
 }
diff --git a/bundles/org.eclipse.wst.ws.service.policy.ui/src/org/eclipse/wst/ws/internal/service/policy/ui/ServicePolicyPlatformUIImpl.java b/bundles/org.eclipse.wst.ws.service.policy.ui/src/org/eclipse/wst/ws/internal/service/policy/ui/ServicePolicyPlatformUIImpl.java
index e5daf4e..061ee25 100644
--- a/bundles/org.eclipse.wst.ws.service.policy.ui/src/org/eclipse/wst/ws/internal/service/policy/ui/ServicePolicyPlatformUIImpl.java
+++ b/bundles/org.eclipse.wst.ws.service.policy.ui/src/org/eclipse/wst/ws/internal/service/policy/ui/ServicePolicyPlatformUIImpl.java
@@ -32,7 +32,7 @@
 
 public class ServicePolicyPlatformUIImpl
 {
-  private Map<String, PolicyOperationImpl>           operationMap;
+  private Map<String, BaseOperationImpl>             baseOperationMap;
   private Map<IServicePolicy, Set<IPolicyOperation>> policyCache;
   private Map<String,List<IQuickFixActionInfo>>      quickFixes;
   
@@ -42,25 +42,15 @@
     ServicePolicyRegistryUI registry  = new ServicePolicyRegistryUI();
     Set<String>             policyIds = platform.getAllPolicyIds();
     
-    operationMap = new HashMap<String, PolicyOperationImpl>();
-    policyCache  = new HashMap<IServicePolicy, Set<IPolicyOperation>>();
-    quickFixes   = new HashMap<String, List<IQuickFixActionInfo>>();
-    registry.load( operationMap, quickFixes );
+    baseOperationMap = new HashMap<String, BaseOperationImpl>();
+    policyCache      = new HashMap<IServicePolicy, Set<IPolicyOperation>>();
+    quickFixes       = new HashMap<String, List<IQuickFixActionInfo>>();
+    registry.load( baseOperationMap, quickFixes );
     createOperationCache( policyIds );
     
-    // Now add listeners to each node.
-    for( String policyId : policyIds )
-    {
-      IServicePolicy policy = platform.getServicePolicy( policyId );
-      policy.addPolicyChildChangeListener( new ChildListener() );
-    }
+    platform.addChildChangeListener( new ChildListener() );
   }
-  
-  public IPolicyOperation getOperation( String operationId )
-  {
-    return operationMap.get( operationId );
-  }
-  
+      
   public List<IQuickFixActionInfo> getQuickFixes( IStatus status )
   {
     String                    pluginId = status.getPlugin();
@@ -79,46 +69,42 @@
   
   public List<IPolicyOperation> getAllOperations()
   {
-    return new Vector<IPolicyOperation>( operationMap.values() );
-  }
-  
-  public Set<IPolicyOperation> getSelectedOperations( List<IServicePolicy> policiesSelected, boolean isWorkspace )
-  {
-    Set<IPolicyOperation> operations = new HashSet<IPolicyOperation>();
+    List<IPolicyOperation> operations = new Vector<IPolicyOperation>();
     
-    for( IServicePolicy policy : policiesSelected )
+    for( Set<IPolicyOperation> operationSet : policyCache.values() )
     {
-      Set<IPolicyOperation> policyOperations = policyCache.get( policy );
-      
-      if( policyOperations != null )
-      {
-        operations.addAll( policyOperations );
-      }
-    }
-    
-    if( !isWorkspace )
-    {
-      // We are getting operations for a project so we must remove the operations that are
-      // only for a workspace.
-      List<IPolicyOperation> operationsToRemove = new Vector<IPolicyOperation>();
-      
-      for( IPolicyOperation operation : operations )
-      {
-        if( operation.isWorkspaceOnly() ) operationsToRemove.add( operation );
-      }
-      
-      operations.removeAll( operationsToRemove );
+      operations.addAll( operationSet );  
     }
     
     return operations;
   }
   
+  public Set<IPolicyOperation> getOperationsForPolicy( IServicePolicy policy, boolean isWorkspace )
+  {
+    Set<IPolicyOperation> policyOperations   = policyCache.get( policy );
+    Set<IPolicyOperation> result             = new HashSet<IPolicyOperation>( policyOperations );
+    
+    if( !isWorkspace )
+    {
+      for( IPolicyOperation operation : policyOperations )
+      {
+        if( operation.isWorkspaceOnly() )
+        {
+          result.remove( operation );
+        }
+      }
+    }
+      
+    return result;
+  }
+  
+  
   private void createOperationCache( Set<String> policyIds )
   {
-    ServicePolicyPlatform           platform   = ServicePolicyPlatform.getInstance();
-    Collection<PolicyOperationImpl> operations = operationMap.values();
+    ServicePolicyPlatform         platform   = ServicePolicyPlatform.getInstance();
+    Collection<BaseOperationImpl> operations = baseOperationMap.values();
     
-    for( PolicyOperationImpl operation : operations )
+    for( BaseOperationImpl operation : operations )
     {
       String  policyPattern = operation.getPolicyIdPattern();
       Pattern pattern       = Pattern.compile( policyPattern );
@@ -138,7 +124,7 @@
             policyCache.put( policy, operationsSet );
           }
           
-          operationsSet.add( operation );
+          operationsSet.add( new PolicyOperationImpl( operation, policy ) );
         }
       }
     }    
@@ -146,18 +132,29 @@
   
   private class ChildListener implements IPolicyChildChangeListener
   {
-    public void childChange(IServicePolicy child, boolean added)
+    public void childChange(List<IServicePolicy> childList, List<Boolean> addedList)
     {
-      if( added )
+      Set<String> idSet = new HashSet<String>();
+      
+      for( int index = 0; index < childList.size(); index++ )
       {
-        Set<String> idSet = new HashSet<String>();
+        IServicePolicy policy = childList.get( index );
+        boolean        added  = addedList.get( index );
         
-        idSet.add( child.getId() );
-        createOperationCache( idSet );
+        if( added )
+        {
+        
+          idSet.add( policy.getId() );
+        }
+        else
+        {
+          policyCache.remove( policy );
+        }
       }
-      else
+      
+      if( idSet.size() > 0 )
       {
-        policyCache.remove( child );
+        createOperationCache( idSet );
       }
     }    
   }
diff --git a/bundles/org.eclipse.wst.ws.service.policy.ui/src/org/eclipse/wst/ws/internal/service/policy/ui/ServicePolicyRegistryUI.java b/bundles/org.eclipse.wst.ws.service.policy.ui/src/org/eclipse/wst/ws/internal/service/policy/ui/ServicePolicyRegistryUI.java
index e9c5b58..a270e0a 100644
--- a/bundles/org.eclipse.wst.ws.service.policy.ui/src/org/eclipse/wst/ws/internal/service/policy/ui/ServicePolicyRegistryUI.java
+++ b/bundles/org.eclipse.wst.ws.service.policy.ui/src/org/eclipse/wst/ws/internal/service/policy/ui/ServicePolicyRegistryUI.java
@@ -32,7 +32,7 @@
   {
   }
   
-  public void load( Map<String, PolicyOperationImpl> operationMap, Map<String, List<IQuickFixActionInfo>> quickFixes )
+  public void load( Map<String, BaseOperationImpl> operationMap, Map<String, List<IQuickFixActionInfo>> quickFixes )
   {
     IConfigurationElement[] elements = Platform.getExtensionRegistry().getConfigurationElementsFor(SERVICE_POLICY_ID);
     
@@ -70,7 +70,7 @@
   }
    
   private void loadServicePolicyui( IConfigurationElement element,
-                                    Map<String, PolicyOperationImpl> operationMap )
+                                    Map<String, BaseOperationImpl> operationMap )
   {
     String                  id             = RegistryUtils.getAttribute( element, "id" ); //$NON-NLS-1$
     String                  policyPattern  = RegistryUtils.getAttribute( element, "policypattern" ); //$NON-NLS-1$
@@ -78,12 +78,14 @@
     IConfigurationElement[] children       = element.getChildren();
     IDescriptor             descriptor     = null;
     String                  enumId         = null;
+    String                  defaultItem    = null;
     boolean                 selection      = false;
     boolean                 icon           = false;
     boolean                 multiSelect    = false;
     IConfigurationElement   enabledElement = null;
     IConfigurationElement   launchElement  = null;
     boolean                 error          = false;
+    boolean                 useDefaultData = true;
     
     for( IConfigurationElement child : children )
     {
@@ -95,24 +97,39 @@
       }
       else if( name.equals( "enumeration" ) ) //$NON-NLS-1$
       {
+        String defaultData = RegistryUtils.getAttribute( child, "defaultdata" ); //$NON-NLS-1$
+        
         enumId = RegistryUtils.getAttribute( child, "id" ); //$NON-NLS-1$
+        defaultItem = RegistryUtils.getAttribute( child, "defaultItem" ); //$NON-NLS-1$
         
         if( enumId == null )
         {
           error( "Service policy ui enumeration element is missing id attribute." ); //$NON-NLS-1$
           error = true;
         }
+        
+        if( defaultData != null && defaultData.equalsIgnoreCase( "false" ) ) //$NON-NLS-1$
+        {
+          useDefaultData = false;
+        }        
       }
       else if( name.equals( "selection" ) ) //$NON-NLS-1$
       {
-        String iconValue = RegistryUtils.getAttribute( child, "icon" ); //$NON-NLS-1$
+        String iconValue   = RegistryUtils.getAttribute( child, "icon" ); //$NON-NLS-1$
+        String defaultData = RegistryUtils.getAttribute( child, "defaultdata" ); //$NON-NLS-1$
         
         selection = true;
         
+        if( defaultData != null && defaultData.equalsIgnoreCase( "false" ) ) //$NON-NLS-1$
+        {
+          useDefaultData = false;
+        }        
+        
         if( iconValue != null && iconValue.equalsIgnoreCase( "true" ) ) //$NON-NLS-1$
         {
           icon = true;
-        }
+          useDefaultData = true;
+        }        
       }
       else if( name.equals( "complex" ) ) //$NON-NLS-1$
       {
@@ -178,7 +195,7 @@
     
     if( ! error )
     {
-      PolicyOperationImpl operation          = new PolicyOperationImpl();
+      BaseOperationImpl operation          = new BaseOperationImpl();
       boolean             workspaceOnlyValue = workspaceOnly != null && workspaceOnly.equals( "true" ); //$NON-NLS-1$
       
       operation.setId( id );
@@ -186,7 +203,9 @@
       operation.setDescriptor( descriptor );
       operation.setMultiSelect( multiSelect );
       operation.setEnumerationId( enumId );
+      operation.setDefaultItem( defaultItem );
       operation.setWorkspaceOnly( workspaceOnlyValue );
+      operation.setUseDefaultData( useDefaultData );
       
       if( selection )
       {
diff --git a/bundles/org.eclipse.wst.ws.service.policy.ui/src/org/eclipse/wst/ws/service/policy/ui/IPolicyOperation.java b/bundles/org.eclipse.wst.ws.service.policy.ui/src/org/eclipse/wst/ws/service/policy/ui/IPolicyOperation.java
index ae6f3f7..b0ddad9 100644
--- a/bundles/org.eclipse.wst.ws.service.policy.ui/src/org/eclipse/wst/ws/service/policy/ui/IPolicyOperation.java
+++ b/bundles/org.eclipse.wst.ws.service.policy.ui/src/org/eclipse/wst/ws/service/policy/ui/IPolicyOperation.java
@@ -15,6 +15,7 @@
 
 import java.util.List;
 
+import org.eclipse.core.resources.IProject;
 import org.eclipse.wst.ws.service.policy.IDescriptor;
 import org.eclipse.wst.ws.service.policy.IServicePolicy;
 
@@ -76,6 +77,13 @@
   public String getEnumerationId();
   
   /**
+   * 
+   * @return returns if this is an enumeration it returns the default item for this
+   * enumeration.
+   */
+  public String getDefaultItem();
+  
+  /**
    * Launches the service policy operation if this is a complex operation.
    * 
    * @param selectedPolicies the selected service policies.
@@ -97,4 +105,25 @@
    * with this operation.
    */
   public String getPolicyIdPattern();
+  
+  /**
+   * 
+   * @return returns the service policy for this operation.
+   */
+  public IServicePolicy getServicePolicy();
+  
+  /**
+   * @param project the project if this is project property page item.
+   * For the preference page context null should be specified.
+   * @return returns the current enumeration item for this operation.
+   */
+  public String getStateItem( IProject project );
+  
+  /**
+   * Sets the current enumeration item for this operation.
+   * @param project the project if this is project property page item.
+   * For the preference page context null should be specified.
+   * @param stateItem the item.
+   */
+  public void setStateItem( IProject project, String stateItem );
 }
diff --git a/bundles/org.eclipse.wst.ws.service.policy.ui/src/org/eclipse/wst/ws/service/policy/ui/ServicePolicyPlatformUI.java b/bundles/org.eclipse.wst.ws.service.policy.ui/src/org/eclipse/wst/ws/service/policy/ui/ServicePolicyPlatformUI.java
index 799fc05..66de46a 100644
--- a/bundles/org.eclipse.wst.ws.service.policy.ui/src/org/eclipse/wst/ws/service/policy/ui/ServicePolicyPlatformUI.java
+++ b/bundles/org.eclipse.wst.ws.service.policy.ui/src/org/eclipse/wst/ws/service/policy/ui/ServicePolicyPlatformUI.java
@@ -14,7 +14,7 @@
 package org.eclipse.wst.ws.service.policy.ui;
 
 import java.util.List;
-import java.util.Set;
+import java.util.Vector;
 
 import org.eclipse.core.runtime.IStatus;
 import org.eclipse.wst.ws.internal.service.policy.ui.ServicePolicyPlatformUIImpl;
@@ -52,40 +52,43 @@
   
   /**
    * 
-   * @param operationId the operation ID
-   * @return returns the service policy operation given it ID.
-   */
-  public IPolicyOperation getOperation( String operationId )
-  {
-    return platformUI.getOperation( operationId );
-  }
-  
-  /**
-   * 
-   * @return returns all the operations that are known to the platform.
+   * @return returns all the operations for all known policies.
    */
   public List<IPolicyOperation> getAllOperations()
   {
     return platformUI.getAllOperations();
   }
   
-  /**
-   * 
-   * @param policiesSelected the selected service policies.
-   * @param isWorkspace indicates if this method is being called from the workspace
-   * preference page or from a project property page.
-   * @return returns the set of operations that are applicable to the list
-   * selected service policies.  This set is further restricted by the
-   * isWorkspace parameter.  If this parameter is false then operations that 
-   * are only associated with the workspace will be removed. 
-   */
-  public Set<IPolicyOperation> getSelectedOperations( List<IServicePolicy> policiesSelected, boolean isWorkspace )
+  public IPolicyOperation getOperation( IServicePolicy policy, String id )
   {
-    return platformUI.getSelectedOperations( policiesSelected, isWorkspace );
+    List<IPolicyOperation> operations = getOperations( policy, true );
+    IPolicyOperation       result     = null;
+    
+    for( IPolicyOperation operation : operations )
+    {
+      if( operation.getId().equals( id ) )
+      {
+        result = operation;
+        break;
+      }
+    }
+    
+    return result;
   }
   
   /**
    * 
+   * @param policy the policy
+   * @param isWorkspace true if this is a preference page context
+   * @return returns the list of operations for this policy.
+   */
+  public List<IPolicyOperation> getOperations( IServicePolicy policy, boolean isWorkspace )
+  {
+    return new Vector<IPolicyOperation>( platformUI.getOperationsForPolicy( policy, isWorkspace ) );
+  }
+    
+  /**
+   * 
    * @param status
    * @return returns a list of quick fixes for this status object.  If
    * no quick fixes are available an empty list will be returned.
diff --git a/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/internal/policy/EnumerationStateImpl.java b/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/internal/policy/EnumerationStateImpl.java
index adea503..83f8302 100644
--- a/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/internal/policy/EnumerationStateImpl.java
+++ b/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/internal/policy/EnumerationStateImpl.java
@@ -22,7 +22,7 @@
 
 public class EnumerationStateImpl implements IPolicyStateEnum
 {
-  private final String VALUE = "value";  //$NON-NLS-1$
+  private final String VALUE = IPolicyState.DefaultValueKey;  //$NON-NLS-1$
   
   private String                      enumId;
   private List<IStateEnumerationItem> enumList;
diff --git a/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/internal/policy/ServicePolicyImpl.java b/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/internal/policy/ServicePolicyImpl.java
index 6cedc57..69cb06f 100644
--- a/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/internal/policy/ServicePolicyImpl.java
+++ b/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/internal/policy/ServicePolicyImpl.java
@@ -375,7 +375,12 @@
   {
     for( IPolicyChildChangeListener listener : childChangeListeners )
     {
-      listener.childChange( policy, isAdd );     
+      List<IServicePolicy> policyList = new Vector<IServicePolicy>(1);
+      List<Boolean>        addedList  = new Vector<Boolean>(1);
+      
+      policyList.add( policy );
+      addedList.add( isAdd );
+      listener.childChange( policyList, addedList );     
     }
   }
 }
diff --git a/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/internal/policy/ServicePolicyPlatformImpl.java b/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/internal/policy/ServicePolicyPlatformImpl.java
index 1e4c35b..b1f139d 100644
--- a/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/internal/policy/ServicePolicyPlatformImpl.java
+++ b/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/internal/policy/ServicePolicyPlatformImpl.java
@@ -49,6 +49,8 @@
   private Map<IProject, ProjectEntry>              enabledProjectMap;
   private List<Expression>                         enabledList;
   private List<IPolicyChildChangeListener>         childChangeListeners;
+  private List<IServicePolicy>                     queuedChildChangePolicy;
+  private List<Boolean>                            queuedChildChangeAdded;
   
   public ServicePolicyPlatformImpl()
   {
@@ -204,11 +206,45 @@
     childChangeListeners.remove( listener );  
   }
   
+  public void queueChildChangeListeners( boolean queue )
+  {
+    if( queue && queuedChildChangeAdded == null )
+    {
+      queuedChildChangeAdded = new Vector<Boolean>();
+      queuedChildChangePolicy = new Vector<IServicePolicy>();
+    }
+    else if( !queue && queuedChildChangeAdded != null )
+    {
+      // Queuing has been turned off so we will fire all the queued events.
+      for( IPolicyChildChangeListener listener : childChangeListeners )
+      {
+        listener.childChange( queuedChildChangePolicy, queuedChildChangeAdded );
+      }
+      
+      queuedChildChangeAdded = null;
+      queuedChildChangePolicy = null;
+    }
+  }
+  
   private void fireChildChangeEvent( IServicePolicy policy, boolean isAdd )
   {
-    for( IPolicyChildChangeListener listener : childChangeListeners )
+    if( queuedChildChangeAdded == null )
     {
-      listener.childChange( policy, isAdd );     
+      List<IServicePolicy> policyList = new Vector<IServicePolicy>(1);
+      List<Boolean>        addedList  = new Vector<Boolean>(1);
+      
+      policyList.add( policy );
+      addedList.add( isAdd );
+      
+      for( IPolicyChildChangeListener listener : childChangeListeners )
+      {
+        listener.childChange( policyList, addedList );     
+      }
+    }
+    else
+    {
+      queuedChildChangeAdded.add( isAdd );
+      queuedChildChangePolicy.add( policy );
     }
   }
   
diff --git a/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/policy/IPolicyState.java b/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/policy/IPolicyState.java
index fa7b6a9..380723a 100644
--- a/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/policy/IPolicyState.java
+++ b/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/policy/IPolicyState.java
@@ -34,6 +34,8 @@
  */
 public interface IPolicyState
 {
+  public final static String DefaultValueKey = "default.value.key";
+  
   /**
    * 
    * @return returns true if the state of this policy is mutable.
diff --git a/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/policy/ServicePolicyPlatform.java b/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/policy/ServicePolicyPlatform.java
index 95a4b2e..f944e74 100644
--- a/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/policy/ServicePolicyPlatform.java
+++ b/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/policy/ServicePolicyPlatform.java
@@ -223,6 +223,11 @@
     platformImpl.addChildChangeListener( listener );  
   }
   
+  public void queueChildChangeListeners( boolean queue )
+  {
+    platformImpl.queueChildChangeListeners( queue );
+  }
+  
   /**
    * Removes a child change listener from the service policy platform.
    * 
diff --git a/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/policy/listeners/IPolicyChildChangeListener.java b/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/policy/listeners/IPolicyChildChangeListener.java
index e876994..c513604 100644
--- a/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/policy/listeners/IPolicyChildChangeListener.java
+++ b/bundles/org.eclipse.wst.ws.service.policy/src/org/eclipse/wst/ws/service/policy/listeners/IPolicyChildChangeListener.java
@@ -14,9 +14,18 @@
  *******************************************************************************/
 package org.eclipse.wst.ws.service.policy.listeners;
 
+import java.util.List;
+
 import org.eclipse.wst.ws.service.policy.IServicePolicy;
 
 public interface IPolicyChildChangeListener
 {
-  public void childChange( IServicePolicy child, boolean added );
+  /**
+   * The method is called with an array of child changes.  Each child item
+   * is associated with the added item at the same index value.
+   * 
+   * @param child service policies that have changed.
+   * @param added indicates if the associate policy was added or removed.
+   */
+  public void childChange( List<IServicePolicy> child, List<Boolean> added );
 }
diff --git a/tests/org.eclipse.wst.ws.service.policy.test/src/org/eclipse/wst/ws/service/policy/test/MainTester.java b/tests/org.eclipse.wst.ws.service.policy.test/src/org/eclipse/wst/ws/service/policy/test/MainTester.java
index 87173b4..2b00891 100644
--- a/tests/org.eclipse.wst.ws.service.policy.test/src/org/eclipse/wst/ws/service/policy/test/MainTester.java
+++ b/tests/org.eclipse.wst.ws.service.policy.test/src/org/eclipse/wst/ws/service/policy/test/MainTester.java
@@ -391,10 +391,10 @@
      public boolean isAdded = false;
      public int     count = 0;;
      
-     public void childChange(IServicePolicy child, boolean added)
+     public void childChange(List<IServicePolicy> childList, List<Boolean> addedList)
      {
        childEventOccured = true;
-       isAdded = added;
+       isAdded = addedList.get(0);
        count++;
      }
    }
diff --git a/tests/org.eclipse.wst.ws.service.policy.test/src/org/eclipse/wst/ws/service/policy/test/MainUITester.java b/tests/org.eclipse.wst.ws.service.policy.test/src/org/eclipse/wst/ws/service/policy/test/MainUITester.java
index f9ea792..9af60aa 100644
--- a/tests/org.eclipse.wst.ws.service.policy.test/src/org/eclipse/wst/ws/service/policy/test/MainUITester.java
+++ b/tests/org.eclipse.wst.ws.service.policy.test/src/org/eclipse/wst/ws/service/policy/test/MainUITester.java
@@ -14,7 +14,6 @@
 package org.eclipse.wst.ws.service.policy.test;
 
 import java.util.List;
-import java.util.Set;
 import java.util.Vector;
 
 import junit.framework.TestCase;
@@ -53,57 +52,32 @@
      IServicePolicy          id2        = platform.getServicePolicy( "id2" ); //$NON-NLS-1$
      IServicePolicy          id3        = platform.getServicePolicy( "id3" ); //$NON-NLS-1$
      IServicePolicy          id4        = platform.getServicePolicy( "id4" ); //$NON-NLS-1$
-     //IServicePolicy          id_bool1   = platform.getServicePolicy( "id_boolean1" );
-//     /IServicePolicy          id_bool2   = platform.getServicePolicy( "id_boolean2" );
-     List<IServicePolicy>    list1      = new Vector<IServicePolicy>();
-     List<IServicePolicy>    list2      = new Vector<IServicePolicy>();
-     List<IServicePolicy>    list3      = new Vector<IServicePolicy>();
-     List<IServicePolicy>    list4      = new Vector<IServicePolicy>();
-     List<IServicePolicy>    list5      = new Vector<IServicePolicy>();
-     List<IServicePolicy>    list6      = new Vector<IServicePolicy>();
-     List<IServicePolicy>    list7      = new Vector<IServicePolicy>();
-     IPolicyOperation        op1        = platformUI.getOperation( "service.ui.operation1" ); //$NON-NLS-1$
-     IPolicyOperation        op2        = platformUI.getOperation( "service.ui.operation2" ); //$NON-NLS-1$
-     IPolicyOperation        op3        = platformUI.getOperation( "service.ui.operation3" ); //$NON-NLS-1$
-     IPolicyOperation        op4        = platformUI.getOperation( "service.ui.operation4" ); //$NON-NLS-1$
-  
-     list1.add( id1 );
-     list2.add( id2 );
-     list3.add( id3 );
-     list4.add( id4 );
-     list5.add( id4 );
-     list5.add( id1 );
-     list6.add( id2 );
-     list6.add( id3 );
-     list7.add( id1 );
-     list7.add( id2 );
-     list7.add( id3 );
-     list7.add( id4 );
-    
-     Set<IPolicyOperation> set1 = platformUI.getSelectedOperations( list1, true );
-     Set<IPolicyOperation> set2 = platformUI.getSelectedOperations( list2, true );
-     Set<IPolicyOperation> set3 = platformUI.getSelectedOperations( list3, true );
-     Set<IPolicyOperation> set4 = platformUI.getSelectedOperations( list4, true );
-     Set<IPolicyOperation> set5 = platformUI.getSelectedOperations( list5, true );
-     Set<IPolicyOperation> set6 = platformUI.getSelectedOperations( list6, true );
-     Set<IPolicyOperation> set7 = platformUI.getSelectedOperations( list7, true );
+     IPolicyOperation        op1_id2    = platformUI.getOperation( id2, "service.ui.operation1" ); //$NON-NLS-1$
+     IPolicyOperation        op1_id3    = platformUI.getOperation( id3, "service.ui.operation1" ); //$NON-NLS-1$
+     IPolicyOperation        op2_id1    = platformUI.getOperation( id1, "service.ui.operation2" ); //$NON-NLS-1$
+     IPolicyOperation        op2_id2    = platformUI.getOperation( id2, "service.ui.operation2" ); //$NON-NLS-1$
+     IPolicyOperation        op2_id3    = platformUI.getOperation( id3, "service.ui.operation2" ); //$NON-NLS-1$
+     IPolicyOperation        op2_id4    = platformUI.getOperation( id4, "service.ui.operation2" ); //$NON-NLS-1$
+     IPolicyOperation        op3_id4    = platformUI.getOperation( id4, "service.ui.operation3" ); //$NON-NLS-1$
+     IPolicyOperation        op4_id1    = platformUI.getOperation( id1, "service.ui.operation4" ); //$NON-NLS-1$
+     IPolicyOperation        op4_id2    = platformUI.getOperation( id2, "service.ui.operation4" ); //$NON-NLS-1$
+     IPolicyOperation        op4_id3    = platformUI.getOperation( id3, "service.ui.operation4" ); //$NON-NLS-1$
      
-     System.out.println( "\nDisplay sets" ); //$NON-NLS-1$
-     displaySet( "Set1", set1 ); //$NON-NLS-1$
-     displaySet( "Set2", set2 ); //$NON-NLS-1$
-     displaySet( "Set3", set3 ); //$NON-NLS-1$
-     displaySet( "Set4", set4 ); //$NON-NLS-1$
-     displaySet( "Set5", set5 ); //$NON-NLS-1$
-     displaySet( "Set6", set6 ); //$NON-NLS-1$
-     displaySet( "Set7", set7 ); //$NON-NLS-1$
+     List<IPolicyOperation> list1 = platformUI.getOperations( id1, true );
+     List<IPolicyOperation> list2 = platformUI.getOperations( id2, true );
+     List<IPolicyOperation> list3 = platformUI.getOperations( id3, true );
+     List<IPolicyOperation> list4 = platformUI.getOperations( id4, true );
      
-     checkContents( "Set1", set1, new IPolicyOperation[]{ op2, op4 } ); //$NON-NLS-1$
-     checkContents( "Set2", set2, new IPolicyOperation[]{ op1, op2, op4 } ); //$NON-NLS-1$
-     checkContents( "Set3", set3, new IPolicyOperation[]{ op1, op2, op4 } ); //$NON-NLS-1$
-     checkContents( "Set4", set4, new IPolicyOperation[]{ op2, op3 } ); //$NON-NLS-1$
-     checkContents( "Set5", set5, new IPolicyOperation[]{ op2, op3, op4 } ); //$NON-NLS-1$
-     checkContents( "Set6", set6, new IPolicyOperation[]{ op1, op2, op4 } ); //$NON-NLS-1$
-     checkContents( "Set7", set7, new IPolicyOperation[]{ op1, op2, op3, op4 } ); //$NON-NLS-1$
+     System.out.println( "\nDisplay lists" ); //$NON-NLS-1$
+     displayList( "List1", list1 ); //$NON-NLS-1$
+     displayList( "List2", list2 ); //$NON-NLS-1$
+     displayList( "List3", list3 ); //$NON-NLS-1$
+     displayList( "List4", list4 ); //$NON-NLS-1$
+     
+     checkContents( "List1", list1, new IPolicyOperation[]{ op2_id1, op4_id1 } ); //$NON-NLS-1$
+     checkContents( "List2", list2, new IPolicyOperation[]{ op1_id2, op2_id2, op4_id2 } ); //$NON-NLS-1$
+     checkContents( "List3", list3, new IPolicyOperation[]{ op1_id3, op2_id3, op4_id3 } ); //$NON-NLS-1$
+     checkContents( "List4", list4, new IPolicyOperation[]{ op2_id4, op3_id4 } ); //$NON-NLS-1$
    }
    
    public void testEnabledOperations()
@@ -116,7 +90,7 @@
      IServicePolicy          id4         = platform.getServicePolicy( "id4" ); //$NON-NLS-1$
      List<IServicePolicy>    policyList1 = new Vector<IServicePolicy>();
      List<IServicePolicy>    policyList2 = new Vector<IServicePolicy>();
-     IPolicyOperation        op1         = platformUI.getOperation( "service.ui.operation3" ); //$NON-NLS-1$
+     IPolicyOperation        op1         = platformUI.getOperation( id4, "service.ui.operation3" ); //$NON-NLS-1$
      
      policyList1.add( id1 );
      policyList1.add( id2 );
@@ -180,11 +154,11 @@
      }
    }
    
-   private void displaySet( String setName, Set<IPolicyOperation> operationSet )
+   private void displayList( String setName, List<IPolicyOperation> operationList )
    {
      System.out.print( setName + ": " ); //$NON-NLS-1$
      
-     for( IPolicyOperation operation : operationSet )
+     for( IPolicyOperation operation : operationList )
      {
        System.out.print( operation.getId() + "," ); //$NON-NLS-1$
      }
@@ -192,7 +166,7 @@
      System.out.println( "" ); //$NON-NLS-1$
    }
    
-   private void checkContents( String setName, Set<IPolicyOperation> operationSet, IPolicyOperation[] operationArray )
+   private void checkContents( String setName, List<IPolicyOperation> operationSet, IPolicyOperation[] operationArray )
    {
      assertTrue( "Set and array sizes don't match for " + setName + ".", operationSet.size() == operationArray.length ); //$NON-NLS-1$ //$NON-NLS-2$
 
