CheckIN:Fix bugzilla bug 189254
diff --git a/plugins/org.eclipse.datatools.enablement.oda.ws.ui/META-INF/MANIFEST.MF b/plugins/org.eclipse.datatools.enablement.oda.ws.ui/META-INF/MANIFEST.MF
index 427b605..5384f27 100644
--- a/plugins/org.eclipse.datatools.enablement.oda.ws.ui/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.datatools.enablement.oda.ws.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %plugin.name
 Bundle-SymbolicName: org.eclipse.datatools.enablement.oda.ws.ui; singleton:=true
-Bundle-Version: 1.0.0.200705291
+Bundle-Version: 1.0.0.200705301
 Bundle-Activator: org.eclipse.datatools.enablement.oda.ws.ui.Activator
 Bundle-Vendor: Eclipse.org
 Bundle-Localization: plugin
diff --git a/plugins/org.eclipse.datatools.enablement.oda.ws.ui/plugin.xml b/plugins/org.eclipse.datatools.enablement.oda.ws.ui/plugin.xml
index dc39fda..5a2510f 100644
--- a/plugins/org.eclipse.datatools.enablement.oda.ws.ui/plugin.xml
+++ b/plugins/org.eclipse.datatools.enablement.oda.ws.ui/plugin.xml
@@ -27,6 +27,11 @@
                wizardPageClass="org.eclipse.datatools.enablement.oda.ws.ui.wizards.OperationPage">
          </dataSetPage>
          <dataSetPage
+               displayName="%oda.ws.soapparameters"
+               id="org.eclipse.datatools.enablement.oda.ws.ui.SOAPParametersPage"
+               wizardPageClass="org.eclipse.datatools.enablement.oda.ws.ui.wizards.SOAPParametersPage">
+         </dataSetPage>
+         <dataSetPage
                displayName="%oda.ws.soaprequest"
                id="org.eclipse.datatools.enablement.oda.ws.ui.SOAPRequestPage"
                wizardPageClass="org.eclipse.datatools.enablement.oda.ws.ui.wizards.SOAPRequestPage">
diff --git a/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/i18n/messages.properties b/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/i18n/messages.properties
index e89f7100..cede08f 100644
--- a/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/i18n/messages.properties
+++ b/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/i18n/messages.properties
@@ -31,7 +31,8 @@
 
 # OperationPage
 operationPage.message.default=Select an operation defined in the data source's WSDL descriptor
-operationPage.message.operationChanged=Operation has been changed, make sure to regenerate the SOAP request and reconnect the end point
+operationPage.message.operationChanged=Confrim to regenerate the SOAP request and reconnect the End Point
+operationPage.title.operationChanged=Operation Changed
 operationPage.label.selectOpearation=Selected Operation
 operationPage.label.document=Documentation
 
@@ -40,9 +41,9 @@
 
 # SoapRequestPage
 soapRequestPage.message.default=Edit the SOAP request template of this data set. You may leave the text empty if your data source's custom connecion class code does not require a query text
-soapRequestPage.message.generateTemplate=This will regenerate the query text template based on the SOAP operation you have selected. It will remove any modifications you have made to the text.\n\nAre you sure?
-soapRequestPage.title.generateTemplate=Regenerate Template
-soapRequestPage.button.generateTemplate=&Regenerate Template
+soapRequestPage.message.regenerateTemplate=This will regenerate the query text template based on the SOAP operation you have selected. It will remove any modifications you have made to the text.\n\nAre you sure?
+soapRequestPage.title.regenerateTemplate=Regenerate Template
+soapRequestPage.button.regenerateTemplate=&Regenerate Template
 soapRequestPage.button.insertParameter=&Insert Parameter...
 soapRequestPage.button.clear=&Clear
 
diff --git a/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/util/WSConsole.java b/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/util/WSConsole.java
index 9594260..6959c2d 100644
--- a/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/util/WSConsole.java
+++ b/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/util/WSConsole.java
@@ -493,9 +493,12 @@
 		for ( int i = 0; i < parameters.length; i++ )
 		{
 			// apply name & defaultValue
-			ParameterDefinition paramDef = (ParameterDefinition) parameterDefinitions.get( i );
-			paramDef.getAttributes( ).setName( parameters[i].getName( ) );
-			paramDef.setDefaultScalarValue( parameters[i].getDefaultValue( ) );
+			if ( !WSUIUtil.isNull( parameters[i] ) )
+			{
+				ParameterDefinition paramDef = (ParameterDefinition) parameterDefinitions.get( i );
+				paramDef.getAttributes( ).setName( parameters[i].getName( ) );
+				paramDef.setDefaultScalarValue( parameters[i].getDefaultValue( ) );
+			}
 		}
 	}
 
@@ -511,4 +514,18 @@
 		return true;
 	}
 
+	/**
+	 * 
+	 * @param queryText
+	 * @param params
+	 * @return
+	 */
+	public String manipulateTemplate( )
+	{
+		SOAPRequest soapRequest = new SOAPRequest( getPropertyValue( Constants.WS_QUERYTEXT ) );
+		soapRequest.setParameters( parameters );
+
+		return soapRequest.manipulateQuery( );
+	}
+
 }
diff --git a/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/util/WSUIUtil.java b/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/util/WSUIUtil.java
index 7953659..150937d 100644
--- a/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/util/WSUIUtil.java
+++ b/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/util/WSUIUtil.java
@@ -88,6 +88,9 @@
 	 */
 	public static void savePage( DataSetDesign dataSetDesign )
 	{
+		if ( !WSConsole.getInstance( ).isSessionOK( ) )
+			return;
+		
 		IConnection conn = null;
 		try
 		{
@@ -131,8 +134,9 @@
 		{
 			for ( int i = 0; i < soapParameters.length; i++ )
 			{
-				query.setString( soapParameters[i].getId( ),
-						soapParameters[i].getDefaultValue( ) );
+				if ( !isNull( soapParameters[i] ) )
+					query.setString( soapParameters[i].getId( ),
+							soapParameters[i].getDefaultValue( ) );
 			}
 		}
 
diff --git a/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/wizards/OperationPage.java b/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/wizards/OperationPage.java
index 7e3dda5..ea980ca 100644
--- a/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/wizards/OperationPage.java
+++ b/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/wizards/OperationPage.java
@@ -20,6 +20,7 @@
 import javax.wsdl.Port;
 import javax.wsdl.Service;
 
+import org.eclipse.datatools.connectivity.oda.OdaException;
 import org.eclipse.datatools.connectivity.oda.design.DataSetDesign;
 import org.eclipse.datatools.connectivity.oda.design.ui.wizards.DataSetWizardPage;
 import org.eclipse.datatools.enablement.oda.ws.ui.Activator;
@@ -28,6 +29,7 @@
 import org.eclipse.datatools.enablement.oda.ws.ui.util.WSConsole;
 import org.eclipse.datatools.enablement.oda.ws.ui.util.WSUIUtil;
 import org.eclipse.datatools.enablement.oda.ws.util.WSDLAdvisor;
+import org.eclipse.jface.dialogs.MessageDialog;
 import org.eclipse.jface.wizard.IWizardPage;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
@@ -57,6 +59,7 @@
 	private String operationTrace = WSUIUtil.EMPTY_STRING;
 	private String initOperationTrace = WSUIUtil.EMPTY_STRING;
 	private String wsdlURI = WSUIUtil.EMPTY_STRING;
+	private String wsQuery = WSUIUtil.EMPTY_STRING;
 
 	private Image wsdlImage;
 	private Image serviceImage;
@@ -138,7 +141,6 @@
 			public void widgetSelected( SelectionEvent event )
 			{
 				handle( );
-				testDirty( );
 			}
 
 			private void handle( )
@@ -161,17 +163,6 @@
 				}
 			}
 
-			private void testDirty( )
-			{
-				if ( !WSUIUtil.isNull( initOperationTrace )
-						&& !initOperationTrace.equals( operationTrace ) )
-					setMessage( Messages.getString( "operationPage.message.operationChanged" ), //$NON-NLS-1$
-							INFORMATION );
-
-				else
-					setMessage( DEFAULT_MESSAGE );
-			}
-
 		} );
 	}
 
@@ -367,7 +358,7 @@
 	{
 		initFromModel( );
 		populateTree( );
-		
+
 		setMessage( DEFAULT_MESSAGE );
 	}
 
@@ -379,9 +370,48 @@
 	protected boolean canLeave( )
 	{
 		saveToModle( );
+		testDirty( );
+
 		return super.canLeave( );
 	}
 
+	private void testDirty( )
+	{
+		if ( !WSUIUtil.isNull( initOperationTrace )
+				&& !initOperationTrace.equals( operationTrace ) )
+			if ( MessageDialog.openConfirm( null,
+					Messages.getString( "operationPage.title.operationChanged" ), Messages.getString( "operationPage.message.operationChanged" ) ) )//$NON-NLS-1$ //$NON-NLS-2$
+			{
+				regenerateTemplate( );
+				try
+				{
+					WSConsole.getInstance( ).createXMLTempFileURI( );
+				}
+				catch ( OdaException e )
+				{
+				}
+			}
+	}
+
+	private void regenerateTemplate( )
+	{
+		wsQuery = WSUIUtil.getNonNullString( WSConsole.getInstance( )
+				.getTemplate( ) );
+		if ( !WSUIUtil.isNull( wsQuery ) )
+			WSConsole.getInstance( ).setPropertyValue( Constants.WS_QUERYTEXT,
+					wsQuery );
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.wizard.WizardPage#canFlipToNextPage()
+	 */
+	public boolean canFlipToNextPage( )
+	{
+		return isPageComplete( );
+	}
+
 	/*
 	 * (non-Javadoc)
 	 * 
@@ -392,8 +422,8 @@
 		saveToModle( );
 
 		IWizardPage page = super.getNextPage( );
-		if ( page instanceof SOAPRequestPage )
-			( (SOAPRequestPage) page ).refresh( );
+		if ( page instanceof SOAPParametersPage )
+			( (SOAPParametersPage) page ).refresh( );
 
 		return page;
 	}
diff --git a/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/wizards/SOAPParametersPage.java b/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/wizards/SOAPParametersPage.java
new file mode 100644
index 0000000..59565b8
--- /dev/null
+++ b/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/wizards/SOAPParametersPage.java
@@ -0,0 +1,436 @@
+/*******************************************************************************
+ * Copyright (c) 2004, 2005 Actuate Corporation.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *  Actuate Corporation  - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.datatools.enablement.oda.ws.ui.wizards;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.datatools.connectivity.oda.design.DataSetDesign;
+import org.eclipse.datatools.connectivity.oda.design.ui.wizards.DataSetWizardPage;
+import org.eclipse.datatools.enablement.oda.ws.soap.SOAPParameter;
+import org.eclipse.datatools.enablement.oda.ws.soap.SOAPRequest;
+import org.eclipse.datatools.enablement.oda.ws.ui.i18n.Messages;
+import org.eclipse.datatools.enablement.oda.ws.ui.util.Constants;
+import org.eclipse.datatools.enablement.oda.ws.ui.util.WSConsole;
+import org.eclipse.datatools.enablement.oda.ws.ui.util.WSUIUtil;
+import org.eclipse.jface.viewers.CellEditor;
+import org.eclipse.jface.viewers.CheckboxTableViewer;
+import org.eclipse.jface.viewers.ICellModifier;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.IStructuredContentProvider;
+import org.eclipse.jface.viewers.ITableLabelProvider;
+import org.eclipse.jface.viewers.TableLayout;
+import org.eclipse.jface.viewers.TextCellEditor;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.wizard.IWizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableColumn;
+import org.eclipse.swt.widgets.TableItem;
+
+/**
+ * 
+ */
+
+public class SOAPParametersPage extends DataSetWizardPage
+{
+
+	private static final String COLUMN_NAME = Messages.getString( "parameterInputDialog.column.name" );//$NON-NLS-1$ 
+	private static final String COLUMN_DATATYPE = Messages.getString( "parameterInputDialog.column.type" );//$NON-NLS-1$ 
+	private static final String COLUMN_DEFAULTVALUE = Messages.getString( "parameterInputDialog.column.defaultValue" );//$NON-NLS-1$ 
+
+	private CheckboxTableViewer viewer;
+	private SOAPRequest soapRequest;
+	private String wsQueryText;
+	// parameters for page, different from soapParameters
+	private SOAPParameter[] parameters;
+	private static String DEFAULT_MESSAGE = Messages.getString( "soapParametersPage.message.default" );//$NON-NLS-1$
+
+	public SOAPParametersPage( String pageName )
+	{
+		super( pageName );
+		setMessage( DEFAULT_MESSAGE );
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.datatools.connectivity.oda.design.ui.wizards.DataSetWizardPage#createPageCustomControl(org.eclipse.swt.widgets.Composite)
+	 */
+	public void createPageCustomControl( Composite parent )
+	{
+		setControl( createPageControl( parent ) );
+		initializeControl( );
+	}
+
+	/**
+	 * Creates custom control for user-defined query text.
+	 */
+	private Control createPageControl( Composite parent )
+	{
+		Composite composite = new Composite( parent, SWT.NONE );
+		GridLayout layout = new GridLayout( 1, false );
+		composite.setLayout( layout );
+		GridData layoutData = new GridData( GridData.HORIZONTAL_ALIGN_FILL
+				| GridData.VERTICAL_ALIGN_FILL );
+		composite.setLayoutData( layoutData );
+
+		setupParametersComposite( composite );
+
+		return composite;
+	}
+
+	private void setupParametersComposite( Composite parent )
+	{
+		createCheckboxTable( parent );
+		setupEditors( );
+	}
+
+	private void createCheckboxTable( Composite parent )
+	{
+		final Table table = new Table( parent, SWT.CHECK
+				| SWT.BORDER | SWT.MULTI | SWT.FULL_SELECTION | SWT.H_SCROLL
+				| SWT.V_SCROLL );
+		TableLayout tableLayout = new TableLayout( );
+		table.setLayout( tableLayout );
+		GridData layouData = new GridData( GridData.FILL_BOTH );
+		table.setLayoutData( layouData );
+
+		table.setHeaderVisible( true );
+		table.setLinesVisible( true );
+
+		TableColumn column0 = new TableColumn( table, SWT.NONE );
+		column0.setText( COLUMN_NAME );
+		column0.setWidth( 200 );
+
+		TableColumn column1 = new TableColumn( table, SWT.NONE );
+		column1.setText( COLUMN_DATATYPE );
+		column1.setWidth( 200 );
+
+		TableColumn column2 = new TableColumn( table, SWT.NONE );
+		column2.setText( COLUMN_DEFAULTVALUE );
+		column2.setWidth( 200 );
+
+		viewer = new CheckboxTableViewer( table );
+		viewer.setContentProvider( new IStructuredContentProvider( ) {
+
+			public Object[] getElements( Object inputElement )
+			{
+				if ( inputElement == null
+						|| !( inputElement instanceof SOAPParameter[] ) )
+					return new Object[0];
+
+				return (SOAPParameter[]) inputElement;
+			}
+
+			public void inputChanged( Viewer viewer, Object oldInput,
+					Object newInput )
+			{
+				
+			}
+
+			public void dispose( )
+			{
+			}
+		} );
+		viewer.setLabelProvider( new ITableLabelProvider( ) {
+
+			public Image getColumnImage( Object element, int columnIndex )
+			{
+				return null;
+			}
+
+			public String getColumnText( Object element, int columnIndex )
+			{
+				SOAPParameter param = ( (SOAPParameter) element );
+				String value = WSUIUtil.EMPTY_STRING;
+				switch ( columnIndex )
+				{
+					case 0 :
+						value = param.getName( );
+						break;
+					case 1 :
+						value = WSUIUtil.EMPTY_STRING;
+						break;
+					case 2 :
+						value = param.getDefaultValue( );
+						break;
+				}
+
+				return WSUIUtil.getNonNullString( value );
+			}
+
+			public void addListener( ILabelProviderListener listener )
+			{
+			}
+
+			public void dispose( )
+			{
+			}
+
+			public boolean isLabelProperty( Object element, String property )
+			{
+				return false;
+			}
+
+			public void removeListener( ILabelProviderListener listener )
+			{
+			}
+		} );
+	}
+
+	private void setupEditors( )
+	{
+		CellEditor[] editors = new CellEditor[3];
+		for ( int i = 0; i < editors.length; i++ )
+		{
+			editors[i] = new TextCellEditor( viewer.getTable( ), SWT.NONE );
+		}
+
+		viewer.setCellEditors( editors );
+		viewer.setColumnProperties( new String[]{
+				COLUMN_NAME, COLUMN_DATATYPE, COLUMN_DEFAULTVALUE
+		} );
+
+		viewer.setCellModifier( new ICellModifier( ) {
+
+			public boolean canModify( Object element, String property )
+			{
+				if ( viewer.getChecked( element )
+						&& property.equals( COLUMN_DEFAULTVALUE ) )
+					return true;
+
+				return false;
+			}
+
+			public Object getValue( Object element, String property )
+			{
+				return WSUIUtil.getNonNullString( ( (SOAPParameter) element ).getDefaultValue( ) );
+			}
+
+			public void modify( Object element, String property, Object value )
+			{
+				SOAPParameter soapParameter = (SOAPParameter) ( (TableItem) element ).getData( );
+				soapParameter.setDefaultValue( value.toString( ) );
+
+				viewer.refresh( ); 
+			}
+		} );
+	}
+
+	/**
+	 * Initializes the page control with the last edited data set design.
+	 */
+	private void initializeControl( )
+	{
+		initWSConsole( );
+		initFromModel( );
+		initViewer( );
+	}
+
+	private void initWSConsole( )
+	{
+		if ( !WSConsole.getInstance( ).isSessionOK( ) )
+			WSConsole.getInstance( ).start( getInitializationDesign( ) );
+	}
+
+	private void initFromModel( )
+	{
+		wsQueryText = WSConsole.getInstance( )
+				.getPropertyValue( Constants.WS_QUERYTEXT );
+		parameters = WSConsole.getInstance( ).getParameters( );
+	}
+
+	private void initViewer( )
+	{
+		if ( WSUIUtil.isNull( wsQueryText ) )
+			return;
+
+		soapRequest = new SOAPRequest( );
+		soapRequest.setQueryText( wsQueryText );
+		soapRequest.init( );
+		mergeParameters( );
+		SOAPParameter[] soapParameters = soapRequest.getParameters( );
+		if ( !WSUIUtil.isNull( soapParameters ) )
+		{
+			viewer.setInput( soapParameters );
+			for ( int i = 0; i < soapParameters.length; i++ )
+			{
+				if ( !WSUIUtil.isNull( soapParameters[i] ) )
+					viewer.setChecked( soapParameters[i], true );
+			}
+		}
+	}
+
+	private void mergeParameters( )
+	{
+		if ( !canMerge( ) )
+			return;
+
+		SOAPParameter[] soapParameters = soapRequest.getParameters( );
+		for ( int i = 0; i < parameters.length; i++ )
+		{
+			soapParameters[i].setDefaultValue( parameters[i].getDefaultValue( ) );
+		}
+	}
+
+	private boolean canMerge( )
+	{
+		SOAPParameter[] soapParameters = soapRequest.getParameters( );
+		if ( parameters == null || soapParameters == null )
+			return false;
+
+		if ( parameters.length != soapParameters.length )
+			return false;
+
+		for ( int i = 0; i < parameters.length; i++ )
+		{
+			if ( !parameters[i].getName( )
+					.equals( soapParameters[i].getName( ) ) )
+				return false;
+		}
+
+		return true;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.datatools.connectivity.oda.design.ui.wizards.DataSetWizardPage#collectDataSetDesign(org.eclipse.datatools.connectivity.oda.design.DataSetDesign)
+	 */
+	protected DataSetDesign collectDataSetDesign( DataSetDesign design )
+	{
+		savePage( design );
+		WSUIUtil.savePage( design );
+		return design;
+	}
+
+	private void savePage( DataSetDesign dataSetDesign )
+	{
+		// TODO nothing to save
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.datatools.connectivity.oda.design.ui.wizards.DataSetWizardPage#refresh(org.eclipse.datatools.connectivity.oda.design.DataSetDesign)
+	 */
+	protected void refresh( DataSetDesign dataSetDesign )
+	{
+		initFromModel( );
+		initViewer( );
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.wizard.WizardPage#canFlipToNextPage()
+	 */
+	public boolean canFlipToNextPage( )
+	{
+		return isPageComplete( );
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
+	 */
+	public IWizardPage getNextPage( )
+	{
+		saveToModel( );
+
+		IWizardPage page = super.getNextPage( );
+		if ( page instanceof SOAPRequestPage )
+			( (SOAPRequestPage) page ).refresh( );
+
+		return page;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.datatools.connectivity.oda.design.ui.wizards.DataSetWizardPage#canLeave()
+	 */
+	protected boolean canLeave( )
+	{
+		viewer.refresh( );
+		saveToModel( );
+		return super.canLeave( );
+	}
+
+	private void saveToModel( )
+	{
+		WSConsole.getInstance( ).setPropertyValue( Constants.WS_QUERYTEXT,
+				wsQueryText );
+		WSConsole.getInstance( ).setParameters( getSOAPParameters( ) );
+	}
+
+	private SOAPParameter[] getSOAPParameters( )
+	{
+		Object[] candidates = (Object[]) viewer.getCheckedElements( );
+		List manipulated = getManipulatedIndexList( candidates );
+
+		SOAPParameter[] targets = soapRequest.getParameters( );
+		if ( WSUIUtil.isNull( targets ) || manipulated.isEmpty( ) )
+			return targets;
+
+		List result = new ArrayList();
+		for ( int i = 0; i < targets.length; i++ )
+		{
+			if ( ! (targets[i] != null && !manipulated.contains( new Integer( targets[i].getId( ) ) ) ))
+				result.add( targets[i] );
+		}
+		SOAPParameter[] r = new SOAPParameter[result.size( )];
+		for( int i = 0; i < result.size( ); i++ )
+		{
+			r[i] = (SOAPParameter)result.get( i );
+		}
+		
+		return r;
+	}
+
+	private List getManipulatedIndexList( Object[] soapParameters )
+	{
+		if ( WSUIUtil.isNull( soapParameters ) || soapParameters.length == 0 )
+			return Collections.EMPTY_LIST;
+
+		List manipulated = new ArrayList( );
+		for ( int i = 0; i < soapParameters.length; i++ )
+			manipulated.add( new Integer( ( (SOAPParameter) soapParameters[i] ).getId( ) ) );
+
+		return manipulated;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.datatools.connectivity.oda.design.ui.wizards.DataSetWizardPage#cleanup()
+	 */
+	protected void cleanup( )
+	{
+		WSConsole.getInstance( ).terminateSession( );
+	}
+
+	void refresh( )
+	{
+		wsQueryText = WSConsole.getInstance( ).getTemplate( );
+		initViewer( );
+	}
+
+}
diff --git a/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/wizards/SOAPRequestPage.java b/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/wizards/SOAPRequestPage.java
index 37241c1..3bf9703 100644
--- a/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/wizards/SOAPRequestPage.java
+++ b/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/wizards/SOAPRequestPage.java
@@ -111,7 +111,7 @@
 		composite.setLayoutData( layoutData );
 
 		Button button = new Button( composite, SWT.NONE );
-		button.setText( Messages.getString( "soapRequestPage.button.generateTemplate" ) ); //$NON-NLS-1$
+		button.setText( Messages.getString( "soapRequestPage.button.regenerateTemplate" ) ); //$NON-NLS-1$
 		layoutData = new GridData( );
 		layoutData.widthHint = 120;
 		button.setLayoutData( layoutData );
@@ -120,9 +120,9 @@
 			public void widgetSelected( SelectionEvent e )
 			{
 				if ( MessageDialog.openConfirm( null,
-						Messages.getString( "soapRequestPage.title.generateTemplate" ), //$NON-NLS-1$
-						Messages.getString( "soapRequestPage.message.generateTemplate" ) ) ) //$NON-NLS-1$
-					refresh( );
+						Messages.getString( "soapRequestPage.title.regenerateTemplate" ), //$NON-NLS-1$
+						Messages.getString( "soapRequestPage.message.regenerateTemplate" ) ) ) //$NON-NLS-1$
+					regenerateTemplate( );
 			}
 
 		} );
@@ -162,7 +162,12 @@
 			}
 
 		} );
+	}
 
+	private void regenerateTemplate( )
+	{
+		queryText.setText( WSUIUtil.getNonNullString( WSConsole.getInstance( )
+				.getTemplate( ) ) );
 	}
 
 	/**
@@ -224,20 +229,23 @@
 	{
 		super.refresh( dataSetDesign );
 
-		if ( isDirty( dataSetDesign ) )
-			refresh( );
-	}
-
-	// TODO
-	private boolean isDirty( DataSetDesign dataSetDesign )
-	{
-		return false;
+		initFromModel( );
 	}
 
 	void refresh( )
 	{
 		queryText.setText( WSUIUtil.getNonNullString( WSConsole.getInstance( )
-				.getTemplate( ) ) );
+				.manipulateTemplate( ) ) );
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.jface.wizard.WizardPage#canFlipToNextPage()
+	 */
+	public boolean canFlipToNextPage( )
+	{
+		return isPageComplete( );
 	}
 
 	/*
@@ -480,7 +488,8 @@
 			SOAPParameter[] soapParameters = soapRequest.getParameters( );
 			for ( int i = 0; i < parameters.length; i++ )
 			{
-				soapParameters[i].setDefaultValue( parameters[i].getDefaultValue( ) );
+				if ( !WSUIUtil.isNull( parameters[i] ) )
+					soapParameters[i].setDefaultValue( parameters[i].getDefaultValue( ) );
 			}
 		}
 
@@ -495,8 +504,9 @@
 
 			for ( int i = 0; i < parameters.length; i++ )
 			{
-				if ( !parameters[i].getName( )
-						.equals( soapParameters[i].getName( ) ) )
+				if ( !WSUIUtil.isNull( parameters[i] )
+						&& !parameters[i].getName( )
+								.equals( soapParameters[i].getName( ) ) )
 					return false;
 			}
 
diff --git a/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/wizards/SOAPResponsePage.java b/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/wizards/SOAPResponsePage.java
index 1a7a3f7..2950237 100644
--- a/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/wizards/SOAPResponsePage.java
+++ b/plugins/org.eclipse.datatools.enablement.oda.ws.ui/src/org/eclipse/datatools/enablement/oda/ws/ui/wizards/SOAPResponsePage.java
@@ -397,6 +397,16 @@
 	/*
 	 * (non-Javadoc)
 	 * 
+	 * @see org.eclipse.jface.wizard.WizardPage#canFlipToNextPage()
+	 */
+	public boolean canFlipToNextPage( )
+	{
+		return isPageComplete( );
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * 
 	 * @see org.eclipse.jface.wizard.WizardPage#getNextPage()
 	 */
 	public IWizardPage getNextPage( )
diff --git a/plugins/org.eclipse.datatools.enablement.oda.ws/META-INF/MANIFEST.MF b/plugins/org.eclipse.datatools.enablement.oda.ws/META-INF/MANIFEST.MF
index 2fadfac..38f5c6f 100644
--- a/plugins/org.eclipse.datatools.enablement.oda.ws/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.datatools.enablement.oda.ws/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %plugin.name
 Bundle-SymbolicName: org.eclipse.datatools.enablement.oda.ws; singleton:=true
-Bundle-Version: 1.0.0.200705291
+Bundle-Version: 1.0.0.200705301
 Bundle-Activator: org.eclipse.datatools.enablement.oda.ws.Activator
 Bundle-Vendor: Eclipse.org
 Bundle-Localization: plugin
diff --git a/plugins/org.eclipse.datatools.enablement.oda.ws/src/org/eclipse/datatools/enablement/oda/ws/soap/SOAPRequest.java b/plugins/org.eclipse.datatools.enablement.oda.ws/src/org/eclipse/datatools/enablement/oda/ws/soap/SOAPRequest.java
index ed0b2e0..b5c9cd3 100644
--- a/plugins/org.eclipse.datatools.enablement.oda.ws/src/org/eclipse/datatools/enablement/oda/ws/soap/SOAPRequest.java
+++ b/plugins/org.eclipse.datatools.enablement.oda.ws/src/org/eclipse/datatools/enablement/oda/ws/soap/SOAPRequest.java
@@ -201,4 +201,40 @@
 		return soapRequest;
 	}
 
+	/**
+	 * Convenient method to manipulate query after parameters have been changed
+	 * 
+	 * @param soapParameters
+	 * @return
+	 */
+	public String manipulateQuery( )
+	{
+		if ( WSUtil.isNull( template ) )
+			return WSUtil.EMPTY_STRING;
+
+		if ( WSUtil.isNull( parameters ) )
+			return template[template.length - 1];
+
+		String soapRequest = WSUtil.EMPTY_STRING;
+		for ( int i = 0; i < parameters.length; i++ )
+		{
+			if ( !WSUtil.isNull( parameters[i] ) )
+			{
+				soapRequest += template[i];
+				if ( WSUtil.isNull( parameters[i].getDefaultValue( ) ) )
+					soapRequest += buildParameter( parameters[i].getName( ) );
+				else
+					soapRequest += parameters[i].getDefaultValue( );
+			}
+		}
+		soapRequest += template[template.length - 1];
+
+		return soapRequest;
+	}
+
+	private String buildParameter( String paramName )
+	{
+		return "&?" + paramName + "?&"; //$NON-NLS-1$//$NON-NLS-2$
+	}
+
 }