Index: JAXRSWSTestView2.java
===================================================================
--- JAXRSWSTestView2.java	(revision 0)
+++ JAXRSWSTestView2.java	(revision 0)
@@ -0,0 +1,1249 @@
+/******************************************************************************* 
+ * Copyright (c) 2010 Red Hat, Inc. 
+ * Distributed under license by Red Hat, Inc. All rights reserved. 
+ * This program is 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: 
+ * Red Hat, Inc. - initial API and implementation 
+ ******************************************************************************/
+package org.jboss.tools.ws.ui.views;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map.Entry;
+
+import javax.xml.soap.SOAPBody;
+import javax.xml.soap.SOAPEnvelope;
+
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.CoolBar;
+import org.eclipse.swt.widgets.CoolItem;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.TabFolder;
+import org.eclipse.swt.widgets.TabItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.ui.IStorageEditorInput;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.events.ExpansionAdapter;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.part.ViewPart;
+import org.eclipse.wst.internet.monitor.core.internal.provisional.IMonitor;
+import org.eclipse.wst.internet.monitor.core.internal.provisional.MonitorCore;
+import org.jboss.tools.ws.ui.JBossWSUIPlugin;
+import org.jboss.tools.ws.ui.messages.JBossWSUIMessages;
+import org.jboss.tools.ws.ui.utils.JAXRSTester;
+import org.jboss.tools.ws.ui.utils.JAXWSTester2;
+import org.jboss.tools.ws.ui.utils.ResultsXMLStorage;
+import org.jboss.tools.ws.ui.utils.ResultsXMLStorageInput;
+import org.jboss.tools.ws.ui.utils.WSTestUtils;
+
+/**
+ * View for testing web services (JAX-WS & JAX-RS)
+ * @author bfitzpat
+ *
+ */
+@SuppressWarnings("restriction")
+public class JAXRSWSTestView2 extends ViewPart {
+
+	private static final String DEFAULT_TEXT_EDITOR_ID = "org.eclipse.ui.DefaultTextEditor"; //$NON-NLS-1$
+	private static final String XML_EDITOR_ID = "org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart"; //$NON-NLS-1$
+	private static final String TCPIP_VIEW_ID = "org.eclipse.wst.internet.monitor.view";//$NON-NLS-1$
+	private static final String DELETE = "DELETE";//$NON-NLS-1$
+	private static final String PUT = "PUT";//$NON-NLS-1$
+	private static final String POST = "POST";//$NON-NLS-1$
+	private static final String GET = "GET";//$NON-NLS-1$
+	private static final String JAX_WS = "JAX-WS"; //$NON-NLS-1$
+	private static final String JAX_RS = "JAX-RS"; //$NON-NLS-1$
+	private static final String EMPTY_STRING = ""; //$NON-NLS-1$
+	private static final String RESULT_HEADER_DELIMITER = "%";//$NON-NLS-1$
+
+	/**
+	 * The ID of the view as specified by the extension.
+	 */
+	public static final String ID = "org.jboss.tools.ws.ui.tester.views.TestWSView";//$NON-NLS-1$
+
+	/* UI controls */
+	private Button testButton = null;
+	private Button wsdlButton = null;
+	private Text actionText;
+	private Text resultsText;
+	private Combo urlCombo;
+	private DelimitedStringList dlsList;
+	private Combo methodCombo;
+	private Combo wsTypeCombo;
+	private Text bodyText;
+	private TabFolder tabGroup;
+	private TabItem bodyTab;
+	private TabItem headerTab;
+	private List resultHeadersList;
+	private TabItem resultHeadersTab;
+	private TabItem resultTab;
+	private TabFolder resultTabGroup;
+
+	private TabItem parmsTab;
+
+	private DelimitedStringList parmsList;
+	private Button openTCPIPMonitorButton;
+	private Button addTCPIPMonitorButton;
+
+	private SOAPEnvelope envelope;
+	private SOAPBody soapbody;
+	private MenuItem openInXMLEditorAction;
+	private MenuItem openResponseTagInXMLEditor;
+	private Menu resultsTextMenu;
+	private MenuItem copyMenuAction;
+	private Menu resultsHeaderMenu;
+	private MenuItem copyResultHeaderMenuAction;
+	
+	private boolean showSampleButton = false;
+	private String[] serviceNSMessage = null;
+	
+	private FormToolkit toolkit;
+	private ScrolledForm form;
+	private ImageRegistry mImageRegistry;
+
+	private static final String IMG_DESC_WSDL = "icons/obj16/wsdl.gif"; //$NON-NLS-1$
+	private static final String IMG_DESC_START = "icons/obj16/run.gif"; //$NON-NLS-1$
+	private static final String IMG_DESC_STOP = "icons/obj16/progress_stop.gif"; //$NON-NLS-1$
+	
+	/**
+	 * The constructor.
+	 */
+	public JAXRSWSTestView2() {
+	}
+
+	private void getImages() {
+		mImageRegistry = new ImageRegistry();
+		mImageRegistry.put(IMG_DESC_WSDL, ImageDescriptor
+				.createFromURL(JBossWSUIPlugin.getDefault().getBundle()
+						.getEntry(IMG_DESC_WSDL)));
+		mImageRegistry.put(IMG_DESC_START, ImageDescriptor
+				.createFromURL(JBossWSUIPlugin.getDefault().getBundle()
+						.getEntry(IMG_DESC_START)));
+		mImageRegistry.put(IMG_DESC_STOP, ImageDescriptor
+				.createFromURL(JBossWSUIPlugin.getDefault().getBundle()
+						.getEntry(IMG_DESC_STOP)));
+	}
+	
+	/**
+	 * This is a callback that will allow us
+	 * to create the viewer and initialize it.
+	 */
+	public void createPartControl(Composite parent) {
+		
+		getImages();
+		
+		toolkit = new FormToolkit(parent.getDisplay());
+		form = toolkit.createScrolledForm(parent);
+		
+		GridLayout layout = new GridLayout(2, false);
+  	    form.getBody().setLayout(layout);
+  	    
+		urlCombo = new Combo(form.getBody(), SWT.BORDER | SWT.DROP_DOWN);
+		GridData gdURL = new GridData(SWT.FILL, SWT.NONE, true, false);
+		urlCombo.setLayoutData(gdURL);
+		toolkit.adapt(urlCombo);
+		
+		Composite comp1 = toolkit.createComposite(form.getBody());
+		comp1.setLayout(new FillLayout());
+		
+		CoolBar coolBar = new CoolBar(comp1,SWT.BORDER);
+		toolkit.adapt(coolBar);
+		
+		CoolItem wsTypeCoolItem = new CoolItem(coolBar, SWT.PUSH);
+		wsTypeCombo = new Combo(coolBar, SWT.READ_ONLY | SWT.BORDER);
+        String[] items = {JAX_WS, JAX_RS};
+        wsTypeCombo.setItems(items);
+        wsTypeCombo.pack();
+        Point size = wsTypeCombo.computeSize (SWT.DEFAULT, SWT.DEFAULT);
+        wsTypeCoolItem.setPreferredSize (wsTypeCoolItem.computeSize (size.x, size.y));
+        wsTypeCoolItem.setControl(wsTypeCombo);
+		wsTypeCombo.addSelectionListener(new SelectionListener() {
+			public void widgetDefaultSelected(SelectionEvent e) {
+				widgetSelected(e);
+			}
+			public void widgetSelected(SelectionEvent e) {
+				setControlsForWSType(wsTypeCombo.getText());
+				setControlsForMethodType(methodCombo.getText());
+				setControlsForSelectedURL();
+			}
+		});
+		toolkit.adapt(wsTypeCombo);
+		
+		CoolItem wsMethodCoolItem = new CoolItem(coolBar, SWT.PUSH);
+		methodCombo = new Combo(coolBar, SWT.BORDER | SWT.READ_ONLY);
+		String[] methods = {GET, POST, PUT, DELETE};
+		methodCombo.setItems(methods);
+		methodCombo.pack();
+        size = methodCombo.computeSize (SWT.DEFAULT, SWT.DEFAULT);
+        wsMethodCoolItem.setPreferredSize (wsMethodCoolItem.computeSize (size.x, size.y));
+        wsMethodCoolItem.setControl(methodCombo);
+		methodCombo.addSelectionListener(new SelectionListener() {
+			public void widgetDefaultSelected(SelectionEvent e) {
+				widgetSelected(e);
+			}
+			public void widgetSelected(SelectionEvent e) {
+				setControlsForMethodType(methodCombo.getText());
+			}
+		});
+		toolkit.adapt(methodCombo);
+
+        CoolItem topCoolItem = new CoolItem(coolBar, SWT.NONE);
+       
+        ToolBar topToolBar = new ToolBar(coolBar,SWT.HORIZONTAL);
+        ToolItem openWSDLToolItem = new ToolItem(topToolBar, SWT.PUSH);
+        openWSDLToolItem.setImage(mImageRegistry.get(IMG_DESC_WSDL));
+        openWSDLToolItem.setToolTipText("Get from WSDL");
+        
+        ToolItem startToolItem = new ToolItem(topToolBar, SWT.PUSH);
+        startToolItem.setImage(mImageRegistry.get(IMG_DESC_START));
+        startToolItem.setToolTipText("Go");
+
+        ToolItem stopToolItem = new ToolItem(topToolBar, SWT.PUSH);
+        stopToolItem.setImage(mImageRegistry.get(IMG_DESC_STOP));
+        stopToolItem.setToolTipText("Stop");
+        toolkit.adapt(coolBar);
+
+        topToolBar.pack(); 
+        size = topToolBar.getSize();
+        topCoolItem.setControl(topToolBar);
+        topCoolItem.setSize(topCoolItem.computeSize(size.x, size.y));
+        
+		SashForm topBottomForm = new SashForm(form.getBody(), SWT.NONE);
+		topBottomForm.setOrientation(SWT.VERTICAL);
+		toolkit.adapt(topBottomForm);
+		topBottomForm.setLayout(new GridLayout());
+		GridData gd8 = new GridData(SWT.FILL, SWT.NONE, true, false);
+		gd8.horizontalSpan = 2;
+		topBottomForm.setLayoutData(gd8);
+		
+		SashForm sashForm = new SashForm(topBottomForm, SWT.NONE);
+		sashForm.setOrientation(SWT.HORIZONTAL);
+		toolkit.adapt(sashForm);
+		GridLayout sashLayout = new GridLayout(2, false);
+		sashForm.setLayout(sashLayout);
+		GridData gd3 = new GridData(SWT.FILL, SWT.NONE, true, false);
+		gd3.horizontalSpan = 2;
+		sashForm.setLayoutData(gd3);
+
+		ExpandableComposite ec = toolkit.createExpandableComposite(sashForm, 
+			     ExpandableComposite.TWISTIE|
+			     ExpandableComposite.CLIENT_INDENT);
+		ec.setText("Headers");
+		dlsList = new DelimitedStringList(ec, SWT.None);
+		ec.setClient(dlsList);
+		toolkit.adapt(dlsList);
+		GridData gd = new GridData(SWT.FILL, SWT.NONE, true, false);
+		 ec.setLayoutData(gd);
+		ec.addExpansionListener(new ExpansionAdapter() {
+			  public void expansionStateChanged(ExpansionEvent e) {
+			   form.reflow(true);
+			  }
+		});
+		
+		ExpandableComposite ec2 = toolkit.createExpandableComposite(sashForm, 
+			     ExpandableComposite.TWISTIE|
+			     ExpandableComposite.CLIENT_INDENT);
+		ec2.setText("Response Headers");
+		resultsText = toolkit.createText(ec2, "", SWT.BORDER | SWT.V_SCROLL | SWT.WRAP | SWT.READ_ONLY );
+		ec2.setClient(resultsText);
+		GridData gd2 = new GridData(SWT.FILL, SWT.FILL, true, false);
+		 ec2.setLayoutData(gd2);
+		ec2.addExpansionListener(new ExpansionAdapter() {
+			  public void expansionStateChanged(ExpansionEvent e) {
+			   form.reflow(true);
+			  }
+		});
+
+		SashForm sashForm2 = new SashForm(topBottomForm, SWT.NONE);
+		sashForm2.setOrientation(SWT.HORIZONTAL);
+		toolkit.adapt(sashForm);
+		GridLayout sashLayout2 = new GridLayout(2, false);
+		sashForm2.setLayout(sashLayout2);
+		GridData gd5 = new GridData(SWT.FILL, SWT.NONE, true, false);
+		gd5.horizontalSpan = 2;
+		sashForm2.setLayoutData(gd5);
+
+		ExpandableComposite ec3 = toolkit.createExpandableComposite(sashForm2, 
+			     ExpandableComposite.TWISTIE|
+			     ExpandableComposite.CLIENT_INDENT);
+		ec3.setText("Parameters");
+		parmsList = new DelimitedStringList(ec3, SWT.None);
+		ec3.setClient(parmsList);
+		toolkit.adapt(parmsList);
+		GridData gd4 = new GridData(SWT.FILL, SWT.FILL, true, false);
+		 ec3.setLayoutData(gd4);
+		ec3.addExpansionListener(new ExpansionAdapter() {
+			  public void expansionStateChanged(ExpansionEvent e) {
+			   form.reflow(true);
+			  }
+		});
+
+		ExpandableComposite ec4 = toolkit.createExpandableComposite(sashForm2, 
+			     ExpandableComposite.TWISTIE|
+			     ExpandableComposite.CLIENT_INDENT);
+		ec4.setText("Response Body");
+
+		Composite comp2 = toolkit.createComposite(ec4);
+		comp2.setLayout(new GridLayout());
+		
+		Composite comp3 = toolkit.createComposite(comp2);
+		comp3.setLayout(new GridLayout(4, false));
+		comp3.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
+		
+		Button saveBtn = toolkit.createButton(comp3, "Save", SWT.PUSH);
+		saveBtn.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
+		Button editorBtn = toolkit.createButton(comp3, "Open in Editor", SWT.PUSH);
+		editorBtn.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
+		Button rawBtn = toolkit.createButton(comp3, "Show Raw", SWT.PUSH);
+		rawBtn.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
+		Button browserBtn = toolkit.createButton(comp3, "Show in Browser", SWT.PUSH);
+		browserBtn.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_END));
+
+		bodyText = new Text(comp2, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL);
+		GridData gd7 = new GridData(SWT.FILL, SWT.FILL, true, true);
+		bodyText.setLayoutData(gd7);
+		
+		ec4.setClient(comp2);
+		GridData gd6 = new GridData(SWT.FILL, SWT.FILL, true, false);
+		 ec4.setLayoutData(gd6);
+		ec4.addExpansionListener(new ExpansionAdapter() {
+			  public void expansionStateChanged(ExpansionEvent e) {
+			   form.reflow(true);
+			  }
+		});
+
+		SashForm sashForm3 = new SashForm(topBottomForm, SWT.NONE);
+		sashForm3.setOrientation(SWT.HORIZONTAL);
+		toolkit.adapt(sashForm);
+		GridLayout sashLayout3 = new GridLayout(2, false);
+		sashForm3.setLayout(sashLayout3);
+		GridData gd10 = new GridData(SWT.FILL, SWT.NONE, true, false);
+//		gd10.horizontalSpan = 1;
+		sashForm3.setLayoutData(gd10);
+
+		ExpandableComposite ec5 = toolkit.createExpandableComposite(sashForm3, 
+			     ExpandableComposite.TWISTIE|
+			     ExpandableComposite.CLIENT_INDENT);
+		ec5.setText("Body Text");
+		bodyText = toolkit.createText(ec5, "", SWT.BORDER | SWT.WRAP | SWT.V_SCROLL);
+		ec5.setClient(bodyText);
+		GridData gd9 = new GridData(SWT.FILL, SWT.FILL, true, true);
+		 ec5.setLayoutData(gd9);
+		ec5.addExpansionListener(new ExpansionAdapter() {
+			  public void expansionStateChanged(ExpansionEvent e) {
+			   form.reflow(true);
+			  }
+		});
+
+//		Label methodLabel = new Label(topHalf, SWT.NONE);
+//		methodLabel.setText(JBossWSUIMessages.JAXRSWSTestView_HTTP_Method_Label);
+//		methodLabel.setLayoutData(new GridData());
+//
+//		methodCombo = new Combo(topHalf, SWT.DROP_DOWN | SWT.READ_ONLY);
+//		methodCombo.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
+//		methodCombo.add(GET);
+//		methodCombo.add(POST);
+//		methodCombo.add(PUT);
+//		methodCombo.add(DELETE);
+//		methodCombo.setText(GET);
+//		methodCombo.addSelectionListener(new SelectionListener() {
+//			public void widgetDefaultSelected(SelectionEvent e) {
+//				widgetSelected(e);
+//			}
+//			public void widgetSelected(SelectionEvent e) {
+//				setControlsForMethodType(methodCombo.getText());
+//			}
+//		});
+//
+//		Label urlLabel = new Label(topHalf, SWT.NONE);
+//		urlLabel.setText(JBossWSUIMessages.JAXRSWSTestView_Service_URL_Label);
+//		urlLabel.setLayoutData(new GridData());
+//
+//
+//		Label actionLabel = new Label(topHalf, SWT.NONE);
+//		actionLabel.setText(JBossWSUIMessages.JAXRSWSTestView_Action_URL_Label);
+//		actionLabel.setLayoutData(new GridData());
+//
+//		actionText = new Text(topHalf, SWT.BORDER);
+//		actionText.setLayoutData(new GridData(SWT.FILL, SWT.NONE, true, false));
+//
+//		tabGroup = new TabFolder(topHalf, SWT.BORDER);
+//
+//		bodyTab = new TabItem(tabGroup, SWT.NONE, 0);
+//		bodyTab.setText(JBossWSUIMessages.JAXRSWSTestView_Request_Body_Label);
+//
+//		parmsTab = new TabItem(tabGroup, SWT.NONE, 1);
+//		parmsTab.setText(JBossWSUIMessages.JAXRSWSTestView_Request_Parameters_Label);
+//
+//		parmsList = new DelimitedStringList(tabGroup, SWT.None);
+//		parmsTab.setControl(parmsList);
+//		GridData parmsListGD = new GridData(SWT.FILL, SWT.FILL, true, true);
+//		parmsListGD.horizontalSpan = 2;
+//		parmsList.setLayoutData(parmsListGD);
+//
+//		headerTab = new TabItem(tabGroup, SWT.NONE, 2);
+//		bodyText = new Text(tabGroup, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL);
+//		GridData btGridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+//		bodyText.setLayoutData(btGridData);
+//		bodyTab.setControl(bodyText);
+//
+//		headerTab.setText(JBossWSUIMessages.JAXRSWSTestView_Request_Header_Label);
+//		GridData hgGridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+//		hgGridData.horizontalSpan = 2;
+//		tabGroup.setLayoutData(hgGridData);
+//
+//		dlsList = new DelimitedStringList(tabGroup, SWT.None);
+//		headerTab.setControl(dlsList);
+//		GridData dlsListGD = new GridData(SWT.FILL, SWT.FILL, true, true);
+//		dlsListGD.horizontalSpan = 2;
+//		dlsList.setLayoutData(dlsListGD);
+//
+//		Composite buttonBar = new Composite ( topHalf, SWT.NONE);
+//		GridData buttonBarGD = new GridData(SWT.FILL, SWT.NONE, true, false);
+//		buttonBarGD.horizontalSpan = 2;
+//		buttonBar.setLayoutData(buttonBarGD);
+//		buttonBar.setLayout(new RowLayout());
+//
+//		testButton = new Button (buttonBar, SWT.PUSH);
+//		testButton.setText(JBossWSUIMessages.JAXRSWSTestView_Invoke_Label);
+//
+//		testButton.addSelectionListener(new SelectionListener() {
+//			public void widgetSelected(SelectionEvent e) {
+//				handleTest(wsTypeCombo.getText());
+//			}
+//			public void widgetDefaultSelected(SelectionEvent e) {
+//				widgetSelected(e);
+//			}
+//		});
+//
+//		wsdlButton = new Button (buttonBar, SWT.PUSH);
+//		wsdlButton.setText(JBossWSUIMessages.JAXRSWSTestView_Button_Get_From_WSDL);
+//
+//		wsdlButton.addSelectionListener(new SelectionListener() {
+//			public void widgetSelected(SelectionEvent e) {
+//				WSDLBrowseDialog wbDialog =  new WSDLBrowseDialog(getSite().getShell());
+//				int rtnCode = wbDialog.open();
+//				if (rtnCode == Window.OK){
+//					serviceNSMessage = null;
+//					Definition wsdlDef = wbDialog.getWSDLDefinition();
+//					String output = TesterWSDLUtils.getSampleSOAPInputMessage(wsdlDef, 
+//							wbDialog.getServiceTextValue(), 
+//							wbDialog.getPortTextValue(), 
+//							wbDialog.getBindingValue(), 
+//							wbDialog.getOperationTextValue());
+//					String endpointURL = TesterWSDLUtils.getEndpointURL(wsdlDef, 
+//							wbDialog.getServiceTextValue(), 
+//							wbDialog.getPortTextValue(), 
+//							wbDialog.getBindingValue(), 
+//							wbDialog.getOperationTextValue());
+//					String actionURL = TesterWSDLUtils.getActionURL(wsdlDef, 
+//							wbDialog.getServiceTextValue(), 
+//							wbDialog.getPortTextValue(), 
+//							wbDialog.getBindingValue(), 
+//							wbDialog.getOperationTextValue());
+//					serviceNSMessage = TesterWSDLUtils.getNSServiceNameAndMessageNameArray(wsdlDef, 
+//							wbDialog.getServiceTextValue(), 
+//							wbDialog.getPortTextValue(), 
+//							wbDialog.getBindingValue(), 
+//							wbDialog.getOperationTextValue());
+//					String soapIn = generateSampleSOAP(output);
+//					bodyText.setText(soapIn);
+//					urlCombo.setText(endpointURL);
+//					actionText.setText(actionURL);
+//					setControlsForWSType(wsTypeCombo.getText());
+//					setControlsForMethodType(methodCombo.getText());
+//					setControlsForSelectedURL();
+//				}
+//			}
+//			public void widgetDefaultSelected(SelectionEvent e) {
+//				widgetSelected(e);
+//			}
+//		});
+//
+//		addTCPIPMonitorButton = new Button(buttonBar, SWT.PUSH);
+//		addTCPIPMonitorButton.setText(JBossWSUIMessages.JAXRSWSTestView_Configure_Monitor_Button);
+//
+//		addTCPIPMonitorButton.addSelectionListener(new SelectionListener() {
+//			public void widgetSelected(SelectionEvent e) {
+//				configureMonitor();
+//			}
+//			public void widgetDefaultSelected(SelectionEvent e) {
+//				widgetSelected(e);
+//			}
+//		});
+//
+//		openTCPIPMonitorButton = new Button(buttonBar, SWT.PUSH);
+//		openTCPIPMonitorButton.setText(JBossWSUIMessages.JAXRSWSTestView_Open_Monitor_Button);
+//
+//		openTCPIPMonitorButton.addSelectionListener(new SelectionListener() {
+//			public void widgetSelected(SelectionEvent e) {
+//				openMonitor();
+//			}
+//			public void widgetDefaultSelected(SelectionEvent e) {
+//				widgetSelected(e);
+//			}
+//		});
+//
+//		Button sampleButton = new Button(buttonBar, SWT.PUSH);
+//		sampleButton.setText(JBossWSUIMessages.JAXRSWSTestView_Set_Sample_Data_Label);
+//		sampleButton.setVisible(showSampleButton);
+//
+//		sampleButton.addSelectionListener(new SelectionListener() {
+//			public void widgetSelected(SelectionEvent e) {
+//				setupSample();
+//			}
+//			public void widgetDefaultSelected(SelectionEvent e) {
+//				widgetSelected(e);
+//			}
+//		});
+//
+//		Composite bottomHalf = new Composite (sashForm, SWT.NONE);
+//		bottomHalf.setLayout(new GridLayout(2, false));
+//
+//		resultTabGroup = new TabFolder(bottomHalf, SWT.BORDER);
+//		GridData rtGridData = new GridData(SWT.FILL, SWT.FILL, true, true);
+//		rtGridData.horizontalSpan = 2;
+//		resultTabGroup.setLayoutData(rtGridData);
+//
+//		resultTab = new TabItem(resultTabGroup, SWT.NONE, 0);
+//		resultTab.setText(JBossWSUIMessages.JAXRSWSTestView_Results_Body_Label);
+//		resultsText = new Text(resultTabGroup, SWT.BORDER | SWT.V_SCROLL | SWT.WRAP | SWT.READ_ONLY );
+//		resultsText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+//
+//		resultsTextMenu = new Menu(resultsText.getShell(), SWT.POP_UP);
+//		
+//		copyMenuAction = new MenuItem(resultsTextMenu, SWT.PUSH);
+//		copyMenuAction.setText(JBossWSUIMessages.JAXRSWSTestView_CopyResultsMenu);
+//		copyMenuAction.setAccelerator(SWT.CTRL + 'C');
+//		copyMenuAction.addSelectionListener(new SelectionListener(){
+//
+//			public void widgetDefaultSelected(SelectionEvent arg0) {
+//				if (resultsText.getSelectionCount() == 0)
+//					resultsText.selectAll();
+//				resultsText.copy();
+//			}
+//
+//			public void widgetSelected(SelectionEvent arg0) {
+//				widgetDefaultSelected(arg0);
+//			}
+//		});
+//		new MenuItem(resultsTextMenu, SWT.SEPARATOR);
+//		
+//		openInXMLEditorAction = new MenuItem(resultsTextMenu, SWT.PUSH);
+//		openInXMLEditorAction.setText(JBossWSUIMessages.JAXRSWSTestView_Open_Result_in_XML_Editor);
+//		openInXMLEditorAction.setAccelerator(SWT.CTRL + 'O');
+//		openInXMLEditorAction.addSelectionListener(new SelectionListener() {
+//
+//			public void widgetSelected(SelectionEvent arg0) {
+//				String string = resultsText.getText();
+//				openXMLEditor(string);
+//			}
+//
+//			public void widgetDefaultSelected(SelectionEvent arg0) {
+//				widgetSelected(arg0);
+//			}
+//		});
+//
+//		openResponseTagInXMLEditor = new MenuItem(resultsTextMenu, SWT.PUSH);
+//		openResponseTagInXMLEditor.setText(JBossWSUIMessages.JAXRSWSTestView_Open_Response_Tag_Contents_in_XML_Editor);
+//		openResponseTagInXMLEditor.setAccelerator(SWT.CTRL + 'R');
+//		openResponseTagInXMLEditor.addSelectionListener(new SelectionListener() {
+//
+//			public void widgetSelected(SelectionEvent arg0) {
+//				String string = null;
+//				try {
+//					SOAPBody body = null;
+//					if (envelope != null){
+//						body = envelope.getBody();
+//					} else if (soapbody != null) {
+//						body = soapbody;
+//					}
+//
+//					NodeList list = body.getChildNodes();
+//					for (int i = 0; i< list.getLength(); i++){
+//						Node node = list.item(i);
+//						if (node.getNodeName().contains("Response")){ //$NON-NLS-1$
+//							NodeList list2 = node.getChildNodes();
+//							for (int j = 0; j<list2.getLength(); j++){
+//								Node node2 = list2.item(j);
+//								if (node2.getNodeName().contains("Result")){ //$NON-NLS-1$
+//									Node node3 = node2.getChildNodes().item(0);
+//									if (node3.getNodeType() == Node.TEXT_NODE) {
+//										string = node3.getNodeValue();
+//										break;
+//									} else if (node3.getNodeType() == Node.ELEMENT_NODE) {
+//										Element element = (Element) node3;
+//										string = XMLUtils.ElementToString(element);
+//										break;
+//									}
+//								}
+//							}
+//							if (string != null) break;
+//						}
+//					}
+//					if (string != null){
+//						openXMLEditor(string);
+//					}
+//				} catch (SOAPException e) {
+//					JBossWSUIPlugin.log(e);
+//				}
+//			}
+//
+//			public void widgetDefaultSelected(SelectionEvent arg0) {
+//				widgetSelected(arg0);
+//			}
+//		});
+//		
+//		resultsText.setMenu(resultsTextMenu);		
+//
+//		resultTab.setControl(resultsText);
+//		
+//		resultsText.addFocusListener(new FocusListener() {
+//			
+//			public void focusLost(FocusEvent arg0) {
+//			}
+//			
+//			public void focusGained(FocusEvent arg0) {
+//				setMenusForCurrentState();
+//			}
+//		});
+//
+//		resultHeadersTab = new TabItem(resultTabGroup, SWT.NONE, 1);
+//		resultHeadersTab.setText(JBossWSUIMessages.JAXRSWSTestView_Results_Header_Label);
+//		resultHeadersList = new List(resultTabGroup, SWT.V_SCROLL);
+//		resultHeadersTab.setControl(resultHeadersList);
+//		GridData rdlsListGD = new GridData(SWT.FILL, SWT.FILL, true, true);
+//		rdlsListGD.horizontalSpan = 2;
+//		resultHeadersList.setLayoutData(dlsListGD);
+//
+//		resultsHeaderMenu = new Menu(resultHeadersList.getShell(), SWT.POP_UP);
+//		
+//		copyResultHeaderMenuAction = new MenuItem(resultsHeaderMenu, SWT.PUSH);
+//		copyResultHeaderMenuAction.setText(JBossWSUIMessages.JAXRSWSTestView_CopyResultMenu_Text);
+//		copyResultHeaderMenuAction.setAccelerator(SWT.CTRL + 'C');
+//		copyResultHeaderMenuAction.addSelectionListener(new SelectionListener(){
+//
+//			public void widgetDefaultSelected(SelectionEvent arg0) {
+//				if (resultHeadersList.getSelectionCount() == 0)
+//					resultHeadersList.selectAll();
+//				Display display = Display.getDefault();
+//				final Clipboard cb = new Clipboard(display);
+//				TextTransfer textTransfer = TextTransfer.getInstance();
+//		        cb.setContents(resultHeadersList.getSelection() ,
+//		            new Transfer[] { textTransfer });
+//			}
+//
+//			public void widgetSelected(SelectionEvent arg0) {
+//				widgetDefaultSelected(arg0);
+//			}
+//		});
+//		
+//		resultHeadersList.setMenu(resultsHeaderMenu);
+//		
+//		resultHeadersList.addMouseListener(new MouseListener() {
+//			public void mouseDoubleClick(MouseEvent arg0) {
+//			}
+//			public void mouseDown(MouseEvent arg0) {
+//				setMenusForCurrentState();
+//			}
+//			public void mouseUp(MouseEvent arg0) {
+//			}
+//		});
+//
+//		wsTypeCombo.setText(JAX_WS);
+//		setControlsForWSType(wsTypeCombo.getText());
+//		setControlsForMethodType(methodCombo.getText());
+//		setControlsForSelectedURL();
+//		setMenusForCurrentState();
+	}
+	
+	@Override
+	public void dispose() {
+		toolkit.dispose();
+		mImageRegistry.dispose();
+		super.dispose();
+	}
+
+	private String generateSampleSOAP ( String innerText ) {
+		String soapIn = "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\" ?>\n" + //$NON-NLS-1$
+			"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" " + //$NON-NLS-1$
+			"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +  //$NON-NLS-1$
+			"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +  //$NON-NLS-1$
+			">\n" + //$NON-NLS-1$
+			"<soap:Body>\n";//$NON-NLS-1$
+		if (innerText != null)
+			soapIn = soapIn + innerText;
+		soapIn = soapIn +
+			"</soap:Body>\n" + //$NON-NLS-1$
+			"</soap:Envelope>";	 //$NON-NLS-1$
+		return soapIn;
+	}
+	
+	private void setMenusForCurrentState() {
+		if (resultsText!= null && !resultsText.isDisposed()){
+			boolean enabled = resultsText.getText().trim().length() > 0; 
+			copyMenuAction.setEnabled(enabled);
+			openInXMLEditorAction.setEnabled(enabled);
+			if (wsTypeCombo.getText().equalsIgnoreCase(JAX_WS)) {
+				openResponseTagInXMLEditor.setEnabled(enabled);
+			} else if (wsTypeCombo.getText().equalsIgnoreCase(JAX_RS) ){
+				openResponseTagInXMLEditor.setEnabled(false);
+			}
+		}
+		if (resultHeadersList != null && !resultHeadersList.isDisposed()) {
+			boolean enabled = resultHeadersList.getItemCount() > 0;
+			copyResultHeaderMenuAction.setEnabled(enabled);
+		}
+	}
+	
+	private void openXMLEditor (String text){
+		IWorkbenchWindow window = getSite().getWorkbenchWindow();
+		IStorage storage = new ResultsXMLStorage(text);
+		IStorageEditorInput input = new ResultsXMLStorageInput(storage);
+		IWorkbenchPage page = window.getActivePage();
+		if (page != null) {
+			try {
+				if (window.getWorkbench().getEditorRegistry().findEditor(XML_EDITOR_ID) != null) {
+					page.openEditor(input, XML_EDITOR_ID);
+				} else {
+					page.openEditor(input, DEFAULT_TEXT_EDITOR_ID);
+				}
+			} catch (PartInitException e) {
+				JBossWSUIPlugin.log(e);
+			}			
+		}
+	}
+
+	private void setControlsForSelectedURL() {
+		if (urlCombo.getText().trim().length() > 0) {
+			String urlText = urlCombo.getText();
+			try {
+				new URL(urlText);
+				testButton.setEnabled(true);
+				addTCPIPMonitorButton.setEnabled(true);
+			} catch (MalformedURLException mue) {
+				testButton.setEnabled(false);
+				addTCPIPMonitorButton.setEnabled(false);
+
+				return;
+			}
+		} else {
+			testButton.setEnabled(false);
+			addTCPIPMonitorButton.setEnabled(false);
+		}
+	}
+
+	/*
+	 * Open the TCP/IP Monitor View 
+	 */
+	private void openMonitor() {
+		try {
+			PlatformUI.getWorkbench().getActiveWorkbenchWindow().
+			getActivePage().showView(TCPIP_VIEW_ID);
+		} catch (PartInitException e) {
+			JBossWSUIPlugin.log(e);
+		}
+	}
+
+	private IMonitor findMonitor(String urlToCheck) {
+		IMonitor monitor = null;
+
+		IMonitor[] monitors = MonitorCore.getMonitors();
+		if (monitors != null && monitors.length > 0) {
+			for (int i= 0; i < monitors.length; i++) {
+				if (urlToCheck.contains(monitors[i].getRemoteHost())) {
+					monitor = monitors[i];
+					break;
+				}
+			}
+		}
+		return monitor;
+	}
+
+	/*
+	 * Configure a TCP/IP Monitor entry so we can monitor it 
+	 */
+	private void configureMonitor() {
+		if (urlCombo.getText().trim().length() > 0) {
+			String oldUrl = urlCombo.getText();
+			IMonitor monitor = findMonitor(oldUrl);
+			if (monitor == null) {
+
+				URL tempURL = null;
+				try {
+					tempURL = new URL(oldUrl);
+				} catch (MalformedURLException e) {
+					// ignore
+				}
+				AddMonitorDialog dialog = new AddMonitorDialog(getSite().getShell());
+				if (tempURL != null) {
+					dialog.getMonitor().setRemoteHost(tempURL.getHost());
+					if (tempURL.getPort() > 0) 
+						dialog.getMonitor().setRemotePort(tempURL.getPort());
+				}
+				if (dialog.open() == Window.CANCEL)
+					return;
+				monitor = dialog.getMonitor();
+			}
+
+			if (monitor != null) {
+				monitor = findMonitor(oldUrl);
+				if (monitor != null) {
+					if (!monitor.isRunning()) {
+						try {
+							monitor.start();
+							int port = monitor.getLocalPort();
+							int remotePort = monitor.getRemotePort();
+							String host = monitor.getRemoteHost();
+							String newUrl = null;
+							if (oldUrl.contains(host + ':' + remotePort)) {
+								newUrl = oldUrl.replace(host + ':' + remotePort, "localhost:" + port); //$NON-NLS-1$
+							} else if (oldUrl.contains(host + ':' + port)) {
+								// do nothing - host/port combo is already correct
+								newUrl = oldUrl;
+							} else {
+								newUrl = oldUrl.replace(host, "localhost:" + port); //$NON-NLS-1$
+							}
+							urlCombo.setText(newUrl);
+						} catch (CoreException e) {
+							// if we hit an error, open a dialog
+							ErrorDialog dialog = new ErrorDialog(this.getSite().getShell(), 
+									JBossWSUIMessages.JAXRSWSTestView_Error_Title_Starting_Monitor,
+									JBossWSUIMessages.JAXRSWSTestView_Error_Msg_Starting_Monitor,
+									new Status(IStatus.ERROR, JBossWSUIPlugin.PLUGIN_ID, 
+									e.getLocalizedMessage(), e), IStatus.ERROR);
+							dialog.open();
+						}
+					}
+				}
+			}
+		}		
+	}
+
+	/*
+	 * Enable/disable controls based on the WS technology type
+	 * and the method.
+	 * 
+	 * @param methodType
+	 */
+	private void setControlsForMethodType ( String methodType ) {
+		if (wsTypeCombo.getText().equalsIgnoreCase(JAX_RS) &&
+				methodType.equalsIgnoreCase(GET)) {
+			bodyText.setEnabled(false);
+		} else {
+			bodyText.setEnabled(true);
+		}
+	}
+
+	/*
+	 * Enable/disable controls based on the WS technology type
+	 * @param wsType
+	 */
+	private void setControlsForWSType ( String wsType ) {
+		if (wsType.equalsIgnoreCase(JAX_WS)) {
+			actionText.setEnabled(true);
+			bodyText.setEnabled(true);
+			methodCombo.setEnabled(false);
+			parmsList.setEnabled(false);
+			parmsList.removeAll();
+			dlsList.setEnabled(false);
+			parmsTab.getControl().setEnabled(false);
+			headerTab.getControl().setEnabled(true);
+			methodCombo.setText(POST);
+
+			String emptySOAP = "<?xml version=\"1.0\" standalone=\"yes\" ?>" + //$NON-NLS-1$
+			"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" " + //$NON-NLS-1$
+			"xmlns:ns=\"INSERT_URL_HERE\">" + //$NON-NLS-1$
+			"<soap:Body>" + //$NON-NLS-1$
+			"</soap:Body>" + //$NON-NLS-1$
+			"</soap:Envelope>";	 //$NON-NLS-1$
+			emptySOAP = WSTestUtils.addNLsToXML(emptySOAP);
+
+			if (bodyText.getText().trim().length() == 0) {
+				bodyText.setText(emptySOAP);
+			}
+			wsdlButton.setEnabled(true);
+		}
+		else if (wsType.equalsIgnoreCase(JAX_RS)) {
+			actionText.setEnabled(false);
+			bodyText.setEnabled(true);
+			methodCombo.setEnabled(true);
+			parmsList.setEnabled(true);
+			dlsList.setEnabled(true);
+			parmsTab.getControl().setEnabled(true);
+			headerTab.getControl().setEnabled(true);
+			methodCombo.setText(GET);
+			wsdlButton.setEnabled(false);
+
+			if (bodyText.getText().trim().length() > 0) {
+				bodyText.setText(""); //$NON-NLS-1$
+			}
+		}
+		setMenusForCurrentState();
+	}
+
+	/*
+	 * Sets up the controls to call a public sample RESTful WS that does
+	 * a postal code lookup or a JAX-WS service that does a 
+	 * Shakespeare lookup. 
+	 */
+	private void setupSample() {
+		// go to http://www.geonames.org/export/web-services.html for example
+		//http://ws.geonames.org/postalCodeSearch?postalcode=9011&maxRows=10
+		if (wsTypeCombo.getText().equalsIgnoreCase(JAX_RS)) {
+			urlCombo.setText("http://ws.geonames.org/postalCodeSearch?"); //$NON-NLS-1$
+			parmsList.setSelection("postalcode=80920,maxRows=10"); //$NON-NLS-1$
+			dlsList.setSelection("content-type=application/xml"); //$NON-NLS-1$
+			methodCombo.setText(GET);
+			tabGroup.setSelection(parmsTab);
+			bodyText.setText(EMPTY_STRING);
+		}
+		else if (wsTypeCombo.getText().equalsIgnoreCase(JAX_WS)) {
+			String soapIn = "<?xml version=\"1.0\" standalone=\"yes\" ?>" + //$NON-NLS-1$
+			"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" " + //$NON-NLS-1$
+			"xmlns:ns=\"http://xmlme.com/WebServices\">" + //$NON-NLS-1$
+			"<soap:Body>" + //$NON-NLS-1$
+			"<ns:GetSpeech>" + //$NON-NLS-1$
+			"<ns:Request>slings and arrows</ns:Request>"+ //$NON-NLS-1$
+			"</ns:GetSpeech>"+ //$NON-NLS-1$
+			"</soap:Body>" + //$NON-NLS-1$
+			"</soap:Envelope>";	 //$NON-NLS-1$
+			soapIn = WSTestUtils.addNLsToXML(soapIn);
+
+			urlCombo.setText("http://www.xmlme.com/WSShakespeare.asmx"); //$NON-NLS-1$
+			actionText.setText("http://xmlme.com/WebServices/GetSpeech"); //$NON-NLS-1$
+			bodyText.setText(soapIn);
+			parmsList.setSelection(EMPTY_STRING);
+			dlsList.setSelection(EMPTY_STRING);
+			tabGroup.setSelection(bodyTab);
+		}
+		setControlsForWSType(wsTypeCombo.getText());
+		setControlsForMethodType(methodCombo.getText());
+		setControlsForSelectedURL();
+	}
+
+	/*
+	 * Actually perform the test based on which type of activity it is 
+	 */
+	private void handleTest(final String wsTech) {
+
+		String urlText = urlCombo.getText();
+		try {
+			new URL(urlText);
+		} catch (MalformedURLException mue) {
+			// do nothing, but return since we don't have a working URL
+			return;
+		}
+		
+		if (urlCombo.getItemCount() > 0) {
+			java.util.List<String> aList = Arrays.asList(urlCombo.getItems());
+			if (!aList.contains(urlCombo.getText())) {
+				urlCombo.add(urlCombo.getText());
+			}
+		} else {
+			urlCombo.add(urlCombo.getText());
+		}
+
+		final String url = urlCombo.getText();
+		final String action = actionText.getText();
+		final String body = bodyText.getText();
+		final String method = methodCombo.getText();
+		final String headers = dlsList.getSelection();
+		final String parms = parmsList.getSelection();
+
+		Job aJob = new Job(JBossWSUIMessages.JAXRSWSTestView_Invoking_WS_Status) {
+			protected IStatus run(IProgressMonitor monitor) {
+				IStatus status = Status.OK_STATUS;
+				// execute the task ...
+				if (wsTech.equalsIgnoreCase(JAX_RS)) {
+					status = handleRSTest(monitor, url, method, body, parms, headers);
+				}
+				else if (wsTech.equalsIgnoreCase(JAX_WS)) {
+					status = handleWSTest(monitor, url, action, body);
+				}
+				monitor.done();
+				return status;  
+			}
+		};
+		// true to indicate that this job was initiated by a UI end user
+		aJob.setUser(true);		
+		aJob.addJobChangeListener(new IJobChangeListener() {
+
+			public void sleeping(IJobChangeEvent event) {};
+			public void scheduled(IJobChangeEvent event) {};
+			public void running(IJobChangeEvent event) {};
+			public void done(final IJobChangeEvent event) {
+				if (event.getResult() instanceof WSTestStatus) {
+					final WSTestStatus status = (WSTestStatus) event.getResult();
+					PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+						public void run() {
+							if (status.getResultsText() != null)
+								resultsText.setText(status.getResultsText());
+							else if (status.getMessage() != null) 
+								resultsText.setText(status.getMessage());
+							resultHeadersList.removeAll();
+							String[] headers =
+								DelimitedStringList.parseString(status.getHeadersList(), RESULT_HEADER_DELIMITER);
+							if (headers != null && headers.length > 0) {
+								for (int i = 0; i < headers.length; i++) { 
+									resultHeadersList.add(headers[i]);
+								}
+							}
+						}
+					});
+				}
+			}
+
+			public void awake(IJobChangeEvent event) {};
+			public void aboutToRun(IJobChangeEvent event) {};
+		});
+		aJob.schedule();
+
+		setMenusForCurrentState();
+	}
+
+	/*
+	 * Actually call the WS and displays the result 
+	 */
+	private IStatus handleWSTest(final IProgressMonitor monitor, String url, String action, String body) {
+		try {
+
+			envelope = null;
+			soapbody = null;
+			monitor.worked(10);
+//			JAXWSTester tester = new JAXWSTester();
+//			tester.doTest(url, action, body);
+			JAXWSTester2 tester = new JAXWSTester2();
+			boolean itRan = false;
+			while (!monitor.isCanceled()) {
+				try {
+					if (!itRan && serviceNSMessage != null && serviceNSMessage.length == 3) { 
+						itRan = true;
+						// 	call the service
+						tester.doTest(monitor, url, action, serviceNSMessage[0], serviceNSMessage[1], serviceNSMessage[2], body);
+					} else {
+						break;
+					}
+				} catch (InterruptedException ie) {
+					monitor.setCanceled(true);
+				}
+			}
+			if (monitor.isCanceled()) {
+				WSTestStatus status = new WSTestStatus(IStatus.OK, 
+						JBossWSUIPlugin.PLUGIN_ID, 
+						JBossWSUIMessages.JAXRSWSTestView_Message_Service_Invocation_Cancelled);
+				return status;
+			}
+			if (!itRan) {
+				WSTestStatus status = new WSTestStatus(IStatus.OK, 
+						JBossWSUIPlugin.PLUGIN_ID, 
+						JBossWSUIMessages.JAXRSWSTestView_Message_Unsuccessful_Test);
+				return status;
+			}
+//			tester.doTest(url, action, serviceNSMessage[0], serviceNSMessage[1], serviceNSMessage[2], body);
+			monitor.worked(70);
+			String result = tester.getResultBody();
+			envelope = tester.getResultSOAP();
+			soapbody = tester.getResultSOAPBody();
+			String cleanedUp = WSTestUtils.addNLsToXML(result);
+
+			WSTestStatus status = new WSTestStatus(IStatus.OK, 
+					JBossWSUIPlugin.PLUGIN_ID, 
+					JBossWSUIMessages.JAXRSWSTestView_JAXWS_Success_Status);
+			status.setResultsText(cleanedUp);
+			monitor.worked(10);
+
+			String listText = EMPTY_STRING;
+			if (tester.getResultHeaders() != null) {
+				Iterator<?> iter = tester.getResultHeaders().entrySet().iterator();
+				while (iter.hasNext()) {
+					String text = EMPTY_STRING;
+					Entry<?, ?> entry = (Entry<?, ?>) iter.next();
+					if (entry.getKey() == null) 
+						text = entry.getValue().toString();
+					else
+						text = text + entry.toString();
+					listText = listText + text;
+					if (iter.hasNext()) {
+						listText = listText + RESULT_HEADER_DELIMITER;
+					}
+				}
+			}
+			status.setHeadersList(listText);
+			monitor.worked(10);
+			return status;
+		} catch (Exception e) {
+			WSTestStatus status = new WSTestStatus(IStatus.OK, 
+					JBossWSUIPlugin.PLUGIN_ID, 
+					JBossWSUIMessages.JAXRSWSTestView_Exception_Status + e.getLocalizedMessage());
+			status.setResultsText(e.toString());
+			JBossWSUIPlugin.log(e);
+			return status;
+		}
+	}
+
+	/*
+	 * Actually call the RESTful WS to test it
+	 */
+	private IStatus handleRSTest(final IProgressMonitor monitor, String address, String method, String body, String parms, String headersStr) {
+
+		if (method.equalsIgnoreCase(GET))
+			body = EMPTY_STRING;
+
+		// if no actual text in the request body, set to null
+		if (body.trim().length() == 0) body = null;
+
+		monitor.worked(10);
+
+		// Process parameters for web service call
+		HashMap<String, String> parameters = new HashMap<String, String>();
+		if (parms != null && parms.length() > 0) {
+			String[] parsedList = DelimitedStringList.parseString(parms , ","); //$NON-NLS-1$
+			if (parsedList != null && parsedList.length > 0) {
+				for (int i = 0; i < parsedList.length; i++) {
+					String nameValuePair = parsedList[i];
+					String[] nameAndValue = DelimitedStringList.parseString(nameValuePair, "="); //$NON-NLS-1$
+					if (nameAndValue != null && nameAndValue.length == 2) {
+						parameters.put(nameAndValue[0], nameAndValue[1]);
+					}
+				}
+			}
+		}
+
+		monitor.worked(10);
+		// Process headers for web service call
+		HashMap<String, String> headers = new HashMap<String, String>();
+		if (headersStr != null && headersStr.length() > 0) {
+			String[] parsedList = DelimitedStringList.parseString(headersStr , ","); //$NON-NLS-1$
+			if (parsedList != null && parsedList.length > 0) {
+				for (int i = 0; i < parsedList.length; i++) {
+					String nameValuePair = parsedList[i];
+					String[] nameAndValue = DelimitedStringList.parseString(nameValuePair, "="); //$NON-NLS-1$
+					if (nameAndValue != null && nameAndValue.length == 2) {
+						headers.put(nameAndValue[0], nameAndValue[1]);
+					}
+				}
+			}
+		}
+
+		JAXRSTester tester = new JAXRSTester();
+
+		// now actually call it
+		try {
+
+			// call the service
+			tester.doTest(address, parameters, headers, method, body);
+
+			String result = tester.getResultBody();
+
+			// put the results in the result text field
+			String cleanedUp = WSTestUtils.addNLsToXML(result);
+
+			WSTestStatus status = new WSTestStatus(IStatus.OK, 
+					JBossWSUIPlugin.PLUGIN_ID, 
+					JBossWSUIMessages.JAXRSWSTestView_JAXRS_Success_Status);
+			status.setResultsText(cleanedUp);
+
+			String listText = EMPTY_STRING;
+			if (tester.getResultHeaders() != null) {
+				Iterator<?> iter = tester.getResultHeaders().entrySet().iterator();
+				while (iter.hasNext()) {
+					String text = EMPTY_STRING;
+					Entry<?, ?> entry = (Entry<?, ?>) iter.next();
+					if (entry.getKey() == null) 
+						text = entry.getValue().toString();
+					else
+						text = text + entry.toString();
+					listText = listText + text;
+					if (iter.hasNext()) {
+						listText = listText + RESULT_HEADER_DELIMITER;
+					}
+				}
+			}
+
+			status.setHeadersList(listText);
+			monitor.worked(10);
+			return status;
+
+		} catch (Exception e) {
+			String result = tester.getResultBody();
+
+			// put the results in the result text field
+			String cleanedUp = WSTestUtils.addNLsToXML(result);
+
+			WSTestStatus status = new WSTestStatus(IStatus.OK, 
+					JBossWSUIPlugin.PLUGIN_ID, 
+					JBossWSUIMessages.JAXRSWSTestView_JAXRS_Success_Status);
+			status.setResultsText(cleanedUp);
+
+			String listText = EMPTY_STRING;
+			if (tester.getResultHeaders() != null) {
+				Iterator<?> iter = tester.getResultHeaders().entrySet().iterator();
+				while (iter.hasNext()) {
+					String text = EMPTY_STRING;
+					Entry<?, ?> entry = (Entry<?, ?>) iter.next();
+					if (entry.getKey() == null) 
+						text = entry.getValue().toString();
+					else
+						text = text + entry.toString();
+					listText = listText + text;
+					if (iter.hasNext()) {
+						listText = listText + RESULT_HEADER_DELIMITER;
+					}
+				}
+			}
+
+			status.setHeadersList(listText);
+			monitor.worked(10);
+			return status;
+		}
+	}
+
+	/**
+	 * Passing the focus request to the control.
+	 */
+	public void setFocus() {
+		// set initial focus to the URL text combo
+//		urlCombo.setFocus();
+		form.setFocus();
+	}
+
+}
\ No newline at end of file
Index: plugin.xml
===================================================================
--- plugin.xml	(revision 23325)
+++ plugin.xml	(working copy)
@@ -74,7 +74,7 @@
       </category>
       <view
             category="org.jboss.tools.ws.ui.tester"
-            class="org.jboss.tools.ws.ui.views.JAXRSWSTestView"
+            class="org.jboss.tools.ws.ui.views.JAXRSWSTestView2"
             icon="icons/obj16/ws_tester.gif"
             id="org.jboss.tools.ws.ui.tester.views.TestWSView"
             name="%test.view.name">
Index: META-INF/MANIFEST.MF
===================================================================
--- META-INF/MANIFEST.MF	(revision 23325)
+++ META-INF/MANIFEST.MF	(working copy)
@@ -30,7 +30,8 @@
  org.eclipse.wst.internet.monitor.ui,
  javax.wsdl;bundle-version="1.6.2",
  org.jdom,
- javax.xml.ws
+ javax.xml.ws,
+ org.eclipse.ui.forms
 Bundle-ActivationPolicy: lazy
 Export-Package: org.jboss.tools.ws.ui,
  org.jboss.tools.ws.ui.messages,
Index: src/org/jboss/tools/ws/ui/messages/JBossWSUI.properties
===================================================================
--- src/org/jboss/tools/ws/ui/messages/JBossWSUI.properties	(revision 23325)
+++ src/org/jboss/tools/ws/ui/messages/JBossWSUI.properties	(working copy)
@@ -105,6 +105,20 @@
 JAXRSWSTestView_Service_URL_Label=Service URL:
 JAXRSWSTestView_Set_Sample_Data_Label=Set Sample Data
 JAXRSWSTestView_Web_Service_Type_Label=Web Service Type:
+JAXRSWSTestView2_BodyText_Section=Body Text
+JAXRSWSTestView2_GetFromWSDL_Tooltip=Get from WSDL
+JAXRSWSTestView2_Go_Tooltip=Invoke
+JAXRSWSTestView2_Headers_Section=Headers
+JAXRSWSTestView2_OpenInEditor_Action=Open in Editor
+JAXRSWSTestView2_Parameters_Section=Parameters
+JAXRSWSTestView2_RequestDetails_Section=Request Details
+JAXRSWSTestView2_ResponseBody_Section=Response Body
+JAXRSWSTestView2_ResponseDetails_Section=Response Details
+JAXRSWSTestView2_ResponseHeaders_Section=Response Headers
+JAXRSWSTestView2_SaveResponseText_Error=Error Writing Response to File
+JAXRSWSTestView2_SaveResponseText_tooltip=Save to File
+JAXRSWSTestView2_ShowInBrowser_Tooltip=Show in Browser
+JAXRSWSTestView2_ShowRaw_Tooltip=Show Raw
 ResultsXMLStorageInput_WS_Invocation_Results_Prefix=Web Service Invocation Results\: 
 WSDLBrowseDialog_Dialog_Title=Select WSDL
 WSDLBrowseDialog_FS_Browse=File system...
@@ -124,6 +138,8 @@
 WSDLBrowseDialog_WSDL_URI_Field=WSDL URI:
 WSDLBrowseDialog_WSDL_URL_Dialog_Title=WSDL URL
 WSDLBrowseDialog_WSDL_URL_Prompt=Type the URL for the WSDL:
+WSTestUtils_SaveResponseText_Error_Msg=Error encountered writing response text to file.
+WSTestUtils_SaveResponseText_Title=Save Response Text
 DelimitedStringList_Msg_No_Btn=No
 DelimitedStringList_Msg_Text_ParseByAmpersand=Should we parse the string to be added by ampersands '&&' and add each individual string?
 DelimitedStringList_Msg_Text_ParseByComma=Should we parse the string to be added by commas ',' and add each individual string?
Index: src/org/jboss/tools/ws/ui/messages/JBossWSUIMessages.java
===================================================================
--- src/org/jboss/tools/ws/ui/messages/JBossWSUIMessages.java	(revision 23325)
+++ src/org/jboss/tools/ws/ui/messages/JBossWSUIMessages.java	(working copy)
@@ -136,6 +136,20 @@
 	public static String JAXRSWSTestView_Service_URL_Label;
 	public static String JAXRSWSTestView_Set_Sample_Data_Label;
 	public static String JAXRSWSTestView_Web_Service_Type_Label;
+	public static String JAXRSWSTestView2_BodyText_Section;
+	public static String JAXRSWSTestView2_GetFromWSDL_Tooltip;
+	public static String JAXRSWSTestView2_Go_Tooltip;
+	public static String JAXRSWSTestView2_Headers_Section;
+	public static String JAXRSWSTestView2_OpenInEditor_Action;
+	public static String JAXRSWSTestView2_Parameters_Section;
+	public static String JAXRSWSTestView2_RequestDetails_Section;
+	public static String JAXRSWSTestView2_ResponseBody_Section;
+	public static String JAXRSWSTestView2_ResponseDetails_Section;
+	public static String JAXRSWSTestView2_ResponseHeaders_Section;
+	public static String JAXRSWSTestView2_SaveResponseText_Error;
+	public static String JAXRSWSTestView2_SaveResponseText_tooltip;
+	public static String JAXRSWSTestView2_ShowInBrowser_Tooltip;
+	public static String JAXRSWSTestView2_ShowRaw_Tooltip;
 	public static String ResultsXMLStorageInput_WS_Invocation_Results_Prefix;
 
 	public static String WSDLBrowseDialog_Dialog_Title;
@@ -157,6 +171,9 @@
 	public static String WSDLBrowseDialog_WSDL_URL_Dialog_Title;
 	public static String WSDLBrowseDialog_WSDL_URL_Prompt;
 
+	public static String WSTestUtils_SaveResponseText_Error_Msg;
+	public static String WSTestUtils_SaveResponseText_Title;
+
 	static {
 		NLS.initializeMessages(BUNDLE_NAME, JBossWSUIMessages.class);
 	}
Index: src/org/jboss/tools/ws/ui/utils/JAXWSTester2.java
===================================================================
--- src/org/jboss/tools/ws/ui/utils/JAXWSTester2.java	(revision 23325)
+++ src/org/jboss/tools/ws/ui/utils/JAXWSTester2.java	(working copy)
@@ -120,8 +120,9 @@
 				this.resultBody = baos.toString();
 				this.resultSOAPBody = o.getSOAPBody();
 				
-				if (d.getResponseContext() != null) {
-					Object responseHeaders = d.getResponseContext().get(MessageContext.HTTP_RESPONSE_HEADERS);
+				if (response.getContext() != null) {
+					Object responseHeaders =
+						response.getContext().get(MessageContext.HTTP_RESPONSE_HEADERS);
 					if ( responseHeaders != null && responseHeaders instanceof Map) {
 						this.resultHeaders = (Map<String, String>) responseHeaders;
 					}
Index: src/org/jboss/tools/ws/ui/utils/WSTestUtils.java
===================================================================
--- src/org/jboss/tools/ws/ui/utils/WSTestUtils.java	(revision 23325)
+++ src/org/jboss/tools/ws/ui/utils/WSTestUtils.java	(working copy)
@@ -10,6 +10,25 @@
  ******************************************************************************/
 package org.jboss.tools.ws.ui.utils;
 
+import java.io.ByteArrayInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Shell;
+import org.jboss.tools.ws.ui.JBossWSUIPlugin;
+import org.jboss.tools.ws.ui.messages.JBossWSUIMessages;
+import org.xml.sax.SAXException;
+
 /**
  * Static utility methods for testing JAX-RS and JAX-WS web services
  * @author bfitzpat
@@ -36,4 +55,64 @@
 		}
 		return outgoing;
 	}
+
+	public static IStatus saveTextToFile ( String text ) {
+		FileDialog fd = new FileDialog(new Shell(Display.getCurrent()), SWT.SAVE);
+		fd.setText(JBossWSUIMessages.WSTestUtils_SaveResponseText_Title);
+		String[] filterExt = { "*.txt", "*.xml"}; //$NON-NLS-1$ //$NON-NLS-2$
+		fd.setFilterExtensions(filterExt);
+		String selected = fd.open();
+		if (selected != null) {
+			FileOutputStream out;
+			PrintStream p;
+
+			try
+			{
+				// Create a new file output stream for the file
+				out = new FileOutputStream(selected);
+
+				// Connect print stream to the output stream
+				p = new PrintStream( out );
+
+				// print to it and close
+				p.println (text);
+				p.close();
+
+				return Status.OK_STATUS;
+			}
+			catch (Exception e)
+			{
+				Status rtnStatus = new Status(IStatus.ERROR, 
+						JBossWSUIPlugin.PLUGIN_ID,
+						JBossWSUIMessages.WSTestUtils_SaveResponseText_Error_Msg,
+						e);
+				return rtnStatus;
+			}
+		}
+		return Status.CANCEL_STATUS;
+	}
+	
+	public static boolean isTextXML ( String text ) {
+		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+		dbf.setValidating(false);
+		try {
+			//Using factory get an instance of document builder
+			DocumentBuilder db = dbf.newDocumentBuilder();
+			
+			ByteArrayInputStream bais = new ByteArrayInputStream(text.getBytes());
+			
+			//parse using builder to get DOM representation of the XML file
+			db.parse(bais);
+			
+			return true;
+
+		}catch(ParserConfigurationException pce) {
+			// ignore
+		}catch(SAXException se) {
+			// ignore
+		} catch (IOException e) {
+			// ignore
+		}
+		return false;
+	}
 }
Index: src/org/jboss/tools/ws/ui/views/DelimitedStringList.java
===================================================================
--- src/org/jboss/tools/ws/ui/views/DelimitedStringList.java	(revision 23325)
+++ src/org/jboss/tools/ws/ui/views/DelimitedStringList.java	(working copy)
@@ -116,6 +116,7 @@
 			wlGridData.horizontalSpan = 2;
 			this.mWarningLabel.setLayoutData(wlGridData);
 			this.mWarningLabel.setForeground(this.mWarningLabel.getDisplay().getSystemColor(SWT.COLOR_RED));
+			this.mWarningLabel.setBackground(parent.getBackground());
 		}
 		{
 			this.mAddText = new Text(this, SWT.BORDER | additionalStyles);
@@ -144,6 +145,7 @@
 			gridData.horizontalSpan = 2;
 			mSpacerComposite.setLayoutData(gridData);
 			mSpacerComposite.setLayout(new GridLayout());
+			mSpacerComposite.setBackground(parent.getBackground());
 		}
 		{
 			this.mPropsList = new List(this, SWT.BORDER | SWT.V_SCROLL);
Index: src/org/jboss/tools/ws/ui/views/JAXRSWSTestView2.java
===================================================================
--- src/org/jboss/tools/ws/ui/views/JAXRSWSTestView2.java	(revision 0)
+++ src/org/jboss/tools/ws/ui/views/JAXRSWSTestView2.java	(revision 0)
@@ -0,0 +1,1134 @@
+/******************************************************************************* 
+ * Copyright (c) 2010 Red Hat, Inc. 
+ * Distributed under license by Red Hat, Inc. All rights reserved. 
+ * This program is 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: 
+ * Red Hat, Inc. - initial API and implementation 
+ ******************************************************************************/
+package org.jboss.tools.ws.ui.views;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map.Entry;
+
+import javax.wsdl.Definition;
+import javax.xml.soap.SOAPBody;
+import javax.xml.soap.SOAPEnvelope;
+import javax.xml.soap.SOAPException;
+
+import org.apache.axis.utils.XMLUtils;
+import org.eclipse.core.resources.IStorage;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.IJobChangeListener;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.browser.Browser;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.dnd.Clipboard;
+import org.eclipse.swt.dnd.TextTransfer;
+import org.eclipse.swt.dnd.Transfer;
+import org.eclipse.swt.events.FocusEvent;
+import org.eclipse.swt.events.FocusListener;
+import org.eclipse.swt.events.KeyEvent;
+import org.eclipse.swt.events.KeyListener;
+import org.eclipse.swt.events.MouseEvent;
+import org.eclipse.swt.events.MouseListener;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.FillLayout;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.CoolBar;
+import org.eclipse.swt.widgets.CoolItem;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.List;
+import org.eclipse.swt.widgets.Listener;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.ToolBar;
+import org.eclipse.swt.widgets.ToolItem;
+import org.eclipse.ui.IStorageEditorInput;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.events.ExpansionAdapter;
+import org.eclipse.ui.forms.events.ExpansionEvent;
+import org.eclipse.ui.forms.widgets.ExpandableComposite;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.ScrolledPageBook;
+import org.eclipse.ui.forms.widgets.Section;
+import org.eclipse.ui.part.ViewPart;
+import org.jboss.tools.ws.ui.JBossWSUIPlugin;
+import org.jboss.tools.ws.ui.messages.JBossWSUIMessages;
+import org.jboss.tools.ws.ui.utils.JAXRSTester;
+import org.jboss.tools.ws.ui.utils.JAXWSTester2;
+import org.jboss.tools.ws.ui.utils.ResultsXMLStorage;
+import org.jboss.tools.ws.ui.utils.ResultsXMLStorageInput;
+import org.jboss.tools.ws.ui.utils.TesterWSDLUtils;
+import org.jboss.tools.ws.ui.utils.WSTestUtils;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * View for testing web services (JAX-WS & JAX-RS)
+ * @author bfitzpat
+ *
+ */
+public class JAXRSWSTestView2 extends ViewPart {
+
+	private static final String PAGE1_KEY = "page1"; //$NON-NLS-1$
+	private static final String PAGE2_KEY = "page2"; //$NON-NLS-1$
+	private static final String DEFAULT_TEXT_EDITOR_ID = "org.eclipse.ui.DefaultTextEditor"; //$NON-NLS-1$
+	private static final String XML_EDITOR_ID = "org.eclipse.wst.xml.ui.internal.tabletree.XMLMultiPageEditorPart"; //$NON-NLS-1$
+	private static final String DELETE = "DELETE";//$NON-NLS-1$
+	private static final String PUT = "PUT";//$NON-NLS-1$
+	private static final String POST = "POST";//$NON-NLS-1$
+	private static final String GET = "GET";//$NON-NLS-1$
+	private static final String JAX_WS = "JAX-WS"; //$NON-NLS-1$
+	private static final String JAX_RS = "JAX-RS"; //$NON-NLS-1$
+	private static final String EMPTY_STRING = ""; //$NON-NLS-1$
+	private static final String RESULT_HEADER_DELIMITER = "%";//$NON-NLS-1$
+
+	/**
+	 * The ID of the view as specified by the extension.
+	 */
+	public static final String ID = "org.jboss.tools.ws.ui.tester.views.TestWSView";//$NON-NLS-1$
+
+	/* UI controls */
+	private Text resultsText;
+	private Browser resultsBrowser;
+	private Combo urlCombo;
+	private DelimitedStringList dlsList;
+	private Combo methodCombo;
+	private Text bodyText;
+	private List resultHeadersList;
+
+	private DelimitedStringList parmsList;
+
+	private SOAPEnvelope envelope;
+	private SOAPBody soapbody;
+	private MenuItem openInXMLEditorAction;
+	private MenuItem openResponseTagInXMLEditor;
+	private Menu resultsTextMenu;
+	private MenuItem copyMenuAction;
+	private Menu resultsHeaderMenu;
+	private MenuItem copyResultHeaderMenuAction;
+	
+	private String[] serviceNSMessage = null;
+	private String actionText = null;
+	
+	private FormToolkit toolkit;
+	private ScrolledForm form;
+	private ImageRegistry mImageRegistry;
+
+	private static final String IMG_DESC_WSDL = "icons/obj16/wsdl.gif"; //$NON-NLS-1$
+	private static final String IMG_DESC_START = "icons/obj16/run.gif"; //$NON-NLS-1$
+	
+	private static final String IMG_DESC_SHOWRAW = "icons/obj16/binary.gif"; //$NON-NLS-1$
+	private static final String IMG_DESC_SHOWWEB = "icons/obj16/web.gif"; //$NON-NLS-1$
+	private static final String IMG_DESC_SHOWEDITOR = "icons/obj16/properties.gif"; //$NON-NLS-1$
+	private static final String IMG_DESC_SAVE = "icons/obj16/save_edit.gif"; //$NON-NLS-1$
+
+	private ToolItem openWSDLToolItem;
+	private ToolItem startToolItem;
+	private ScrolledPageBook pageBook;
+	private ShowRawAction rawAction;
+	private ShowInBrowserAction browserAction;
+	private FormExpansionAdapter expansionListener;
+	
+	/**
+	 * The constructor.
+	 */
+	public JAXRSWSTestView2() {
+	}
+
+	private void getImages() {
+		mImageRegistry = new ImageRegistry();
+		mImageRegistry.put(IMG_DESC_WSDL, ImageDescriptor
+				.createFromURL(JBossWSUIPlugin.getDefault().getBundle()
+						.getEntry(IMG_DESC_WSDL)));
+		mImageRegistry.put(IMG_DESC_START, ImageDescriptor
+				.createFromURL(JBossWSUIPlugin.getDefault().getBundle()
+						.getEntry(IMG_DESC_START)));
+		mImageRegistry.put(IMG_DESC_SHOWRAW, ImageDescriptor
+				.createFromURL(JBossWSUIPlugin.getDefault().getBundle()
+						.getEntry(IMG_DESC_SHOWRAW)));
+		mImageRegistry.put(IMG_DESC_SHOWWEB, ImageDescriptor
+				.createFromURL(JBossWSUIPlugin.getDefault().getBundle()
+						.getEntry(IMG_DESC_SHOWWEB)));
+		mImageRegistry.put(IMG_DESC_SHOWEDITOR, ImageDescriptor
+				.createFromURL(JBossWSUIPlugin.getDefault().getBundle()
+						.getEntry(IMG_DESC_SHOWEDITOR)));
+		mImageRegistry.put(IMG_DESC_SAVE, ImageDescriptor
+				.createFromURL(JBossWSUIPlugin.getDefault().getBundle()
+						.getEntry(IMG_DESC_SAVE)));
+	}
+	
+	private void createResponseToolbar ( ExpandableComposite parent ) {
+		
+		// create a couple of actions for toggling views
+		rawAction = new ShowRawAction();
+		rawAction.setChecked(true);
+		browserAction = new ShowInBrowserAction();
+		
+		ToolBarManager toolBarManager = new ToolBarManager(SWT.FLAT);
+		ToolBar toolbar = toolBarManager.createControl(parent);
+		
+		toolBarManager.add(new FileSaveAction());
+		toolBarManager.add(new OpenInXMLEditorAction());
+		toolBarManager.add(rawAction);
+		toolBarManager.add(browserAction);
+
+		toolBarManager.update(true);
+		
+		parent.setTextClient(toolbar);
+	}
+	
+	class FormExpansionAdapter extends ExpansionAdapter {
+		public void expansionStateChanged(ExpansionEvent e) {
+			form.reflow(true);
+		}
+	}
+	
+	class OpenInXMLEditorAction extends Action {
+		@Override
+		public void run() {
+			openXMLEditor(resultsText.getText());
+		}
+		@Override
+		public String getToolTipText() {
+			return JBossWSUIMessages.JAXRSWSTestView2_OpenInEditor_Action;
+		}
+		@Override
+		public ImageDescriptor getImageDescriptor() {
+			return mImageRegistry.getDescriptor(IMG_DESC_SHOWEDITOR);
+		}
+	}
+	
+	class FileSaveAction extends Action {
+		@Override
+		public void run() {
+			IStatus status =
+				WSTestUtils.saveTextToFile(resultsText.getText());
+			if (status.getCode() == IStatus.ERROR) {
+                MessageDialog.openError(new Shell(Display.getCurrent()),
+               		JBossWSUIMessages.JAXRSWSTestView2_SaveResponseText_Error,
+               		status.getMessage());
+	        }
+	    }
+		@Override
+		public String getToolTipText() {
+			return JBossWSUIMessages.JAXRSWSTestView2_SaveResponseText_tooltip;
+		}
+		@Override
+		public ImageDescriptor getImageDescriptor() {
+			return mImageRegistry.getDescriptor(IMG_DESC_SAVE);
+		}
+	}
+	
+	class ToggleAction extends Action {
+		public ToggleAction ( ) {
+			super(null, IAction.AS_CHECK_BOX);
+		}
+	}
+	
+	class ShowInBrowserAction extends ToggleAction {
+		public void run() {
+			if (rawAction.isChecked()) rawAction.setChecked(false);
+			if (JAXRSWSTestView2.this.resultsText.getText().length() > 0 ) {
+				JAXRSWSTestView2.this.resultsBrowser.setText
+					(JAXRSWSTestView2.this.resultsText.getText());
+			}
+			JAXRSWSTestView2.this.pageBook.showPage(PAGE2_KEY);
+		}
+		@Override
+		public String getToolTipText() {
+			return JBossWSUIMessages.JAXRSWSTestView2_ShowInBrowser_Tooltip;
+		}
+		@Override
+		public ImageDescriptor getImageDescriptor() {
+			return mImageRegistry.getDescriptor(IMG_DESC_SHOWWEB);
+		}
+	}
+	
+	class ShowRawAction extends ToggleAction {
+		public void run() {
+			if (browserAction.isChecked()) browserAction.setChecked(false);
+			JAXRSWSTestView2.this.pageBook.showPage(PAGE1_KEY);
+		}
+		@Override
+		public String getToolTipText() {
+			return JBossWSUIMessages.JAXRSWSTestView2_ShowRaw_Tooltip;
+		}
+		@Override
+		public ImageDescriptor getImageDescriptor() {
+			return mImageRegistry.getDescriptor(IMG_DESC_SHOWRAW);
+		}
+	}
+
+	private String getCurrentTestType() {
+		if (methodCombo.getText().equalsIgnoreCase(JAX_WS))
+			return JAX_WS;
+		return JAX_RS;
+	}
+	
+	private void createURLAndToolbar( ) {
+		urlCombo = new Combo(form.getBody(), SWT.BORDER | SWT.DROP_DOWN);
+		GridData gdURL = new GridData(SWT.FILL, SWT.NONE, true, false);
+		urlCombo.setLayoutData(gdURL);
+		toolkit.adapt(urlCombo);
+		
+		urlCombo.addKeyListener(new KeyListener() {
+			public void keyPressed(KeyEvent e) {
+			}
+
+			public void keyReleased(KeyEvent e) {
+				setControlsForSelectedURL();
+				if (e.keyCode == SWT.CR && e.stateMask == SWT.CTRL) {
+					handleTest(getCurrentTestType());
+				}
+			}
+		});
+		urlCombo.addSelectionListener(new SelectionListener() {
+			public void widgetDefaultSelected(SelectionEvent e) {
+				widgetSelected(e);
+			}
+			public void widgetSelected(SelectionEvent e) {
+				setControlsForSelectedURL();
+			}
+		});
+
+		Composite comp1 = toolkit.createComposite(form.getBody());
+		comp1.setLayoutData(new GridData(SWT.END, SWT.NONE, false, false));
+		comp1.setLayout(new FillLayout());
+		
+		CoolBar coolBar = new CoolBar(comp1, SWT.FLAT);
+		coolBar.setLocked(true);
+		coolBar.setBackground(form.getBody().getBackground());
+		
+		CoolItem wsMethodCoolItem = new CoolItem(coolBar, SWT.PUSH | SWT.FLAT);
+		methodCombo = new Combo(coolBar, SWT.BORDER | SWT.READ_ONLY);
+		methodCombo.setBackground(form.getBody().getBackground());
+		String[] methods = {JAX_WS, GET, POST, PUT, DELETE};
+		methodCombo.setItems(methods);
+		methodCombo.pack();
+        Point size = methodCombo.computeSize (SWT.DEFAULT, SWT.DEFAULT);
+        wsMethodCoolItem.setPreferredSize (wsMethodCoolItem.computeSize (size.x, size.y));
+        wsMethodCoolItem.setControl(methodCombo);
+		methodCombo.addSelectionListener(new SelectionListener() {
+			public void widgetDefaultSelected(SelectionEvent e) {
+				widgetSelected(e);
+			}
+			public void widgetSelected(SelectionEvent e) {
+				setControlsForWSType(getCurrentTestType());
+				setControlsForMethodType(methodCombo.getText());
+				setControlsForSelectedURL();
+			}
+		});
+		toolkit.adapt(methodCombo);
+
+        CoolItem topCoolItem = new CoolItem(coolBar, SWT.FLAT);
+       
+        ToolBar topToolBar = new ToolBar(coolBar,SWT.HORIZONTAL| SWT.FLAT);
+        topToolBar.setBackground(form.getBody().getBackground());
+        openWSDLToolItem = new ToolItem(topToolBar, SWT.PUSH);
+        openWSDLToolItem.setImage(mImageRegistry.get(IMG_DESC_WSDL));
+        openWSDLToolItem.setToolTipText(JBossWSUIMessages.JAXRSWSTestView2_GetFromWSDL_Tooltip);
+        openWSDLToolItem.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				WSDLBrowseDialog wbDialog =  new WSDLBrowseDialog(getSite().getShell());
+				int rtnCode = wbDialog.open();
+				if (rtnCode == Window.OK){
+					serviceNSMessage = null;
+					actionText = null;
+					Definition wsdlDef = wbDialog.getWSDLDefinition();
+					String output = TesterWSDLUtils.getSampleSOAPInputMessage(wsdlDef, 
+							wbDialog.getServiceTextValue(), 
+							wbDialog.getPortTextValue(), 
+							wbDialog.getBindingValue(), 
+							wbDialog.getOperationTextValue());
+					String endpointURL = TesterWSDLUtils.getEndpointURL(wsdlDef, 
+							wbDialog.getServiceTextValue(), 
+							wbDialog.getPortTextValue(), 
+							wbDialog.getBindingValue(), 
+							wbDialog.getOperationTextValue());
+					String actionURL = TesterWSDLUtils.getActionURL(wsdlDef, 
+							wbDialog.getServiceTextValue(), 
+							wbDialog.getPortTextValue(), 
+							wbDialog.getBindingValue(), 
+							wbDialog.getOperationTextValue());
+					serviceNSMessage = TesterWSDLUtils.getNSServiceNameAndMessageNameArray(wsdlDef, 
+							wbDialog.getServiceTextValue(), 
+							wbDialog.getPortTextValue(), 
+							wbDialog.getBindingValue(), 
+							wbDialog.getOperationTextValue());
+					String soapIn = generateSampleSOAP(output);
+					bodyText.setText(soapIn);
+					urlCombo.setText(endpointURL);
+					actionText = actionURL;
+					setControlsForWSType(getCurrentTestType());
+					setControlsForMethodType(methodCombo.getText());
+					setControlsForSelectedURL();
+				}
+			}
+			public void widgetDefaultSelected(SelectionEvent e) {
+				widgetSelected(e);
+			}
+		});
+        
+        startToolItem = new ToolItem(topToolBar, SWT.PUSH| SWT.FLAT);
+        startToolItem.setImage(mImageRegistry.get(IMG_DESC_START));
+        startToolItem.setToolTipText(JBossWSUIMessages.JAXRSWSTestView2_Go_Tooltip);
+        startToolItem.addSelectionListener(new SelectionListener() {
+        	public void widgetSelected(SelectionEvent e) {
+        		handleTest(getCurrentTestType());
+        	}
+        	public void widgetDefaultSelected(SelectionEvent e) {
+        		widgetSelected(e);
+        	}
+        });
+
+        topToolBar.pack(); 
+        size = topToolBar.getSize();
+        topCoolItem.setControl(topToolBar);
+        topCoolItem.setSize(topCoolItem.computeSize(size.x, size.y));
+		toolkit.adapt(coolBar);
+	}
+	
+	private void createRequestSide( SashForm sashForm ) {
+		Section section = toolkit.createSection(sashForm, 
+				Section.TITLE_BAR|
+				Section.TWISTIE|Section.EXPANDED);
+		section.setText(JBossWSUIMessages.JAXRSWSTestView2_RequestDetails_Section);
+
+		Composite sectionClient = toolkit.createComposite(section);
+		sectionClient.setLayout(new GridLayout());
+		sectionClient.setLayoutData(new GridData());
+
+		ExpandableComposite ec = toolkit.createExpandableComposite(sectionClient, 
+				ExpandableComposite.TREE_NODE|
+				ExpandableComposite.CLIENT_INDENT);
+		ec.setText(JBossWSUIMessages.JAXRSWSTestView2_Headers_Section);
+		dlsList = new DelimitedStringList(ec, SWT.None);
+		ec.setClient(dlsList);
+		toolkit.adapt(dlsList);
+		GridData gd2 = new GridData(SWT.FILL, SWT.FILL, true, false);
+		ec.setLayoutData(gd2);
+		ec.addExpansionListener(expansionListener);
+
+		ExpandableComposite ec3 = toolkit.createExpandableComposite(sectionClient, 
+				ExpandableComposite.TREE_NODE|
+				ExpandableComposite.CLIENT_INDENT);
+		ec3.setText(JBossWSUIMessages.JAXRSWSTestView2_Parameters_Section);
+		parmsList = new DelimitedStringList(ec3, SWT.None);
+		ec3.setClient(parmsList);
+		toolkit.adapt(parmsList);
+		GridData gd4 = new GridData(SWT.FILL, SWT.FILL, true, false);
+		ec3.setLayoutData(gd4);
+		ec3.addExpansionListener(expansionListener);
+
+		ExpandableComposite ec5 = toolkit.createExpandableComposite(sectionClient, 
+			     ExpandableComposite.TWISTIE|
+			     ExpandableComposite.CLIENT_INDENT |
+			     ExpandableComposite.EXPANDED);
+		ec5.setText(JBossWSUIMessages.JAXRSWSTestView2_BodyText_Section);
+		bodyText = toolkit.createText(ec5, EMPTY_STRING, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL);
+		ec5.setClient(bodyText);
+		GridData gd9 = new GridData(SWT.FILL, SWT.FILL, true, true);
+		gd9.minimumHeight = 200;
+		 ec5.setLayoutData(gd9);
+		ec5.addExpansionListener(expansionListener);
+
+		section.setClient(sectionClient);  	    
+	}
+	
+	private void createResponseSide ( SashForm sashForm ) {
+		Section section2 = toolkit.createSection(sashForm, 
+				Section.TITLE_BAR|
+				Section.TWISTIE|Section.EXPANDED);
+		section2.setText(JBossWSUIMessages.JAXRSWSTestView2_ResponseDetails_Section);
+
+		Composite sectionClient2 = toolkit.createComposite(section2);
+		sectionClient2.setLayout(new GridLayout());
+		sectionClient2.setLayoutData(new GridData());
+		
+		ExpandableComposite ec2 = toolkit.createExpandableComposite(sectionClient2, 
+				ExpandableComposite.TREE_NODE|
+				ExpandableComposite.CLIENT_INDENT | Section.EXPANDED);
+		ec2.setText(JBossWSUIMessages.JAXRSWSTestView2_ResponseHeaders_Section);
+		ec2.setLayout(new GridLayout());
+		resultHeadersList = new List(ec2, SWT.V_SCROLL | SWT.BORDER );
+		GridData rhlGD = new GridData(GridData.FILL_BOTH);
+		rhlGD.heightHint = 50;
+		resultHeadersList.setLayoutData(rhlGD);
+		ec2.setClient(resultHeadersList);
+		resultsHeaderMenu = new Menu(resultHeadersList.getShell(), SWT.POP_UP);
+		
+		copyResultHeaderMenuAction = new MenuItem(resultsHeaderMenu, SWT.PUSH);
+		copyResultHeaderMenuAction.setText(JBossWSUIMessages.JAXRSWSTestView_CopyResultMenu_Text);
+		copyResultHeaderMenuAction.setAccelerator(SWT.CTRL + 'C');
+		copyResultHeaderMenuAction.addSelectionListener(new SelectionListener(){
+
+			public void widgetDefaultSelected(SelectionEvent arg0) {
+				if (resultHeadersList.getSelectionCount() == 0)
+					resultHeadersList.selectAll();
+				Display display = Display.getDefault();
+				final Clipboard cb = new Clipboard(display);
+				TextTransfer textTransfer = TextTransfer.getInstance();
+		        cb.setContents(resultHeadersList.getSelection() ,
+		            new Transfer[] { textTransfer });
+			}
+
+			public void widgetSelected(SelectionEvent arg0) {
+				widgetDefaultSelected(arg0);
+			}
+		});
+		
+		resultHeadersList.setMenu(resultsHeaderMenu);
+		
+		resultHeadersList.addMouseListener(new MouseListener() {
+			public void mouseDoubleClick(MouseEvent arg0) {
+			}
+			public void mouseDown(MouseEvent arg0) {
+				setMenusForCurrentState();
+			}
+			public void mouseUp(MouseEvent arg0) {
+			}
+		});
+
+		GridData gd6 = new GridData(SWT.FILL, SWT.FILL, true, true);
+//		gd6.minimumHeight = 50;
+		ec2.setLayoutData(gd6);
+		ec2.addExpansionListener(expansionListener);
+
+		ExpandableComposite ec4 = toolkit.createExpandableComposite(sectionClient2, 
+			     ExpandableComposite.TWISTIE|
+			     ExpandableComposite.CLIENT_INDENT |
+			     ExpandableComposite.EXPANDED);
+		ec4.setText(JBossWSUIMessages.JAXRSWSTestView2_ResponseBody_Section);
+		
+		createResponseToolbar(ec4);
+		
+		pageBook = toolkit.createPageBook(ec4, SWT.NONE);
+
+		Composite page1 = pageBook.createPage(PAGE1_KEY);
+		page1.setLayout(new GridLayout());
+		resultsText = toolkit.createText(page1, EMPTY_STRING, SWT.BORDER | SWT.WRAP | SWT.V_SCROLL);
+		GridData gd7 = new GridData(GridData.FILL_BOTH);
+		gd7.minimumHeight = 100;
+		gd7.heightHint = 1;
+		resultsText.setLayoutData(gd7);
+		
+		pageBook.showPage(PAGE1_KEY);
+
+		Composite page2 = pageBook.createPage(PAGE2_KEY);
+		page2.setLayout(new GridLayout());
+		resultsBrowser = new Browser(page2, SWT.BORDER | SWT.WRAP );// | SWT.V_SCROLL);
+		GridData gd10 = new GridData(SWT.FILL, SWT.FILL, true, true);
+		gd7.heightHint = 1;
+		gd10.minimumHeight = 100;
+		toolkit.adapt(resultsBrowser);
+		resultsBrowser.setLayoutData(gd10);
+		
+		pageBook.showPage(PAGE2_KEY);
+
+		GridData gd = new GridData(SWT.FILL, SWT.FILL, true, true); //GridData.FILL_HORIZONTAL);
+		gd.heightHint = 1;
+		gd.minimumHeight = 100;
+		pageBook.setLayoutData(gd);
+		
+		pageBook.showPage(PAGE1_KEY);
+		
+		resultsTextMenu = new Menu(resultsText.getShell(), SWT.POP_UP);
+		
+		copyMenuAction = new MenuItem(resultsTextMenu, SWT.PUSH);
+		copyMenuAction.setText(JBossWSUIMessages.JAXRSWSTestView_CopyResultsMenu);
+		copyMenuAction.setAccelerator(SWT.CTRL + 'C');
+		copyMenuAction.addSelectionListener(new SelectionListener(){
+
+			public void widgetDefaultSelected(SelectionEvent arg0) {
+				if (resultsText.getSelectionCount() == 0)
+					resultsText.selectAll();
+				resultsText.copy();
+			}
+
+			public void widgetSelected(SelectionEvent arg0) {
+				widgetDefaultSelected(arg0);
+			}
+		});
+		new MenuItem(resultsTextMenu, SWT.SEPARATOR);
+		
+		openInXMLEditorAction = new MenuItem(resultsTextMenu, SWT.PUSH);
+		openInXMLEditorAction.setText(JBossWSUIMessages.JAXRSWSTestView_Open_Result_in_XML_Editor);
+		openInXMLEditorAction.setAccelerator(SWT.CTRL + 'O');
+		openInXMLEditorAction.addSelectionListener(new SelectionListener() {
+
+			public void widgetSelected(SelectionEvent arg0) {
+				String string = resultsText.getText();
+				openXMLEditor(string);
+			}
+
+			public void widgetDefaultSelected(SelectionEvent arg0) {
+				widgetSelected(arg0);
+			}
+		});
+
+		openResponseTagInXMLEditor = new MenuItem(resultsTextMenu, SWT.PUSH);
+		openResponseTagInXMLEditor.setText(JBossWSUIMessages.JAXRSWSTestView_Open_Response_Tag_Contents_in_XML_Editor);
+		openResponseTagInXMLEditor.setAccelerator(SWT.CTRL + 'R');
+		openResponseTagInXMLEditor.addSelectionListener(new SelectionListener() {
+
+			public void widgetSelected(SelectionEvent arg0) {
+				String string = null;
+				try {
+					SOAPBody body = null;
+					if (envelope != null){
+						body = envelope.getBody();
+					} else if (soapbody != null) {
+						body = soapbody;
+					}
+
+					NodeList list = body.getChildNodes();
+					for (int i = 0; i< list.getLength(); i++){
+						Node node = list.item(i);
+						if (node.getNodeName().contains("Response")){ //$NON-NLS-1$
+							NodeList list2 = node.getChildNodes();
+							for (int j = 0; j<list2.getLength(); j++){
+								Node node2 = list2.item(j);
+								if (node2.getNodeName().contains("Result")){ //$NON-NLS-1$
+									Node node3 = node2.getChildNodes().item(0);
+									if (node3.getNodeType() == Node.TEXT_NODE) {
+										string = node3.getNodeValue();
+										break;
+									} else if (node3.getNodeType() == Node.ELEMENT_NODE) {
+										Element element = (Element) node3;
+										string = XMLUtils.ElementToString(element);
+										break;
+									}
+								}
+							}
+							if (string != null) break;
+						}
+					}
+					if (string != null){
+						openXMLEditor(string);
+					}
+				} catch (SOAPException e) {
+					JBossWSUIPlugin.log(e);
+				}
+			}
+
+			public void widgetDefaultSelected(SelectionEvent arg0) {
+				widgetSelected(arg0);
+			}
+		});
+		
+		resultsText.setMenu(resultsTextMenu);		
+
+		resultsText.addFocusListener(new FocusListener() {
+			
+			public void focusLost(FocusEvent arg0) {
+			}
+			
+			public void focusGained(FocusEvent arg0) {
+				setMenusForCurrentState();
+			}
+		});
+
+		ec4.setClient(pageBook);
+		GridData gd8 = new GridData(SWT.FILL, SWT.FILL, true, true);
+		 ec4.setLayoutData(gd8);
+		ec4.addExpansionListener(expansionListener);
+
+		section2.setClient(sectionClient2);  	    
+	}
+	
+	/**
+	 * This is a callback that will allow us
+	 * to create the viewer and initialize it.
+	 */
+	public void createPartControl(Composite parent) {
+		
+		getImages();
+		
+		expansionListener = new FormExpansionAdapter();
+
+		toolkit = new FormToolkit(parent.getDisplay());
+		form = toolkit.createScrolledForm(parent);
+		form.addListener(SWT.Resize, new Listener() {
+		      public void handleEvent(Event e) {
+		    	  JAXRSWSTestView2.this.form.reflow(true);
+		      }
+		    });
+		GridLayout layout = new GridLayout(2, false);
+		layout.verticalSpacing = 1;
+		form.getBody().setLayout(layout);
+
+		createURLAndToolbar();
+
+		SashForm sashForm = new SashForm(form.getBody(), SWT.NONE);
+		sashForm.setOrientation(SWT.HORIZONTAL);
+		toolkit.adapt(sashForm);
+		GridLayout sashLayout = new GridLayout(2, false);
+		sashForm.setLayout(sashLayout);
+		GridData gd3 = new GridData(SWT.FILL, SWT.FILL, true, true);
+		gd3.horizontalSpan = 2;
+		gd3.widthHint = 1;
+		sashForm.setLayoutData(gd3);
+		
+		createRequestSide(sashForm);
+
+		createResponseSide(sashForm);
+		
+		toolkit.paintBordersFor(form);
+		form.reflow(true);
+
+		methodCombo.setText(JAX_WS);
+		setControlsForWSType(getCurrentTestType());
+		setControlsForMethodType(methodCombo.getText());
+		setControlsForSelectedURL();
+		setMenusForCurrentState();
+	}
+	
+	@Override
+	public void dispose() {
+		toolkit.dispose();
+		mImageRegistry.dispose();
+		super.dispose();
+	}
+
+	private String generateSampleSOAP ( String innerText ) {
+		String soapIn = "<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\" ?>\n" + //$NON-NLS-1$
+			"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" " + //$NON-NLS-1$
+			"xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" " +  //$NON-NLS-1$
+			"xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" " +  //$NON-NLS-1$
+			">\n" + //$NON-NLS-1$
+			"<soap:Body>\n";//$NON-NLS-1$
+		if (innerText != null)
+			soapIn = soapIn + innerText;
+		soapIn = soapIn +
+			"</soap:Body>\n" + //$NON-NLS-1$
+			"</soap:Envelope>";	 //$NON-NLS-1$
+		return soapIn;
+	}
+	
+	private void setMenusForCurrentState() {
+		if (resultsText!= null && !resultsText.isDisposed()){
+			boolean enabled = resultsText.getText().trim().length() > 0; 
+			copyMenuAction.setEnabled(enabled);
+			openInXMLEditorAction.setEnabled(enabled);
+			if (getCurrentTestType().equalsIgnoreCase(JAX_WS)) {
+				openResponseTagInXMLEditor.setEnabled(enabled);
+			} else if (getCurrentTestType().equalsIgnoreCase(JAX_RS) ){
+				openResponseTagInXMLEditor.setEnabled(false);
+			}
+		}
+		if (resultHeadersList != null && !resultHeadersList.isDisposed()) {
+			boolean enabled = resultHeadersList.getItemCount() > 0;
+			copyResultHeaderMenuAction.setEnabled(enabled);
+		}
+	}
+	
+	private void openXMLEditor (String text){
+		IWorkbenchWindow window = getSite().getWorkbenchWindow();
+		IStorage storage = new ResultsXMLStorage(text);
+		IStorageEditorInput input = new ResultsXMLStorageInput(storage);
+		IWorkbenchPage page = window.getActivePage();
+		if (page != null) {
+			try {
+				if (WSTestUtils.isTextXML(text)) {
+					if (window.getWorkbench().getEditorRegistry().findEditor(XML_EDITOR_ID) != null) {
+						page.openEditor(input, XML_EDITOR_ID);
+					} else {
+						page.openEditor(input, DEFAULT_TEXT_EDITOR_ID);
+					}
+				} else {
+					page.openEditor(input, DEFAULT_TEXT_EDITOR_ID);
+				}
+			} catch (PartInitException e) {
+				JBossWSUIPlugin.log(e);
+			}			
+		}
+	}
+
+	private void setControlsForSelectedURL() {
+		if (urlCombo.getText().trim().length() > 0) {
+			String urlText = urlCombo.getText();
+			try {
+				new URL(urlText);
+				startToolItem.setEnabled(true);
+			} catch (MalformedURLException mue) {
+				startToolItem.setEnabled(false);
+				return;
+			}
+		} else {
+			startToolItem.setEnabled(false);
+		}
+	}
+
+	/*
+	 * Enable/disable controls based on the WS technology type
+	 * and the method.
+	 * 
+	 * @param methodType
+	 */
+	private void setControlsForMethodType ( String methodType ) {
+		if (getCurrentTestType().equalsIgnoreCase(JAX_RS) &&
+				methodType.equalsIgnoreCase(GET)) {
+			bodyText.setEnabled(false);
+		} else {
+			bodyText.setEnabled(true);
+		}
+	}
+
+	/*
+	 * Enable/disable controls based on the WS technology type
+	 * @param wsType
+	 */
+	private void setControlsForWSType ( String wsType ) {
+		if (wsType.equalsIgnoreCase(JAX_WS)) {
+			bodyText.setEnabled(true);
+			parmsList.setEnabled(false);
+			parmsList.removeAll();
+			dlsList.setEnabled(false);
+
+			String emptySOAP = "<?xml version=\"1.0\" standalone=\"yes\" ?>" + //$NON-NLS-1$
+			"<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" " + //$NON-NLS-1$
+			"xmlns:ns=\"INSERT_URL_HERE\">" + //$NON-NLS-1$
+			"<soap:Body>" + //$NON-NLS-1$
+			"</soap:Body>" + //$NON-NLS-1$
+			"</soap:Envelope>";	 //$NON-NLS-1$
+			emptySOAP = WSTestUtils.addNLsToXML(emptySOAP);
+
+			if (bodyText.getText().trim().length() == 0) {
+				bodyText.setText(emptySOAP);
+			}
+			openWSDLToolItem.setEnabled(true);
+		}
+		else if (wsType.equalsIgnoreCase(JAX_RS)) {
+			bodyText.setEnabled(true);
+			parmsList.setEnabled(true);
+			dlsList.setEnabled(true);
+			openWSDLToolItem.setEnabled(false);
+
+			if (bodyText.getText().trim().length() > 0) {
+				bodyText.setText(EMPTY_STRING);
+			}
+		}
+		setMenusForCurrentState();
+	}
+
+	/*
+	 * Actually perform the test based on which type of activity it is 
+	 */
+	private void handleTest(final String wsTech) {
+
+		String urlText = urlCombo.getText();
+		try {
+			new URL(urlText);
+		} catch (MalformedURLException mue) {
+			// do nothing, but return since we don't have a working URL
+			return;
+		}
+		
+		if (urlCombo.getItemCount() > 0) {
+			java.util.List<String> aList = Arrays.asList(urlCombo.getItems());
+			if (!aList.contains(urlCombo.getText())) {
+				urlCombo.add(urlCombo.getText());
+			}
+		} else {
+			urlCombo.add(urlCombo.getText());
+		}
+
+		final String url = urlCombo.getText();
+		final String action = actionText;
+		final String body = bodyText.getText();
+		final String method = methodCombo.getText();
+		final String headers = dlsList.getSelection();
+		final String parms = parmsList.getSelection();
+
+		Job aJob = new Job(JBossWSUIMessages.JAXRSWSTestView_Invoking_WS_Status) {
+			protected IStatus run(IProgressMonitor monitor) {
+				IStatus status = Status.OK_STATUS;
+				// execute the task ...
+				if (wsTech.equalsIgnoreCase(JAX_RS)) {
+					status = handleRSTest(monitor, url, method, body, parms, headers);
+				}
+				else if (wsTech.equalsIgnoreCase(JAX_WS)) {
+					status = handleWSTest(monitor, url, action, body);
+				}
+				monitor.done();
+				return status;  
+			}
+		};
+		// true to indicate that this job was initiated by a UI end user
+		aJob.setUser(true);		
+		aJob.addJobChangeListener(new IJobChangeListener() {
+
+			public void sleeping(IJobChangeEvent event) {};
+			public void scheduled(IJobChangeEvent event) {};
+			public void running(IJobChangeEvent event) {};
+			public void done(final IJobChangeEvent event) {
+				if (event.getResult() instanceof WSTestStatus) {
+					final WSTestStatus status = (WSTestStatus) event.getResult();
+					PlatformUI.getWorkbench().getDisplay().syncExec(new Runnable() {
+						public void run() {
+							if (status.getResultsText() != null) {
+								JAXRSWSTestView2.this.resultsText.setText(status.getResultsText());
+								JAXRSWSTestView2.this.resultsBrowser.setText(status.getResultsText());
+								JAXRSWSTestView2.this.form.reflow(true);
+							}
+							else if (status.getMessage() != null) { 
+								JAXRSWSTestView2.this.resultsText.setText(status.getMessage());
+								JAXRSWSTestView2.this.resultsBrowser.setText(status.getMessage());
+								JAXRSWSTestView2.this.form.reflow(true);
+							}
+							resultHeadersList.removeAll();
+							String[] headers =
+								DelimitedStringList.parseString(status.getHeadersList(), RESULT_HEADER_DELIMITER);
+							if (headers != null && headers.length > 0) {
+								for (int i = 0; i < headers.length; i++) { 
+									resultHeadersList.add(headers[i]);
+								}
+							}
+						}
+					});
+				}
+			}
+
+			public void awake(IJobChangeEvent event) {};
+			public void aboutToRun(IJobChangeEvent event) {};
+		});
+		aJob.schedule();
+
+		setMenusForCurrentState();
+	}
+
+	/*
+	 * Actually call the WS and displays the result 
+	 */
+	private IStatus handleWSTest(final IProgressMonitor monitor, String url, String action, String body) {
+		try {
+
+			envelope = null;
+			soapbody = null;
+			monitor.worked(10);
+			JAXWSTester2 tester = new JAXWSTester2();
+			boolean itRan = false;
+			while (!monitor.isCanceled()) {
+				try {
+					if (!itRan && serviceNSMessage != null && serviceNSMessage.length == 3) { 
+						itRan = true;
+						// 	call the service
+						tester.doTest(monitor, url, action, serviceNSMessage[0], serviceNSMessage[1], serviceNSMessage[2], body);
+					} else {
+						break;
+					}
+				} catch (InterruptedException ie) {
+					monitor.setCanceled(true);
+				}
+			}
+			if (monitor.isCanceled()) {
+				WSTestStatus status = new WSTestStatus(IStatus.OK, 
+						JBossWSUIPlugin.PLUGIN_ID, 
+						JBossWSUIMessages.JAXRSWSTestView_Message_Service_Invocation_Cancelled);
+				return status;
+			}
+			if (!itRan) {
+				WSTestStatus status = new WSTestStatus(IStatus.OK, 
+						JBossWSUIPlugin.PLUGIN_ID, 
+						JBossWSUIMessages.JAXRSWSTestView_Message_Unsuccessful_Test);
+				return status;
+			}
+			monitor.worked(70);
+			String result = tester.getResultBody();
+			envelope = tester.getResultSOAP();
+			soapbody = tester.getResultSOAPBody();
+			String cleanedUp = WSTestUtils.addNLsToXML(result);
+
+			WSTestStatus status = new WSTestStatus(IStatus.OK, 
+					JBossWSUIPlugin.PLUGIN_ID, 
+					JBossWSUIMessages.JAXRSWSTestView_JAXWS_Success_Status);
+			status.setResultsText(cleanedUp);
+			monitor.worked(10);
+
+			String listText = EMPTY_STRING;
+			if (tester.getResultHeaders() != null) {
+				Iterator<?> iter = tester.getResultHeaders().entrySet().iterator();
+				while (iter.hasNext()) {
+					String text = EMPTY_STRING;
+					Entry<?, ?> entry = (Entry<?, ?>) iter.next();
+					if (entry.getKey() == null) 
+						text = entry.getValue().toString();
+					else
+						text = text + entry.toString();
+					listText = listText + text;
+					if (iter.hasNext()) {
+						listText = listText + RESULT_HEADER_DELIMITER;
+					}
+				}
+			}
+			status.setHeadersList(listText);
+			monitor.worked(10);
+			return status;
+		} catch (Exception e) {
+			WSTestStatus status = new WSTestStatus(IStatus.OK, 
+					JBossWSUIPlugin.PLUGIN_ID, 
+					JBossWSUIMessages.JAXRSWSTestView_Exception_Status + e.getLocalizedMessage());
+			status.setResultsText(e.toString());
+			JBossWSUIPlugin.log(e);
+			return status;
+		}
+	}
+
+	/*
+	 * Actually call the RESTful WS to test it
+	 */
+	private IStatus handleRSTest(final IProgressMonitor monitor, String address, String method, String body, String parms, String headersStr) {
+
+		if (method.equalsIgnoreCase(GET))
+			body = EMPTY_STRING;
+
+		// if no actual text in the request body, set to null
+		if (body.trim().length() == 0) body = null;
+
+		monitor.worked(10);
+
+		// Process parameters for web service call
+		HashMap<String, String> parameters = new HashMap<String, String>();
+		if (parms != null && parms.length() > 0) {
+			String[] parsedList = DelimitedStringList.parseString(parms , ","); //$NON-NLS-1$
+			if (parsedList != null && parsedList.length > 0) {
+				for (int i = 0; i < parsedList.length; i++) {
+					String nameValuePair = parsedList[i];
+					String[] nameAndValue = DelimitedStringList.parseString(nameValuePair, "="); //$NON-NLS-1$
+					if (nameAndValue != null && nameAndValue.length == 2) {
+						parameters.put(nameAndValue[0], nameAndValue[1]);
+					}
+				}
+			}
+		}
+
+		monitor.worked(10);
+		// Process headers for web service call
+		HashMap<String, String> headers = new HashMap<String, String>();
+		if (headersStr != null && headersStr.length() > 0) {
+			String[] parsedList = DelimitedStringList.parseString(headersStr , ","); //$NON-NLS-1$
+			if (parsedList != null && parsedList.length > 0) {
+				for (int i = 0; i < parsedList.length; i++) {
+					String nameValuePair = parsedList[i];
+					String[] nameAndValue = DelimitedStringList.parseString(nameValuePair, "="); //$NON-NLS-1$
+					if (nameAndValue != null && nameAndValue.length == 2) {
+						headers.put(nameAndValue[0], nameAndValue[1]);
+					}
+				}
+			}
+		}
+
+		JAXRSTester tester = new JAXRSTester();
+
+		// now actually call it
+		try {
+
+			// call the service
+			tester.doTest(address, parameters, headers, method, body);
+
+			String result = tester.getResultBody();
+
+			// put the results in the result text field
+			String cleanedUp = WSTestUtils.addNLsToXML(result);
+
+			WSTestStatus status = new WSTestStatus(IStatus.OK, 
+					JBossWSUIPlugin.PLUGIN_ID, 
+					JBossWSUIMessages.JAXRSWSTestView_JAXRS_Success_Status);
+			status.setResultsText(cleanedUp);
+
+			String listText = EMPTY_STRING;
+			if (tester.getResultHeaders() != null) {
+				Iterator<?> iter = tester.getResultHeaders().entrySet().iterator();
+				while (iter.hasNext()) {
+					String text = EMPTY_STRING;
+					Entry<?, ?> entry = (Entry<?, ?>) iter.next();
+					if (entry.getKey() == null) 
+						text = entry.getValue().toString();
+					else
+						text = text + entry.toString();
+					listText = listText + text;
+					if (iter.hasNext()) {
+						listText = listText + RESULT_HEADER_DELIMITER;
+					}
+				}
+			}
+
+			status.setHeadersList(listText);
+			monitor.worked(10);
+			return status;
+
+		} catch (Exception e) {
+			String result = tester.getResultBody();
+
+			// put the results in the result text field
+			String cleanedUp = WSTestUtils.addNLsToXML(result);
+
+			WSTestStatus status = new WSTestStatus(IStatus.OK, 
+					JBossWSUIPlugin.PLUGIN_ID, 
+					JBossWSUIMessages.JAXRSWSTestView_JAXRS_Success_Status);
+			status.setResultsText(cleanedUp);
+
+			String listText = EMPTY_STRING;
+			if (tester.getResultHeaders() != null) {
+				Iterator<?> iter = tester.getResultHeaders().entrySet().iterator();
+				while (iter.hasNext()) {
+					String text = EMPTY_STRING;
+					Entry<?, ?> entry = (Entry<?, ?>) iter.next();
+					if (entry.getKey() == null) 
+						text = entry.getValue().toString();
+					else
+						text = text + entry.toString();
+					listText = listText + text;
+					if (iter.hasNext()) {
+						listText = listText + RESULT_HEADER_DELIMITER;
+					}
+				}
+			}
+
+			status.setHeadersList(listText);
+			monitor.worked(10);
+			return status;
+		}
+	}
+
+	/**
+	 * Passing the focus request to the control.
+	 */
+	public void setFocus() {
+		// set initial focus to the URL text combo
+		urlCombo.setFocus();
+	}
+
+}
\ No newline at end of file
Index: src/org/jboss/tools/ws/ui/views/FormLayoutFactory.java
===================================================================
--- src/org/jboss/tools/ws/ui/views/FormLayoutFactory.java	(revision 0)
+++ src/org/jboss/tools/ws/ui/views/FormLayoutFactory.java	(revision 0)
@@ -0,0 +1,397 @@
+/*******************************************************************************
+ *  Copyright (c) 2007, 2008 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.jboss.tools.ws.ui.views;
+
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.forms.widgets.TableWrapLayout;
+
+/**
+ * FormLayoutFactory
+ *
+ */
+public class FormLayoutFactory {
+
+	// Used in place of 0.  If 0 is used, widget borders will appear clipped
+	// on some platforms (e.g. Windows XP Classic Theme).
+	// Form tool kit requires parent composites containing the widget to have
+	// at least 1 pixel border margins in order to paint the flat borders.
+	// The form toolkit paints flat borders on a given widget when native 
+	// borders are not painted by SWT.  See FormToolkit#paintBordersFor()
+	public static final int DEFAULT_CLEAR_MARGIN = 2;
+
+	// Required to allow space for field decorations
+	public static final int CONTROL_HORIZONTAL_INDENT = 3;
+
+	// UI Forms Standards
+
+	// FORM BODY
+	public static final int FORM_BODY_MARGIN_TOP = 12;
+	public static final int FORM_BODY_MARGIN_BOTTOM = 12;
+	public static final int FORM_BODY_MARGIN_LEFT = 6;
+	public static final int FORM_BODY_MARGIN_RIGHT = 6;
+	public static final int FORM_BODY_HORIZONTAL_SPACING = 20;
+	// Should be 20; but, we minus 3 because the section automatically pads the 
+	// bottom margin by that amount 	
+	public static final int FORM_BODY_VERTICAL_SPACING = 17;
+	public static final int FORM_BODY_MARGIN_HEIGHT = 0;
+	public static final int FORM_BODY_MARGIN_WIDTH = 0;
+
+	// SECTION CLIENT
+	public static final int SECTION_CLIENT_MARGIN_TOP = 5;
+	public static final int SECTION_CLIENT_MARGIN_BOTTOM = 5;
+	// Should be 6; but, we minus 4 because the section automatically pads the
+	// left margin by that amount
+	public static final int SECTION_CLIENT_MARGIN_LEFT = 2;
+	// Should be 6; but, we minus 4 because the section automatically pads the
+	// right margin by that amount	
+	public static final int SECTION_CLIENT_MARGIN_RIGHT = 2;
+	public static final int SECTION_CLIENT_HORIZONTAL_SPACING = 5;
+	public static final int SECTION_CLIENT_VERTICAL_SPACING = 5;
+	public static final int SECTION_CLIENT_MARGIN_HEIGHT = 0;
+	public static final int SECTION_CLIENT_MARGIN_WIDTH = 0;
+
+	public static final int SECTION_HEADER_VERTICAL_SPACING = 6;
+
+	// CLEAR
+	public static final int CLEAR_MARGIN_TOP = DEFAULT_CLEAR_MARGIN;
+	public static final int CLEAR_MARGIN_BOTTOM = DEFAULT_CLEAR_MARGIN;
+	public static final int CLEAR_MARGIN_LEFT = DEFAULT_CLEAR_MARGIN;
+	public static final int CLEAR_MARGIN_RIGHT = DEFAULT_CLEAR_MARGIN;
+	public static final int CLEAR_HORIZONTAL_SPACING = 0;
+	public static final int CLEAR_VERTICAL_SPACING = 0;
+	public static final int CLEAR_MARGIN_HEIGHT = 0;
+	public static final int CLEAR_MARGIN_WIDTH = 0;
+
+	// FORM PANE
+	public static final int FORM_PANE_MARGIN_TOP = 0;
+	public static final int FORM_PANE_MARGIN_BOTTOM = 0;
+	public static final int FORM_PANE_MARGIN_LEFT = 0;
+	public static final int FORM_PANE_MARGIN_RIGHT = 0;
+	public static final int FORM_PANE_HORIZONTAL_SPACING = FORM_BODY_HORIZONTAL_SPACING;
+	public static final int FORM_PANE_VERTICAL_SPACING = FORM_BODY_VERTICAL_SPACING;
+	public static final int FORM_PANE_MARGIN_HEIGHT = 0;
+	public static final int FORM_PANE_MARGIN_WIDTH = 0;
+
+	// MASTER DETAILS
+	public static final int MASTER_DETAILS_MARGIN_TOP = 0;
+	public static final int MASTER_DETAILS_MARGIN_BOTTOM = 0;
+	// Used only by masters part.  Details part margin dynamically calculated
+	public static final int MASTER_DETAILS_MARGIN_LEFT = 0;
+	// Used only by details part.  Masters part margin dynamically calcualated
+	public static final int MASTER_DETAILS_MARGIN_RIGHT = 1;
+	public static final int MASTER_DETAILS_HORIZONTAL_SPACING = FORM_BODY_HORIZONTAL_SPACING;
+	public static final int MASTER_DETAILS_VERTICAL_SPACING = FORM_BODY_VERTICAL_SPACING;
+	public static final int MASTER_DETAILS_MARGIN_HEIGHT = 0;
+	public static final int MASTER_DETAILS_MARGIN_WIDTH = 0;
+
+	/**
+	 * 
+	 */
+	private FormLayoutFactory() {
+		// NO-OP
+	}
+
+	/**
+	 * For form bodies.
+	 * @param makeColumnsEqualWidth
+	 * @param numColumns
+	 * @return
+	 */
+	public static GridLayout createFormGridLayout(boolean makeColumnsEqualWidth, int numColumns) {
+		GridLayout layout = new GridLayout();
+
+		layout.marginHeight = FORM_BODY_MARGIN_HEIGHT;
+		layout.marginWidth = FORM_BODY_MARGIN_WIDTH;
+
+		layout.marginTop = FORM_BODY_MARGIN_TOP;
+		layout.marginBottom = FORM_BODY_MARGIN_BOTTOM;
+		layout.marginLeft = FORM_BODY_MARGIN_LEFT;
+		layout.marginRight = FORM_BODY_MARGIN_RIGHT;
+
+		layout.horizontalSpacing = FORM_BODY_HORIZONTAL_SPACING;
+		layout.verticalSpacing = FORM_BODY_VERTICAL_SPACING;
+
+		layout.makeColumnsEqualWidth = makeColumnsEqualWidth;
+		layout.numColumns = numColumns;
+
+		return layout;
+	}
+
+	/**
+	 * For miscellaneous grouping composites.
+	 * For sections (as a whole - header plus client).
+	 * @param makeColumnsEqualWidth
+	 * @param numColumns
+	 * @return
+	 */
+	public static GridLayout createClearGridLayout(boolean makeColumnsEqualWidth, int numColumns) {
+		GridLayout layout = new GridLayout();
+
+		layout.marginHeight = CLEAR_MARGIN_HEIGHT;
+		layout.marginWidth = CLEAR_MARGIN_WIDTH;
+
+		layout.marginTop = CLEAR_MARGIN_TOP;
+		layout.marginBottom = CLEAR_MARGIN_BOTTOM;
+		layout.marginLeft = CLEAR_MARGIN_LEFT;
+		layout.marginRight = CLEAR_MARGIN_RIGHT;
+
+		layout.horizontalSpacing = CLEAR_HORIZONTAL_SPACING;
+		layout.verticalSpacing = CLEAR_VERTICAL_SPACING;
+
+		layout.makeColumnsEqualWidth = makeColumnsEqualWidth;
+		layout.numColumns = numColumns;
+
+		return layout;
+	}
+
+	/**
+	 * For form bodies.
+	 * @param makeColumnsEqualWidth
+	 * @param numColumns
+	 * @return
+	 */
+	public static TableWrapLayout createFormTableWrapLayout(boolean makeColumnsEqualWidth, int numColumns) {
+		TableWrapLayout layout = new TableWrapLayout();
+
+		layout.topMargin = FORM_BODY_MARGIN_TOP;
+		layout.bottomMargin = FORM_BODY_MARGIN_BOTTOM;
+		layout.leftMargin = FORM_BODY_MARGIN_LEFT;
+		layout.rightMargin = FORM_BODY_MARGIN_RIGHT;
+
+		layout.horizontalSpacing = FORM_BODY_HORIZONTAL_SPACING;
+		layout.verticalSpacing = FORM_BODY_VERTICAL_SPACING;
+
+		layout.makeColumnsEqualWidth = makeColumnsEqualWidth;
+		layout.numColumns = numColumns;
+
+		return layout;
+	}
+
+	/**
+	 * For composites used to group sections in left and right panes.
+	 * @param makeColumnsEqualWidth
+	 * @param numColumns
+	 * @return
+	 */
+	public static TableWrapLayout createFormPaneTableWrapLayout(boolean makeColumnsEqualWidth, int numColumns) {
+		TableWrapLayout layout = new TableWrapLayout();
+
+		layout.topMargin = FORM_PANE_MARGIN_TOP;
+		layout.bottomMargin = FORM_PANE_MARGIN_BOTTOM;
+		layout.leftMargin = FORM_PANE_MARGIN_LEFT;
+		layout.rightMargin = FORM_PANE_MARGIN_RIGHT;
+
+		layout.horizontalSpacing = FORM_PANE_HORIZONTAL_SPACING;
+		layout.verticalSpacing = FORM_PANE_VERTICAL_SPACING;
+
+		layout.makeColumnsEqualWidth = makeColumnsEqualWidth;
+		layout.numColumns = numColumns;
+
+		return layout;
+	}
+
+	/**
+	 * For composites used to group sections in left and right panes.
+	 * @param makeColumnsEqualWidth
+	 * @param numColumns
+	 * @return
+	 */
+	public static GridLayout createFormPaneGridLayout(boolean makeColumnsEqualWidth, int numColumns) {
+		GridLayout layout = new GridLayout();
+
+		layout.marginHeight = FORM_PANE_MARGIN_HEIGHT;
+		layout.marginWidth = FORM_PANE_MARGIN_WIDTH;
+
+		layout.marginTop = FORM_PANE_MARGIN_TOP;
+		layout.marginBottom = FORM_PANE_MARGIN_BOTTOM;
+		layout.marginLeft = FORM_PANE_MARGIN_LEFT;
+		layout.marginRight = FORM_PANE_MARGIN_RIGHT;
+
+		layout.horizontalSpacing = FORM_PANE_HORIZONTAL_SPACING;
+		layout.verticalSpacing = FORM_PANE_VERTICAL_SPACING;
+
+		layout.makeColumnsEqualWidth = makeColumnsEqualWidth;
+		layout.numColumns = numColumns;
+
+		return layout;
+	}
+
+	/**
+	 * For miscellaneous grouping composites.
+	 * For sections (as a whole - header plus client).
+	 * @param makeColumnsEqualWidth
+	 * @param numColumns
+	 * @return
+	 */
+	public static TableWrapLayout createClearTableWrapLayout(boolean makeColumnsEqualWidth, int numColumns) {
+		TableWrapLayout layout = new TableWrapLayout();
+
+		layout.topMargin = CLEAR_MARGIN_TOP;
+		layout.bottomMargin = CLEAR_MARGIN_BOTTOM;
+		layout.leftMargin = CLEAR_MARGIN_LEFT;
+		layout.rightMargin = CLEAR_MARGIN_RIGHT;
+
+		layout.horizontalSpacing = CLEAR_HORIZONTAL_SPACING;
+		layout.verticalSpacing = CLEAR_VERTICAL_SPACING;
+
+		layout.makeColumnsEqualWidth = makeColumnsEqualWidth;
+		layout.numColumns = numColumns;
+
+		return layout;
+	}
+
+	/**
+	 * For master sections belonging to a master details block.
+	 * @param makeColumnsEqualWidth
+	 * @param numColumns
+	 * @return
+	 */
+	public static GridLayout createMasterGridLayout(boolean makeColumnsEqualWidth, int numColumns) {
+		GridLayout layout = new GridLayout();
+
+		layout.marginHeight = MASTER_DETAILS_MARGIN_HEIGHT;
+		layout.marginWidth = MASTER_DETAILS_MARGIN_WIDTH;
+
+		layout.marginTop = MASTER_DETAILS_MARGIN_TOP;
+		layout.marginBottom = MASTER_DETAILS_MARGIN_BOTTOM;
+		layout.marginLeft = MASTER_DETAILS_MARGIN_LEFT;
+		// Cannot set layout on a sash form.
+		// In order to replicate the horizontal spacing between sections,
+		// divide the amount by 2 and set the master section right margin to 
+		// half the amount and set the left details section margin to half
+		// the amount.  The default sash width is currently set at 3.
+		// Minus 1 pixel from each half.  Use the 1 left over pixel to separate
+		// the details section from the vertical scollbar.
+		int marginRight = MASTER_DETAILS_HORIZONTAL_SPACING;
+		if (marginRight > 0) {
+			marginRight = marginRight / 2;
+			if (marginRight > 0) {
+				marginRight--;
+			}
+		}
+		layout.marginRight = marginRight;
+
+		layout.horizontalSpacing = MASTER_DETAILS_HORIZONTAL_SPACING;
+		layout.verticalSpacing = MASTER_DETAILS_VERTICAL_SPACING;
+
+		layout.makeColumnsEqualWidth = makeColumnsEqualWidth;
+		layout.numColumns = numColumns;
+
+		return layout;
+	}
+
+	/**
+	 * For details sections belonging to a master details block.
+	 * @param makeColumnsEqualWidth
+	 * @param numColumns
+	 * @return
+	 */
+	public static GridLayout createDetailsGridLayout(boolean makeColumnsEqualWidth, int numColumns) {
+		GridLayout layout = new GridLayout();
+
+		layout.marginHeight = MASTER_DETAILS_MARGIN_HEIGHT;
+		layout.marginWidth = MASTER_DETAILS_MARGIN_WIDTH;
+
+		layout.marginTop = MASTER_DETAILS_MARGIN_TOP;
+		layout.marginBottom = MASTER_DETAILS_MARGIN_BOTTOM;
+		// Cannot set layout on a sash form.
+		// In order to replicate the horizontal spacing between sections,
+		// divide the amount by 2 and set the master section right margin to 
+		// half the amount and set the left details section margin to half
+		// the amount.  The default sash width is currently set at 3.
+		// Minus 1 pixel from each half.  Use the 1 left over pixel to separate
+		// the details section from the vertical scollbar.
+		int marginLeft = MASTER_DETAILS_HORIZONTAL_SPACING;
+		if (marginLeft > 0) {
+			marginLeft = marginLeft / 2;
+			if (marginLeft > 0) {
+				marginLeft--;
+			}
+		}
+		layout.marginLeft = marginLeft;
+		layout.marginRight = MASTER_DETAILS_MARGIN_RIGHT;
+
+		layout.horizontalSpacing = MASTER_DETAILS_HORIZONTAL_SPACING;
+		layout.verticalSpacing = MASTER_DETAILS_VERTICAL_SPACING;
+
+		layout.makeColumnsEqualWidth = makeColumnsEqualWidth;
+		layout.numColumns = numColumns;
+
+		return layout;
+	}
+
+	/**
+	 * For composites set as section clients.
+	 * For composites containg form text.
+	 * @param makeColumnsEqualWidth
+	 * @param numColumns
+	 * @return
+	 */
+	public static GridLayout createSectionClientGridLayout(boolean makeColumnsEqualWidth, int numColumns) {
+		GridLayout layout = new GridLayout();
+
+		layout.marginHeight = SECTION_CLIENT_MARGIN_HEIGHT;
+		layout.marginWidth = SECTION_CLIENT_MARGIN_WIDTH;
+
+		layout.marginTop = SECTION_CLIENT_MARGIN_TOP;
+		layout.marginBottom = SECTION_CLIENT_MARGIN_BOTTOM;
+		layout.marginLeft = SECTION_CLIENT_MARGIN_LEFT;
+		layout.marginRight = SECTION_CLIENT_MARGIN_RIGHT;
+
+		layout.horizontalSpacing = SECTION_CLIENT_HORIZONTAL_SPACING;
+		layout.verticalSpacing = SECTION_CLIENT_VERTICAL_SPACING;
+
+		layout.makeColumnsEqualWidth = makeColumnsEqualWidth;
+		layout.numColumns = numColumns;
+
+		return layout;
+	}
+
+	/**
+	 * For composites set as section clients.
+	 * For composites containg form text.
+	 * @param makeColumnsEqualWidth
+	 * @param numColumns
+	 * @return
+	 */
+	public static TableWrapLayout createSectionClientTableWrapLayout(boolean makeColumnsEqualWidth, int numColumns) {
+		TableWrapLayout layout = new TableWrapLayout();
+
+		layout.topMargin = SECTION_CLIENT_MARGIN_TOP;
+		layout.bottomMargin = SECTION_CLIENT_MARGIN_BOTTOM;
+		layout.leftMargin = SECTION_CLIENT_MARGIN_LEFT;
+		layout.rightMargin = SECTION_CLIENT_MARGIN_RIGHT;
+
+		layout.horizontalSpacing = SECTION_CLIENT_HORIZONTAL_SPACING;
+		layout.verticalSpacing = SECTION_CLIENT_VERTICAL_SPACING;
+
+		layout.makeColumnsEqualWidth = makeColumnsEqualWidth;
+		layout.numColumns = numColumns;
+
+		return layout;
+	}
+
+	/**
+	 * Debug method.
+	 * 
+	 * MAGENTA = 11
+	 * CYAN = 13
+	 * GREEN = 5
+	 * @param container
+	 * @param color
+	 */
+	public static void visualizeLayoutArea(Composite container, int color) {
+		container.setBackground(Display.getCurrent().getSystemColor(color));
+	}
+}
