diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/.classpath b/bundles/org.eclipse.jst.ws.axis2.consumption.core/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/.cvsignore b/bundles/org.eclipse.jst.ws.axis2.consumption.core/.cvsignore
deleted file mode 100644
index 7722bc8..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-build.xml
-javaCompiler...args
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/.project b/bundles/org.eclipse.jst.ws.axis2.consumption.core/.project
deleted file mode 100644
index 673d2ac..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.ws.axis2.consumption.core</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/.settings/org.eclipse.core.resources.prefs b/bundles/org.eclipse.jst.ws.axis2.consumption.core/.settings/org.eclipse.core.resources.prefs
deleted file mode 100644
index a758557..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/.settings/org.eclipse.core.resources.prefs
+++ /dev/null
@@ -1,3 +0,0 @@
-#Tue Apr 24 12:40:53 EDT 2007
-eclipse.preferences.version=1
-encoding//src/org/eclipse/jst/ws/axis2/consumption/core/messages/Axis2ConsumptionUI.properties=ISO-8859-1
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.jst.ws.axis2.consumption.core/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 5cd75cc..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,62 +0,0 @@
-#Sun May 06 17:32:38 LKT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=ignore
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.jst.ws.axis2.consumption.core/META-INF/MANIFEST.MF
deleted file mode 100644
index ad6be10..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,37 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %PLUGIN_NAME
-Bundle-SymbolicName: org.eclipse.jst.ws.axis2.consumption.core
-Bundle-Version: 1.0.102.qualifier
-Bundle-Activator: org.eclipse.jst.ws.axis2.consumption.core.plugin.WebServiceAxis2ConsumptionCorePlugin
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.ui.ide,
- org.eclipse.core.resources,
- org.eclipse.jdt.core,
- org.eclipse.wst.ws.parser,
- org.eclipse.jst.ws,
- org.eclipse.jst.ws.ui,
- org.eclipse.jst.ws.consumption,
- org.eclipse.jst.ws.consumption.ui,
- org.eclipse.wst.ws,
- org.eclipse.wst.command.env,
- org.eclipse.wst.command.env.core,
- org.eclipse.wst.command.env.ui,
- org.eclipse.wst.server.core,
- org.eclipse.wst.wsdl,
- org.eclipse.wst.common.frameworks,
- org.eclipse.wst.common.environment,
- org.eclipse.jst.ws.axis2.ui,
- org.eclipse.jst.ws.axis2.core
-Eclipse-LazyStart: true
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.jst.ws.axis2.consumption.core.command,
- org.eclipse.jst.ws.axis2.consumption.core.data,
- org.eclipse.jst.ws.axis2.consumption.core.messages,
- org.eclipse.jst.ws.axis2.consumption.core.plugin,
- org.eclipse.jst.ws.axis2.consumption.core.utils,
- org.eclipse.jst.ws.axis2.creation.core.data
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-Vendor: %PLUGIN_PROVIDER
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/about.html b/bundles/org.eclipse.jst.ws.axis2.consumption.core/about.html
deleted file mode 100644
index 9e73bda..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/about.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<HTML>
-
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-
-<BODY lang="EN-US">
-
-<H3>About This Content</H3>
-
-<P>June 06, 2007</P>
-
-<H3>License</H3>
-
-<P>The Eclipse Foundation makes available all content in this plug-in 
-("Content"). Unless otherwise indicated below, the Content is provided to you 
-under the terms and conditions of the Eclipse Public License Version 1.0 
-("EPL"). A copy of the EPL is available at
-<A href="http://www.eclipse.org/org/documents/epl-v10.php">http://www.eclipse.org/org/documents/epl-v10.php</A>. 
-For purposes of the EPL, "Program" will mean the Content.</P>
-
-<P>If you did not receive this Content directly from the Eclipse Foundation, the 
-Content is being redistributed by another party ("Redistributor") and different 
-terms and conditions may apply to your use of any object code in the Content. 
-Check the Redistributor's license that was provided with the Content. If no such 
-license exists, contact the Redistributor. Unless otherwise indicated below, the 
-terms and conditions of the EPL still apply to any source code in the Content 
-and such source code may be obtained at
-<A href="http://www.eclipse.org/">http://www.eclipse.org/</A>.</P>
-
-</BODY>
-</HTML>
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/build.properties b/bundles/org.eclipse.jst.ws.axis2.consumption.core/build.properties
deleted file mode 100644
index 37a61fe..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2007 WSO2 Inc 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:
-# WSO2 Inc - initial API and implementation
-# yyyymmdd bug      Email and other contact information
-# -------- -------- -----------------------------------------------------------
-# 20070130   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the 
-#											Axis2 runtime to the framework for 168762
-# 20070502   184302 sandakith@wso2.com - Lahiru Sandakith, Fix copyright for Axis2 plugins
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.properties,\
-               about.html
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/plugin.properties b/bundles/org.eclipse.jst.ws.axis2.consumption.core/plugin.properties
deleted file mode 100644
index c334ca0..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/plugin.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-###############################################################################
-# Copyright (c) 2007 WSO2 Inc. 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:
-# WSO2 Inc. - initial API and implementation
-# yyyymmdd bug      Email and other contact information
-# -------- -------- -----------------------------------------------------------
-# 20070428   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the 
-# 										 Axis2 runtime to the framework for 168762
-# 20070501   184617 sandakith@wso2.com - Lahiru Sandakith, Provide plugin details
-# 20070507   185686 sandakith@wso2.com - Lahiru Sandakith
-###############################################################################
-
-#
-# Messages in plugin.xml.
-#
-PLUGIN_NAME=Webservice Axis2 Consumption Core Plug-in
-PLUGIN_PROVIDER=WSO2
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/command/Axis2ClientCodegenCommand.java b/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/command/Axis2ClientCodegenCommand.java
deleted file mode 100644
index e4aa3f4..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/command/Axis2ClientCodegenCommand.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070205   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070206   172186 sandakith@wso2.com	- Fix for 172186, Added a check to overcome the issue.
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070507   185398 sandakith@wso2.com - Lahiru Sandakith
- * 20070813   196173  sandakith@wso2.com - Lahiru Sandakith, Fix 196173, DWP custom location fix
- * 20070814   187840 sandakith@wso2.com - Lahiru Sandakith, Fixing 187840 ITE message
- * 20070814   193593 sandakith@wso2.com - Lahiru Sandakith, custom package name fix
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- * 20080213   218910 kathy@ca.ibm.com - Kathy Chan
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.consumption.core.command;
-
-import java.io.File;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.util.Map;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.ws.axis2.consumption.core.data.DataModel;
-import org.eclipse.jst.ws.axis2.consumption.core.messages.Axis2ConsumptionUIMessages;
-import org.eclipse.jst.ws.axis2.consumption.core.utils.ContentCopyUtils;
-import org.eclipse.jst.ws.axis2.consumption.core.utils.WSDL2JavaGenerator;
-import org.eclipse.jst.ws.axis2.consumption.core.utils.WSDLPropertyReader;
-import org.eclipse.jst.ws.axis2.core.constant.Axis2Constants;
-import org.eclipse.jst.ws.axis2.core.utils.ClassLoadingUtil;
-import org.eclipse.jst.ws.axis2.core.utils.FacetContainerUtils;
-import org.eclipse.jst.ws.axis2.core.utils.FileUtils;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.command.internal.env.core.common.StatusUtils;
-import org.eclipse.wst.common.environment.IEnvironment;
-import org.eclipse.wst.common.environment.IStatusHandler;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-
-public class Axis2ClientCodegenCommand extends AbstractDataModelOperation {
-	
-	  private DataModel model;
-		
-	  public Axis2ClientCodegenCommand( DataModel model ){
-	    this.model = model;  
-	  }
-
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info)
-													 throws ExecutionException {
-		IStatus status = Status.OK_STATUS;  
-		IEnvironment environment = getEnvironment();
-		IStatusHandler statusHandler = environment.getStatusHandler();	
-		
-		String workspaceDirectory = ResourcesPlugin.getWorkspace().getRoot().
-													getLocation().toOSString();
-		String currentDynamicWebProjectDir = FacetContainerUtils.getProjectRoot(
-				                                  model.getWebProjectName()).toOSString();
-		String matadataDir = FileUtils.addAnotherNodeToPath(
-										workspaceDirectory,
-										Axis2Constants.DIR_DOT_METADATA);
-	    String matadataPluginsDir = FileUtils.addAnotherNodeToPath(
-	    								matadataDir,
-	    								Axis2Constants.DIR_DOT_PLUGINS);
-	    String matadataAxis2Dir = FileUtils.addAnotherNodeToPath(
-	    									matadataPluginsDir, 
-	    									Axis2Constants.AXIS2_PROJECT);
-		String tempCodegenOutputLocation = FileUtils.addAnotherNodeToPath(
-											matadataAxis2Dir, 
-											Axis2Constants.CODEGEN_RESULTS);
-		File tempCodegenOutputLocationFile = new File(tempCodegenOutputLocation);
-		if (tempCodegenOutputLocationFile.exists()){
-			FileUtils.deleteDirectories(tempCodegenOutputLocation);
-		}
-		FileUtils.createDirectorys(tempCodegenOutputLocation);
-		WSDL2JavaGenerator generator = new WSDL2JavaGenerator(); 
-      
-		//AxisService service;
-		Object axisServiceInstance;
-		
-		String transformerFactory = null;
-		boolean transformerFactoryModified = false;
-		
-	try {
-		// use the xalan transformer factory if loadable
-		try {
-			transformerFactory = System.getProperty("javax.xml.transform.TransformerFactory");
-			Class.forName("org.apache.xalan.processor.TransformerFactoryImpl");
-			String modifiedTransformerFactory = "org.apache.xalan.processor.TransformerFactoryImpl";
-			if (!modifiedTransformerFactory.equals(transformerFactory)) {
-				System.setProperty("javax.xml.transform.TransformerFactory", modifiedTransformerFactory);
-				transformerFactoryModified = true;
-			}
-		}
-		catch (ClassNotFoundException e) {
-			// If class not found, keep using the default transformer factory.
-		}
-		
-		//service = generator.getAxisService(model.getWsdlURI());
-		ClassLoadingUtil.setInitByClient(true);
-		ClassLoadingUtil.cleanAntClassLoader();
-		ClassLoadingUtil.init(model.getWebProjectName());
-		axisServiceInstance = generator.getAxisService(model.getWsdlURI());
-		Map optionsMap = generator.fillOptionMap(	
-			model.isASync(), //async
-            model.isSync(), //sync
-            false,  //servirside false always
-            false,  //services.xml false always
-            model.isTestCaseCheck(),
-            model.isGenerateAllCheck(),
-            (model.getServiceName()!=null)?model.getServiceName():null,
-            (model.getPortName()!=null)?model.getPortName():null,
-            (model.getDatabindingType().toLowerCase()!=null)
-            			?model.getDatabindingType().toLowerCase()
-            			:null,
-            (model.getWsdlURI()!=null)?model.getWsdlURI():null,
-            (model.getPackageText()!=null)?model.getPackageText():null,
-            "java",
-            tempCodegenOutputLocation,
-            model.getNamespaseToPackageMapping(),
-            false	//Serverside interface always false
-           ); 
-      
-        //CodeGenConfiguration codegenConfig = new CodeGenConfiguration(service, optionsMap);
-		Class CodeGenConfigurationClass = ClassLoadingUtil
-				.loadClassFromAntClassLoader("org.apache.axis2.wsdl.codegen.CodeGenConfiguration");
-
-		//-----------------------------------------------------------------------------------//
-		//Fix for the Axis2 1.2 
-		//Constructor CodeGenConfigurationConstructor = CodeGenConfigurationClass
-		//		.getConstructor(new Class[]{axisServiceInstance.getClass(),Map.class});
-		//Object CodeGenConfigurationInstance = CodeGenConfigurationConstructor
-		//		.newInstance(new Object[]{axisServiceInstance,optionsMap});
-		
-		Constructor CodeGenConfigurationConstructor = CodeGenConfigurationClass
-				.getConstructor(new Class[]{Map.class});
-		Object CodeGenConfigurationInstance = CodeGenConfigurationConstructor
-				.newInstance(new Object[]{optionsMap});
-		
-		// codegenConfig.addAxisService(service);
-		Method addAxisServiceMethod = CodeGenConfigurationClass
-				.getMethod("addAxisService", new Class[]{ axisServiceInstance.getClass()});
-		addAxisServiceMethod.invoke(CodeGenConfigurationInstance, 
-							new Object[]{axisServiceInstance});
-		
-        //set the wsdl definision for codegen config for skeleton generarion.
-        WSDLPropertyReader reader = new WSDLPropertyReader();
-        reader.readWSDL(model.getWebProjectName(),model.getWsdlURI());
-        Object wsdlDefinitionInstance = reader.getWsdlDefinitionInstance();
-        //Class DefinitionClass = ClassLoadingUtil.loadClassFromAntClassLoader("javax.wsdl.Definition");
-        //codegenConfig.setWsdlDefinition(wsdlDefinition);
-		Method setWsdlDefinitionMethod = CodeGenConfigurationClass
-				.getMethod("setWsdlDefinition", new Class[]{reader.getWsdlDefinitionClass()});
-		setWsdlDefinitionMethod.invoke(CodeGenConfigurationInstance, 
-					new Object[]{wsdlDefinitionInstance});       
-        
-		//-----------------------------------------------------------------------------------//
-		
-        //set the baseURI
-        //codegenConfig.setBaseURI(generator.getBaseUri(model.getWsdlURI()));
-		
-		Method setBaseURIMethod = CodeGenConfigurationClass
-				.getMethod("setBaseURI", new Class[]{String.class});
-		setBaseURIMethod.invoke(CodeGenConfigurationInstance, 
-								new Object[]{generator.getBaseUri(model.getWsdlURI())});
-		
-		//Get the namespace from the AxisService and set it in the configuration 
-		Class AxisServiceClass = ClassLoadingUtil
-					.loadClassFromAntClassLoader("org.apache.axis2.description.AxisService");
-
-		Method getTargetNamespaceMethod = AxisServiceClass.getMethod("getTargetNamespace", null);
-		Object targetNamespace = getTargetNamespaceMethod.invoke(axisServiceInstance, null);
-		
-		Object stringReturn = null;
-		if (model.getPackageText()!=null) {
-			stringReturn = model.getPackageText();
-		} else {
-			Class URLProcessorClass = ClassLoadingUtil
-						.loadClassFromAntClassLoader("org.apache.axis2.util.URLProcessor");
-			Method makePackageNameMethod = URLProcessorClass
-						.getMethod("makePackageName", new Class[]{String.class});
-			stringReturn = makePackageNameMethod.invoke(null, new Object[]{targetNamespace});
-		}
-
-		
-		model.setPackageText(stringReturn.toString());
-		
-		Method setPackageNameMethod = CodeGenConfigurationClass
-					.getMethod("setPackageName", new Class[]{String.class});
-		setPackageNameMethod.invoke(CodeGenConfigurationInstance, new Object[]{stringReturn});
-		
-        //new CodeGenerationEngine(codegenConfig).generate();
-		
-		Class CodeGenerationEngineClass = ClassLoadingUtil
-				.loadClassFromAntClassLoader("org.apache.axis2.wsdl.codegen.CodeGenerationEngine");
-		Constructor CodeGenerationEngineConstructor = CodeGenerationEngineClass
-					.getConstructor(new Class[]{CodeGenConfigurationInstance.getClass()});
-		Object CodeGenerationEngineInstance  = CodeGenerationEngineConstructor
-					.newInstance(new Object[]{CodeGenConfigurationInstance});
-		
-		//Invoke Codegen Method
-		Method generateMethod = CodeGenerationEngineClass.getMethod("generate", null);
-		generateMethod.invoke(CodeGenerationEngineInstance, null);
-      
-		//Copy the existing codegen results to the current project
-        ContentCopyUtils contentCopyUtils = new ContentCopyUtils();
-	    status = contentCopyUtils.copyDirectoryRecursivelyIntoWorkspace(
-	    							tempCodegenOutputLocation, 
-	    							currentDynamicWebProjectDir, 
-	    							monitor, 
-	    							statusHandler);
-      
-	} catch (Exception e) {
-		status = StatusUtils.errorStatus(NLS.bind(
-											Axis2ConsumptionUIMessages.ERROR_CODEGEN_EXCEPTION,
-											new String[]{" : "+e.getCause()}),
-										e);
-		environment.getStatusHandler().reportError(status); 
-	} finally {
-		if (transformerFactoryModified) {
-			// restore to the original TransformerFactory
-			if (transformerFactory == null) {
-				System.clearProperty("javax.xml.transform.TransformerFactory"); 
-			} else {
-				System.setProperty("javax.xml.transform.TransformerFactory", transformerFactory); 
-			}
-		}
-	}
-
-		return status;
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/command/Axis2ClientDefaultingCommand.java b/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/command/Axis2ClientDefaultingCommand.java
deleted file mode 100644
index 1a23ca5..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/command/Axis2ClientDefaultingCommand.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc., 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070205   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070508   175030 sandakith@wso2.com - Lahiru Sandakith, WSDL not passed to Axis2 client fix
- * 20070612   192047 sandakith@wso2.com - Lahiru Sandakith, 192047
- * 20070612   192047 kathy@ca.ibm.com   - Kathy Chan
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.consumption.core.command;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.ws.axis2.consumption.core.data.DataModel;
-import org.eclipse.jst.ws.axis2.consumption.core.utils.DefaultCodegenUtil;
-import org.eclipse.jst.ws.axis2.core.constant.Axis2Constants;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.ws.internal.wsrt.IWebServiceClient;
-
-public class Axis2ClientDefaultingCommand extends AbstractDataModelOperation {
-	
-	DataModel model;
-	private IWebServiceClient ws;
-	IStatus status;
-	
-	public Axis2ClientDefaultingCommand(DataModel model, IWebServiceClient ws){
-		this.model=model;
-		this.ws=ws;
-	}
-
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-		//Default Settings for the Codegeneration
-
-		String wsdlURL = ws.getWebServiceClientInfo().getWsdlURL();
-		model.setWsdlURI(wsdlURL);
-		
-		model.setDatabindingType(Axis2Constants.DATA_BINDING_ADB);
-		model.setASync(false);
-		model.setSync(false);
-		
-		DefaultCodegenUtil defaultCodegenUtil = new DefaultCodegenUtil(model);
-		defaultCodegenUtil.populateModelParamsFromWSDL();
-		
-		status = Status.OK_STATUS;
-		return status;
-	}
-	
-	public DataModel getWebServiceDataModel(){
-		return model;
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/command/Axis2ClientTestCaseIntegrateCommand.java b/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/command/Axis2ClientTestCaseIntegrateCommand.java
deleted file mode 100644
index 46410bf..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/command/Axis2ClientTestCaseIntegrateCommand.java
+++ /dev/null
@@ -1,172 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070518        187311 sandakith@wso2.com - Lahiru Sandakith, Fixing test resource addition
- * 20070608        191055 sandakith@wso2.com - Lahiru Sandakith, Duplicate classpath entry fix
- * 20070824        200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to separate file
- * 20071121        205227 sandakith@wso2.com - Lahiru Sandakith, jUnit problem with project export
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.consumption.core.command;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.internal.core.JavaProject;
-import org.eclipse.jst.ws.axis2.consumption.core.data.DataModel;
-import org.eclipse.jst.ws.axis2.consumption.core.messages.Axis2ConsumptionUIMessages;
-import org.eclipse.jst.ws.axis2.consumption.core.utils.ContentCopyUtils;
-import org.eclipse.jst.ws.axis2.core.constant.Axis2Constants;
-import org.eclipse.jst.ws.axis2.core.utils.FileUtils;
-import org.eclipse.jst.ws.internal.common.J2EEUtils;
-import org.eclipse.wst.common.environment.IEnvironment;
-import org.eclipse.wst.common.environment.IStatusHandler;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.ws.internal.common.BundleUtils;
-
-
-/**
- * This Class will first check whether Axis2 Client will generate the TestCase
- * and if so then it will integrate that test to the initiated dynamic web project
- *
- */
-public class Axis2ClientTestCaseIntegrateCommand extends AbstractDataModelOperation {
-
-    private DataModel model;
-    private IProject project;
-    private boolean testClassPathExists;
-
-    public Axis2ClientTestCaseIntegrateCommand(IProject project_,DataModel model_){
-        this.model = model_;
-        this.project = project_;
-    }
-    
-    public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-        IStatus status = Status.OK_STATUS;
-        String workspaceDirectory = ResourcesPlugin.getWorkspace().getRoot().
-                                                    getLocation().toOSString();
-        // Check whether the service generate test case is enabled
-        if(model.isTestCaseCheck()){
-        	try{
-        	// Then add the latest junit.jar from to the project class path
-        	CopyJUnitJarToProject(workspaceDirectory,monitor);
-
-            // make the test folder as source folder.
-            // Get the Project Handler
-            IJavaProject javaProj = new JavaProject(project,null);
-            // to get existing class path entries
-            IClasspathEntry[] classpathEntries = javaProj.getRawClasspath(); 
-            // increase the class path entries array by 1 to make room for the new source directory
-            // where path is the new source directory
-            IClasspathEntry newClasspathEntry = JavaCore
-                                .newSourceEntry(getPathToTestFolder(project,workspaceDirectory)); 
-           
-            //Check test directory already in the classpath entries.
-            for (int i = 0; i < classpathEntries.length; i++) {
-                if (classpathEntries[i].equals(newClasspathEntry)){
-                	testClassPathExists = true;
-                }
-            }
-            
-            int classPathLength = classpathEntries.length;
-            if(!testClassPathExists){
-            	classPathLength+=1;
-            }
-            IClasspathEntry[] newClasspathEntryArray = new IClasspathEntry[classPathLength];
-            
-            for (int i = 0; i < classpathEntries.length; i++) {
-            	 newClasspathEntryArray[i]= classpathEntries[i];
-            }
-            // if not already exist add new Class Path Entry test directory
-           	if(!testClassPathExists){
-            	newClasspathEntryArray[classPathLength-1] = newClasspathEntry;
-            }
-            javaProj.setRawClasspath(newClasspathEntryArray,monitor);
-           
-            } catch (JavaModelException e) {
-                throw new ExecutionException(e.getMessage());
-            } catch (IOException e) {
-            	 throw new ExecutionException(e.getMessage());
-			}
-        }
-
-        return status;
-       
-    }
-   
-    /**
-     * Copy the JUnit jar from the framework location to the project classpath.
-     * @param workspace
-     * @return absolute path location of the copying file
-     * @throws ExecutionException
-     * @throws IOException
-     */
-    private String CopyJUnitJarToProject(String workspace, IProgressMonitor monitor) 
-                                                           throws ExecutionException, IOException {
-    	File relativeWebInfJunitFile = new File(FileUtils.addAnotherNodeToPath(
-    												J2EEUtils.getWebInfPath(project).toOSString(),
-    												Axis2Constants.DIR_LIB+File.separator+
-    												Axis2Constants.JUNIT_JAR));
-    	
-    	File obsaluteWebInfJunitFile = new File(FileUtils.addAnotherNodeToPath(
-    														workspace, 
-    														relativeWebInfJunitFile.toString()));
-    	IEnvironment environment = getEnvironment();
-		IStatusHandler statusHandler = environment.getStatusHandler();	
-    	ContentCopyUtils contentCopyUtils = new ContentCopyUtils();
-    	contentCopyUtils.copyDirectoryRecursivelyIntoWorkspace(
-    			getFrameworkJunitFile().getAbsolutePath(),
-    			obsaluteWebInfJunitFile.getAbsolutePath(), 
-    			monitor, statusHandler);
-		return obsaluteWebInfJunitFile.getAbsolutePath();
-	}
-
-    /**
-     * returns the Framework JUnit File location.
-     * @return
-     * @throws ExecutionException
-     */
-	private File getFrameworkJunitFile() throws ExecutionException {
-    	IPath junitJarPath=BundleUtils.getJarredPluginPath(Axis2Constants.JUNIT_BUNDLE);
-    	if (junitJarPath != null){
-    		return new File(FileUtils.addAnotherNodeToPath(junitJarPath.toOSString(),
-    				Axis2Constants.JUNIT_JAR));
-    	}else{
-    		throw new ExecutionException(Axis2ConsumptionUIMessages.ERROR_JUNIT_JAR_NOT_FOUND);
-    	}
-    }
-
-	/**
-	 * returns the path to the newly generated test folder 
-	 * @param project
-	 * @param workspace
-	 * @return IPath to the test folder
-	 */
-    private IPath getPathToTestFolder(IProject project, String workspace) {
-        String pathToTest = project.getFullPath().toOSString() + File.separator
-                            + Axis2Constants.DIR_TEST;
-        IPath pathToTestFolder = new Path(pathToTest);
-        return pathToTestFolder;
-    }
-   
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/command/Axis2WebservicesServerCommand.java b/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/command/Axis2WebservicesServerCommand.java
deleted file mode 100644
index f9acee7..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/command/Axis2WebservicesServerCommand.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20080114   209411 sandakith@wso2.com - Lahiru Sandakith, Fix for the 209411, ?wsdl not update 
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.consumption.core.command;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.ws.axis2.consumption.core.data.DataModel;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-
-public class Axis2WebservicesServerCommand extends
-AbstractDataModelOperation {
-
-	String project;
-	DataModel model;
-	public Axis2WebservicesServerCommand(DataModel model, String project){
-		this.model=model;
-		this.project = project;
-	}
-
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info)
-	throws ExecutionException {
-		IStatus status = Status.OK_STATUS;
-		model.setWebProjectName(project);
-		return status;
-	}
-	
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/data/DataModel.java b/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/data/DataModel.java
deleted file mode 100644
index bcc76db..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/data/DataModel.java
+++ /dev/null
@@ -1,109 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.consumption.core.data;
-
-public class DataModel extends Model{
-	
-	//Consumption DataModel Parameters
-	
-	private String 	serviceClass;
-	private String 	databindingType;
-	private String 	namespaseToPackageMapping;
-	//Default setting is to generate both sync and async
-	private boolean	Sync = false; 
-	private boolean	ASync = false;
-	private boolean generateAllCheck = false;
-	private boolean testCaseCheck = false;
-
-	
-	public String getDatabindingType() {
-		return databindingType;
-	}
-	public void setDatabindingType(String databindingType) {
-		this.databindingType = databindingType;
-	}
-	public boolean isGenerateAllCheck() {
-		return generateAllCheck;
-	}
-	public void setGenerateAllCheck(boolean generateAllCheck) {
-		this.generateAllCheck = generateAllCheck;
-	}
-	public String getNamespaseToPackageMapping() {
-		return namespaseToPackageMapping;
-	}
-	public void setNamespaseToPackageMapping(String namespaseToPackageMapping) {
-		this.namespaseToPackageMapping = namespaseToPackageMapping;
-	}
-
-	public String getPackageText() {
-		return super.getPackageText();
-	}
-
-	public void setPackageText(String packageText) {
-		super.setPackageText(packageText);
-	}
-	
-	public String getPortName() {
-		return super.getPortName();
-	}
-
-	public void setPortName(String portName) {
-		super.setPortName(portName);
-	}
-	
-	public String getServiceClass() {
-		return serviceClass;
-	}
-	public void setServiceClass(String serviceClass) {
-		this.serviceClass = serviceClass;
-	}
-
-	public String getServiceName() {
-		return super.getServiceName();
-	}
-
-	public void setServiceName(String serviceName) {
-		super.setServiceName(serviceName);
-	}
-	
-	public String getWsdlURI() {
-		return super.getWsdlURI();
-	}
-
-	public void setWsdlURI(String wsdlURI) {
-		super.setWsdlURI(wsdlURI);
-	}
-	
-	public boolean isASync() {
-		return ASync;
-	}
-	public void setASync(boolean async) {
-		ASync = async;
-	}
-	public boolean isSync() {
-		return Sync;
-	}
-	public void setSync(boolean sync) {
-		Sync = sync;
-	}
-	public boolean isTestCaseCheck() {
-		return testCaseCheck;
-	}
-	public void setTestCaseCheck(boolean testCaseCheck) {
-		this.testCaseCheck = testCaseCheck;
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/data/Model.java b/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/data/Model.java
deleted file mode 100644
index 221b777..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/data/Model.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070213   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.consumption.core.data;
-
-public class Model {
-	
-	private String  webProjectName;
-	
-	private boolean serverStatus;
-	private String  wsdlURI;
-	private String portName;
-	private String serviceName;
-	private String packageText;
-	
-	public String getPackageText() {
-		return packageText;
-	}
-	public void setPackageText(String packageText) {
-		this.packageText = packageText;
-	}
-	public String getPortName() {
-		return portName;
-	}
-	public void setPortName(String portName) {
-		this.portName = portName;
-	}
-	public String getServiceName() {
-		return serviceName;
-	}
-	public void setServiceName(String serviceName) {
-		this.serviceName = serviceName;
-	}
-	public String getWsdlURI() {
-		return wsdlURI;
-	}
-	public void setWsdlURI(String wsdlURI) {
-		this.wsdlURI = wsdlURI;
-	}
-	public boolean getServerStatus() {
-		return serverStatus;
-	}
-	public void setServerStatus(boolean b) {
-		this.serverStatus = b;
-	}
-	
-	public String getWebProjectName() {
-		return webProjectName;
-	}
-	public void setWebProjectName(String webProjectName) {
-		this.webProjectName = webProjectName;
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/messages/Axis2ConsumptionUI.properties b/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/messages/Axis2ConsumptionUI.properties
deleted file mode 100644
index 6d98265..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/messages/Axis2ConsumptionUI.properties
+++ /dev/null
@@ -1,43 +0,0 @@
-###############################################################################
-# Copyright (c) 2007, 2008 WSO2 Inc. 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:
-# WSO2 Inc. - initial API and implementation
-# yyyymmdd bug      Email and other contact information
-# -------- -------- -----------------------------------------------------------
-# 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduce the Axis2 
-#										 runtime to the framework for 168762
-# 20070511   186440 sandakith@wso2.com - Lahiru Sandakith fix 186440
-# 20070517   187307 sandakith@wso2.com - Lahiru Sandakith
-# 20070518   187311 sandakith@wso2.com - Lahiru Sandakith, Fixing test resource addition
-# 20070601   190505 pmoogk@ca.ibm.com - Peter Moogk
-# 20080116   209411 sandakith@wso2.com - Lahiru Sandakith, Introduced for the Fix 209411
-# 20080130   216997 katep@wso2.com - Kate Price
-###############################################################################
-
-
-LABEL_SERVICE_NAME_CAPTION=Service Name
-LABEL_GENERATE_TESTCASE_CAPTION=Generate a JUnit test case to test the service
-LABEL_DATABINDING_CAPTION=Databinding
-LABEL_PORTNAME=Port Name
-LABEL_GENERATE_ALL=Generate all types for all elements referred to by schemas
-LABEL_PACKEGE_NAME=Custom package name
-LABEL_NAMESPACE=Namespace
-LABEL_PACKAGE=Package
-LABEL_CLIENT_SIDE=Client mode
-LABEL_SYNC_AND_ASYNC=Generate a client which supports both synchronous and asynchronous invocation
-LABEL_SYNC=Generate a synchronous client
-LABEL_ASYNC=Generate an asynchronous client
-
-PAGE_TITLE_WS_AXIS2_PROXY=Axis2 Client Web Service Configuration 
-PAGE_DESC_WS_AXIS2_PROXY=Select the appropriate code generation settings 
-
-ERROR_INVALID_FILE_READ_WRITEL=Exception occurred while reading or writing files {0}
-ERROR_INVALID_WSDL_FILE_READ_WRITEL=Exception occurred while reading or writing WSDL {0}
-ERROR_CODEGEN_EXCEPTION=Exception occurred during code generation for WSDL {0}
-ERROR_JUNIT_JAR_NOT_FOUND=Exception occurred while copying junit.jar
-ERROR_WSDL_PING_TIME_OUT=Could not retrieve the WSDL. Timeout occurred.
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/messages/Axis2ConsumptionUIMessages.java b/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/messages/Axis2ConsumptionUIMessages.java
deleted file mode 100644
index cc3d2ef..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/messages/Axis2ConsumptionUIMessages.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 runtime to the framework for 168762
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070511   186440 sandakith@wso2.com - Lahiru Sandakith fix 186440
- * 20070517   187307 sandakith@wso2.com - Lahiru Sandakith
- * 20070518   187311 sandakith@wso2.com - Lahiru Sandakith, Fixing test resource addition
- * 20070601   190505 pmoogk@ca.ibm.com - Peter Moogk
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- * 20080116    sandakith@wso2.com - Lahiru Sandakith, Introduced for the Fix 209411
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.consumption.core.messages;
-
-import org.eclipse.osgi.util.NLS;
-
-public final class Axis2ConsumptionUIMessages extends NLS {
-
-	private static final String BUNDLE_NAME = 
-		"org.eclipse.jst.ws.axis2.consumption.core.messages.Axis2ConsumptionUI";//$NON-NLS-1$
-	
-	private Axis2ConsumptionUIMessages() {
-		// Do not instantiate
-	}
-
-	public static String LABEL_SERVICE_NAME_CAPTION;
-	public static String LABEL_GENERATE_TESTCASE_CAPTION;
-	public static String LABEL_DATABINDING_CAPTION;
-	public static String LABEL_PORTNAME;
-	public static String LABEL_GENERATE_ALL;
-	public static String LABEL_PACKEGE_NAME;
-	public static String LABEL_NAMESPACE;
-	public static String LABEL_PACKAGE;
-	public static String LABEL_CLIENT_SIDE;
-	public static String LABEL_SYNC_AND_ASYNC;
-	public static String LABEL_SYNC;
-	public static String LABEL_ASYNC;
-	
-	public static String PAGE_TITLE_WS_AXIS2_PROXY;
-	public static String PAGE_DESC_WS_AXIS2_PROXY;
-	
-	public static String ERROR_INVALID_FILE_READ_WRITEL;
-	public static String ERROR_INVALID_WSDL_FILE_READ_WRITEL;
-	public static String ERROR_CODEGEN_EXCEPTION;
-	public static String ERROR_JUNIT_JAR_NOT_FOUND;
-	public static String ERROR_WSDL_PING_TIME_OUT;
-	
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, Axis2ConsumptionUIMessages.class);
-	}
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/plugin/WebServiceAxis2ConsumptionCorePlugin.java b/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/plugin/WebServiceAxis2ConsumptionCorePlugin.java
deleted file mode 100644
index 669cbc2..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/plugin/WebServiceAxis2ConsumptionCorePlugin.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.consumption.core.plugin;
-
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class WebServiceAxis2ConsumptionCorePlugin extends AbstractUIPlugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.jst.ws.axis2.consumption.core";
-
-	// The shared instance
-	private static WebServiceAxis2ConsumptionCorePlugin plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public WebServiceAxis2ConsumptionCorePlugin() {
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static WebServiceAxis2ConsumptionCorePlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/utils/ContentCopyUtils.java b/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/utils/ContentCopyUtils.java
deleted file mode 100644
index b026b93..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/utils/ContentCopyUtils.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070118   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 runtime to the framework for 168762
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.consumption.core.utils;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.ws.axis2.consumption.core.messages.Axis2ConsumptionUIMessages;
-import org.eclipse.jst.ws.internal.plugin.WebServicePlugin;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.command.internal.env.core.common.StatusUtils;
-import org.eclipse.wst.command.internal.env.core.context.ResourceContext;
-import org.eclipse.wst.common.environment.IStatusHandler;
-
-public class ContentCopyUtils {
-
-	private List fileAndDirectoriesList = new ArrayList();
-	FileInputStream finStream = null;		
-
-	/**
-	 * This method will copy the source directory into the eclipse workspace according 
-	 * to the Eclipse Framework API
-	 * @param sourceDir
-	 * @param destinationDir
-	 * @param monitor
-	 * @param statusHandler
-	 * @return
-	 */
-	public IStatus copyDirectoryRecursivelyIntoWorkspace(String sourceDir, 
-				String destinationDir,
-				IProgressMonitor monitor,
-				IStatusHandler statusHandler) {
-		IStatus status = Status.OK_STATUS;
-		fileAndDirectoriesList.clear();
-		File axis2WebappFolder = new File(sourceDir);
-		visitAllDirsAndFiles(axis2WebappFolder);
-		List deployFiles = new ArrayList();
-		deployFiles= fileAndDirectoriesList;
-
-		try {
-
-			//Import the axis2 dependency plugin according to the Resources API of eclipse 
-			ResourceContext context = WebServicePlugin.getInstance().getResourceContext();	
-
-			IPath outputPath = new Path (destinationDir);
-
-			String fileName;
-			IPath targetPath=null;
-			boolean isDirectory = false;
-
-			String deployFile;
-			Iterator iterator;
-
-			String tempOutputDir = axis2WebappFolder.toString();
-			iterator = deployFiles.iterator();
-			while (iterator.hasNext()) {
-				deployFile = (String) iterator.next();
-				File source = new File(deployFile);
-				if (source.isDirectory()) {
-					isDirectory =true;
-				}else{
-					isDirectory=false;
-					finStream = new FileInputStream(source);
-				}
-
-				if (deployFile.startsWith(tempOutputDir)) {
-					fileName = deployFile.substring(tempOutputDir.length());
-					targetPath = outputPath.append(fileName).makeAbsolute();
-					if (isDirectory){
-						org.eclipse.wst.command.internal.env.common.FileResourceUtils
-						.makeFolderPathAtLocation(context,  
-								targetPath,
-								monitor,
-								statusHandler);
-					}else{
-						if (finStream != null) {
-							org.eclipse.wst.command.internal.env.common.FileResourceUtils
-							.createFileAtLocation(context,  
-									targetPath,
-									finStream,
-									monitor,
-									statusHandler);
-						}
-						finStream.close();
-					}
-				}
-			}
-		} catch (IOException e) {
-			status = StatusUtils.errorStatus(
-					NLS.bind(Axis2ConsumptionUIMessages.ERROR_INVALID_FILE_READ_WRITEL,
-							new String[]{e.getLocalizedMessage()}), e);
-		} catch (CoreException e) {
-			status = StatusUtils.errorStatus(
-					NLS.bind(Axis2ConsumptionUIMessages.ERROR_INVALID_FILE_READ_WRITEL,
-							new String[]{e.getLocalizedMessage()}), e);
-		}
-
-		return status;
-
-	}
-
-	//	Process all files and directories under dir
-	private void visitAllDirsAndFiles(File dir) {
-
-		fileAndDirectoriesList.add(dir.getAbsolutePath());
-
-		if (dir.isDirectory()) {
-			String[] children = dir.list();
-			for (int i=0; i<children.length; i++) {
-				visitAllDirsAndFiles(new File(dir, children[i]));
-			}
-		}
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/utils/DefaultCodegenUtil.java b/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/utils/DefaultCodegenUtil.java
deleted file mode 100644
index 79054a3..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/utils/DefaultCodegenUtil.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070206   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.consumption.core.utils;
-
-import java.lang.reflect.Method;
-import java.util.List;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.ws.axis2.consumption.core.data.Model;
-import org.eclipse.jst.ws.axis2.consumption.core.messages.Axis2ConsumptionUIMessages;
-import org.eclipse.jst.ws.axis2.core.utils.ClassLoadingUtil;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.command.internal.env.core.common.StatusUtils;
-
-public class DefaultCodegenUtil {
-	
-	private WSDLPropertyReader reader;
-	private Model model;
-	private List serviceQNameList = null;
-	IStatus status;
-	
-	public DefaultCodegenUtil(org.eclipse.jst.ws.axis2.consumption.core.data.DataModel model){
-		this.model=model;
-	}
-	
-	public DefaultCodegenUtil(org.eclipse.jst.ws.axis2.creation.core.data.DataModel model){
-		this.model=model;
-	}
-
-	/**
-	 * populate the model for the default scenario from the wsdl url
-	 */
-	public void populateModelParamsFromWSDL() {
-		status = Status.OK_STATUS;
-		if (reader == null)
-			reader = new WSDLPropertyReader();
-		try {
-			String lname = model.getWsdlURI();
-			if (!"".equals(lname.trim())) {
-
-				reader.readWSDL(model.getWebProjectName(), lname);
-
-				this.serviceQNameList = reader.getServiceList();
-				if (!serviceQNameList.isEmpty()) {
-					// add the local part of the
-					Object serviceQnameInstance = serviceQNameList.get(0);
-					Class QNameClass = ClassLoadingUtil
-							.loadClassFromAntClassLoader("javax.xml.namespace.QName");
-					Method GetLocalPartMethod  = QNameClass.getMethod("getLocalPart", null);
-					Object resultLocalPart = GetLocalPartMethod.invoke(serviceQnameInstance, null);
-					model.setServiceName(resultLocalPart.toString());
-					// load the ports
-					 loadPortNames();
-				} 
-				populatePackageName();
-				//populate the namespacess
-				//loadNamespaces(reader.getDefinitionNamespaceMap());
-			}
-		} catch (Exception e) {
-			status = StatusUtils.errorStatus(NLS.bind(
-					Axis2ConsumptionUIMessages.ERROR_INVALID_WSDL_FILE_READ_WRITEL,
-					new String[]{e.getLocalizedMessage()}), e);
-		}
-	}
-	
-	private void loadPortNames() {
-			java.util.List ports = reader.getPortNameList(serviceQNameList.get(0));
-					// add the local part of the
-					model.setPortName(ports.get(0).toString());
-	}
-	
-	private void populatePackageName() {
-		model.setPackageText(reader.packageFromTargetNamespace());
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/utils/ServicePingUtil.java b/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/utils/ServicePingUtil.java
deleted file mode 100644
index 542b598..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/utils/ServicePingUtil.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20080116    sandakith@wso2.com - Lahiru Sandakith, Introduced for the Fix 209411
- *                                                    WSDL retrieval issue
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.consumption.core.utils;
-
-import java.io.IOException;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.net.URLConnection;
-
-import org.eclipse.jst.ws.axis2.consumption.core.messages.Axis2ConsumptionUIMessages;
-
-/**
- * Utility class for the service ping
- */
-public class ServicePingUtil {
-	/**
-	 * WSDL Retrieve Timeout
-	 */
-	int timeTORetrieveWSDL = 10000 ; // Default is 10 sec 
-	
-	/**
-	 * Utility method to connect to a particular URL
-	 * @param url
-	 */
-	public void connectToURL(String urlString) throws Exception{
-		URL url = new URL(urlString);
-        long start = System.currentTimeMillis();
-        while (true) {
-            try {
-                URLConnection urlCon;
-                urlCon = url.openConnection();
-                // TODO handle the HTTPS scenario as well. 
-                if (urlCon instanceof HttpURLConnection) {
-                	HttpURLConnection httpCon = (HttpURLConnection)urlCon;
-                    httpCon.setDoOutput(true);
-                    httpCon.setDoInput(true);
-                    httpCon.setUseCaches(false);
-                    httpCon.setRequestMethod("GET");
-                    HttpURLConnection.setFollowRedirects(true);  
-                    httpCon.setReadTimeout(timeTORetrieveWSDL);
-                    httpCon.connect();  // try to connect to WSDL
-                    httpCon.disconnect();
-				} else {
-					// Do nothing 
-					// Assume that this is in the local file system
-				}
-                break;
-            } catch (IOException e) {
-                if(System.currentTimeMillis() - start >= timeTORetrieveWSDL){
-                    throw new IOException(Axis2ConsumptionUIMessages.ERROR_WSDL_PING_TIME_OUT);
-                }
-                Thread.sleep(1000);
-            }
-        }
-	}
-
-	/**
-	 * Set the WSDL read timeout 
-	 * @param timeTORetrieveWSDL 
-	 */
-	public void setTimeTORetrieveWSDL(int timeTORetrieveWSDL) {
-		this.timeTORetrieveWSDL = timeTORetrieveWSDL;
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/utils/WSDL2JavaGenerator.java b/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/utils/WSDL2JavaGenerator.java
deleted file mode 100644
index c05c86f..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/utils/WSDL2JavaGenerator.java
+++ /dev/null
@@ -1,397 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070118   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070507   184729 sandakith@wso2.com - Lahiru Sandakith
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.consumption.core.utils;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-import org.eclipse.jst.ws.axis2.core.utils.ClassLoadingUtil;
-
-public class WSDL2JavaGenerator {
-	
-    /**
-     * Maps a string containing the name of a language to a constant defined in 
-     * CommandLineOptionConstants.LanguageNames
-     * @param UILangValue a string containg a language, e.g. "java", "cs", "cpp" or "vb"
-     * @return a normalized string constant
-     */
-    private String mapLanguagesWithCombo(String UILangValue)  {
-       return UILangValue;
-    }
-    /**
-     * Creates a list of parameters for the code generator based on the decisions made by 
-     * the user on the OptionsPage(page2). For each setting, there is a Command-Line option for 
-     * the Axis2 code generator.
-     * @return a Map with keys from CommandLineOptionConstants with the values entered 
-     * by the user on the Options Page.
-     */
-    public Map fillOptionMap(boolean isAyncOnly,
-            		  boolean isSyncOnly,
-            		  boolean isServerSide,
-            		  boolean isServerXML,
-            		  boolean isTestCase,
-            		  boolean isGenerateAll,
-            		  String serviceName,
-            		  String portName,
-            		  String databindingName,
-            		  String WSDLURI,
-            		  String packageName,
-            		  String selectedLanguage,
-            		  String outputLocation,
-            		  String namespace2packageList,
-            		  boolean isServerSideInterface
-            		  ){
-       Map optionMap = new HashMap();
-       
-     try{  
-        //Reflection invocatin resources
-		Class CommandLineOptionConstantsClass = ClassLoadingUtil.loadClassFromAntClassLoader(
-							"org.apache.axis2.util.CommandLineOptionConstants$WSDL2JavaConstants");
-		Class CommandLineOptionClass = ClassLoadingUtil.loadClassFromAntClassLoader(
-														"org.apache.axis2.util.CommandLineOption");
-		Constructor CommandLineOptionConstructor = CommandLineOptionClass.getConstructor(
-														new Class[]{String.class,String[].class});
-        //WSDL file name
-       
-							//       optionMap.put(CommandLineOptionConstants.WSDL2JavaConstants.WSDL_LOCATION_URI_OPTION, 
-							//    		   		 new CommandLineOption(
-							//    		   				 CommandLineOptionConstants.WSDL2JavaConstants.WSDL_LOCATION_URI_OPTION,
-							//    		   				 getStringArray(WSDLURI)));
-		
-        //Reflection Invocation 
-		Field WSDL_LOCATION_URI_OPTION_FIELD = CommandLineOptionConstantsClass.getField(
-																		"WSDL_LOCATION_URI_OPTION");
-		optionMap.put((String)WSDL_LOCATION_URI_OPTION_FIELD.get(String.class),
-						CommandLineOptionConstructor.newInstance(
-							new Object[]{(String)WSDL_LOCATION_URI_OPTION_FIELD.get(String.class),
-							getStringArray(WSDLURI)}));
-       
-       //Async only
-       if (isAyncOnly)
-       {
-							//          optionMap.put(CommandLineOptionConstants.WSDL2JavaConstants.CODEGEN_ASYNC_ONLY_OPTION, 
-							//        		  	new CommandLineOption(
-							//        		  			CommandLineOptionConstants.WSDL2JavaConstants.CODEGEN_ASYNC_ONLY_OPTION,
-							//        		  			new String[0]));
-        
-    	//Reflection Invocation     	   
-   		Field CODEGEN_ASYNC_ONLY_OPTION_FIELD = CommandLineOptionConstantsClass
-   												.getField("CODEGEN_ASYNC_ONLY_OPTION");
-		optionMap.put((String)CODEGEN_ASYNC_ONLY_OPTION_FIELD.get(
-						String.class),
-						CommandLineOptionConstructor.newInstance(
-							new Object[]{(String)CODEGEN_ASYNC_ONLY_OPTION_FIELD.get(String.class),
-							new String[0]}));
-       }
-       
-       //sync only
-       if (isSyncOnly)
-       {
-							//          optionMap.put(CommandLineOptionConstants.WSDL2JavaConstants.CODEGEN_SYNC_ONLY_OPTION, 
-							//        		  new CommandLineOption(
-							//        		  CommandLineOptionConstants.WSDL2JavaConstants.CODEGEN_SYNC_ONLY_OPTION,
-							//        		  new String[0]));
-       //Reflection Invocation
-      		Field CODEGEN_SYNC_ONLY_OPTION_FIELD = CommandLineOptionConstantsClass
-      												.getField("CODEGEN_SYNC_ONLY_OPTION");
-    		optionMap.put((String)CODEGEN_SYNC_ONLY_OPTION_FIELD.get(String.class),
-					CommandLineOptionConstructor.newInstance(
-							new Object[]{(String)CODEGEN_SYNC_ONLY_OPTION_FIELD.get(String.class),
-							new String[0]}));
-       }
-       //serverside
-       if (isServerSide)
-       {
-							//          optionMap.put(CommandLineOptionConstants.WSDL2JavaConstants.SERVER_SIDE_CODE_OPTION, 
-							//        		  new CommandLineOption(
-							//        		  CommandLineOptionConstants.WSDL2JavaConstants.SERVER_SIDE_CODE_OPTION,
-							//        		  new String[0]));
-	    //Reflection Invocation
-		Field SERVER_SIDE_CODE_OPTION_FIELD = CommandLineOptionConstantsClass
-												.getField("SERVER_SIDE_CODE_OPTION");
-		optionMap.put((String)SERVER_SIDE_CODE_OPTION_FIELD.get(String.class),
-				CommandLineOptionConstructor.newInstance(
-						new Object[]{(String)SERVER_SIDE_CODE_OPTION_FIELD.get(String.class),
-						new String[0]}));
-          //server xml
-          if (isServerXML)
-          {
-          //optionMap.put(
-							//            		 CommandLineOptionConstants.WSDL2JavaConstants.GENERATE_SERVICE_DESCRIPTION_OPTION,
-          // 	new CommandLineOption(
-          // 	CommandLineOptionConstants.WSDL2JavaConstants.GENERATE_SERVICE_DESCRIPTION_OPTION,
-							//            		 new String[0]));
-       		Field GENERATE_SERVICE_DESCRIPTION_OPTION_FIELD = CommandLineOptionConstantsClass
-   												.getField("GENERATE_SERVICE_DESCRIPTION_OPTION");
-    		optionMap.put((String)GENERATE_SERVICE_DESCRIPTION_OPTION_FIELD.get(String.class),
-				CommandLineOptionConstructor.newInstance(
-				   new Object[]{(String)GENERATE_SERVICE_DESCRIPTION_OPTION_FIELD.get(String.class),
-				   new String[0]}));
-          }
-          if (isGenerateAll){
-							//              optionMap.put(CommandLineOptionConstants.WSDL2JavaConstants.GENERATE_ALL_OPTION, 
-							//            		  new CommandLineOption(
-							//            		  CommandLineOptionConstants.WSDL2JavaConstants.GENERATE_ALL_OPTION,
-							//            		  new String[0]));
-			Field GENERATE_ALL_OPTION_FIELD = CommandLineOptionConstantsClass
-														.getField("GENERATE_ALL_OPTION");
-			optionMap.put((String)GENERATE_ALL_OPTION_FIELD.get(String.class),
-					CommandLineOptionConstructor.newInstance(
-							new Object[]{(String)GENERATE_ALL_OPTION_FIELD.get(String.class),
-							new String[0]}));
-          }
-       }
-       //test case
-       if (isTestCase)
-       {
-							//          optionMap.put(CommandLineOptionConstants.WSDL2JavaConstants.GENERATE_TEST_CASE_OPTION,
-							//        		  new CommandLineOption(
-							//        		  CommandLineOptionConstants.WSDL2JavaConstants.GENERATE_TEST_CASE_OPTION,
-							//        		  new String[0]));
-		Field GENERATE_TEST_CASE_OPTION_FIELD = CommandLineOptionConstantsClass
-													.getField("GENERATE_TEST_CASE_OPTION");
-		optionMap.put((String)GENERATE_TEST_CASE_OPTION_FIELD.get(String.class),
-				CommandLineOptionConstructor.newInstance(
-						new Object[]{(String)GENERATE_TEST_CASE_OPTION_FIELD.get(String.class),
-						new String[0]}));
-       }
-       //package name
-							//       optionMap.put(CommandLineOptionConstants.WSDL2JavaConstants.PACKAGE_OPTION,
-							//    		   new CommandLineOption(
-							//    		   CommandLineOptionConstants.WSDL2JavaConstants.PACKAGE_OPTION,
-							//    		   getStringArray(packageName)));
- 		Field PACKAGE_OPTION_FIELD = CommandLineOptionConstantsClass.getField("PACKAGE_OPTION");
-		optionMap.put((String)PACKAGE_OPTION_FIELD.get(String.class),
-							CommandLineOptionConstructor.newInstance(
-									new Object[]{(String)PACKAGE_OPTION_FIELD.get(String.class),
-									getStringArray(packageName)}));
-		
-       //selected language
-							//       optionMap.put(CommandLineOptionConstants.WSDL2JavaConstants.STUB_LANGUAGE_OPTION,
-							//    		   new CommandLineOption(
-							//    		   CommandLineOptionConstants.WSDL2JavaConstants.STUB_LANGUAGE_OPTION,
-							//    		   getStringArray(mapLanguagesWithCombo(selectedLanguage))));
- 		Field STUB_LANGUAGE_OPTION_FIELD = CommandLineOptionConstantsClass
- 															.getField("STUB_LANGUAGE_OPTION");
-		optionMap.put((String)STUB_LANGUAGE_OPTION_FIELD.get(String.class),
-							CommandLineOptionConstructor.newInstance(
-								new Object[]{(String)STUB_LANGUAGE_OPTION_FIELD.get(String.class),
-								getStringArray(mapLanguagesWithCombo(selectedLanguage))}));
-		
-       //output location
-							//       optionMap.put(CommandLineOptionConstants.WSDL2JavaConstants.OUTPUT_LOCATION_OPTION,
-							//    		   new CommandLineOption(
-							//    		   CommandLineOptionConstants.WSDL2JavaConstants.OUTPUT_LOCATION_OPTION,
-							//    		   getStringArray(outputLocation)));
- 		Field OUTPUT_LOCATION_OPTION_FIELD = CommandLineOptionConstantsClass
- 														.getField("OUTPUT_LOCATION_OPTION");
-		optionMap.put((String)OUTPUT_LOCATION_OPTION_FIELD.get(String.class),
-							CommandLineOptionConstructor.newInstance(
-								new Object[]{(String)OUTPUT_LOCATION_OPTION_FIELD.get(String.class),
-								getStringArray(outputLocation)}));
-       
-      //databinding
-							//       optionMap.put(CommandLineOptionConstants.WSDL2JavaConstants.DATA_BINDING_TYPE_OPTION,
-							//    		   new CommandLineOption(
-							//    		   CommandLineOptionConstants.WSDL2JavaConstants.DATA_BINDING_TYPE_OPTION,
-							//    		   getStringArray(databindingName)));
- 		Field DATA_BINDING_TYPE_OPTION_FIELD = CommandLineOptionConstantsClass
- 													.getField("DATA_BINDING_TYPE_OPTION");
-		optionMap.put((String)DATA_BINDING_TYPE_OPTION_FIELD.get(String.class),
-							CommandLineOptionConstructor.newInstance(
-							  new Object[]{(String)DATA_BINDING_TYPE_OPTION_FIELD.get(String.class),
-							  getStringArray(databindingName)}));
-       
-       //port name
-       if (portName!=null){
-							//	       optionMap.put(CommandLineOptionConstants.WSDL2JavaConstants.PORT_NAME_OPTION,
-							//	    		   new CommandLineOption(
-							//	    		   CommandLineOptionConstants.WSDL2JavaConstants.PORT_NAME_OPTION,
-							//	    		   getStringArray(portName)));
-     		Field PORT_NAME_OPTION_FIELD = CommandLineOptionConstantsClass
-     														.getField("PORT_NAME_OPTION");
-    		optionMap.put((String)PORT_NAME_OPTION_FIELD.get(String.class),
-    						CommandLineOptionConstructor.newInstance(
-    								new Object[]{(String)PORT_NAME_OPTION_FIELD.get(String.class),
-    								getStringArray(portName)}));
-       }
-       //service name
-       if (serviceName!= null){
-							//	       optionMap.put(CommandLineOptionConstants.WSDL2JavaConstants.SERVICE_NAME_OPTION,
-							//	    		   new CommandLineOption(
-							//	    		   CommandLineOptionConstants.WSDL2JavaConstants.SERVICE_NAME_OPTION,
-							//	    		   getStringArray(serviceName)));
-     		Field SERVICE_NAME_OPTION_FIELD = CommandLineOptionConstantsClass
-     													.getField("SERVICE_NAME_OPTION");
-    		optionMap.put((String)SERVICE_NAME_OPTION_FIELD.get(String.class),
-    					CommandLineOptionConstructor.newInstance(
-    							new Object[]{(String)SERVICE_NAME_OPTION_FIELD.get(String.class),
-    									getStringArray(serviceName)}));
-       }
-       //ns2pkg mapping
-       if (namespace2packageList!= null){
-							//	       optionMap.put(CommandLineOptionConstants.WSDL2JavaConstants.NAME_SPACE_TO_PACKAGE_OPTION,
-							//	    		   new CommandLineOption(
-							//	    		   CommandLineOptionConstants.WSDL2JavaConstants.NAME_SPACE_TO_PACKAGE_OPTION
-							//	    		   , getStringArray(namespace2packageList)));
-     		Field NAME_SPACE_TO_PACKAGE_OPTION_FIELD = CommandLineOptionConstantsClass
-     											.getField("NAME_SPACE_TO_PACKAGE_OPTION");
-    		optionMap.put((String)NAME_SPACE_TO_PACKAGE_OPTION_FIELD.get(String.class),
-    				CommandLineOptionConstructor.newInstance(
-    					new Object[]{(String)NAME_SPACE_TO_PACKAGE_OPTION_FIELD.get(String.class),
-    					getStringArray(namespace2packageList)}));
-       }
-       
-       //server side interface  mapping
-       if (isServerSideInterface){
-							//	       optionMap.put(CommandLineOptionConstants.WSDL2JavaConstants.SERVER_SIDE_INTERFACE_OPTION,
-							//	    		   new CommandLineOption(
-							//	    		   CommandLineOptionConstants.WSDL2JavaConstants.SERVER_SIDE_INTERFACE_OPTION,
-							//	    		   new String[0]));
-     		Field SERVER_SIDE_INTERFACE_OPTION_FIELD = CommandLineOptionConstantsClass
-     											.getField("SERVER_SIDE_INTERFACE_OPTION");
-    		optionMap.put((String)SERVER_SIDE_INTERFACE_OPTION_FIELD.get(String.class),
-    				CommandLineOptionConstructor.newInstance(
-    					new Object[]{(String)SERVER_SIDE_INTERFACE_OPTION_FIELD.get(String.class),
-    					new String[0]}));
-       }
-       
-     }catch(Exception e){
-    	 e.printStackTrace();
-     }
-       return optionMap;
-       
-    }
-    
-    public String getBaseUri(String wsdlURI){
-    	
-    	try {
-			URL url;
-			if (wsdlURI.indexOf("://")==-1){
-				url = new URL("file","",wsdlURI);
-			}else{
-				url = new URL(wsdlURI);	
-			}
-
-			
-			String baseUri;
-			if ("file".equals(url.getProtocol())){
-				baseUri = new File(url.getFile()).getParentFile().toURL().toExternalForm();
-			}else{
-				baseUri = url.toExternalForm().substring(0,
-						url.toExternalForm().lastIndexOf("/")
-				);
-			}
-		
-			
-			return baseUri;
-		} catch (MalformedURLException e) {
-			throw new RuntimeException(e);
-		}
-    }
-    
-    /**
-     * Reads the WSDL Object Model from the given location.
-     * 
-     * @param wsdlURI the filesystem location (full path) of the WSDL file to read in.
-     * @return the WSDLDescription object containing the WSDL Object Model of the given WSDL file
-     * @throws WSDLException when WSDL File is invalid
-     * @throws IOException on errors reading the WSDL file
-     */
-    public Object getAxisService(String wsdlURI) throws Exception{
-    	
-    		URL url;
-			if (wsdlURI.indexOf("://")==-1){
-				url = new URL("file","",wsdlURI);
-			}if (wsdlURI.indexOf(":/")==-1){
-				url = new URL("file","",wsdlURI);
-			}
-			else{
-				url = new URL(wsdlURI);	
-			}
-
-			//FIXME @author soi - 
-		    // This quick fix assume that the wsdlURI points to a wsdl 1.1 version.
-			// A better fix should be to determine which builder to use based on the wsdl version. 
-			// The current implementation of the wsdl builder classes did not allow for this. 
-			// I will suggestthat the determination of which builder to use should be done in
-			// the builder classes, preferably in the parent builder class. Accessable through a
-			// static reference to a method like getBuilderInstance(String wsdlURI) in the parent
-			//builder class or through a builder Abstract Factor or Abstract factory methods.
-			
-			
-			//WSDL11ToAxisServiceBuilder builder = new WSDL11ToAxisServiceBuilder(
-			//											url.openConnection().getInputStream());
-							//			builder.setBaseUri(getBaseUri(wsdlURI));
-							//			return builder.populateService();
-			
-			//Reflection invocation
-			//Class WSDL11ToAxisServiceBuilderClass = ClassLoadingUtil.loadClassFromAxis2LibPath(
-			//                projectName,
-			//                "org.apache.axis2.description.WSDL11ToAxisServiceBuilder");
-			
-			Class WSDL11ToAxisServiceBuilderClass = ClassLoadingUtil.loadClassFromAntClassLoader(
-					"org.apache.axis2.description.WSDL11ToAxisServiceBuilder");
-			Constructor constructor = WSDL11ToAxisServiceBuilderClass.getConstructor(
-					new Class[]{InputStream.class});
-			Object WSDL11ToAxisServiceBuilderInstance = constructor.newInstance(
-					new Object[]{url.openConnection().getInputStream()});
-			Method setBaseUriMethod = WSDL11ToAxisServiceBuilderClass.getMethod(
-					"setBaseUri", 
-					new Class[]{String.class});
-			setBaseUriMethod.invoke(
-					WSDL11ToAxisServiceBuilderInstance, 
-					new Object[]{wsdlURI});
-			
-			//Fix for the Axis2 1.2 
-			//builder.setCodegen(true);
-			Method setCodegenMethod = WSDL11ToAxisServiceBuilderClass.getMethod(
-					"setCodegen", 
-					new Class[]{boolean.class});
-			setCodegenMethod.invoke(
-					WSDL11ToAxisServiceBuilderInstance, 
-					new Object[]{true});
-			
-			Method populateServiceMethod = WSDL11ToAxisServiceBuilderClass.getMethod(
-					"populateService", 
-					null);
-			return populateServiceMethod.invoke(WSDL11ToAxisServiceBuilderInstance, null);
-			
-			//return this import org.apache.axis2.description.AxisService;
-    }
-
-    /**
-     * Converts a single String into a String Array
-     * 
-     * @param value a single string
-     * @return an array containing only one element
-     */
-    private String[] getStringArray(String value)
-    {
-       String[] values = new String[1];
-       values[0] = value;
-       return values;
-    }
-}
-
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/utils/WSDLPropertyReader.java b/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/utils/WSDLPropertyReader.java
deleted file mode 100644
index 8aaacec..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/consumption/core/utils/WSDLPropertyReader.java
+++ /dev/null
@@ -1,239 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070118   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070507   184729 sandakith@wso2.com - Lahiru Sandakith
- *******************************************************************************/
-
-package org.eclipse.jst.ws.axis2.consumption.core.utils;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.jst.ws.axis2.core.utils.ClassLoadingUtil;
-
-
-/**
- * This class presents a convenient way of reading the 
- * WSDL file(url) and producing a useful set of information
- * It does NOT use any of the standard WSDL classes from 
- * Axis2, rather it uses wsdl4j to read the wsdl and extract 
- * the properties (This is meant as a convenience for the UI
- * only. We may not need the whole conversion the WSDLpump 
- * goes through)
- * One would need to change this to suit a proper WSDL 
- */
-public class WSDLPropertyReader {
-
-
-	//private Definition wsdlDefinition = null;
-	private Object DefinitionInstance = null;
-	private Class DefinitionClass = null;
-	private Class ServiceClass = null;
-
-	public void readWSDL(String projectName, String filepath) throws Exception {
-		
-		ClassLoadingUtil.init(projectName);
-		
-		DefinitionClass = ClassLoadingUtil.loadClassFromAntClassLoader("javax.wsdl.Definition");
-		
-		//		WSDLReader reader = WSDLFactory.newInstance().newWSDLReader();
-		//		wsdlDefinition = reader.readWSDL(filepath); 
-
-		Class WSDLFactoryClass = ClassLoadingUtil
-				.loadClassFromAntClassLoader("javax.wsdl.factory.WSDLFactory");
-		Method newInstanceMethod = WSDLFactoryClass.getMethod("newInstance", null);
-		Object WSDLFactoryObject = newInstanceMethod.invoke(null, null);
-		Class WSDLFactoryImplClass = ClassLoadingUtil
-				.loadClassFromAntClassLoader(WSDLFactoryObject.getClass().getName());
-		Method newWSDLReaderMethod = WSDLFactoryImplClass.getMethod("newWSDLReader", null);
-		Object WSDLReaderObject = newWSDLReaderMethod.invoke(WSDLFactoryObject, null);
-		Class WSDLReaderClass = ClassLoadingUtil
-				.loadClassFromAntClassLoader(WSDLReaderObject.getClass().getName());
-		Method readWSDLMethod = WSDLReaderClass.getMethod("readWSDL", new Class[]{String.class});
-		DefinitionInstance = readWSDLMethod.invoke(WSDLReaderObject, new Object[]{filepath});
-
-	}
-
-	/**
-	 * Returns the namespace map from definition
-	 * @return
-	 */
-	public Map getDefinitionNamespaceMap(){
-		//return wsdlDefinition.getNamespaces();
-		Map map = null;
-		try {
-			Method getNamespacesMethod = DefinitionClass.getMethod("getNamespaces", null);
-			map = (Map)getNamespacesMethod.invoke(DefinitionInstance, null);
-		} catch (SecurityException e) {
-			e.printStackTrace();
-		} catch (NoSuchMethodException e) {
-			e.printStackTrace();
-		} catch (IllegalArgumentException e) {
-			e.printStackTrace();
-		} catch (IllegalAccessException e) {
-			e.printStackTrace();
-		} catch (InvocationTargetException e) {
-			e.printStackTrace();
-		}
-		return map;
-	}
-
-	/**
-	 * get the default package derived by the targetNamespace
-	 */
-	public String packageFromTargetNamespace(){
-		//return  URLProcessor.makePackageName(wsdlDefinition.getTargetNamespace());
-		String returnString = null;
-		try{
-			Method getTargetNamespaceMethod = DefinitionClass.getMethod("getTargetNamespace", null);
-			String packageName = (String)getTargetNamespaceMethod.invoke(DefinitionInstance, null);
-			Class URLProcessorClass = ClassLoadingUtil
-					.loadClassFromAntClassLoader("org.apache.axis2.util.URLProcessor");
-			Method makePackageNameMethod = URLProcessorClass
-					.getMethod("makePackageName", new Class[]{String.class});
-			returnString = (String)makePackageNameMethod.invoke(null, new Object[]{packageName});
-		} catch (SecurityException e) {
-			e.printStackTrace();
-		} catch (NoSuchMethodException e) {
-			e.printStackTrace();
-		} catch (IllegalArgumentException e) {
-			e.printStackTrace();
-		} catch (IllegalAccessException e) {
-			e.printStackTrace();
-		} catch (InvocationTargetException e) {
-			e.printStackTrace();
-		}
-
-		return returnString;
-	}
-
-	/**
-	 * Returns a list of service names
-	 * the names are QNames
-	 * @return
-	 */
-	public List getServiceList(){
-		//Service service = null;
-		//Map serviceMap = wsdlDefinition.getServices();
-		//service = (Service)serviceIterator.next();
-		//returnList.add(service.getQName());
-		List returnList = new ArrayList();
-		try{
-			Object serviceInstance;
-			Method getServicesMethod = DefinitionClass.getMethod("getServices", null);
-			Map serviceMap = (Map)getServicesMethod.invoke(DefinitionInstance, null);
-
-			if(serviceMap!=null && !serviceMap.isEmpty()){
-				Iterator serviceIterator = serviceMap.values().iterator();
-				while(serviceIterator.hasNext()){
-					ServiceClass = ClassLoadingUtil
-							.loadClassFromAntClassLoader("javax.wsdl.Service");
-					Method getQNameMethod = ServiceClass.getMethod("getQName", null);
-					serviceInstance = (Object)serviceIterator.next();
-					returnList.add(getQNameMethod.invoke(serviceInstance, null));   
-				}
-			}
-		} catch (SecurityException e) {
-			e.printStackTrace();
-		} catch (NoSuchMethodException e) {
-			e.printStackTrace();
-		} catch (IllegalArgumentException e) {
-			e.printStackTrace();
-		} catch (IllegalAccessException e) {
-			e.printStackTrace();
-		} catch (InvocationTargetException e) {
-			e.printStackTrace();
-		}
-		return returnList;
-	}
-
-	/**
-	 * Returns a list of ports for a particular service
-	 * the names are QNames
-	 * @return
-	 */
-	public List getPortNameList(Object serviceName){
-		//List returnList = new ArrayList();
-		//Service service = wsdlDefinition.getService(serviceName);
-		//Port port = null; 
-		//if(service!=null){
-		//	Map portMap = service.getPorts();
-		//	if (portMap!=null && !portMap.isEmpty()){
-		//		Iterator portIterator = portMap.values().iterator();
-		//		while(portIterator.hasNext()){
-		//			port = (Port)portIterator.next();
-		//			returnList.add(port.getName());
-		//		}
-		//	}
-		//}
-		//return returnList;
-
-		List returnList = new ArrayList();
-		try{	
-			Method getServiceMethod = DefinitionClass
-						.getMethod("getService", new Class[]{serviceName.getClass()});
-			Object serviceInstance = getServiceMethod
-						.invoke(DefinitionInstance, new Object[]{serviceName});
-			Object portInstance = null;
-			if(serviceInstance!=null){
-				Method getPortsMethod = ServiceClass.getMethod("getPorts", null);
-				Map portMap = (Map)getPortsMethod.invoke(serviceInstance, null);
-				if (portMap!=null && !portMap.isEmpty()){
-					Iterator portIterator = portMap.values().iterator();
-					while(portIterator.hasNext()){
-						portInstance = (Object)portIterator.next();
-						Class PortClass = ClassLoadingUtil
-								.loadClassFromAntClassLoader("javax.wsdl.Port");
-						Method getNameMethod = PortClass.getMethod("getName", null);
-						returnList.add(getNameMethod.invoke(portInstance,null)); 
-					}
-				}
-
-			}
-		} catch (SecurityException e) {
-			e.printStackTrace();
-		} catch (NoSuchMethodException e) {
-			e.printStackTrace();
-		} catch (IllegalArgumentException e) {
-			e.printStackTrace();
-		} catch (IllegalAccessException e) {
-			e.printStackTrace();
-		} catch (InvocationTargetException e) {
-			e.printStackTrace();
-		}
-		return returnList;
-	}
-	
-    /**
-     * public method to get loaded wsdl Definition Instance
-     * @return
-     */
-    public Object getWsdlDefinitionInstance() {
-            return DefinitionInstance;
-    }
-    
-    /**
-     * public method to get loaded Definition Class
-     * @return
-     */
-    public Class getWsdlDefinitionClass() {
-            return DefinitionClass;
-    }
-
-}
-
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/creation/core/data/DataModel.java b/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/creation/core/data/DataModel.java
deleted file mode 100644
index 0400d62..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.core/src/org/eclipse/jst/ws/axis2/creation/core/data/DataModel.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070518   187311 sandakith@wso2.com - Lahiru Sandakith, Fixing test resource addition
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.creation.core.data;
-
-import org.eclipse.jst.ws.axis2.consumption.core.data.Model;
-
-public class DataModel extends Model{
-	
-	//Client Side
-	private String serviceClass;
-	private boolean generateServicesXML;
-	private boolean servicesXML;
-	private boolean generateAAR;
-	private String  pathToServicesXML;
-	private String  pathToWebServicesTempDir;
-	
-	//Server Side 
-	private boolean generateServerSideInterface;
-    private boolean serverXMLCheck;
-	private boolean generateAllCheck;
-	private String databindingType;
-	private String namespaseToPackageMapping;
-
-
-	public boolean isGenerateServicesXML(){
-		return generateServicesXML;
-	}
-
-	public void setGenerateServicesXML(boolean generateServicesXML){
-		this.generateServicesXML = generateServicesXML;
-	}
-
-	public String getPathToServicesXML(){
-		return pathToServicesXML;
-	}
-
-	public void setPathToServicesXML(String pathToServicesXML){
-		this.pathToServicesXML = pathToServicesXML;
-	}
-
-	public boolean isGenerateAAR() {
-		return generateAAR;
-	}
-
-	public void setGenerateAAR(boolean generateAAR) {
-		this.generateAAR = generateAAR;
-	}
-
-	public boolean isServicesXML() {
-		return servicesXML;
-	}
-
-	public void setServicesXML(boolean servicesXML) {
-		this.servicesXML = servicesXML;
-	}
-
-	public String getPathToWebServicesTempDir() {
-		return pathToWebServicesTempDir;
-	}
-
-	public void setPathToWebServicesTempDir(String pathToWebServicesTempDir) {
-		this.pathToWebServicesTempDir = pathToWebServicesTempDir;
-	}
-
-	public String getWsdlURI() {
-		return super.getWsdlURI();
-	}
-
-	public void setWsdlURI(String wsdlURI) {
-		super.setWsdlURI(wsdlURI);
-	}
-
-	public String getDatabindingType() {
-		return databindingType;
-	}
-
-	public void setDatabindingType(String databindingType) {
-		this.databindingType = databindingType;
-	}
-
-	public boolean isGenerateAllCheck() {
-		return generateAllCheck;
-	}
-
-	public void setGenerateAllCheck(boolean generateAllCheck) {
-		this.generateAllCheck = generateAllCheck;
-	}
-
-	public boolean isGenerateServerSideInterface() {
-		return generateServerSideInterface;
-	}
-
-	public void setGenerateServerSideInterface(boolean generateServerSideInterface) {
-		this.generateServerSideInterface = generateServerSideInterface;
-	}
-
-	public String getPortName() {
-		return super.getPortName();
-	}
-
-	public void setPortName(String portName) {
-		super.setPortName(portName);
-	}
-
-	public boolean isServerXMLCheck() {
-		return serverXMLCheck;
-	}
-
-	public void setServerXMLCheck(boolean serverXMLCheck) {
-		this.serverXMLCheck = serverXMLCheck;
-	}
-
-	public String getServiceName() {
-		return super.getServiceName();
-	}
-
-	public void setServiceName(String serviceName) {
-		super.setServiceName(serviceName);
-	}
-
-	public String getPackageText() {
-		return super.getPackageText();
-	}
-
-	public void setPackageText(String packageText) {
-		super.setPackageText(packageText);
-	}
-
-	public String getServiceClass() {
-		return serviceClass;
-	}
-
-	public void setServiceClass(String serviceClass) {
-		this.serviceClass = serviceClass;
-	}
-
-	public String getNamespaseToPackageMapping() {
-		return namespaseToPackageMapping;
-	}
-
-	public void setNamespaseToPackageMapping(String namespaseToPackageMapping) {
-		this.namespaseToPackageMapping = namespaseToPackageMapping;
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/.classpath b/bundles/org.eclipse.jst.ws.axis2.consumption.ui/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/.cvsignore b/bundles/org.eclipse.jst.ws.axis2.consumption.ui/.cvsignore
deleted file mode 100644
index 7722bc8..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-build.xml
-javaCompiler...args
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/.project b/bundles/org.eclipse.jst.ws.axis2.consumption.ui/.project
deleted file mode 100644
index 46d662e..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.ws.axis2.consumption.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.jst.ws.axis2.consumption.ui/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 5f5c3d4..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,62 +0,0 @@
-#Sun May 06 17:33:23 LKT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=ignore
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.jst.ws.axis2.consumption.ui/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 05b7c7c..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Wed Feb 21 10:48:27 LKT 2007
-eclipse.preferences.version=1
-internal.default.compliance=default
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?>\n<templates/>
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.jst.ws.axis2.consumption.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index e8f4da8..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,35 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %PLUGIN_NAME
-Bundle-SymbolicName: org.eclipse.jst.ws.axis2.consumption.ui;singleton:=true
-Bundle-Version: 1.0.101.qualifier
-Bundle-Activator: org.eclipse.jst.ws.internal.axis2.consumption.ui.plugin.WebServiceAxis2ConsumptionUIPlugin
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.ui.ide,
- org.eclipse.core.resources,
- org.eclipse.jdt.core,
- org.eclipse.wst.ws.parser,
- org.eclipse.jst.ws,
- org.eclipse.jst.ws.ui,
- org.eclipse.jst.ws.consumption,
- org.eclipse.jst.ws.consumption.ui,
- org.eclipse.wst.ws,
- org.eclipse.wst.command.env,
- org.eclipse.wst.command.env.core,
- org.eclipse.wst.command.env.ui,
- org.eclipse.wst.server.core,
- org.eclipse.wst.wsdl,
- org.eclipse.wst.common.frameworks,
- org.eclipse.wst.common.environment,
- org.eclipse.jst.ws.axis2.consumption.core,
- org.eclipse.jst.ws.axis2.ui,
- org.eclipse.jst.ws.axis2.core
-Eclipse-LazyStart: true
-Bundle-Vendor: %PLUGIN_PROVIDER
-Export-Package: org.eclipse.jst.ws.internal.axis2.consumption.ui.plugin,
- org.eclipse.jst.ws.internal.axis2.consumption.ui.widgets,
- org.eclipse.jst.ws.internal.axis2.consumption.ui.wizard.client,
- org.eclipse.jst.ws.internal.axis2.consumption.ui.wsrt
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/about.html b/bundles/org.eclipse.jst.ws.axis2.consumption.ui/about.html
deleted file mode 100644
index 9e73bda..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/about.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<HTML>
-
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-
-<BODY lang="EN-US">
-
-<H3>About This Content</H3>
-
-<P>June 06, 2007</P>
-
-<H3>License</H3>
-
-<P>The Eclipse Foundation makes available all content in this plug-in 
-("Content"). Unless otherwise indicated below, the Content is provided to you 
-under the terms and conditions of the Eclipse Public License Version 1.0 
-("EPL"). A copy of the EPL is available at
-<A href="http://www.eclipse.org/org/documents/epl-v10.php">http://www.eclipse.org/org/documents/epl-v10.php</A>. 
-For purposes of the EPL, "Program" will mean the Content.</P>
-
-<P>If you did not receive this Content directly from the Eclipse Foundation, the 
-Content is being redistributed by another party ("Redistributor") and different 
-terms and conditions may apply to your use of any object code in the Content. 
-Check the Redistributor's license that was provided with the Content. If no such 
-license exists, contact the Redistributor. Unless otherwise indicated below, the 
-terms and conditions of the EPL still apply to any source code in the Content 
-and such source code may be obtained at
-<A href="http://www.eclipse.org/">http://www.eclipse.org/</A>.</P>
-
-</BODY>
-</HTML>
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/build.properties b/bundles/org.eclipse.jst.ws.axis2.consumption.ui/build.properties
deleted file mode 100644
index 98cccde..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/build.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-###############################################################################
-# Copyright (c) 2007 WSO2 Inc 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:
-# WSO2 Inc - initial API and implementation
-# yyyymmdd bug      Email and other contact information
-# -------- -------- -----------------------------------------------------------
-# 20070130   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the 
-#											Axis2 runtime to the framework for 168762
-# 20070502   184302 sandakith@wso2.com - Lahiru Sandakith, Fix copyright for Axis2 plugins
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               plugin.xml,\
-               META-INF/,\
-               .,\
-               plugin.properties,\
-               about.html
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/plugin.properties b/bundles/org.eclipse.jst.ws.axis2.consumption.ui/plugin.properties
deleted file mode 100644
index f03ca74..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/plugin.properties
+++ /dev/null
@@ -1,30 +0,0 @@
-###############################################################################
-# Copyright (c) 2007 WSO2 Inc. 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:
-# WSO2 Inc. - initial API and implementation
-# yyyymmdd bug      Email and other contact information
-# -------- -------- -----------------------------------------------------------
-# 20070118   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 runtime to the framework for 168762
-# 20070501   184617 sandakith@wso2.com - Lahiru Sandakith, Provide plugin details
-###############################################################################
-#
-
-#
-# Messages in plugin.xml.
-#
-PLUGIN_NAME=Webservice Axis2 Consumption UI Plug-in
-PLUGIN_PROVIDER=WSO2
-
-WEBSERVICECLIENTTYPE_NAME_JAVA_AXIS=Java proxy
-LABEL_RUNTIME_AXIS_11=Apache Axis2
-DESC_RUNTIME_AXIS_11=Apache Axis2
-#
-#	Web Services Preferance Pages
-#
-# Categories
-PREFERENCE_CATEGORY_AXIS2_EMITTER=Axis2 Emitter
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/plugin.xml b/bundles/org.eclipse.jst.ws.axis2.consumption.ui/plugin.xml
deleted file mode 100644
index fd14ae2..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/plugin.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-
-<plugin>
-   
-	<extension point="org.eclipse.wst.command.env.ui.widgetRegistry">
-       <widgetFactory   
-             id="Axis2ClientConfig"
-             insertBeforeCommandId="org.eclipse.jst.ws.axis2.consumption.core.command.Axis2WebservicesServerCommand"
-             class="org.eclipse.jst.ws.internal.axis2.consumption.ui.wsrt.Axis2ClientConfigWidgetFactory"/>
-    </extension> 
-    <extension point="org.eclipse.wst.command.env.antDataMapping">
-        <map
-              key="ClientProjectName"
-              operation="org.eclipse.jst.ws.axis2.creation.core.command.Axis2ClientDefaultingCommand"
-              property="ClientProject"
-              transform="org.eclipse.jst.ws.internal.common.StringToIProjectTransformer"/>
-    </extension> 
-
-</plugin>
\ No newline at end of file
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/src/org/eclipse/jst/ws/internal/axis2/consumption/ui/plugin/WebServiceAxis2ConsumptionUIPlugin.java b/bundles/org.eclipse.jst.ws.axis2.consumption.ui/src/org/eclipse/jst/ws/internal/axis2/consumption/ui/plugin/WebServiceAxis2ConsumptionUIPlugin.java
deleted file mode 100644
index 3dc912b..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/src/org/eclipse/jst/ws/internal/axis2/consumption/ui/plugin/WebServiceAxis2ConsumptionUIPlugin.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc 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:
- * WSO2 Inc - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070130   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the 
- * 											Axis2 runtime to the framework for 168762
- * 20070502   184302 sandakith@wso2.com - Lahiru Sandakith, Fix copyright for Axis2 plugins
- *******************************************************************************/
-package org.eclipse.jst.ws.internal.axis2.consumption.ui.plugin;
-
-import org.eclipse.core.runtime.Plugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class WebServiceAxis2ConsumptionUIPlugin extends Plugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.jst.ws.axis2.consumption.ui";
-
-	// The shared instance
-	private static WebServiceAxis2ConsumptionUIPlugin plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public WebServiceAxis2ConsumptionUIPlugin() {
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static WebServiceAxis2ConsumptionUIPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/src/org/eclipse/jst/ws/internal/axis2/consumption/ui/task/DefaultsForHTTPBasicAuthCommand.java b/bundles/org.eclipse.jst.ws.axis2.consumption.ui/src/org/eclipse/jst/ws/internal/axis2/consumption/ui/task/DefaultsForHTTPBasicAuthCommand.java
deleted file mode 100644
index e544bc1..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/src/org/eclipse/jst/ws/internal/axis2/consumption/ui/task/DefaultsForHTTPBasicAuthCommand.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc 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:
- * WSO2 Inc - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070130   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the 
- * 											Axis2 runtime to the framework for 168762
- * 20070502   184302 sandakith@wso2.com - Lahiru Sandakith, Fix copyright for Axis2 plugins
- *******************************************************************************/
-package org.eclipse.jst.ws.internal.axis2.consumption.ui.task;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-
-public class DefaultsForHTTPBasicAuthCommand extends AbstractDataModelOperation {
-
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-		IStatus status = Status.OK_STATUS;
-		return status;
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/src/org/eclipse/jst/ws/internal/axis2/consumption/ui/widgets/Axis2ProxyWidget.java b/bundles/org.eclipse.jst.ws.axis2.consumption.ui/src/org/eclipse/jst/ws/internal/axis2/consumption/ui/widgets/Axis2ProxyWidget.java
deleted file mode 100644
index cdc50d3..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/src/org/eclipse/jst/ws/internal/axis2/consumption/ui/widgets/Axis2ProxyWidget.java
+++ /dev/null
@@ -1,513 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070130   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070513   186430 sandakith@wso2.com - Lahiru Sandakith, fix for 186430
- *										  Text not accessible on AXIS2 wizard pages.
- * 20070523   174876 sandakith@wso2.com - Lahiru Sandakith, Persist Preferences inside Framework
- * 20070823   200413 sandakith@wso2.com - Lahiru Sandakith, Namespace to Package table fix
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- * 20071030	  207618 zina@ca.ibm.com - Zina Mostafia, Page GUI sequence using tab is not correct ( violates Accessibility)
- *******************************************************************************/
-package org.eclipse.jst.ws.internal.axis2.consumption.ui.widgets;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.ws.axis2.consumption.core.data.DataModel;
-import org.eclipse.jst.ws.axis2.consumption.core.messages.Axis2ConsumptionUIMessages;
-import org.eclipse.jst.ws.axis2.consumption.core.utils.WSDLPropertyReader;
-import org.eclipse.jst.ws.axis2.core.constant.Axis2Constants;
-import org.eclipse.jst.ws.axis2.core.context.Axis2EmitterContext;
-import org.eclipse.jst.ws.axis2.core.plugin.WebServiceAxis2CorePlugin;
-import org.eclipse.jst.ws.axis2.core.utils.ClassLoadingUtil;
-import org.eclipse.jst.ws.axis2.ui.plugin.WebServiceAxis2UIPlugin;
-import org.eclipse.jst.ws.internal.ui.common.UIUtils;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.TableEditor;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Event;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.wst.command.internal.env.core.common.StatusUtils;
-import org.eclipse.wst.command.internal.env.ui.widgets.SimpleWidgetDataContributor;
-import org.eclipse.wst.command.internal.env.ui.widgets.WidgetDataEvents;
-
-public class Axis2ProxyWidget extends SimpleWidgetDataContributor {
-	
-	DataModel model;
-	IStatus status = Status.OK_STATUS;
-
-
-	public Axis2ProxyWidget(DataModel model) {
-		this.model=model;
-	}
-
-	//private String pluginId_ = "org.eclipse.jst.ws.axis2.consumption.ui";
-	
-	private Button genProxyCheckbox_;
-	private Button syncAndAsyncRadioButton;
-	private Button syncOnlyRadioButton;
-	private Button asyncOnlyRadioButton;
-	//private Button testCaseCheckBoxButton;
-	//private Button generateAllCheckBoxButton;
-	private Combo databindingTypeCombo;
-	private Combo portNameCombo;
-	private Combo serviceNameCombo;
-	private Text packageText;
-	
-	//private java.util.List serviceQNameList2 = null;
-	private Table namespace2packageTable = null;
-	private Button generateAllCheckBoxButton;
-	private Button testCaseCheckBoxButton;
-	
-	private WSDLPropertyReader reader;
-	private List serviceQNameList = null;
-	Axis2EmitterContext context;
-
-
-	public WidgetDataEvents addControls( Composite parent, Listener statusListener )
-	{
-		context = WebServiceAxis2CorePlugin.getDefault().getAxisEmitterContext();
-		UIUtils uiUtils = new UIUtils(WebServiceAxis2UIPlugin.PLUGIN_ID);
-		
-		Composite  topComp = uiUtils.createComposite(parent, 2 );
-	
-		// service name
-		serviceNameCombo = uiUtils.createCombo(topComp, Axis2ConsumptionUIMessages.LABEL_SERVICE_NAME_CAPTION, null, null, SWT.READ_ONLY);
-		serviceNameCombo.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				//loadPortNames();
-				model.setServiceName(serviceNameCombo.getText());
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-		// port name
-		portNameCombo = uiUtils.createCombo(topComp, Axis2ConsumptionUIMessages.LABEL_PORTNAME, null, null, SWT.READ_ONLY);
-		portNameCombo.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				model.setPortName(portNameCombo.getText());
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-		// Databinding
-		databindingTypeCombo = uiUtils.createCombo(topComp, Axis2ConsumptionUIMessages.LABEL_DATABINDING_CAPTION, null, null, SWT.READ_ONLY);
-		fillDatabinderCombo();
-		databindingTypeCombo.select(0);
-		databindingTypeCombo.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				model.setDatabindingType(databindingTypeCombo.getText());
-			};
-			public void widgetDefaultSelected(SelectionEvent e) {
-			};
-		});
-		
-		// package name
-		packageText = uiUtils.createText(topComp, Axis2ConsumptionUIMessages.LABEL_PACKEGE_NAME, null, null,SWT.BORDER);
-		packageText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				model.setPackageText(packageText.getText());
-			}
-		});
-		
-	  	//Client type label 
-		Group clientTypeGroup = uiUtils.createGroup(parent, Axis2ConsumptionUIMessages.LABEL_CLIENT_SIDE, null, null);
-				
-		syncAndAsyncRadioButton = uiUtils.createRadioButton(clientTypeGroup, Axis2ConsumptionUIMessages.LABEL_SYNC_AND_ASYNC, null, null);
-		syncAndAsyncRadioButton.setSelection(
-				((context.isAsync() || context.isSync())==false)
-				?true
-				:(context.isAsync() && context.isSync()));
-		syncAndAsyncRadioButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				//Because default setting in axis2 to be both false in thie case
-				//File a JIRA to fix this.
-				model.setSync(!syncAndAsyncRadioButton.getSelection());
-				model.setASync(!syncAndAsyncRadioButton.getSelection());
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-		syncOnlyRadioButton = uiUtils.createRadioButton(clientTypeGroup, Axis2ConsumptionUIMessages.LABEL_SYNC, null, null);
-		syncOnlyRadioButton.setSelection(context.isSync() && !context.isAsync());
-		syncOnlyRadioButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				model.setSync(syncOnlyRadioButton.getSelection());
-				model.setASync(!syncOnlyRadioButton.getSelection());
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-		asyncOnlyRadioButton = uiUtils.createRadioButton(clientTypeGroup, Axis2ConsumptionUIMessages.LABEL_ASYNC, null, null);
-		asyncOnlyRadioButton.setSelection(context.isAsync() && !context.isSync());
-		asyncOnlyRadioButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				model.setASync(asyncOnlyRadioButton.getSelection());
-				model.setSync(!asyncOnlyRadioButton.getSelection());
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-		
-		//Set the sync async to default 
-		model.setSync(context.isSync());
-		model.setASync(context.isAsync());
-		
-	   	// generate test case option
-		
-		Composite checkBoxes = uiUtils.createComposite(parent, 1);
-		testCaseCheckBoxButton = uiUtils.createCheckbox(checkBoxes, Axis2ConsumptionUIMessages.LABEL_GENERATE_TESTCASE_CAPTION, null, null);
-		testCaseCheckBoxButton.setSelection(context.isClientTestCase());
-		model.setTestCaseCheck(context.isClientTestCase());
-		testCaseCheckBoxButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				model.setTestCaseCheck(testCaseCheckBoxButton.getSelection());
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-
-		// generate all
-		generateAllCheckBoxButton = uiUtils.createCheckbox(checkBoxes, Axis2ConsumptionUIMessages.LABEL_GENERATE_ALL, null, null);
-		generateAllCheckBoxButton.setSelection(context.isClientGenerateAll());
-		generateAllCheckBoxButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				model.setGenerateAllCheck(generateAllCheckBoxButton.getSelection());
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-	   
-	    new Label(parent,SWT.HORIZONTAL);
-        namespace2packageTable = new Table(parent,SWT.BORDER|SWT.MULTI);
-        namespace2packageTable.setLinesVisible(true);
-        namespace2packageTable.setHeaderVisible(true); 
-        namespace2packageTable.setEnabled(true);
-              
-        declareColumn(namespace2packageTable,
-        		350, //a default width until we adjust
-        		Axis2ConsumptionUIMessages.LABEL_NAMESPACE);
-        declareColumn(namespace2packageTable,
-        		200,//a default width until we adjust
-        		Axis2ConsumptionUIMessages.LABEL_PACKAGE);
-        
-        namespace2packageTable.setVisible(true);
-        
-        // add the table editor
-        final TableEditor editor = new TableEditor(namespace2packageTable);
-        editor.setColumn(1);
-        editor.horizontalAlignment = SWT.LEFT;
-        editor.grabHorizontal = true;
-
-        namespace2packageTable.addListener(SWT.MouseDown, new Listener() {
-            public void handleEvent(Event event) {
-              Rectangle clientArea = namespace2packageTable.getClientArea();
-              Point pt = new Point(event.x, event.y);
-              int index = namespace2packageTable.getTopIndex();
-              while (index < namespace2packageTable.getItemCount()) {
-                boolean visible = false;
-                final TableItem item = namespace2packageTable.getItem(index);
-                for (int i = 0; i < namespace2packageTable.getColumnCount(); i++) {
-                  Rectangle rect = item.getBounds(i);
-                  if (rect.contains(pt)) {
-                    final int column = i;
-                    final Text text = new Text(namespace2packageTable, SWT.NONE);
-                    Listener textListener = new Listener() {
-                      public void handleEvent(final Event e) {
-                        switch (e.type) {
-                        case SWT.FocusOut:
-                          item.setText(column, text.getText());
-                          text.dispose();
-                          break;
-                        case SWT.Traverse:
-                          switch (e.detail) {
-                          case SWT.TRAVERSE_RETURN:
-                            item
-                                .setText(column, text
-                                    .getText());
-                          // FALL THROUGH
-                          case SWT.TRAVERSE_ESCAPE:
-                            text.dispose();
-                            e.doit = false;
-                          }
-                          break;
-                        }
-                      }
-                    };
-                    text.addListener(SWT.FocusOut, textListener);
-                    text.addListener(SWT.Traverse, textListener);
-                    editor.setEditor(text, item, i);
-                    text.setText(item.getText(i));
-                    text.selectAll();
-                    text.setFocus();
-                    return;
-                  }
-                  if (!visible && rect.intersects(clientArea)) {
-                    visible = true;
-                  }
-                }
-                if (!visible)
-                  return;
-                index++;
-              }
-              model.setNamespaseToPackageMapping(getNs2PkgMapping());
-            }
-          });
-        
-        namespace2packageTable.addListener(SWT.MouseExit, new Listener() {
-            public void handleEvent(Event event) {
-            	 model.setNamespaseToPackageMapping(getNs2PkgMapping());
-            }
-        });
-        
-
-//		UIUtils      uiUtils  = new UIUtils( pluginId_ );
-//		parent.setToolTipText( Axis2ConsumptionUIMessages.TOOLTIP_PPAE_PAGE );
-//		PlatformUI.getWorkbench().getHelpSystem().setHelp( parent, pluginId_ + "." +  this.pluginId_);
-		
-		populateParamsFromWSDL();
-		populateModel();
-
-		return this;
-	}
-	
-	/**
-	 * A util method to create a new column
-	 * @param table
-	 * @param width
-	 * @param colName
-	 */
-	private void declareColumn(Table table, int width,String colName){
-        TableColumn column = new TableColumn(table,SWT.NONE);
-        column.setWidth(width);
-        column.setText(colName);
-    }
-	
-	/**
-	 * get the package to namespace mappings
-	 * @return
-	 */
-	public String getNs2PkgMapping(){
-		String returnList="";
-		TableItem[] items = namespace2packageTable.getItems();
-		String packageValue; 
-		for (int i=0;i<items.length;i++){
-			packageValue = items[i].getText(1);
-			if (packageValue!=null && !"".equals(packageValue)){
-				returnList = returnList +
-				             ("".equals(returnList)?"":",") +
-				             items[i].getText(0)+ "=" + packageValue;
-			}
-			
-		}
-		return "".equals(returnList)?null:returnList;
-	}
-
-	public boolean isGenProxy()	{
-		//boolean enabled = genProxyCheckbox_.getSelection();
-		return true; //always
-
-	}
-
-	public void setGenerateProxy( Boolean genProxy ){
-		genProxyCheckbox_.setSelection( genProxy.booleanValue() );
-	}   
-	
-	/**
-	 * Fill the combo with proper databinding names
-	 */
-	private void fillDatabinderCombo() {
-		databindingTypeCombo.add(Axis2Constants.DATA_BINDING_ADB);
-		databindingTypeCombo.add(Axis2Constants.DATA_BINDING_NONE);
-		databindingTypeCombo.select(0);
-	}
-	
-	private void populateModel() {
-		model.setServiceName(serviceNameCombo.getText());
-		model.setPortName(portNameCombo.getText());
-		model.setPackageText(packageText.getText());
-		model.setDatabindingType(databindingTypeCombo.getText());
-		//model.setASync(asyncOnlyRadioButton.getSelection());
-		//model.setSync(syncOnlyRadioButton.getSelection());
-		if (syncAndAsyncRadioButton.getSelection()){
-			model.setASync(!syncAndAsyncRadioButton.getSelection());
-			model.setSync(!syncAndAsyncRadioButton.getSelection());
-		}
-		model.setGenerateAllCheck(generateAllCheckBoxButton.getSelection());
-		model.setTestCaseCheck(testCaseCheckBoxButton.getSelection());
-		model.setNamespaseToPackageMapping(getNs2PkgMapping());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.command.env.ui.widgets.WidgetContributor#getStatus()
-	 */
-	public IStatus getStatus() 
-	{
-		IStatus result = null;
-		return result;
-	}
-
-	private void populatePackageName() {
-		this.packageText.setText(reader.packageFromTargetNamespace());
-	}
-
-	/**
-	 * populate the service and the port from the WSDL this needs to be public
-	 * since the WSDLselection page may call this
-	 */
-	public void populateParamsFromWSDL() {
-		if (reader == null)
-			reader = new WSDLPropertyReader();
-		try {
-			String lname = model.getWsdlURI();
-			if (!"".equals(lname.trim())) {
-
-				reader.readWSDL(model.getWebProjectName(), lname);
-
-				this.serviceQNameList = reader.getServiceList();
-				if (!serviceQNameList.isEmpty()) {
-					serviceNameCombo.removeAll();
-					for (int i = 0; i < serviceQNameList.size(); i++) {
-						// add the local part of the
-						Object serviceQnameInstance = serviceQNameList.get(0);
-						Class QNameClass = ClassLoadingUtil
-								.loadClassFromAntClassLoader("javax.xml.namespace.QName");
-						Method GetLocalPartMethod  = QNameClass.getMethod("getLocalPart", null);
-						Object resultLocalPart = GetLocalPartMethod
-										.invoke(serviceQnameInstance, null);
-						serviceNameCombo.add(resultLocalPart.toString());
-					}
-					;
-					// select the first one as the default
-					serviceNameCombo.select(0);
-
-					// load the ports
-					loadPortNames();
-
-				} else {
-					// service name list being empty means we are switching to
-					// the interface mode
-					if (serviceNameCombo!=null) serviceNameCombo.removeAll();
-					if (portNameCombo!=null) portNameCombo.removeAll();
-
-				}
-
-				populatePackageName();
-
-				//populate the namespacess
-				loadNamespaces(reader.getDefinitionNamespaceMap());
-			}
-		} catch (Exception e) {
-			status = StatusUtils.errorStatus(NLS.bind(
-					Axis2ConsumptionUIMessages.ERROR_INVALID_WSDL_FILE_READ_WRITEL,
-					new String[]{e.getLocalizedMessage()}), e);
-		}
-	}
-	
-	/**
-	 * Loads the namespaces
-	 * @param namespaceMap
-	 */
-	private void loadNamespaces(Map namespaceMap){
-		Iterator namespaces = namespaceMap.values().iterator();
-		namespace2packageTable.removeAll();
-        TableItem[] items = new TableItem[namespaceMap.size()]; // An item for each field
-        
-        int i = 0;
-        while(namespaces.hasNext()){
-        	
-           items[i] = new TableItem(namespace2packageTable, SWT.NULL);
-           String namespace = (String)namespaces.next();
-           items[i].setText(0,namespace);
-           items[i].setText(1,getPackageFromNamespace(namespace));
-           i++;
-        }
-
-        namespace2packageTable.setVisible(true);
-		
-	}
-
-	private void loadPortNames() {
-		int selectionIndex = serviceNameCombo.getSelectionIndex();
-		if (selectionIndex != -1) {
-			java.util.List ports = reader.getPortNameList( serviceQNameList
-					.get(selectionIndex));
-			if (!ports.isEmpty()) {
-				portNameCombo.removeAll();
-				for (int i = 0; i < ports.size(); i++) {
-					// add the local part of the
-					portNameCombo.add(ports.get(i).toString());
-				}
-				portNameCombo.select(0);
-			} else {
-				// error no ports found
-			}
-		}
-	}
-	
-	/**
-	 * get the package derived by  Namespace
-	 */
-	public String getPackageFromNamespace(String namespace){
-		// Use reflection to invoke org.apache.axis2.util.URLProcessor 
-		// makePackageName(namespace) statically
-		Object stringReturn = null;
-		try {
-			Class URLProcessorClass = ClassLoadingUtil
-					.loadClassFromAntClassLoader("org.apache.axis2.util.URLProcessor");
-			Method makePackageNameMethod = URLProcessorClass
-					.getMethod("makePackageName", new Class[]{String.class});
-			stringReturn = makePackageNameMethod.invoke(null, new Object[]{namespace});
-		} catch (SecurityException e) {
-			e.printStackTrace();
-		} catch (NoSuchMethodException e) {
-			e.printStackTrace();
-		} catch (IllegalArgumentException e) {
-			e.printStackTrace();
-		} catch (IllegalAccessException e) {
-			e.printStackTrace();
-		} catch (InvocationTargetException e) {
-			e.printStackTrace();
-		}
-		return  (String)stringReturn;
-
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/src/org/eclipse/jst/ws/internal/axis2/consumption/ui/wizard/client/WebServiceClientAxis2Type.java b/bundles/org.eclipse.jst.ws.axis2.consumption.ui/src/org/eclipse/jst/ws/internal/axis2/consumption/ui/wizard/client/WebServiceClientAxis2Type.java
deleted file mode 100644
index f0cff69..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/src/org/eclipse/jst/ws/internal/axis2/consumption/ui/wizard/client/WebServiceClientAxis2Type.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070130   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- *******************************************************************************/
-package org.eclipse.jst.ws.internal.axis2.consumption.ui.wizard.client;
-
-import org.eclipse.jst.ws.axis2.consumption.core.data.DataModel;
-import org.eclipse.jst.ws.axis2.consumption.core.messages.Axis2ConsumptionUIMessages;
-import org.eclipse.jst.ws.internal.axis2.consumption.ui.widgets.Axis2ProxyWidget;
-import org.eclipse.wst.command.internal.env.core.data.DataMappingRegistry;
-import org.eclipse.wst.command.internal.env.core.fragment.CommandFragment;
-import org.eclipse.wst.command.internal.env.core.fragment.CommandFragmentFactory;
-import org.eclipse.wst.command.internal.env.core.fragment.SimpleFragment;
-import org.eclipse.wst.command.internal.env.ui.widgets.CanFinishRegistry;
-import org.eclipse.wst.command.internal.env.ui.widgets.CommandWidgetBinding;
-import org.eclipse.wst.command.internal.env.ui.widgets.WidgetContributor;
-import org.eclipse.wst.command.internal.env.ui.widgets.WidgetContributorFactory;
-import org.eclipse.wst.command.internal.env.ui.widgets.WidgetRegistry;
-
-public class WebServiceClientAxis2Type implements CommandWidgetBinding {
-	
-	DataModel model;
-	
-	public WebServiceClientAxis2Type(DataModel model){
-		this.model = model;
-	}
-
-	
-	  /* (non-Javadoc)
-	   * @see org.eclipse.wst.command.env.ui.widgets.CommandWidgetBinding#registerDataMappings
-	   * (org.eclipse.wst.command.internal.env.core.data.DataMappingRegistry)
-	   */
-	  public void registerDataMappings(DataMappingRegistry dataRegistry) {
-	  	// AxisClientDefaultingCommand  	
-	    // dataRegistry.addMapping( Axis2ClientDefaultingCommand.class, 
-		// "CustomizeClientMappings", Axis2ProxyWidget.class );
-	    
-	  }
-	  
-	  /* (non-Javadoc)
-	   * @see org.eclipse.wst.command.env.ui.widgets.CommandWidgetBinding#registerWidgetMappings
-	   * (org.eclipse.wst.command.env.ui.widgets.WidgetRegistry)
-	   */
-	  public void registerWidgetMappings(WidgetRegistry widgetRegistry) {
-	   
-	    widgetRegistry.add( "AxisClientStart", 
-	        Axis2ConsumptionUIMessages.PAGE_TITLE_WS_AXIS2_PROXY,
-	        Axis2ConsumptionUIMessages.PAGE_DESC_WS_AXIS2_PROXY,
-	        new WidgetContributorFactory()
-	        {
-	          public WidgetContributor create()
-	          {
-	            return new Axis2ProxyWidget(model);
-	          }
-	        } );
-	    
-	    //widgetRegistry.add( "AxisClientBeanMapping", 
-	    //    Axis2ConsumptionUIMessages.PAGE_TITLE_WS_XML2PROXY,
-	    //    Axis2ConsumptionUIMessages.LABEL_EXPLORE_MAPPINGS_XML2BEAN,
-	    //    new WidgetContributorFactory()
-	    //    {
-	    //      public WidgetContributor create()
-	    //      {
-	    //        return new AxisMappingsWidget(AxisMappingsWidget.MODE_XML2PROXY );
-	    //      }
-	    //    } );
-	  }
-	  
-	  /* (non-Javadoc)
-	   * @see org.eclipse.wst.command.internal.env.core.fragment
-	   * .CommandFragmentFactoryFactory#create()
-	   */
-	  public CommandFragmentFactory create() 
-	  {
-	    return new CommandFragmentFactory()
-	           {
-	             public CommandFragment create()
-	             {
-	               //dead code - doesn't matter what gets returned here.
-	               return new SimpleFragment();
-	             }
-	           };
-	  }
-	  /* (non-Javadoc)
-	   * @see org.eclipse.wst.command.env.ui.widgets.CommandWidgetBinding#registerCanFinish
-	   * (org.eclipse.wst.command.env.ui.widgets.CanFinishRegistry)
-	   */
-	  public void registerCanFinish(CanFinishRegistry canFinishRegistry){
-	  }
-	  
-	  public void setWebServiceDataModel( DataModel model ){
-			this.model = model;
-	  }
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/src/org/eclipse/jst/ws/internal/axis2/consumption/ui/wsrt/Axis2ClientConfigWidgetFactory.java b/bundles/org.eclipse.jst.ws.axis2.consumption.ui/src/org/eclipse/jst/ws/internal/axis2/consumption/ui/wsrt/Axis2ClientConfigWidgetFactory.java
deleted file mode 100644
index 0d1471d..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/src/org/eclipse/jst/ws/internal/axis2/consumption/ui/wsrt/Axis2ClientConfigWidgetFactory.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070230   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070601   190505 pmoogk@ca.ibm.com - Peter Moogk
- *******************************************************************************/
-package org.eclipse.jst.ws.internal.axis2.consumption.ui.wsrt;
-
-import org.eclipse.jst.ws.axis2.consumption.core.command.Axis2ClientDefaultingCommand;
-import org.eclipse.jst.ws.axis2.consumption.core.data.DataModel;
-import org.eclipse.jst.ws.internal.axis2.consumption.ui.widgets.Axis2ProxyWidget;
-import org.eclipse.jst.ws.internal.axis2.consumption.ui.wizard.client.WebServiceClientAxis2Type;
-import org.eclipse.wst.command.internal.env.core.data.DataMappingRegistry;
-import org.eclipse.wst.command.internal.env.ui.widgets.INamedWidgetContributor;
-import org.eclipse.wst.command.internal.env.ui.widgets.INamedWidgetContributorFactory;
-import org.eclipse.wst.command.internal.env.ui.widgets.WidgetBindingToWidgetFactoryAdapter;
-
-public class Axis2ClientConfigWidgetFactory implements INamedWidgetContributorFactory{
-	private INamedWidgetContributor             proxyConfigWidget;
-	private INamedWidgetContributor             mappingsWidget;
-	private Axis2ProxyWidget                     proxyWidget;
-	private WidgetBindingToWidgetFactoryAdapter adapter;
-	private DataModel 							model;
-	private WebServiceClientAxis2Type           wsClientAxis2Type;
-	private DataMappingRegistry dataRegistry;
-	
-	public Axis2ClientConfigWidgetFactory(){
-	}
-	
-	public INamedWidgetContributor getFirstNamedWidget() {
-		init();
-		//wsClientAxis2Type.setWebServiceDataModel(model);
-		return proxyConfigWidget;
-	}
-
-	public INamedWidgetContributor getNextNamedWidget( INamedWidgetContributor widgetContributor) {
-	  return widgetContributor == proxyConfigWidget && proxyWidget.isGenProxy() 
-	  								? mappingsWidget 
-	  								: null;
-	}
-	
-	public void registerDataMappings(DataMappingRegistry dataRegistry) {
-		this.dataRegistry=dataRegistry;
-		// Map the data model from the defaulting command to this widget factory.
-		// The framework will actually to the call to getWebServiceDataModel in
-		// the ExampleDefaultingCommand class and then call the setWebServiceDataModel
-		// method in this class.
-		dataRegistry.addMapping( Axis2ClientDefaultingCommand.class, 
-								 "WebServiceDataModel",  //$NON-NLS-1$
-								 Axis2ClientConfigWidgetFactory.class );
-	}
-	
-	public void setWebServiceDataModel( DataModel model ){
-		this.model = model;
-	}
-	
-	private void init(){
-		  wsClientAxis2Type = new WebServiceClientAxis2Type(model);
-		  adapter = new WidgetBindingToWidgetFactoryAdapter(wsClientAxis2Type );
-		  proxyConfigWidget = adapter.getWidget( "AxisClientStart" ); //$NON-NLS-1$
-		  proxyWidget       = (Axis2ProxyWidget)proxyConfigWidget
-		  				.getWidgetContributorFactory().create();
-		  mappingsWidget   = adapter.getWidget( "AxisClientBeanMapping" ); //$NON-NLS-1$
-		  adapter.registerDataMappings( dataRegistry );
-
-	}
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/src/org/eclipse/jst/ws/internal/axis2/consumption/ui/wsrt/Axis2WebServiceClient.java b/bundles/org.eclipse.jst.ws.axis2.consumption.ui/src/org/eclipse/jst/ws/internal/axis2/consumption/ui/wsrt/Axis2WebServiceClient.java
deleted file mode 100644
index 22ae8a0..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.consumption.ui/src/org/eclipse/jst/ws/internal/axis2/consumption/ui/wsrt/Axis2WebServiceClient.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070230   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070518   187311 sandakith@wso2.com - Lahiru Sandakith, Fixing test resource addition
- *******************************************************************************/
-package org.eclipse.jst.ws.internal.axis2.consumption.ui.wsrt;
-
-import java.util.Vector;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jst.ws.axis2.consumption.core.command.Axis2ClientCodegenCommand;
-import org.eclipse.jst.ws.axis2.consumption.core.command.Axis2ClientDefaultingCommand;
-import org.eclipse.jst.ws.axis2.consumption.core.command.Axis2ClientTestCaseIntegrateCommand;
-import org.eclipse.jst.ws.axis2.consumption.core.command.Axis2WebservicesServerCommand;
-import org.eclipse.jst.ws.axis2.consumption.core.data.DataModel;
-import org.eclipse.jst.ws.internal.axis2.consumption.ui.task.DefaultsForHTTPBasicAuthCommand;
-import org.eclipse.wst.command.internal.env.core.ICommandFactory;
-import org.eclipse.wst.command.internal.env.core.SimpleCommandFactory;
-import org.eclipse.wst.command.internal.env.core.data.DataMappingRegistry;
-import org.eclipse.wst.command.internal.env.eclipse.EclipseEnvironment;
-import org.eclipse.wst.common.environment.IEnvironment;
-import org.eclipse.wst.ws.internal.wsrt.AbstractWebServiceClient;
-import org.eclipse.wst.ws.internal.wsrt.IContext;
-import org.eclipse.wst.ws.internal.wsrt.ISelection;
-import org.eclipse.wst.ws.internal.wsrt.WebServiceClientInfo;
-
-public class Axis2WebServiceClient extends AbstractWebServiceClient {
-
-	public Axis2WebServiceClient(WebServiceClientInfo info) {
-		super(info);
-	}
-
-	public ICommandFactory assemble(IEnvironment env, IContext ctx,
-			ISelection arg2, String arg3, String arg4) {
-		return null;
-	}
-
-	public ICommandFactory deploy(IEnvironment env, IContext ctx,
-			ISelection arg2, String arg3, String arg4) {
-		return null;
-	}
-
-	public ICommandFactory develop(IEnvironment env, IContext ctx,
-			ISelection sel, String project, String earProject) {
-		DataModel model = new DataModel();
-		
-		EclipseEnvironment environment = (EclipseEnvironment)env;
-		registerDataMappings( environment.getCommandManager().getMappingRegistry());
-		model.setWebProjectName(project);
-		Vector commands = new Vector();
-		commands.add(new Axis2ClientDefaultingCommand(model,this));
-		commands.add(new Axis2WebservicesServerCommand(model, project));
-		commands.add(new Axis2ClientCodegenCommand(model));
-		commands.add(new Axis2ClientTestCaseIntegrateCommand(
-				ResourcesPlugin.getWorkspace().getRoot().getProject(project),model));
-		
-		return new SimpleCommandFactory(commands);
-	}
-
-	public ICommandFactory install(IEnvironment env, IContext ctx,
-			ISelection sel, String project, String earProject) {
-		return null;
-	}
-
-	public ICommandFactory run(IEnvironment env, IContext ctx,
-			ISelection sel, String project, String earProject) {
-		return null;
-	}
-
-	public void registerDataMappings(DataMappingRegistry registry){
-		// AxisClientDefaultingCommand
-		registry.addMapping(Axis2ClientDefaultingCommand.class, 
-							"WsdlURL", 
-							DefaultsForHTTPBasicAuthCommand.class,
-							"WsdlServiceURL", null); //OK
-
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/.classpath b/bundles/org.eclipse.jst.ws.axis2.creation.core/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/.cvsignore b/bundles/org.eclipse.jst.ws.axis2.creation.core/.cvsignore
deleted file mode 100644
index 7722bc8..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-build.xml
-javaCompiler...args
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/.project b/bundles/org.eclipse.jst.ws.axis2.creation.core/.project
deleted file mode 100644
index b1c0d65..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.ws.axis2.creation.core</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.jst.ws.axis2.creation.core/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 5c552aa..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,62 +0,0 @@
-#Sun May 06 17:33:38 LKT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=ignore
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/.settings/org.eclipse.jdt.ui.prefs b/bundles/org.eclipse.jst.ws.axis2.creation.core/.settings/org.eclipse.jdt.ui.prefs
deleted file mode 100644
index 8322bb7..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,4 +0,0 @@
-#Wed Feb 21 10:49:06 LKT 2007
-eclipse.preferences.version=1
-internal.default.compliance=default
-org.eclipse.jdt.ui.text.custom_code_templates=<?xml version\="1.0" encoding\="UTF-8"?>\n<templates/>
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.jst.ws.axis2.creation.core/META-INF/MANIFEST.MF
deleted file mode 100644
index b7fbccb..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,31 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %PLUGIN_NAME
-Bundle-SymbolicName: org.eclipse.jst.ws.axis2.creation.core
-Bundle-Version: 1.0.102.qualifier
-Bundle-Activator: org.eclipse.jst.ws.axis2.creation.core.plugin.WebServiceAxis2CreationCorePlugin
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.core.resources,
- org.eclipse.wst.command.env,
- org.eclipse.wst.common.frameworks,
- org.eclipse.wst.ws,
- org.eclipse.wst.common.frameworks.ui,
- org.eclipse.wst.command.env.core,
- org.eclipse.wst.command.env.ui,
- org.eclipse.wst.command.env.infopop,
- org.eclipse.core.commands,
- org.eclipse.wst.common.environment,
- org.eclipse.jst.ws,
- org.eclipse.jdt.core,
- org.eclipse.jst.ws.axis2.consumption.core,
- org.eclipse.jst.ws.axis2.core,
- org.apache.ant
-Eclipse-LazyStart: true
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.jst.ws.axis2.creation.core.command,
- org.eclipse.jst.ws.axis2.creation.core.messages,
- org.eclipse.jst.ws.axis2.creation.core.plugin,
- org.eclipse.jst.ws.axis2.creation.core.utils
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-Vendor: %PLUGIN_PROVIDER
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/about.html b/bundles/org.eclipse.jst.ws.axis2.creation.core/about.html
deleted file mode 100644
index 9e73bda..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/about.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<HTML>
-
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-
-<BODY lang="EN-US">
-
-<H3>About This Content</H3>
-
-<P>June 06, 2007</P>
-
-<H3>License</H3>
-
-<P>The Eclipse Foundation makes available all content in this plug-in 
-("Content"). Unless otherwise indicated below, the Content is provided to you 
-under the terms and conditions of the Eclipse Public License Version 1.0 
-("EPL"). A copy of the EPL is available at
-<A href="http://www.eclipse.org/org/documents/epl-v10.php">http://www.eclipse.org/org/documents/epl-v10.php</A>. 
-For purposes of the EPL, "Program" will mean the Content.</P>
-
-<P>If you did not receive this Content directly from the Eclipse Foundation, the 
-Content is being redistributed by another party ("Redistributor") and different 
-terms and conditions may apply to your use of any object code in the Content. 
-Check the Redistributor's license that was provided with the Content. If no such 
-license exists, contact the Redistributor. Unless otherwise indicated below, the 
-terms and conditions of the EPL still apply to any source code in the Content 
-and such source code may be obtained at
-<A href="http://www.eclipse.org/">http://www.eclipse.org/</A>.</P>
-
-</BODY>
-</HTML>
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/build.properties b/bundles/org.eclipse.jst.ws.axis2.creation.core/build.properties
deleted file mode 100644
index 948ed9a..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/build.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-###############################################################################
-# Copyright (c) 2007 WSO2 Inc. 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:
-# WSO2 Inc. - initial API and implementation
-# yyyymmdd bug      Email and other contact information
-# -------- -------- -----------------------------------------------------------
-# 20070507   185686 sandakith@wso2.com - Lahiru Sandakith
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.properties,\
-               about.html
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/plugin.properties b/bundles/org.eclipse.jst.ws.axis2.creation.core/plugin.properties
deleted file mode 100644
index e4346f9..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/plugin.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-###############################################################################
-# Copyright (c) 2007 WSO2 Inc. 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:
-# WSO2 Inc. - initial API and implementation
-# yyyymmdd bug      Email and other contact information
-# -------- -------- -----------------------------------------------------------
-# 20070428   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the 
-# 										 Axis2 runtime to the framework for 168762
-# 20070501   184617 sandakith@wso2.com - Lahiru Sandakith, Provide plugin details
-# 20070507   185686 sandakith@wso2.com - Lahiru Sandakith
-###############################################################################
-
-#
-# Messages in plugin.xml.
-#
-PLUGIN_NAME=Webservice Axis2 Creation Core Plug-in
-PLUGIN_PROVIDER=WSO2
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2BUCommand.java b/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2BUCommand.java
deleted file mode 100644
index bd5ffe1..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2BUCommand.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 runtime to the framework for 168762
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.creation.core.command;
-
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.ws.axis2.creation.core.data.DataModel;
-import org.eclipse.jst.ws.axis2.creation.core.messages.Axis2CreationUIMessages;
-import org.eclipse.wst.command.internal.env.core.common.StatusUtils;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-
-
-public class Axis2BUCommand extends AbstractDataModelOperation 
-{
-  private DataModel model;
-  
-  public Axis2BUCommand( DataModel model )
-  {
-    this.model = model;  
-  }
-  
-  public IStatus execute( IProgressMonitor monitor, IAdaptable adaptable ) 
-  {
-    IStatus status ;  
-    // Check for the nessesary data are available for the scenario to begin
-    if (model.getServiceClass() == null){
-		status = StatusUtils.errorStatus(Axis2CreationUIMessages.ERROR_INVALID_SERVICE_CREATION);
-    }else {
-		status = Status.OK_STATUS; // Ok to proceed 
-	}
-    return status;      	
-  }
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2BUServiceCreationCommand.java b/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2BUServiceCreationCommand.java
deleted file mode 100644
index 33ee397..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2BUServiceCreationCommand.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 runtime to the framework for 168762
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070625   192522 sandakith@wso2.com - Lahiru Sandakith, fix the build path problem
- * 20070813   196173  sandakith@wso2.com - Lahiru Sandakith, Fix 196173, DWP custom location fix
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.creation.core.command;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.ws.axis2.core.constant.Axis2Constants;
-import org.eclipse.jst.ws.axis2.core.utils.FacetContainerUtils;
-import org.eclipse.jst.ws.axis2.core.utils.FileUtils;
-import org.eclipse.jst.ws.axis2.creation.core.data.DataModel;
-import org.eclipse.jst.ws.axis2.creation.core.messages.Axis2CreationUIMessages;
-import org.eclipse.jst.ws.axis2.creation.core.utils.CommonUtils;
-import org.eclipse.jst.ws.axis2.creation.core.utils.ServiceXMLCreator;
-import org.eclipse.jst.ws.internal.common.ResourceUtils;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.command.internal.env.core.common.StatusUtils;
-import org.eclipse.wst.common.environment.IEnvironment;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.ws.internal.wsrt.IWebService;
-
-public class Axis2BUServiceCreationCommand extends
-		AbstractDataModelOperation {
-	
-	  	private DataModel model;
-		private IWebService ws;
-		private String project;
-
-	  public Axis2BUServiceCreationCommand( DataModel model,IWebService ws, String project )
-	  {
-	    this.model = model;  
-	    this.ws=ws;
-	    this.project= project;
-	  }
-
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-		IStatus status = Status.OK_STATUS;  
-		IEnvironment environment = getEnvironment();
-		//The full Qulalified Service Class
-		String serviceClass = ws.getWebServiceInfo().getImplURL(); 
-		try {
-			
-			String workspaceDirectory = ResourcesPlugin.getWorkspace()
-														.getRoot().getLocation().toOSString();
-			String matadataDir = FileUtils.addAnotherNodeToPath(workspaceDirectory,
-					Axis2Constants.DIR_DOT_METADATA);
-		    String matadataPluginsDir = FileUtils.addAnotherNodeToPath(matadataDir,
-		    		Axis2Constants.DIR_DOT_PLUGINS);
-		    String matadataAxis2Dir = FileUtils.addAnotherNodeToPath(matadataPluginsDir, 
-		    		Axis2Constants.AXIS2_PROJECT);
-		    String webservicesDir = FileUtils.addAnotherNodeToPath(matadataAxis2Dir,
-		    		Axis2Constants.DIR_WEBSERVICES);
-		    model.setPathToWebServicesTempDir(webservicesDir);
-		    
-			//Get the Service name from the class name
-		    String serviceName = CommonUtils.classNameFromQualifiedName(serviceClass); 
-		    //String servicePackage = CommonUtils.packageNameFromQualifiedName(serviceClass); 
-			
-			String servicesDirectory = FileUtils.addAnotherNodeToPath(webservicesDir, serviceName);
-			String serviceXMLDirectory = FileUtils.addAnotherNodeToPath(servicesDirectory, 
-					Axis2Constants.DIR_META_INF);
-			
-			//Create the directories
-			//Create the Webservices stuff on the workspace .matadata directory  
-		    FileUtils.createDirectorys(servicesDirectory);
-		    FileUtils.createDirectorys(serviceXMLDirectory);		    
-		    
-		    //create the services.xml file
-		    File serviceXMLFile;
-            if (model.isGenerateServicesXML()){
-			    ServiceXMLCreator serviceXMLCreator = new ServiceXMLCreator(serviceName, 
-			    															serviceClass, 	
-			    															null);
-			    serviceXMLFile = new File(serviceXMLDirectory + File.separator + 
-			    		Axis2Constants.FILE_SERVICES_XML);
-			    FileWriter serviceXMLFileWriter;
-	
-				serviceXMLFileWriter = new FileWriter(serviceXMLFile, false);
-	            BufferedWriter writer = new BufferedWriter(serviceXMLFileWriter) ;
-	            writer.write(serviceXMLCreator.toString()) ;
-	            writer.close() ;
-            }else {
-            	String pathToServicesXML = model.getPathToServicesXML();
-            	if (pathToServicesXML == null){
-    				status = StatusUtils
-    					.errorStatus(Axis2CreationUIMessages.ERROR_INVALID_SERVICES_XML);
-    				environment.getStatusHandler().reportError(status); 
-            	}else{
-            		serviceXMLFile = new File(pathToServicesXML);
-            		File targetServicesXMLFile = new File(serviceXMLDirectory + File.separator + 
-            				Axis2Constants.FILE_SERVICES_XML);
-            		FileUtils.copy(serviceXMLFile, targetServicesXMLFile);
-            	}
-            	
-            }
-	        
-            //Copy the classes directory to the sevices directory
-            String classesDirectory = null;
-    		IPath projectRoot = FacetContainerUtils.getProjectRoot(project);
-    		IPath defaultClassesSubDirectory = ResourceUtils.getJavaOutputLocation(
-            		ResourcesPlugin.getWorkspace().getRoot().getProject(project));
-    		IPath defaultClassesSubDirectoryWithoutProjectRoot = ResourceUtils.getJavaOutputLocation(
-            		ResourcesPlugin.getWorkspace().getRoot().getProject(project))
-            		.removeFirstSegments(1).makeAbsolute();
-    		if(projectRoot.toOSString().contains(FacetContainerUtils.getWorkspace().toOSString())){
-    			classesDirectory = FacetContainerUtils.getWorkspace()
-    						.append(defaultClassesSubDirectory).toOSString();
-    		}else{
-    			classesDirectory = projectRoot
-    						.append(defaultClassesSubDirectoryWithoutProjectRoot).toOSString();
-    		}
-    		
-            //TODO copy only the relevent .classes to the aar
-			FileUtils.copyDirectory(new File(classesDirectory),
-									new File(servicesDirectory));
-			
-//			//Create the .aar file 
-//			String aarDirString =  FileUtils.addAnotherNodeToPath(webservicesDir, 
-//			Axis2CreationUIMessages.DIR_AAR);
-//			File aarDir = new File(aarDirString);
-//			FileUtils.createDirectorys(aarDirString);
-//			AARFileWriter aarFileWriter = new AARFileWriter();
-//			File serviseDir = new File(servicesDirectory);
-//			aarFileWriter.writeAARFile(aarDir, serviceName + 
-//			Axis2CreationUIMessages.FILE_AAR, serviseDir);
-			
-			//Import all the stuff form the .matadata directory to inside the current web project
-			} catch (IOException e) {
-				status = StatusUtils.errorStatus(
-						NLS.bind(Axis2CreationUIMessages.ERROR_INVALID_FILE_READ_WRITEL,
-								new String[]{e.getLocalizedMessage()}), e);
-				environment.getStatusHandler().reportError(status); 
-			} catch (Exception e) {
-				status = StatusUtils.errorStatus(
-						NLS.bind(Axis2CreationUIMessages.ERROR_INVALID_SERVICE_CREATION,
-								new String[]{e.getLocalizedMessage()}), e);
-				environment.getStatusHandler().reportError(status); 
-			}
-		    
-		
-	    
-	    return status;
-	}
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2BuildProjectCommand.java b/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2BuildProjectCommand.java
deleted file mode 100644
index 626dccd..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2BuildProjectCommand.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 runtime to the framework for 168762
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070507   185686 sandakith@wso2.com - Lahiru Sandakith
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.creation.core.command;
-
-//import org.apache.xerces.impl.validation.ValidationManager;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IncrementalProjectBuilder;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-
-public class Axis2BuildProjectCommand extends
-		AbstractDataModelOperation {
-	
-//	  private ValidationManager validationManager;
-	  private IProject project;
-	  private boolean forceBuild;
-
-	  /**
-	   * Default CTOR;
-	   */
-	  public Axis2BuildProjectCommand(){
-	  }
-	  
-	  public Axis2BuildProjectCommand(IProject project){
-		  this.project = project;
-	  }
-	  
-	  public Axis2BuildProjectCommand(IProject project, boolean forceBuild){
-		  this.project = project;
-		  this.forceBuild = forceBuild;
-	  }
-
-	  /**
-	   * Execute the command
-	   */
-	  public IStatus execute( IProgressMonitor monitor, IAdaptable adaptable )
-	  {
-	    try
-	    {
-	      if (forceBuild)
-	        project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, new NullProgressMonitor());
-//	      else if (validationManager == null)
-//	        project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, new NullProgressMonitor());
-//	      else if (validationManager.getWorkspaceAutoBuildPreference())
-//	        project.build(IncrementalProjectBuilder.INCREMENTAL_BUILD, new NullProgressMonitor());
-	    }
-	    catch (Exception e){
-	    }
-	    
-	    try{
-	     Job.getJobManager().join(ResourcesPlugin.FAMILY_AUTO_BUILD,
-  		  		new NullProgressMonitor());   
-	    }
-	    catch (InterruptedException ie){
-	      // continue execution
-	    }
-	    catch (OperationCanceledException oce){
-	      // continue execution
-	    }
-	    
-	    return Status.OK_STATUS;
-	  }
-	  /**
-	   * @param forceBuild The forceBuild to set.
-	   */
-	  public void setForceBuild(boolean forceBuild) {
-	    this.forceBuild = forceBuild;
-	  }
-
-	  /**
-	   * @param project The project to set.
-	   */
-	  public void setProject(IProject project) {
-	    this.project = project;
-	  }
-
-//	  /**
-//	   * @param validationManager The validationManager to set.
-//	   */
-//	  public void setValidationManager(ValidationManager validationManager) {
-//	    this.validationManager = validationManager;
-//	  }
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2ChengeBuildPathCommand.java b/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2ChengeBuildPathCommand.java
deleted file mode 100644
index 1fb540a..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2ChengeBuildPathCommand.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070125  168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.creation.core.command;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jdt.core.IClasspathEntry;
-import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-
-public class Axis2ChengeBuildPathCommand extends AbstractDataModelOperation {
-	
-	private IProject project;
-	private String srcDir;
-	private String outDir;
-	
-	public Axis2ChengeBuildPathCommand(IProject project, String srcDir, String outDir) {
-		this.project = project;
-		this.srcDir = srcDir;
-		this.outDir = outDir;
-	}
-
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info)
-				   throws ExecutionException {
-		
-		IPath srcPath = new Path(srcDir);
-		IPath outPath = new Path(outDir);
-		
-		IStatus status = Status.OK_STATUS;
-		final IJavaProject jproj = JavaCore.create(project);
-        final IClasspathEntry[] cp = {JavaCore.newSourceEntry(srcPath)};
-
-        try {
-			jproj.setRawClasspath(cp, outPath, null);
-			jproj.save(null, true);
-		} catch (JavaModelException e) {
-			e.printStackTrace();
-		}
-		return status;
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2CleanupCommand.java b/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2CleanupCommand.java
deleted file mode 100644
index b4bb82c..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2CleanupCommand.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070314   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse 
- * 										the Axis2 runtime to the framework for 168762
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.creation.core.command;
-
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-
-
-public class Axis2CleanupCommand extends AbstractDataModelOperation 
-{
-  
-  public Axis2CleanupCommand(){
-  }
-  
-  public IStatus execute( IProgressMonitor monitor, IAdaptable adaptable ) 
-  {
-    // Cleanup the reflection over head by increasing the priority to the garbage thread
-    System.gc();
-    return Status.OK_STATUS;      	
-  }
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2DefaultingCommand.java b/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2DefaultingCommand.java
deleted file mode 100644
index ffd5b23..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2DefaultingCommand.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070206   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070508   175030 sandakith@wso2.com - Lahiru Sandakith, WSDL not passed to Axis2 client fix
- * 20070612   192047 sandakith@wso2.com - Lahiru Sandakith, 192047
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.creation.core.command;
-
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.Properties;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.ws.axis2.consumption.core.utils.DefaultCodegenUtil;
-import org.eclipse.jst.ws.axis2.core.constant.Axis2Constants;
-import org.eclipse.jst.ws.axis2.core.context.ServiceContext;
-import org.eclipse.jst.ws.axis2.core.plugin.messages.Axis2CoreUIMessages;
-import org.eclipse.jst.ws.axis2.core.utils.Axis2CoreUtils;
-import org.eclipse.jst.ws.axis2.core.utils.FacetContainerUtils;
-import org.eclipse.jst.ws.axis2.creation.core.data.DataModel;
-import org.eclipse.jst.ws.axis2.creation.core.utils.CommonUtils;
-import org.eclipse.wst.command.internal.env.core.common.StatusUtils;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.ws.internal.wsrt.IWebService;
-import org.eclipse.wst.ws.internal.wsrt.WebServiceScenario;
-
-public class Axis2DefaultingCommand extends AbstractDataModelOperation 
-{
-	private DataModel model;
-	private IWebService ws;
-	private int scenario;
-	IStatus status;
-
-	public Axis2DefaultingCommand( DataModel model ,IWebService ws, int scenario)
-	{
-		this.model = model;  
-		this.ws=ws;
-		this.scenario=scenario;
-	}
-
-	public IStatus execute( IProgressMonitor monitor, IAdaptable adaptable ){
-		//Check wether the current dynamic Web Project is properly build to invoke web service
-		Properties properties = new Properties();
-		try {
-			properties.load(new FileInputStream(Axis2CoreUtils.tempRuntimeStatusFileLocation()));
-			if (properties.containsKey(Axis2Constants.PROPERTY_KEY_STATUS)){
-				 status = Status.OK_STATUS;
-				 model.setServerStatus(true);
-			}else{
-				status = StatusUtils.errorStatus(Axis2CoreUIMessages.ERROR_SERVER_IS_NOT_SET);
-			}
-		} catch (FileNotFoundException e) {
-			status = StatusUtils.errorStatus(Axis2CoreUIMessages.ERROR_INVALID_FILE_READ_WRITEL+
-												Axis2CoreUIMessages.ERROR_SERVER_IS_NOT_SET);
-		} catch (IOException e) {
-			status = StatusUtils.errorStatus(Axis2CoreUIMessages.ERROR_INVALID_FILE_READ_WRITEL+
-												Axis2CoreUIMessages.ERROR_SERVER_IS_NOT_SET);
-		}
-		
-		if (scenario == WebServiceScenario.TOPDOWN) {
-			model.setWsdlURI(ws.getWebServiceInfo().getWsdlURL());
-			model.setDatabindingType(Axis2Constants.DATA_BINDING_ADB);
-			DefaultCodegenUtil defaultCodegenUtil = new DefaultCodegenUtil(model);
-			defaultCodegenUtil.populateModelParamsFromWSDL();
-			model.setServicesXML(true);
-			model.setServerXMLCheck(true);
-			ServiceContext.getInstance().setServiceName(model.getServiceName());
-		}else if (scenario == WebServiceScenario.BOTTOMUP) {
-			model.setServiceClass(ws.getWebServiceInfo().getImplURL());
-			//set the service name inside BUServiceContext for used by client if invoke together
-			ServiceContext.getInstance().setServiceName(
-					CommonUtils.classNameFromQualifiedName(ws.getWebServiceInfo().getImplURL())
-					);
-			
-			model.setGenerateServicesXML(true);
-		}else{
-			//never come here
-		}
-		
-		// Fix for the Bugzilla Bug 175030
-		// Axis2: WSDL representing Web service not passed to Axis2 client
-		// After setting the initial wsdlURL return from the framework to the data model,
-		// replace it with the deployed wsdlURL
-		String deployedWSDLURL = FacetContainerUtils.getDeployedWSDLURL(
-				ResourcesPlugin.getWorkspace().getRoot().getProject(model.getWebProjectName()),
-				ws.getWebServiceInfo().getServerFactoryId(),
-				ws.getWebServiceInfo().getServerInstanceId(),
-				ServiceContext.getInstance().getServiceName());
-		
-		ws.getWebServiceInfo().setWsdlURL(deployedWSDLURL);
-		
-		return status;      	
-	}
-
-	public DataModel getWebServiceDataModel()
-	{
-		return model;
-	}
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2ServicesXMLValidationCommand.java b/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2ServicesXMLValidationCommand.java
deleted file mode 100644
index 974dcef..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2ServicesXMLValidationCommand.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 runtime to the framework for 168762
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.creation.core.command;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-
-public class Axis2ServicesXMLValidationCommand extends
-		AbstractDataModelOperation {
-
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info)
-			throws ExecutionException {
-		//Here write the code to validate the services.xml
-	    IStatus status = Status.OK_STATUS; 
-	    return status;
-	}
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2SkelImplCommand.java b/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2SkelImplCommand.java
deleted file mode 100644
index 27b2243..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2SkelImplCommand.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070123   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.creation.core.command;
-
-import java.net.MalformedURLException;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.ws.axis2.core.constant.Axis2Constants;
-import org.eclipse.jst.ws.axis2.core.utils.FileUtils;
-import org.eclipse.jst.ws.axis2.creation.core.data.DataModel;
-import org.eclipse.jst.ws.axis2.creation.core.messages.Axis2CreationUIMessages;
-import org.eclipse.jst.ws.axis2.creation.core.utils.CommonUtils;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.command.internal.env.core.common.StatusUtils;
-import org.eclipse.wst.common.environment.IEnvironment;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.ws.internal.wsrt.WebServiceInfo;
-
-public class Axis2SkelImplCommand extends AbstractDataModelOperation {
-
-	private WebServiceInfo webServiceInfo;
-	private DataModel model;
-
-	public Axis2SkelImplCommand(WebServiceInfo webServiceInfo, DataModel model){
-		this.webServiceInfo = webServiceInfo;
-		this.model=model;
-	}
-
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
-		
-		IStatus status = Status.OK_STATUS;
-		IEnvironment environment = getEnvironment();
-
-		String workspaceDirectory = ResourcesPlugin.getWorkspace().getRoot().
-													getLocation().toOSString();
-		String currentDynamicWebProjectDir = FileUtils.addAnotherNodeToPath(
-													   workspaceDirectory, 
-													   model.getWebProjectName());
-		String projectSrcDir =  FileUtils.addAnotherNodeToPath(
-											currentDynamicWebProjectDir, 
-											Axis2Constants.DIR_SRC);
-
-		String packagePath = CommonUtils.packgeName2PathName(model.getPackageText());
-		String packageDir = FileUtils.addAnotherNodeToPath(projectSrcDir, packagePath);
-		String serviceSkeletonImpl = FileUtils.addAnotherNodeToPath(packageDir, model.
-																	getServiceName());
-
-		String serviceSkeletonImplURL =  serviceSkeletonImpl + Axis2Constants.SKELETON_SUFFIX;
-		IPath serviceSkeletonImplURLPath = new Path(serviceSkeletonImplURL); 
-		try {
-			//webServiceInfo.setImplURL(serviceSkeletonImplURLPath.toFile().toURL().toString());
-			//String[] implURLArray = {serviceSkeletonImplURL};
-			//webServiceInfo.setImplURLs( implURLArray);
-			
-			String serviceSkeletonImplURLString = 
-				serviceSkeletonImplURLPath.toFile().toURL().toString();
-
-			webServiceInfo.setImplURL(serviceSkeletonImplURLString);
-			String[] implURLArray = {serviceSkeletonImplURLString};
-			webServiceInfo.setImplURLs( implURLArray);
-
-			
-		} catch (MalformedURLException e) {
-			status = StatusUtils.errorStatus(
-					NLS.bind(Axis2CreationUIMessages.ERROR_INVALID_FILE_READ_WRITEL,
-							new String[]{e.getLocalizedMessage()}), e);
-			environment.getStatusHandler().reportError(status); 
-		}
-
-		return status;
-		
-	}
-	
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2TDCommand.java b/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2TDCommand.java
deleted file mode 100644
index e07e7d0..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2TDCommand.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 runtime to the framework for 168762
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.creation.core.command;
-
-
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.ws.axis2.creation.core.data.DataModel;
-import org.eclipse.jst.ws.axis2.creation.core.messages.Axis2CreationUIMessages;
-import org.eclipse.wst.command.internal.env.core.common.StatusUtils;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-
-
-public class Axis2TDCommand extends AbstractDataModelOperation 
-{
-  private DataModel model;
-  
-  public Axis2TDCommand( DataModel model )
-  {
-    this.model = model;  
-  }
-  
-  public IStatus execute( IProgressMonitor monitor, IAdaptable adaptable ) 
-  {
-    IStatus status = Status.OK_STATUS;  
-    // Check for the nessesary data are available for the scenario to begin
-    if (model.getWsdlURI() == null){
-		status = StatusUtils.errorStatus(Axis2CreationUIMessages.ERROR_INVALID_SERVICE_CREATION);
-    }else {
-		status = Status.OK_STATUS; // Ok to proceed 
-	}
-    return status;      	
-  }
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2TDServiceCreationCommand.java b/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2TDServiceCreationCommand.java
deleted file mode 100644
index dc4e477..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2TDServiceCreationCommand.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070507   184740 sandakith@wso2.com - Lahiru Sandakith
- * 20070625   192522 sandakith@wso2.com - Lahiru Sandakith, fix the build path problem
- * 20070813   196173  sandakith@wso2.com - Lahiru Sandakith, Fix 196173, DWP custom location fix
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.creation.core.command;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.ws.axis2.core.constant.Axis2Constants;
-import org.eclipse.jst.ws.axis2.core.utils.FacetContainerUtils;
-import org.eclipse.jst.ws.axis2.core.utils.FileUtils;
-import org.eclipse.jst.ws.axis2.creation.core.data.DataModel;
-import org.eclipse.jst.ws.axis2.creation.core.messages.Axis2CreationUIMessages;
-import org.eclipse.jst.ws.internal.common.ResourceUtils;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.command.internal.env.core.common.StatusUtils;
-import org.eclipse.wst.common.environment.IEnvironment;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.ws.internal.wsrt.IWebService;
-
-public class Axis2TDServiceCreationCommand extends
-AbstractDataModelOperation {
-	
-  	private DataModel model;
-  	private String project;
-
-  public Axis2TDServiceCreationCommand( DataModel model,IWebService ws, String project ) {
-    this.model = model;  
-    this.project = project;
-  }
-
-public IStatus execute(IProgressMonitor monitor, IAdaptable info)
-		throws ExecutionException {
-	IStatus status = Status.OK_STATUS;  
-	IEnvironment environment = getEnvironment();
-
-	try {
-		
-		String workspaceDirectory = ResourcesPlugin.getWorkspace()
-														.getRoot().getLocation().toOSString();
-		String currentDynamicWebProjectDir = FacetContainerUtils.getProjectRoot( 
-														model.getWebProjectName()).toOSString();
-		String matadataDir = FileUtils.addAnotherNodeToPath(workspaceDirectory,
-				Axis2Constants.DIR_DOT_METADATA);
-	    String matadataPluginsDir = FileUtils.addAnotherNodeToPath(matadataDir,
-	    		Axis2Constants.DIR_DOT_PLUGINS);
-	    String matadataAxis2Dir = FileUtils.addAnotherNodeToPath(matadataPluginsDir, 
-	    		Axis2Constants.AXIS2_PROJECT);
-	    String tempServicesDir = FileUtils.addAnotherNodeToPath(matadataAxis2Dir,
-	    		Axis2Constants.DIR_SERVICES);
-	    
-	    model.setPathToWebServicesTempDir(tempServicesDir);
-		
-	    //Exploded temperory services directory
-		String currentservicesDirectory = FileUtils.addAnotherNodeToPath(tempServicesDir, 
-														model.getServiceName());
-		String metaInfDirectory = FileUtils.addAnotherNodeToPath(currentservicesDirectory, 
-				Axis2Constants.DIR_META_INF);
-		
-		//Create the directories
-		//Create the Webservices stuff on the workspace .matadata directory  
-	    FileUtils.createDirectorys(currentservicesDirectory);
-	    FileUtils.createDirectorys(metaInfDirectory);		    
-	    
-	    
-	    //copy the generated resources (services.xml .wsdl ) files
-	    //at resources/service.xml
-	    String currentProjectResourcesDirString = FileUtils
-	    		.addAnotherNodeToPath(currentDynamicWebProjectDir, 
-	    				Axis2Constants.DIR_RESOURCES);
-	    File currentProjectResourcesDir = new File(currentProjectResourcesDirString);
-	    if(!currentProjectResourcesDir.exists()){
-	    	currentProjectResourcesDir.mkdir();
-	    }
-	    FileUtils.copyDirectory(currentProjectResourcesDir, new File(metaInfDirectory));
-        
-        //Copy the classes directory to the sevices directory
-        String classesDirectory = null;
-		IPath projectRoot = FacetContainerUtils.getProjectRoot(project);
-		IPath defaultClassesSubDirectory = ResourceUtils.getJavaOutputLocation(
-        		ResourcesPlugin.getWorkspace().getRoot().getProject(project));
-		IPath defaultClassesSubDirectoryWithoutProjectRoot = ResourceUtils.getJavaOutputLocation(
-        		ResourcesPlugin.getWorkspace().getRoot().getProject(project))
-        		.removeFirstSegments(1).makeAbsolute();
-		if(projectRoot.toOSString().contains(FacetContainerUtils.getWorkspace().toOSString())){
-			classesDirectory = FacetContainerUtils.getWorkspace()
-						.append(defaultClassesSubDirectory).toOSString();
-		}else{
-			classesDirectory = projectRoot
-						.append(defaultClassesSubDirectoryWithoutProjectRoot).toOSString();
-		}
-		
-        //TODO copy only the relevent .classes to the aar
-		FileUtils.copyDirectory(new File(classesDirectory),
-								new File(currentservicesDirectory));
-		
-//		//Create the .aar file 
-//		String aarDirString =  FileUtils.addAnotherNodeToPath(webservicesDir, 
-// 		Axis2CreationUIMessages.DIR_AAR);
-//		File aarDir = new File(aarDirString);
-//		FileUtils.createDirectorys(aarDirString);
-//		AARFileWriter aarFileWriter = new AARFileWriter();
-//		File serviseDir = new File(servicesDirectory);
-//		aarFileWriter.writeAARFile(aarDir, serviceName + 
-//		Axis2CreationUIMessages.FILE_AAR, serviseDir);
-		
-		
-		//Import all the stuff form the .matadata directory to inside the current web project
-		} catch (IOException e) {
-			status = StatusUtils.errorStatus(
-					NLS.bind(Axis2CreationUIMessages.ERROR_INVALID_FILE_READ_WRITEL,
-							new String[]{e.getLocalizedMessage()}), e);
-			environment.getStatusHandler().reportError(status); 
-		} catch (Exception e) {
-			status = StatusUtils.errorStatus(
-					NLS.bind(Axis2CreationUIMessages.ERROR_INVALID_SERVICE_CREATION,
-							new String[]{e.getLocalizedMessage()}), e);
-			environment.getStatusHandler().reportError(status); 
-		}
-	    
-	
-    
-    return status;
-}
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2WSDL2JavaCommand.java b/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2WSDL2JavaCommand.java
deleted file mode 100644
index aa38d62..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2WSDL2JavaCommand.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007, 2008 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070118   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070507   184729 sandakith@wso2.com - Lahiru Sandakith
- * 20070518   187311 sandakith@wso2.com - Lahiru Sandakith, Fixing test resource addition
- * 20070813   196173  sandakith@wso2.com - Lahiru Sandakith, Fix 196173, DWP custom location fix
- * 20070814   187840 sandakith@wso2.com - Lahiru Sandakith, Fixing 187840 ITE message
- * 20070814   193593 sandakith@wso2.com - Lahiru Sandakith, custom package name fix
- * 20080213   218910 kathy@ca.ibm.com - Kathy Chan
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.creation.core.command;
-
-import java.io.File;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.util.Map;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.ws.axis2.consumption.core.utils.ContentCopyUtils;
-import org.eclipse.jst.ws.axis2.consumption.core.utils.WSDL2JavaGenerator;
-import org.eclipse.jst.ws.axis2.consumption.core.utils.WSDLPropertyReader;
-import org.eclipse.jst.ws.axis2.core.utils.ClassLoadingUtil;
-import org.eclipse.jst.ws.axis2.core.utils.FacetContainerUtils;
-import org.eclipse.jst.ws.axis2.core.utils.FileUtils;
-import org.eclipse.jst.ws.axis2.creation.core.data.DataModel;
-import org.eclipse.jst.ws.axis2.creation.core.messages.Axis2CreationUIMessages;
-import org.eclipse.jst.ws.axis2.creation.core.utils.PathLoadingUtil;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.wst.command.internal.env.core.common.StatusUtils;
-import org.eclipse.wst.common.environment.IEnvironment;
-import org.eclipse.wst.common.environment.IStatusHandler;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-
-public class Axis2WSDL2JavaCommand extends AbstractDataModelOperation {
-	
-	  private DataModel model;
-		
-	  public Axis2WSDL2JavaCommand( DataModel model ){
-	    this.model = model;  
-	  }
-
-
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info)
-													 throws ExecutionException {
-		
-		IStatus status = Status.OK_STATUS;  
-		IEnvironment environment = getEnvironment();
-		IStatusHandler statusHandler = environment.getStatusHandler();	
-		
-		PathLoadingUtil.init(model);
-		String tempCodegenOutputLocation =PathLoadingUtil.getTempCodegenOutputLocation();
-		String currentDynamicWebProjectDir = FacetContainerUtils.getProjectRoot(
-				                                  model.getWebProjectName()).toOSString();
-		
-		File tempCodegenLocationFile = new File(tempCodegenOutputLocation);
-		if (tempCodegenLocationFile.exists())FileUtils.deleteDirectories(tempCodegenOutputLocation);
-		FileUtils.createDirectorys(tempCodegenOutputLocation);
-        WSDL2JavaGenerator generator = new WSDL2JavaGenerator(); 
-        
-        //AxisService service;
-        Object axisServiceInstance;
-       
-        String transformerFactory = null;
-        boolean transformerFactoryModified = false;
-        
-	try {
-		// use the xalan transformer factory if loadable
-		try {
-			transformerFactory = System.getProperty("javax.xml.transform.TransformerFactory");
-			Class.forName("org.apache.xalan.processor.TransformerFactoryImpl");
-			String modifiedTransformerFactory = "org.apache.xalan.processor.TransformerFactoryImpl";
-			if (!modifiedTransformerFactory.equals(transformerFactory)) {
-				System.setProperty("javax.xml.transform.TransformerFactory", modifiedTransformerFactory);
-				transformerFactoryModified = true;
-			}
-		}
-		catch (ClassNotFoundException e) {
-			// If class not found, keep using the default transformer factory.
-		}
-		
-		//service = generator.getAxisService(model.getWsdlURI());
-		ClassLoadingUtil.init(model.getWebProjectName());
-		axisServiceInstance = generator.getAxisService(model.getWsdlURI());
-        Map optionsMap = generator.fillOptionMap(	
-        	false,  //async always false
-            false,	//sync always false
-            true,   //is serverside true
-            model.isServerXMLCheck(),
-            false,  //No test case with out stub
-            model.isGenerateAllCheck(),
-            (model.getServiceName()!=null)?model.getServiceName():null,
-            (model.getPortName()!=null)?model.getPortName():null,
-            (model.getDatabindingType().toLowerCase()!=null)?
-            		model.getDatabindingType().toLowerCase():
-            		null,
-            (model.getWsdlURI()!=null)?model.getWsdlURI():null,
-            (model.getPackageText()!=null)?model.getPackageText():null,
-            "java",
-            tempCodegenOutputLocation,
-            model.getNamespaseToPackageMapping(),
-            model.isGenerateServerSideInterface()
-          );
-        
-        
-        //CodeGenConfiguration codegenConfig = new CodeGenConfiguration(service, optionsMap);
-		Class CodeGenConfigurationClass = ClassLoadingUtil
-				.loadClassFromAntClassLoader("org.apache.axis2.wsdl.codegen.CodeGenConfiguration");
-
-		//-----------------------------------------------------------------------------------//
-		//Fix for the Axis2 1.2 
-		//Constructor CodeGenConfigurationConstructor = CodeGenConfigurationClass
-		//		.getConstructor(new Class[]{axisServiceInstance.getClass(),Map.class});
-		//Object CodeGenConfigurationInstance = CodeGenConfigurationConstructor
-		//		.newInstance(new Object[]{axisServiceInstance,optionsMap});
-		
-		Constructor CodeGenConfigurationConstructor = CodeGenConfigurationClass
-				.getConstructor(new Class[]{Map.class});
-		Object CodeGenConfigurationInstance = CodeGenConfigurationConstructor
-				.newInstance(new Object[]{optionsMap});
-		
-		// codegenConfig.addAxisService(service);
-		Method addAxisServiceMethod = CodeGenConfigurationClass
-				.getMethod("addAxisService", new Class[]{ axisServiceInstance.getClass()});
-		addAxisServiceMethod.invoke(CodeGenConfigurationInstance, 
-							new Object[]{axisServiceInstance});
-		
-        //set the wsdl definision for codegen config for skeleton generarion.
-        WSDLPropertyReader reader = new WSDLPropertyReader();
-        reader.readWSDL(model.getWebProjectName(),model.getWsdlURI());
-        Object wsdlDefinitionInstance = reader.getWsdlDefinitionInstance();
-        //Class DefinitionClass = ClassLoadingUtil.loadClassFromAntClassLoader("javax.wsdl.Definition");
-        //codegenConfig.setWsdlDefinition(wsdlDefinition);
-		Method setWsdlDefinitionMethod = CodeGenConfigurationClass
-				.getMethod("setWsdlDefinition", new Class[]{reader.getWsdlDefinitionClass()});
-		setWsdlDefinitionMethod.invoke(CodeGenConfigurationInstance, 
-					new Object[]{wsdlDefinitionInstance});       
-        
-		//-----------------------------------------------------------------------------------//
-
-		//set the baseURI
-        //codegenConfig.setBaseURI(generator.getBaseUri(model.getWsdlURI()));
-		
-		Method setBaseURIMethod = CodeGenConfigurationClass
-			.getMethod("setBaseURI", new Class[]{ String.class});
-		setBaseURIMethod.invoke(CodeGenConfigurationInstance, 
-								new Object[]{generator.getBaseUri(model.getWsdlURI())});
-		
-		//Get the namespace from the AxisService and set it in the configuration 
-		Class AxisServiceClass = ClassLoadingUtil
-					.loadClassFromAntClassLoader("org.apache.axis2.description.AxisService");		
-		Method getTargetNamespaceMethod = AxisServiceClass.getMethod("getTargetNamespace", null);
-		Object targetNamespace = getTargetNamespaceMethod.invoke(axisServiceInstance, null);
-		
-		Object stringReturn = null;
-		if(model.getPackageText()!=null){
-			stringReturn = model.getPackageText();
-		}else{
-			Class URLProcessorClass = ClassLoadingUtil
-					.loadClassFromAntClassLoader("org.apache.axis2.util.URLProcessor");
-			Method makePackageNameMethod = URLProcessorClass
-					.getMethod("makePackageName", new Class[]{String.class});
-			stringReturn = makePackageNameMethod.invoke(null, new Object[]{targetNamespace});
-		}
-		
-		model.setPackageText(stringReturn.toString());
-		
-		Method setPackageNameMethod = CodeGenConfigurationClass
-					.getMethod("setPackageName", new Class[]{String.class});
-		setPackageNameMethod.invoke(CodeGenConfigurationInstance, new Object[]{stringReturn});
-		
-        //new CodeGenerationEngine(codegenConfig).generate();
-		Class CodeGenerationEngineClass = ClassLoadingUtil
-				.loadClassFromAntClassLoader("org.apache.axis2.wsdl.codegen.CodeGenerationEngine");
-		Constructor CodeGenerationEngineConstructor = CodeGenerationEngineClass
-						.getConstructor(new Class[]{CodeGenConfigurationInstance.getClass()});
-		Object CodeGenerationEngineInstance  = CodeGenerationEngineConstructor
-						.newInstance(new Object[]{CodeGenConfigurationInstance});
-		
-		//Invoke Codegen Method
-		Method generateMethod = CodeGenerationEngineClass.getMethod("generate", null);
-		generateMethod.invoke(CodeGenerationEngineInstance, null);
-		
-        
-		//Copy the existing codegen results to the current project
-        ContentCopyUtils contentCopyUtils = new ContentCopyUtils();
-	    status = contentCopyUtils.copyDirectoryRecursivelyIntoWorkspace(
-	    							tempCodegenOutputLocation, 
-	    							currentDynamicWebProjectDir, 
-	    							monitor, 
-	    							statusHandler);
-
-        
-	} catch (Exception e) {
-		status = StatusUtils.errorStatus(NLS.bind(
-											Axis2CreationUIMessages.ERROR_CODEGEN_EXCEPTION,
-											new String[]{" : "+e.getCause()}),
-										e);
-		e.printStackTrace();
-		environment.getStatusHandler().reportError(status); 
-	} finally {
-		if (transformerFactoryModified) {
-			// restore to the original TransformerFactory
-			if (transformerFactory == null) {
-				System.clearProperty("javax.xml.transform.TransformerFactory"); 
-			} else {
-				System.setProperty("javax.xml.transform.TransformerFactory", transformerFactory); 
-			}
-		}
-	}
-		
-		return status;
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2WebservicesServerCommand.java b/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2WebservicesServerCommand.java
deleted file mode 100644
index 9d7e3c9..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2WebservicesServerCommand.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070510   172926 sandakith@wso2.com - Lahiru Sandakith, Fix 172926 Use Util Classes
- * 20070813   196173  sandakith@wso2.com - Lahiru Sandakith, Fix 196173, DWP custom location fix
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.creation.core.command;
-
-import java.io.File;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.ws.axis2.consumption.core.utils.ContentCopyUtils;
-import org.eclipse.jst.ws.axis2.core.constant.Axis2Constants;
-import org.eclipse.jst.ws.axis2.core.utils.FacetContainerUtils;
-import org.eclipse.jst.ws.axis2.core.utils.FileUtils;
-import org.eclipse.jst.ws.axis2.creation.core.data.DataModel;
-import org.eclipse.wst.common.environment.IEnvironment;
-import org.eclipse.wst.common.environment.IStatusHandler;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-import org.eclipse.wst.ws.internal.wsrt.WebServiceScenario;
-
-public class Axis2WebservicesServerCommand extends AbstractDataModelOperation {
-
-	private DataModel model;
-	private int scenario;
-
-	public Axis2WebservicesServerCommand( DataModel model, int scenario ){
-		this.model = model;  
-		this.scenario = scenario;
-	}
-
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info)
-	throws ExecutionException {
-
-		IStatus status = Status.OK_STATUS;
-		IEnvironment environment = getEnvironment();
-		IStatusHandler statusHandler = environment.getStatusHandler();	
-
-		String webContainerDirString = FacetContainerUtils.pathToWebProjectContainer(
-				model.getWebProjectName());
-
-		ContentCopyUtils contentCopyUtils = new ContentCopyUtils();
-		
-		//Check for the server status
-		if (model.getServerStatus()){
-			if (scenario == WebServiceScenario.BOTTOMUP){
-				//Import the tempory webservices directory according to the Resources API of eclipse 
-				String webserviceTempDirString = model.getPathToWebServicesTempDir();
-				String repositoryString = webContainerDirString 
-				+ File.separator + Axis2Constants.DIR_WEB_INF 
-				+ File.separator + Axis2Constants.DIR_SERVICES;
-				//Copy the existing services to the repository
-				status = contentCopyUtils.copyDirectoryRecursivelyIntoWorkspace(
-											webserviceTempDirString, 
-											repositoryString, 
-											monitor, 
-											statusHandler);
-				FileUtils.deleteDirectories(webserviceTempDirString);
-
-
-			}else if (scenario == WebServiceScenario.TOPDOWN){
-				//Do topdown
-				String webserviceTempDirString = model.getPathToWebServicesTempDir();
-				String repositoryString = webContainerDirString 
-				+ File.separator + Axis2Constants.DIR_WEB_INF 
-				+ File.separator + Axis2Constants.DIR_SERVICES;
-				//Copy the existing services to the repository
-				status = contentCopyUtils.copyDirectoryRecursivelyIntoWorkspace(
-											webserviceTempDirString, 
-											repositoryString, 
-											monitor, 
-											statusHandler);
-				FileUtils.deleteDirectories(webserviceTempDirString);
-			}
-			status = Status.OK_STATUS;
-		}else{
-			status = Status.CANCEL_STATUS;
-		}
-
-		return status;
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/messages/Axis2CreationUI.properties b/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/messages/Axis2CreationUI.properties
deleted file mode 100644
index 0f03d4e..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/messages/Axis2CreationUI.properties
+++ /dev/null
@@ -1,49 +0,0 @@
-###############################################################################
-# Copyright (c) 2007, 2008 WSO2 Inc. 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:
-# WSO2 Inc. - initial API and implementation
-# yyyymmdd bug      Email and other contact information
-# -------- -------- -----------------------------------------------------------
-# 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
-#										 runtime to the framework for 168762
-# 20070511   186440 sandakith@wso2.com - Lahiru Sandakith fix 186440
-# 20070517   187307 sandakith@wso2.com - Lahiru Sandakith, Fix 187307 Property File Fix
-# 20070529   188742 sandakith@wso2.com - Lahiru Sandakith, fix for 188742
-# 20070601   190505 pmoogk@ca.ibm.com - Peter Moogk
-# 20080130   216997 katep@wso2.com - Kate Price
-###############################################################################
-#
-# Axis2 server component type labels
-#
-LABEL_HAVE_SERVICES_XML_FILE=Use an existing services.xml file
-LABEL_DEFAULT_SERVICES_XML_FILE=Generate a default services.xml file
-LABEL_AXIS2_PREFERENCE_PAGE=Axis2 Web Service Java Bean Configuration
-LABEL_AXIS2_PREFERENCE_PAGE_HEADING=Axis2 Web Service Java Bean Configuration
-LABEL_AXIS2_PREFERENCE_PAGE_SUB_HEADING=Customize your Web service
-LABEL_BROWSE=&Browse
-LABEL_JAVA_2_WSDL_PAGE_HEADING=Axis2 Web Service Skeleton Java Bean Configuration
-LABEL_JAVA_2_WSDL_PAGE_SUB_HEADING=Select the appropriate code generation settings
-LABEL_SERVICE_NAME_CAPTION=Service Name
-LABEL_GENERATE_TESTCASE_CAPTION=Generate a JUnit test case to test the service
-LABEL_DATABINDING_CAPTION=Databinding
-LABEL_PORTNAME=Port Name
-LABEL_GENERATE_ALL=Generate all types for all elements referred by schemas
-LABEL_GENERATE_SERVERSIDE_INTERFACE=Generate an interface for the skeleton
-LABEL_PACKEGE_NAME=Custom package name
-LABEL_NAMESPACE=Namespace
-LABEL_PACKAGE=Package
-LABEL_NAMESPACE_TO_PACKAGE=Namespace to package mappings
-
-#
-# Axis2 server component type error
-#
-ERROR_INVALID_SERVICES_XML=You must select a valid services.xml file
-ERROR_INVALID_FILE_READ_WRITEL=Exception occurred while reading or writing file {0}
-ERROR_INVALID_WSDL_FILE_READ_WRITEL=Exception occurred while reading or writing WSDL {0}
-ERROR_INVALID_SERVICE_CREATION=Exception occurred during service creation
-ERROR_CODEGEN_EXCEPTION=Exception occurred during code generation for the WSDL {0}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/messages/Axis2CreationUIMessages.java b/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/messages/Axis2CreationUIMessages.java
deleted file mode 100644
index 13249f8..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/messages/Axis2CreationUIMessages.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 runtime to the framework for 168762
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070511   186440 sandakith@wso2.com - Lahiru Sandakith fix 186440
- * 20070517   187307 sandakith@wso2.com - Lahiru Sandakith, Fix 187307 Property File Fix
- * 20070601   190505 pmoogk@ca.ibm.com - Peter Moogk
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.creation.core.messages;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Axis2CreationUIMessages extends NLS {
-
-	//get the lables from this massages to the properties file
-	private static final String BUNDLE_NAME = 
-			"org.eclipse.jst.ws.axis2.creation.core.messages.Axis2CreationUI";	//$NON-NLS-1$
-
-	private Axis2CreationUIMessages() {
-		// Do not instantiate
-	}
-	//labels
-	public static String LABEL_HAVE_SERVICES_XML_FILE;
-	public static String LABEL_DEFAULT_SERVICES_XML_FILE;
-	public static String LABEL_AXIS2_PREFERENCE_PAGE;
-	public static String LABEL_AXIS2_PREFERENCE_PAGE_HEADING;
-	public static String LABEL_AXIS2_PREFERENCE_PAGE_SUB_HEADING;
-	public static String LABEL_BROWSE;
-	public static String LABEL_JAVA_2_WSDL_PAGE_HEADING;
-	public static String LABEL_JAVA_2_WSDL_PAGE_SUB_HEADING;
-	public static String LABEL_SERVICE_NAME_CAPTION;
-	public static String LABEL_GENERATE_TESTCASE_CAPTION;
-	public static String LABEL_DATABINDING_CAPTION;
-	public static String LABEL_PORTNAME;
-	public static String LABEL_GENERATE_ALL;
-	public static String LABEL_GENERATE_SERVERSIDE_INTERFACE;
-	public static String LABEL_PACKEGE_NAME;
-	public static String LABEL_NAMESPACE;
-	public static String LABEL_PACKAGE;
-	public static String LABEL_NAMESPACE_TO_PACKAGE;
-
-	//error
-	public static String ERROR_INVALID_SERVICES_XML;
-	public static String ERROR_INVALID_FILE_READ_WRITEL;
-	public static String ERROR_INVALID_WSDL_FILE_READ_WRITEL;
-	public static String ERROR_INVALID_SERVICE_CREATION;
-	public static String ERROR_CODEGEN_EXCEPTION;
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, Axis2CreationUIMessages.class);
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/plugin/WebServiceAxis2CreationCorePlugin.java b/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/plugin/WebServiceAxis2CreationCorePlugin.java
deleted file mode 100644
index f19af8e..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/plugin/WebServiceAxis2CreationCorePlugin.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070130   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.creation.core.plugin;
-
-import org.eclipse.core.runtime.Plugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class WebServiceAxis2CreationCorePlugin extends Plugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.jst.ws.axis2.creation.core";
-
-	// The shared instance
-	private static WebServiceAxis2CreationCorePlugin plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public WebServiceAxis2CreationCorePlugin() {
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static WebServiceAxis2CreationCorePlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/utils/AARFileWriter.java b/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/utils/AARFileWriter.java
deleted file mode 100644
index 72eebb2..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/utils/AARFileWriter.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.creation.core.utils;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.taskdefs.Jar;
-import org.eclipse.jst.ws.axis2.core.constant.Axis2Constants;
-
-public class AARFileWriter extends Jar{
-
-    public AARFileWriter() {
-        this.setProject(new Project());
-        this.getProject().init();
-        this.setTaskType(Axis2Constants.JAR_TASK);
-        this.setTaskName(Axis2Constants.JAR_TASK);
-        this.setOwningTarget(new org.apache.tools.ant.Target());
-    }
-
-    public void writeAARFile(File outputFolder,
-    						 String outputFileName,
-    						 File inputFileFolder) throws IOException,Exception {
-
-        if (!outputFolder.exists()){
-            outputFolder.mkdir(); //create the output path
-        }else{
-            if (!outputFolder.isDirectory())
-                return;
-        }
-
-        File targetFile = new File(outputFolder,outputFileName);
-        this.setBasedir(inputFileFolder);
-        this.setDestFile(targetFile);
-
-        //run the task
-        this.perform();
-    }
-
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/utils/CommonUtils.java b/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/utils/CommonUtils.java
deleted file mode 100644
index c1d04fd..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/utils/CommonUtils.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * -------- -------- -----------------------------------------------------------
- * 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.creation.core.utils;
-
-
-public class CommonUtils {
-	
-	 public static String classNameFromQualifiedName(String qualifiedCalssName){
-		 //This was done due to not splitting with . Strange
-		 qualifiedCalssName = qualifiedCalssName.replace('.', ':');
-		 String[] parts = qualifiedCalssName.split(":");
-		 if (parts.length == 0){
-			 return "";
-		 }
-		 return parts[parts.length-1];
-	 }
-	  
-	 public static String packageNameFromQualifiedName(String qualifiedCalssName){
-		 //This was done due to not splitting with . Strange
-		 qualifiedCalssName = qualifiedCalssName.replace('.', ':');
-		 String[] parts = qualifiedCalssName.split(":");
-		 StringBuffer packageName = new StringBuffer();
-		 for (int i = 0; i < parts.length-1; i++) {
-			 packageName.append(parts[i]);
-			 if (! (i == parts.length-2)){
-				 packageName.append(".");
-			 }
-		 }
-		 return packageName.toString();
-	 }
-	 
-	 
-	 public static String packgeName2PathName(String packageName){
-		 packageName = packageName.replace('.', '/');
-		 return packageName;
-	 }
-	 
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/utils/PathLoadingUtil.java b/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/utils/PathLoadingUtil.java
deleted file mode 100644
index 5926011..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/utils/PathLoadingUtil.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070330   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070507   184740 sandakith@wso2.com - Lahiru Sandakith
- * 20070507   185686 sandakith@wso2.com - Lahiru Sandakith
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.creation.core.utils;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jst.ws.axis2.core.constant.Axis2Constants;
-import org.eclipse.jst.ws.axis2.core.utils.FileUtils;
-import org.eclipse.jst.ws.axis2.creation.core.data.DataModel;
-
-public class PathLoadingUtil {
-	
-	//Model
-	private static  DataModel model = null;
-
-	//Paths
-	private static String tempCodegenOutputLocation = null;
-	private static String currentDynamicWebProjectDir = null;
-	private static String workspaceDirectory = null;
-	private static String currentProjectWebProjectName = null;
-	
-	//Already Computed
-	private static boolean alreadyInit = false;
-	private static boolean alreadyComputeTempCodegenOutputLocation = false;
-	private static boolean alreadyComputeCurrentDynamicWebProjectDir = false;
-	private static boolean alreadyComputeWorkspaceDirectory = false;
-	private static boolean requireToupdateModel = false;
-	
-	public static void init(DataModel inputModel){
-		requireToupdateModel = !alreadyInit || 
-		!currentProjectWebProjectName.equals(inputModel.getWebProjectName());
-		if(requireToupdateModel){
-		model = inputModel;
-		currentProjectWebProjectName = inputModel.getWebProjectName();
-		}
-		}
-
-	public	static String getWorkspaceDirectory() {
-		if (!alreadyComputeWorkspaceDirectory){
-			workspaceDirectory = ResourcesPlugin.getWorkspace().getRoot()
-			.getLocation().toOSString();
-			alreadyComputeWorkspaceDirectory = true;
-		}
-		return workspaceDirectory;
-	}
-	
-	public static String getCurrentDynamicWebProjectDir(){
-		if (!alreadyComputeCurrentDynamicWebProjectDir || requireToupdateModel){
-			currentDynamicWebProjectDir = FileUtils.addAnotherNodeToPath(
-			getWorkspaceDirectory(), model.getWebProjectName());
-			alreadyComputeCurrentDynamicWebProjectDir = true;
-		}
-		return currentDynamicWebProjectDir;
-	}
-	
-	
-	public static String getTempCodegenOutputLocation() {
-		if (!alreadyComputeTempCodegenOutputLocation){
-			String[] nodes = {	
-					Axis2Constants.DIR_DOT_METADATA,
-					Axis2Constants.DIR_DOT_PLUGINS,
-					Axis2Constants.AXIS2_PROJECT,
-					Axis2Constants.CODEGEN_RESULTS};
-			tempCodegenOutputLocation = FileUtils.addNodesToPath(getWorkspaceDirectory(), nodes);
-			alreadyComputeTempCodegenOutputLocation = true;
-		}
-		return tempCodegenOutputLocation;
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/utils/PluginLocationFinderUtil.java b/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/utils/PluginLocationFinderUtil.java
deleted file mode 100644
index 88a4aa6..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/utils/PluginLocationFinderUtil.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070130   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.creation.core.utils;
-
-
-public class PluginLocationFinderUtil {
-//	/**
-//	 *  
-//	 * @return returns a Vector containing PluginData objects.
-//	 * Each PluginData object represents a Plugin found under any of the following 
-//	 * plugin directories
-//	 * a. the targetPlatformLocation\eclipse\plugins directory, 
-//	 * b. other plugin directories as specified by *.link files under 
-//	 *    targetPlatform\eclipse\links directory 
-//	 **/ 
-//	public static Vector getPluginsInTargetPlatform(){
-//		/**
-//		//step1: Get path of target platform.
-//		//step2: Prepare path of links folder.
-//		//step3: Get list of files in links folder.
-//		//step4: Parse each link file and get the path of linked Eclipse folder.
-//		//step5: Prepare a list of all plugin root folders 
-//		//       (Eclipse plugins and linked Eclipse plugins).
-//		//step6: 6a. For each plugin root folder, 
-//		//       6b. go to each plugin directory and get path of plugin.xml.
-//		//step7: Parse the plugin.xml file to get plugin id, plugin version, 
-//		//       and store in vectors, lists, etc.
-//		//step8: Go back to step 6 to continue with next plugin directory.
-//		**/
-//
-//		//step1: Get path of target platform. 
-//		//Fall back to Eclipse install location if targetplatform in not set.
-//		URL platFormURL = Platform.getInstallLocation().getURL();
-//		Location location = Platform.getInstallLocation();
-//		IPath eclipsePath = null ;		
-//
-//		//Get path of target platform against which the users of this tool 
-//		//will compile their code.	
-////		IPath targetPlatFormLocation = new Path(getTargetPlatformPath(true));
-////		IPath targetPlatFormLocation = new Path(System.getProperty("user.dir"));
-//
-////		if(_useTargetPlatform == false)
-//			eclipsePath = new Path(platFormURL.getPath());
-////		else
-////			eclipsePath = targetPlatFormLocation;
-//		
-////		showMessage("Considering target platform to be: " + 
-////					eclipsePath.toString());
-//		
-//		//step2: Prepare path of links folder.
-//		//step3: Get list of files in links folder.		
-//		//step4: Parse each link file and get the path of linked Eclipse folder.
-//		IPath linksPath = new Path( eclipsePath.toString() ).append("/links");
-//		String linkedPaths[] = getLinkedPaths(linksPath.toString());
-//		int linkedPathLength = 0;
-//		if(null != linkedPaths){
-//			linkedPathLength = linkedPaths.length;
-//		}
-//		
-//		//step5: Prepare a list of all plugin root folders 
-//		//       (Eclipse plugins and linked Eclipse plugins).
-//		IPath eclipsePluginRootFolders[] = new IPath[linkedPathLength + 1];
-//		eclipsePluginRootFolders[0] = 
-//			new Path( eclipsePath.toString() ).append("/plugins");
-//		if(null != linkedPaths){
-//			for(int i=0; i<linkedPaths.length; i++){
-//				eclipsePluginRootFolders[i+1] = 
-//				new Path(linkedPaths[i]).append("/eclipse/plugins");
-//			}
-//		}
-//
-//		//step6: 6a. For each plugin root folder, 
-//		//       6b. go to each plugin directory and get path of plugin.xml.
-//		//step7: Parse the plugin.xml file to get plugin id, plugin version, 
-//		//       and store in vectors, lists, etc.
-//		Vector vectorsInThisVector = new Vector();
-//		for(int i=0; i<eclipsePluginRootFolders.length; i++){
-//			System.out.println("\n========plugin IDs and Versions in " + 
-//			eclipsePluginRootFolders[i] + "========");
-//			Vector pluginDataObjs  = 
-//			getPluginDataForAllPlugins(
-//				eclipsePluginRootFolders[i].toString());
-//			vectorsInThisVector.add(pluginDataObjs);
-//			System.out.println(pluginDataObjs);
-//			System.out.println("\n===========|||=== end ===|||===========");
-//		}
-//		
-//		Vector pluginData = new Vector();
-//		Iterator outerIterator = vectorsInThisVector.iterator();
-//		while(outerIterator.hasNext()){
-//			Vector pluginDataObjs = (Vector)outerIterator.next();
-//			Iterator innerIterator = pluginDataObjs.iterator();
-//			while(innerIterator.hasNext()){
-//				PluginData pd = (PluginData)innerIterator.next();
-//				String pluginIdKey = pd.getPluginID();
-//				String versionValue = pd.getPluginVersion();
-//				String pluginPath = pd.getPluginLocation();
-//				pluginData.add(pd);
-//			}
-//		}
-//		
-//		int breakpoint=0;
-//
-//		return pluginData;
-//	}
-//
-//
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/utils/ServiceXMLCreator.java b/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/utils/ServiceXMLCreator.java
deleted file mode 100644
index 1927e0d..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/utils/ServiceXMLCreator.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070620   193441 sandakith@wso2.com - Lahiru Sandakith, fix for the discription not attach to service
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.creation.core.utils;
-
-import java.util.ArrayList;
-
-public class ServiceXMLCreator {
-    private String serviceName;
-    private String serviceClass;
-    private ArrayList operations;
-
-    public ServiceXMLCreator(String serviceName, String serviceClass, ArrayList operations) {
-        this.serviceName = serviceName;
-        this.serviceClass = serviceClass;
-        this.operations = operations;
-    }
-
-    public String getServiceName() {
-        return serviceName;
-    }
-
-    public String getServiceClass() {
-        return serviceClass;
-    }
-
-    public ArrayList getOperations() {
-        return operations;
-    }
-
-    public String toString() {
-        String serviceXML = "<service name=\"" + serviceName + "\" >\n" +
-        "\t<Description>\n" +
-        "\t\tPlease Type your service description here\n" +
-        "\t</Description>\n" +
-        "\t<messageReceivers>\n" +
-        "\t\t<messageReceiver mep=\"http://www.w3.org/2004/08/wsdl/in-only\" " +
-        "class=\"org.apache.axis2.rpc.receivers.RPCInOnlyMessageReceiver\" />\n" +
-        "\t\t<messageReceiver  mep=\"http://www.w3.org/2004/08/wsdl/in-out\"  " +
-        "class=\"org.apache.axis2.rpc.receivers.RPCMessageReceiver\"/>\n" +
-        "\t</messageReceivers>\n" + 
-        "\t<parameter name=\"ServiceClass\" locked=\"false\">" + serviceClass + "</parameter>\n" ; 
-        serviceXML = serviceXML + "</service>\n";
-        return serviceXML;
-    }
-
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.ui/.classpath b/bundles/org.eclipse.jst.ws.axis2.creation.ui/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.ui/.cvsignore b/bundles/org.eclipse.jst.ws.axis2.creation.ui/.cvsignore
deleted file mode 100644
index 7722bc8..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.ui/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-build.xml
-javaCompiler...args
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.ui/.project b/bundles/org.eclipse.jst.ws.axis2.creation.ui/.project
deleted file mode 100644
index b48462a..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.ws.axis2.creation.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.ui/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.jst.ws.axis2.creation.ui/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index e81617d..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,57 +0,0 @@
-#Sun May 06 17:33:53 LKT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=ignore
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.jst.ws.axis2.creation.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index 0477943..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,31 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %PLUGIN_NAME
-Bundle-SymbolicName: org.eclipse.jst.ws.axis2.creation.ui;singleton:=true
-Bundle-Version: 1.0.2.qualifier
-Bundle-Activator: org.eclipse.jst.ws.internal.axis2.creation.ui.plugin.WebServiceAxis2CreationUIPlugin
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.core.resources,
- org.eclipse.jst.ws.consumption.ui,
- org.eclipse.wst.ws,
- org.eclipse.wst.common.environment,
- org.eclipse.wst.command.env.core,
- org.eclipse.emf.common,
- org.eclipse.wst.common.frameworks,
- org.eclipse.wst.command.env.ui,
- org.eclipse.jst.ws,
- org.eclipse.wst.command.env,
- org.eclipse.jdt.core,
- org.eclipse.jst.ws.axis2.creation.core,
- org.eclipse.jst.ws.axis2.consumption.ui,
- org.eclipse.jst.ws.axis2.consumption.core,
- org.eclipse.jst.ws.axis2.core,
- org.eclipse.jst.ws.ui
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.jst.ws.internal.axis2.creation.ui.widgets.bean,
- org.eclipse.jst.ws.internal.axis2.creation.ui.widgets.skeleton,
- org.eclipse.jst.ws.internal.axis2.creation.ui.wsrt
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-Vendor: %PLUGIN_PROVIDER
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.ui/about.html b/bundles/org.eclipse.jst.ws.axis2.creation.ui/about.html
deleted file mode 100644
index 9e73bda..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.ui/about.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<HTML>
-
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-
-<BODY lang="EN-US">
-
-<H3>About This Content</H3>
-
-<P>June 06, 2007</P>
-
-<H3>License</H3>
-
-<P>The Eclipse Foundation makes available all content in this plug-in 
-("Content"). Unless otherwise indicated below, the Content is provided to you 
-under the terms and conditions of the Eclipse Public License Version 1.0 
-("EPL"). A copy of the EPL is available at
-<A href="http://www.eclipse.org/org/documents/epl-v10.php">http://www.eclipse.org/org/documents/epl-v10.php</A>. 
-For purposes of the EPL, "Program" will mean the Content.</P>
-
-<P>If you did not receive this Content directly from the Eclipse Foundation, the 
-Content is being redistributed by another party ("Redistributor") and different 
-terms and conditions may apply to your use of any object code in the Content. 
-Check the Redistributor's license that was provided with the Content. If no such 
-license exists, contact the Redistributor. Unless otherwise indicated below, the 
-terms and conditions of the EPL still apply to any source code in the Content 
-and such source code may be obtained at
-<A href="http://www.eclipse.org/">http://www.eclipse.org/</A>.</P>
-
-</BODY>
-</HTML>
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.ui/build.properties b/bundles/org.eclipse.jst.ws.axis2.creation.ui/build.properties
deleted file mode 100644
index 6313a1d..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.ui/build.properties
+++ /dev/null
@@ -1,22 +0,0 @@
-###############################################################################
-# Copyright (c) 2007 WSO2 Inc 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:
-# WSO2 Inc - initial API and implementation
-# yyyymmdd bug      Email and other contact information
-# -------- -------- -----------------------------------------------------------
-# 20070130   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the
-#										 Axis2 runtime to the framework for 168762
-# 20070502   184302 sandakith@wso2.com - Lahiru Sandakith, Fix copyright for Axis2 plugins
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               plugin.properties,\
-               about.html
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.ui/plugin.properties b/bundles/org.eclipse.jst.ws.axis2.creation.ui/plugin.properties
deleted file mode 100644
index 2118334..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.ui/plugin.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2007 WSO2 Inc. 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:
-# WSO2 Inc. - initial API and implementation
-# yyyymmdd bug      Email and other contact information
-# -------- -------- -----------------------------------------------------------
-# 20070501   184617 sandakith@wso2.com - Lahiru Sandakith, Provide plugin details
-###############################################################################
-
-#
-# Messages in plugin.xml.
-#
-PLUGIN_NAME=Webservice Axis2 Creation UI Plug-in
-PLUGIN_PROVIDER=WSO2
-
-LABEL_RUNTIME_AXIS_2=Apache Axis2
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.ui/plugin.xml b/bundles/org.eclipse.jst.ws.axis2.creation.ui/plugin.xml
deleted file mode 100644
index 5004d58..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.ui/plugin.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-
-	<extension point="org.eclipse.wst.command.env.ui.widgetRegistry">
-      <widgetFactory   
-        id="BeanExampleConfig"
-        insertBeforeCommandId="org.eclipse.jst.ws.axis2.creation.core.command.Axis2BUCommand"
-        class="org.eclipse.jst.ws.internal.axis2.creation.ui.wsrt.Axis2BeanConfigWidgetFactory"/>
-    </extension> 
-    
-	<extension point="org.eclipse.wst.command.env.ui.widgetRegistry">
-      <widgetFactory   
-        id="SkelExampleConfig"
-        insertBeforeCommandId="org.eclipse.jst.ws.axis2.creation.core.command.Axis2TDCommand"
-        class="org.eclipse.jst.ws.internal.axis2.creation.ui.wsrt.Axis2SkelConfigWidgetFactory" />
-    </extension> 
-    
-    <extension point="org.eclipse.jst.ws.consumption.ui.runtimes">
-      <runtime
-        id="org.eclipse.jst.ws.axis2.creation.axis2WebServiceRT"
-        label="%LABEL_RUNTIME_AXIS_2"
-        serverRequired="false"/>
-    </extension>
-
-
-	<!-- define support for Axis2 Java bean bottom up and top-down support in web projects -->
-    <extension point="org.eclipse.jst.ws.consumption.ui.serviceRuntimes">
-      <serviceRuntime
-        id="org.eclipse.jst.ws.axis2.creation.java" 
-        serviceImplementationTypeId="org.eclipse.jst.ws.wsImpl.java"
-        runtimeId="org.eclipse.jst.ws.axis2.creation.axis2WebServiceRT"
-        bottomUp="true"
-        topDown="true"
-        class="org.eclipse.jst.ws.internal.axis2.creation.ui.wsrt.Axis2WebServiceRuntime">
-
-        <required-facet-version facet="jst.web" version="2.3" allow-newer="true"/>
-        <required-facet-version facet="axis2.core" version="1.1" allow-newer="true" />
-        <required-facet-version facet="axis2.ext" version="1.1" allow-newer="true" />
-
-      </serviceRuntime>
-    </extension>   
-        
-    <!-- define support for Axis Java clients in Web projects -->
-    <extension point="org.eclipse.jst.ws.consumption.ui.clientRuntimes">
-      <clientRuntime
-        id="org.eclipse.jst.ws.axis2.consumption.web"
-        clientImplementationTypeId="org.eclipse.jst.ws.client.type.java"
-        runtimeId="org.eclipse.jst.ws.axis2.creation.axis2WebServiceRT"
-        class="org.eclipse.jst.ws.internal.axis2.creation.ui.wsrt.Axis2WebServiceRuntime">
-
-        <required-facet-version facet="jst.web" version="2.3" allow-newer="true" />
-        <required-facet-version facet="axis2.core" version="1.1" allow-newer="true" />
-        <required-facet-version facet="axis2.ext" version="1.1" allow-newer="true" />
-
-      </clientRuntime>
-    </extension>     
-    
-</plugin>
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/plugin/WebServiceAxis2CreationUIPlugin.java b/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/plugin/WebServiceAxis2CreationUIPlugin.java
deleted file mode 100644
index 1ebe6f5..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/plugin/WebServiceAxis2CreationUIPlugin.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- *******************************************************************************/
-package org.eclipse.jst.ws.internal.axis2.creation.ui.plugin;
-
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class WebServiceAxis2CreationUIPlugin extends AbstractUIPlugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.jst.ws.axis2.creation.ui";
-
-	// The shared instance
-	private static WebServiceAxis2CreationUIPlugin plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public WebServiceAxis2CreationUIPlugin() {
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * @return the shared instance
-	 */
-	public static WebServiceAxis2CreationUIPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/widgets/bean/ServicesXMLSelectBeanWidget.java b/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/widgets/bean/ServicesXMLSelectBeanWidget.java
deleted file mode 100644
index 4fd723e..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/widgets/bean/ServicesXMLSelectBeanWidget.java
+++ /dev/null
@@ -1,209 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070513   186430 sandakith@wso2.com - Lahiru Sandakith, fix for 186430
- *										  Text not accessible on AXIS2 wizard pages.
- * 20070529   188742 sandakith@wso2.com - Lahiru Sandakith, fix for 188742
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- * 20071030	  207621 zina@ca.ibm.com - Zina Mostafia, Page GUI sequence using tab is not correct ( violates Accessibility)
- *******************************************************************************/
-package org.eclipse.jst.ws.internal.axis2.creation.ui.widgets.bean;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.ws.axis2.core.constant.Axis2Constants;
-import org.eclipse.jst.ws.axis2.creation.core.data.DataModel;
-import org.eclipse.jst.ws.axis2.creation.core.messages.Axis2CreationUIMessages;
-import org.eclipse.jst.ws.internal.axis2.consumption.ui.plugin.WebServiceAxis2ConsumptionUIPlugin;
-import org.eclipse.jst.ws.internal.ui.common.UIUtils;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.wst.command.internal.env.ui.widgets.SimpleWidgetDataContributor;
-import org.eclipse.wst.command.internal.env.ui.widgets.WidgetDataEvents;
-
-
-public class ServicesXMLSelectBeanWidget extends SimpleWidgetDataContributor 
-{
-	private DataModel 	model;
-	private Button	 	browseButton;
-	private Text 		servicesXMLPath;
-	private Button 		generateServicesXML;
-	private Button 		haveServicesXML;
-
-	public ServicesXMLSelectBeanWidget( DataModel model )
-	{
-		this.model = model;  
-	}
-
-	public WidgetDataEvents addControls( Composite parent, final Listener statusListener )
-	{
-		UIUtils uiUtils = new UIUtils(WebServiceAxis2ConsumptionUIPlugin.PLUGIN_ID);
-		
-		Text label = new Text(parent, SWT.READ_ONLY);
-		label.setText( Axis2CreationUIMessages.LABEL_AXIS2_PREFERENCE_PAGE );
-		
-		model.setGenerateServicesXML(true);
-		model.setServicesXML(false);
-
-		final Composite radioComp = uiUtils.createComposite(parent, 1);
-		
-		haveServicesXML = uiUtils.createRadioButton(radioComp, Axis2CreationUIMessages.LABEL_HAVE_SERVICES_XML_FILE, null, null );
-		haveServicesXML.addSelectionListener( new SelectionAdapter()
-		{
-			public void widgetSelected(SelectionEvent e)
-			{
-				if (haveServicesXML.getSelection()){
-					haveServicesXML.setSelection(true);
-					generateServicesXML.setSelection(false);
-					enableServicesXMLBrowse();
-				}else{
-					if (!generateServicesXML.getSelection()){
-						haveServicesXML.setSelection(true); 
-						generateServicesXML.setSelection(false);
-						enableServicesXMLBrowse();
-					}else{
-						haveServicesXML.setSelection(false);
-						disableServicesXMLBrowse();
-					}
-				}
-				model.setGenerateServicesXML(false);
-				model.setServicesXML(true);
-
-				// Need to trigger a validation at this point to ensure
-				// that the next button is enabled properly just in case
-				// this is the last page in the wizard.
-				statusListener.handleEvent( null );
-			}     
-		});
-		
-		final Composite pathComp = uiUtils.createComposite(radioComp, 3);
-		servicesXMLPath = uiUtils.createText(pathComp, "", null, null, SWT.BORDER );
-		servicesXMLPath.addModifyListener( new ModifyListener()
-		{
-			public void modifyText(ModifyEvent e)
-			{
-				model.setPathToServicesXML( servicesXMLPath.getText() );
-				// Need to trigger a validation at this point to ensure
-				// that the next button is enabled properly just in case
-				// this is the last page in the wizard.
-				statusListener.handleEvent( null );
-			}
-		});
-
-		
-		browseButton = uiUtils.createPushButton(pathComp, Axis2CreationUIMessages.LABEL_BROWSE, null, null );
-		browseButton.addSelectionListener( new SelectionAdapter()
-		{
-			public void widgetSelected(SelectionEvent e)
-			{
-				handleBrowse(pathComp.getShell());
-				// Need to trigger a validation at this point to ensure
-				// that the next button is enabled properly just in case
-				// this is the last page in the wizard.
-				statusListener.handleEvent( null );
-			}     
-		}); 
-
-
-		generateServicesXML = uiUtils.createRadioButton(radioComp, Axis2CreationUIMessages.LABEL_DEFAULT_SERVICES_XML_FILE, null, null);
-		generateServicesXML.setSelection(true);
-		generateServicesXML.addSelectionListener( new SelectionAdapter()
-		{
-			public void widgetSelected(SelectionEvent e)
-			{
-				if (generateServicesXML.getSelection()){
-					generateServicesXML.setSelection(true); 
-					haveServicesXML.setSelection(false);
-					disableServicesXMLBrowse();
-				}else{
-					if (!haveServicesXML.getSelection()){
-						generateServicesXML.setSelection(true); 
-						haveServicesXML.setSelection(false);
-					}else{
-						generateServicesXML.setSelection(false);
-					}
-				}
-				model.setGenerateServicesXML(true);
-				model.setServicesXML(false);
-				// Need to trigger a validation at this point to ensure
-				// that the next button is enabled properly just in case
-				// this is the last page in the wizard.
-				statusListener.handleEvent( null );
-			}     
-		}); 
-
-		disableServicesXMLBrowse();
-
-		return this;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.command.env.ui.widgets.WidgetContributor#getStatus()
-	 */
-	public IStatus getStatus() 
-	{
-		IStatus result = null;
-
-		if( haveServicesXML.getSelection() && servicesXMLPath.getText().equals("") )
-		{
-			result = new Status( IStatus.ERROR, 
-								"id", 
-								0, 
-								Axis2CreationUIMessages.ERROR_INVALID_SERVICES_XML, 
-								null ); 
-		}
-
-		return result;
-	}
-
-	/**
-	 * enable the services.xml text and browse button
-	 */
-	private void enableServicesXMLBrowse(){
-		browseButton.setEnabled(true);
-		servicesXMLPath.setEnabled(true);
-	}
-
-	/**
-	 * disable the services.xml text and browse button
-	 */
-	private void disableServicesXMLBrowse(){
-		browseButton.setEnabled(false);
-		servicesXMLPath.setEnabled(false);
-	}
-
-	/**
-	 * Pops up the file browse dialog box
-	 */
-	private void handleBrowse(Shell parent) {
-		FileDialog fileDialog = new FileDialog(parent);
-		fileDialog.setFilterExtensions(new String[] { Axis2Constants.FILE_XML });
-		String fileName = fileDialog.open();
-		if (fileName != null) {
-			servicesXMLPath.setText(fileName);
-			model.setPathToServicesXML( servicesXMLPath.getText() );
-		}
-	}
-}
-
-
-
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/widgets/skeleton/WSDL2JAVASkelConfigWidget.java b/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/widgets/skeleton/WSDL2JAVASkelConfigWidget.java
deleted file mode 100644
index 6e0bd75..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/widgets/skeleton/WSDL2JAVASkelConfigWidget.java
+++ /dev/null
@@ -1,513 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070425   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070518   187311 sandakith@wso2.com - Lahiru Sandakith, Fixing test resource addition
- * 20070523   174876 sandakith@wso2.com - Lahiru Sandakith, Persist Preferences inside Framework
- * 20070823   200413 sandakith@wso2.com - Lahiru Sandakith, Namespace to Package table fix
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- *******************************************************************************/
-package org.eclipse.jst.ws.internal.axis2.creation.ui.widgets.skeleton;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.Iterator;
-import java.util.Map;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.ws.axis2.consumption.core.utils.WSDLPropertyReader;
-import org.eclipse.jst.ws.axis2.core.constant.Axis2Constants;
-import org.eclipse.jst.ws.axis2.core.context.Axis2EmitterContext;
-import org.eclipse.jst.ws.axis2.core.plugin.WebServiceAxis2CorePlugin;
-import org.eclipse.jst.ws.axis2.core.utils.ClassLoadingUtil;
-import org.eclipse.jst.ws.axis2.creation.core.data.DataModel;
-import org.eclipse.jst.ws.axis2.creation.core.messages.Axis2CreationUIMessages;
-import org.eclipse.osgi.util.NLS;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.TableEditor;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.events.SelectionListener;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.graphics.Rectangle;
-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.Event;
-import org.eclipse.swt.widgets.Label;
-import org.eclipse.swt.widgets.Listener;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.TableItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.wst.command.internal.env.core.common.StatusUtils;
-import org.eclipse.wst.command.internal.env.ui.widgets.SimpleWidgetDataContributor;
-import org.eclipse.wst.command.internal.env.ui.widgets.WidgetDataEvents;
-
-
-public class WSDL2JAVASkelConfigWidget extends SimpleWidgetDataContributor 
-{
-	private DataModel model;
-	IStatus status = Status.OK_STATUS;
-
-	//controls
-	//check box for server side interface
-	private Button generateServerSideInterfaceCheckBoxButton;
-	private Button generateAllCheckBoxButton;
-	private Combo databindingTypeCombo;
-	// Text box to have the portname
-	private Combo portNameCombo;
-	//Text box to have the service name
-	private Combo serviceNameCombo;
-	private WSDLPropertyReader reader;
-	private java.util.List serviceQNameList = null;
-	private Table namespace2packageTable = null;
-	//Label holding the full qualified package name for generated code
-	private Text packageText;
-	//Checkbox to enable the generation of test case classes 
-	// for the generated implementation of the webservice.
-	Label      label, fillLabel, fillLabel1, fillLabel2, fillLabel3, fillLabel4, fillLabel5, fillLabel6;
-	Axis2EmitterContext context;
-
-	public WSDL2JAVASkelConfigWidget( DataModel model )	{
-		context = WebServiceAxis2CorePlugin.getDefault().getAxisEmitterContext();
-		this.model = model;  
-	}
-
-	public WidgetDataEvents addControls( Composite parent, final Listener statusListener ){
-		Composite  mainComp = new Composite( parent, SWT.NONE );
-		GridLayout layout   = new GridLayout();
-		mainComp.setLayout(layout);
-
-		layout.numColumns = 3;
-		GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-		mainComp.setLayoutData( gd );
-
-		// service name
-		label = new Label(mainComp, SWT.NULL);
-		label.setText(Axis2CreationUIMessages.LABEL_SERVICE_NAME_CAPTION);
-
-		serviceNameCombo = new Combo(mainComp, SWT.DROP_DOWN | SWT.BORDER
-				| SWT.READ_ONLY);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		serviceNameCombo.setLayoutData(gd);
-		serviceNameCombo.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				model.setServiceName(serviceNameCombo.getText());
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-		// port name
-		label = new Label(mainComp, SWT.NULL);
-		label.setText(Axis2CreationUIMessages.LABEL_PORTNAME);
-		portNameCombo = new Combo(mainComp, SWT.DROP_DOWN | SWT.BORDER
-				| SWT.READ_ONLY);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		portNameCombo.setLayoutData(gd);
-		portNameCombo.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				model.setPortName(portNameCombo.getText());
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-		// Databinding
-		label = new Label(mainComp, SWT.NULL);
-		label.setText(Axis2CreationUIMessages.LABEL_DATABINDING_CAPTION);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-		databindingTypeCombo = new Combo(mainComp, SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY);
-		databindingTypeCombo.setLayoutData(gd);
-		fillDatabinderCombo();
-		databindingTypeCombo.select(0);
-		databindingTypeCombo.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				model.setDatabindingType(databindingTypeCombo.getText());
-			};
-			public void widgetDefaultSelected(SelectionEvent e) {
-			};
-		});
-
-		// package name
-		label = new Label(mainComp, SWT.NULL);
-		label.setText(Axis2CreationUIMessages.LABEL_PACKEGE_NAME);
-		packageText = new Text(mainComp, SWT.BORDER);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 2;
-
-		packageText.setLayoutData(gd);
-		packageText.setText(""); // get this text from the
-		packageText.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				model.setPackageText(packageText.getText());
-			}
-		});
-
-		//filling label 
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 3;
-		fillLabel = new Label(mainComp, SWT.HORIZONTAL | SWT.NULL);
-
-		//filling label 
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 3;
-		fillLabel2 = new Label(mainComp, SWT.HORIZONTAL | SWT.NULL);
-
-		//filling label 
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 3;
-		fillLabel3 = new Label(mainComp, SWT.HORIZONTAL | SWT.NULL);
-
-		//filling label 
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 3;
-		fillLabel4 = new Label(mainComp, SWT.HORIZONTAL | SWT.NULL);
-
-		model.setServerXMLCheck(true);
-
-		//the server side interface option
-		generateServerSideInterfaceCheckBoxButton = new Button(mainComp, SWT.CHECK);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 3;
-		generateServerSideInterfaceCheckBoxButton.setLayoutData(gd);
-		generateServerSideInterfaceCheckBoxButton
-							.setSelection(context.isServiceInterfaceSkeleton());
-		generateServerSideInterfaceCheckBoxButton.setText(Axis2CreationUIMessages.
-														  LABEL_GENERATE_SERVERSIDE_INTERFACE);
-		model.setGenerateAllCheck(context.isServiceInterfaceSkeleton());
-		generateServerSideInterfaceCheckBoxButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				model.setGenerateServerSideInterface(
-						generateServerSideInterfaceCheckBoxButton.getSelection());
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-		// generate all
-		generateAllCheckBoxButton = new Button(mainComp, SWT.CHECK);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 3;
-		generateAllCheckBoxButton.setLayoutData(gd);
-		generateAllCheckBoxButton.setSelection(context.isServiceGenerateAll());
-		generateAllCheckBoxButton.setText(Axis2CreationUIMessages.LABEL_GENERATE_ALL);
-		generateAllCheckBoxButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				model.setGenerateAllCheck(generateAllCheckBoxButton.getSelection());
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-		
-		//filling label 
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 3;
-		fillLabel5 = new Label(mainComp, SWT.HORIZONTAL | SWT.NULL);
-
-		//filling label 
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 3;
-		fillLabel6 = new Label(mainComp, SWT.HORIZONTAL | SWT.NULL);
-		
-		//add a table to set namespace to package mapping
-		gd = new GridData(GridData.FILL_BOTH);
-        gd.horizontalSpan = 3;
-        gd.verticalSpan = 5;
-        
-        namespace2packageTable = new Table(mainComp,SWT.BORDER|SWT.MULTI);
-        namespace2packageTable.setLinesVisible(true);
-        namespace2packageTable.setHeaderVisible(true); 
-        namespace2packageTable.setEnabled(true);
-        namespace2packageTable.setLayoutData(gd);
-       
-        declareColumn(namespace2packageTable,
-        		350, //a default width until we adjust
-        		Axis2CreationUIMessages.LABEL_NAMESPACE);
-        declareColumn(namespace2packageTable,
-        		200,//a default width until we adjust
-        		Axis2CreationUIMessages.LABEL_PACKAGE);
-        
-        namespace2packageTable.setVisible(true);
-        
-        // add the table editor
-        final TableEditor editor = new TableEditor(namespace2packageTable);
-        editor.setColumn(1);
-        editor.horizontalAlignment = SWT.LEFT;
-        editor.grabHorizontal = true;
-
-        namespace2packageTable.addListener(SWT.MouseDown, new Listener() {
-            public void handleEvent(Event event) {
-              Rectangle clientArea = namespace2packageTable.getClientArea();
-              Point pt = new Point(event.x, event.y);
-              int index = namespace2packageTable.getTopIndex();
-              while (index < namespace2packageTable.getItemCount()) {
-                boolean visible = false;
-                final TableItem item = namespace2packageTable.getItem(index);
-                for (int i = 0; i < namespace2packageTable.getColumnCount(); i++) {
-                  Rectangle rect = item.getBounds(i);
-                  if (rect.contains(pt)) {
-                    final int column = i;
-                    final Text text = new Text(namespace2packageTable, SWT.NONE);
-                    Listener textListener = new Listener() {
-                      public void handleEvent(final Event e) {
-                        switch (e.type) {
-                        case SWT.FocusOut:
-                          item.setText(column, text.getText());
-                          text.dispose();
-                          break;
-                        case SWT.Traverse:
-                          switch (e.detail) {
-                          case SWT.TRAVERSE_RETURN:
-                            item
-                                .setText(column, text
-                                    .getText());
-                          case SWT.TRAVERSE_ESCAPE:
-                            text.dispose();
-                            e.doit = false;
-                          }
-                          break;
-                        }
-                      }
-                    };
-                    text.addListener(SWT.FocusOut, textListener);
-                    text.addListener(SWT.Traverse, textListener);
-                    editor.setEditor(text, item, i);
-                    text.setText(item.getText(i));
-                    text.selectAll();
-                    text.setFocus();
-                    return;
-                  }
-                  if (!visible && rect.intersects(clientArea)) {
-                    visible = true;
-                  }
-                }
-                if (!visible)
-                  return;
-                index++;
-              }
-              model.setNamespaseToPackageMapping(getNs2PkgMapping());
-            }
-          });
-        
-        namespace2packageTable.addListener(SWT.MouseExit, new Listener() {
-            public void handleEvent(Event event) {
-            	 model.setNamespaseToPackageMapping(getNs2PkgMapping());
-            }
-        });
-        
-		populateParamsFromWSDL();
-		populateModel();
-
-		return this;
-	}
-
-	private void populateModel() {
-		model.setServiceName(serviceNameCombo.getText());
-		model.setPortName(portNameCombo.getText());
-		model.setPackageText(packageText.getText());
-		model.setDatabindingType(databindingTypeCombo.getText());
-		model.setGenerateAllCheck(generateAllCheckBoxButton.getSelection());
-		model.setGenerateServerSideInterface(
-				generateServerSideInterfaceCheckBoxButton.getSelection());
-		model.setNamespaseToPackageMapping(getNs2PkgMapping());
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.wst.command.env.ui.widgets.WidgetContributor#getStatus()
-	 */
-	public IStatus getStatus() 
-	{
-		IStatus result = null;
-		return result;
-	}
-
-	private void populatePackageName() {
-		this.packageText.setText(reader.packageFromTargetNamespace());
-	}
-
-	/**
-	 * populate the service and the port from the WSDL this needs to be public
-	 * since the WSDLselection page may call this
-	 */
-	public void populateParamsFromWSDL() {
-		if (reader == null)
-			reader = new WSDLPropertyReader();
-		try {
-			String lname = model.getWsdlURI();
-			if (!"".equals(lname.trim())) {
-
-				reader.readWSDL(model.getWebProjectName(), lname);
-
-				this.serviceQNameList = reader.getServiceList();
-				if (!serviceQNameList.isEmpty()) {
-					serviceNameCombo.removeAll();
-					for (int i = 0; i < serviceQNameList.size(); i++) {
-						// add the local part of the
-						Object serviceQnameInstance = serviceQNameList.get(0);
-						Class QNameClass = ClassLoadingUtil
-										.loadClassFromAntClassLoader("javax.xml.namespace.QName");
-						Method GetLocalPartMethod  = QNameClass.getMethod("getLocalPart", null);
-						Object resultLocalPart = GetLocalPartMethod
-													.invoke(serviceQnameInstance, null);
-						serviceNameCombo.add(resultLocalPart.toString());
-					}
-					;
-					// select the first one as the default
-					serviceNameCombo.select(0);
-
-					// load the ports
-					loadPortNames();
-
-				} else {
-					// service name list being empty means we are switching to
-					// the interface mode
-					if (serviceNameCombo!=null) serviceNameCombo.removeAll();
-					if (portNameCombo!=null) portNameCombo.removeAll();
-
-				}
-
-				populatePackageName();
-
-				//populate the namespacess
-				loadNamespaces(reader.getDefinitionNamespaceMap());
-			}
-		} catch (Exception e) {
-			if (e.getClass().getName().equals("javax.wsdl.WSDLException"))
-			status = StatusUtils.errorStatus(
-					NLS.bind(Axis2CreationUIMessages.ERROR_INVALID_WSDL_FILE_READ_WRITEL,
-							 new String[]{e.getLocalizedMessage()}), e);
-		}
-	}
-
-	private void loadPortNames() {
-		int selectionIndex = serviceNameCombo.getSelectionIndex();
-		if (selectionIndex != -1) {
-			java.util.List ports = reader.getPortNameList(serviceQNameList
-					.get(selectionIndex));
-			if (!ports.isEmpty()) {
-				portNameCombo.removeAll();
-				for (int i = 0; i < ports.size(); i++) {
-					// add the local part of the
-					portNameCombo.add(ports.get(i).toString());
-				}
-				portNameCombo.select(0);
-			} else {
-				// TODO error no ports found
-			}
-		}
-	}
-
-	/**
-	 * Fill the combo with proper databinding names
-	 */
-	private void fillDatabinderCombo() {
-		databindingTypeCombo.add(Axis2Constants.DATA_BINDING_ADB);
-		databindingTypeCombo.add(Axis2Constants.DATA_BINDING_NONE);
-		databindingTypeCombo.select(0);
-	}
-	
-	
-	/**
-	 * A util method to create a new column
-	 * @param table
-	 * @param width
-	 * @param colName
-	 */
-	private void declareColumn(Table table, int width,String colName){
-        TableColumn column = new TableColumn(table,SWT.NONE);
-        column.setWidth(width);
-        column.setText(colName);
-    }
-	
-	/**
-	 * Loads the namespaces
-	 * @param namespaceMap
-	 */
-	private void loadNamespaces(Map namespaceMap){
-		Iterator namespaces = namespaceMap.values().iterator();
-		namespace2packageTable.removeAll();
-        TableItem[] items = new TableItem[namespaceMap.size()]; // An item for each field
-        int i = 0;
-        while(namespaces.hasNext()){
-        	
-           items[i] = new TableItem(namespace2packageTable, SWT.NULL);
-           String namespace = (String)namespaces.next();
-           items[i].setText(0,namespace);
-           items[i].setText(1,getPackageFromNamespace(namespace));
-           i++;
-        }
-        namespace2packageTable.setVisible(true);
-	}
-	
-	/**
-	 * get the package to namespace mappings
-	 * @return
-	 */
-	public String getNs2PkgMapping(){
-		String returnList="";
-		TableItem[] items = namespace2packageTable.getItems();
-		String packageValue; 
-		for (int i=0;i<items.length;i++){
-			packageValue = items[i].getText(1);
-			if (packageValue!=null && !"".equals(packageValue)){
-				returnList = returnList +
-				             ("".equals(returnList)?"":",") +
-				             items[i].getText(0)+ "=" + packageValue;
-			}
-			
-		}
-		return "".equals(returnList)?null:returnList;
-	}
-	
-	
-	/**
-	 * get the package derived by  Namespace
-	 */
-	public String getPackageFromNamespace(String namespace){
-		
-		Object result = null;
-		try {
-			//Class URLProcessor = Class.forName("org.apache.axis2.util.URLProcessor");
-			Class URLProcessor = ClassLoadingUtil
-						.loadClassFromAntClassLoader("org.apache.axis2.util.URLProcessor");
-			Class parameterTypes[] = new Class[1];
-			parameterTypes[0] = String.class;
-			Method makePackageNameMethod = URLProcessor
-									.getMethod("makePackageName", parameterTypes);
-			Object args[] = new Object[1];
-			args[0] = namespace;
-			result = makePackageNameMethod.invoke(makePackageNameMethod, args);
-		} catch (SecurityException e) {
-			e.printStackTrace();
-		} catch (NoSuchMethodException e) {
-			e.printStackTrace();
-		} catch (IllegalArgumentException e) {
-			e.printStackTrace();
-		} catch (IllegalAccessException e) {
-			e.printStackTrace();
-		} catch (InvocationTargetException e) {
-			e.printStackTrace();
-		}
-		return (String)result;
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/wsrt/Axis2BeanConfigWidgetFactory.java b/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/wsrt/Axis2BeanConfigWidgetFactory.java
deleted file mode 100644
index 3cae7fb..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/wsrt/Axis2BeanConfigWidgetFactory.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070425   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070601   190505 pmoogk@ca.ibm.com - Peter Moogk
- *******************************************************************************/
-
-package org.eclipse.jst.ws.internal.axis2.creation.ui.wsrt;
-
-import org.eclipse.jst.ws.axis2.creation.core.command.Axis2DefaultingCommand;
-import org.eclipse.jst.ws.axis2.creation.core.data.DataModel;
-import org.eclipse.jst.ws.axis2.creation.core.messages.Axis2CreationUIMessages;
-import org.eclipse.jst.ws.internal.axis2.creation.ui.widgets.bean.ServicesXMLSelectBeanWidget;
-import org.eclipse.wst.command.internal.env.core.data.DataMappingRegistry;
-import org.eclipse.wst.command.internal.env.ui.widgets.INamedWidgetContributor;
-import org.eclipse.wst.command.internal.env.ui.widgets.INamedWidgetContributorFactory;
-import org.eclipse.wst.command.internal.env.ui.widgets.SimpleWidgetContributor;
-import org.eclipse.wst.command.internal.env.ui.widgets.WidgetContributor;
-import org.eclipse.wst.command.internal.env.ui.widgets.WidgetContributorFactory;
-import org.eclipse.wst.command.internal.env.ui.widgets.WidgetDataContributor;
-
-public class Axis2BeanConfigWidgetFactory implements INamedWidgetContributorFactory {
-
-	private SimpleWidgetContributor  servicesXMLSelectWidgetContrib;
-	private DataModel                model;
-
-	public Axis2BeanConfigWidgetFactory(){	  
-	}
-
-	public INamedWidgetContributor getFirstNamedWidget(){
-		if( servicesXMLSelectWidgetContrib == null ) init();
-		return servicesXMLSelectWidgetContrib;
-	}
-
-	public INamedWidgetContributor getNextNamedWidget( INamedWidgetContributor widgetContributor){
-		if( servicesXMLSelectWidgetContrib == null ) init();
-		INamedWidgetContributor nextWidgetContrib = null;
-		return nextWidgetContrib;
-	}
-
-	public void registerDataMappings(DataMappingRegistry dataRegistry) 
-	{
-		// Map the data model from the defaulting command to this widget factory.
-		// The framework will actually to the call to getWebServiceDataModel in
-		// the ExampleDefaultingCommand class and then call the setWebServiceDataModel
-		// method in this class.
-		dataRegistry.addMapping( Axis2DefaultingCommand.class, 
-		                         "WebServiceDataModel",  //$NON-NLS-1$
-								             Axis2BeanConfigWidgetFactory.class );
-	}
-
-	public void setWebServiceDataModel( DataModel model ){
-		this.model = model;
-	}
-
-	private void init(){
-		//Pages of Axis2 Web Services Java Bean Scenario
-		ServicesXMLSelectBeanWidget servicesXMLSelectWidget = 
-								new ServicesXMLSelectBeanWidget(model);
-		servicesXMLSelectWidgetContrib  = createWidgetContributor( 
-				Axis2CreationUIMessages.LABEL_AXIS2_PREFERENCE_PAGE_HEADING,
-				Axis2CreationUIMessages.LABEL_AXIS2_PREFERENCE_PAGE_SUB_HEADING, 
-				servicesXMLSelectWidget );
-	}
-
-	private SimpleWidgetContributor createWidgetContributor(String title, 
-															String description, 
-															final WidgetDataContributor contributor){
-		SimpleWidgetContributor widgetContrib  = new SimpleWidgetContributor();
-		widgetContrib.setTitle(title);
-		widgetContrib.setDescription(description);
-		widgetContrib.setFactory( new WidgetContributorFactory(){
-			public WidgetContributor create(){
-				return contributor;
-			}
-		});
-		return widgetContrib;
-	}   
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/wsrt/Axis2CheckWSDLCommand.java b/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/wsrt/Axis2CheckWSDLCommand.java
deleted file mode 100644
index cb4d3ac..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/wsrt/Axis2CheckWSDLCommand.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 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
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20080129   209411 kathy@ca.ibm.com - Kathy Chan
- *******************************************************************************/
-package org.eclipse.jst.ws.internal.axis2.creation.ui.wsrt;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.ws.axis2.consumption.core.utils.ServicePingUtil;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-
-public class Axis2CheckWSDLCommand extends AbstractDataModelOperation{
-	
-	private Axis2WebService ws_;
-
-	private String wsdlURI_;
-	
-	public Axis2CheckWSDLCommand() {
-	}
-	
-	public Axis2CheckWSDLCommand(Axis2WebService ws) {
-		ws_ = ws;
-
-	}
-	
-	public IStatus execute( IProgressMonitor monitor, IAdaptable adaptable ) 
-	{
-	 	
-	 	wsdlURI_ = ws_.getWebServiceInfo().getWsdlURL();
-		try {
-			ServicePingUtil servicePingUtil = new ServicePingUtil();
-			servicePingUtil.connectToURL(wsdlURI_);
-		} catch (MalformedURLException e) {
-			e.printStackTrace();
-		} catch (Exception e) {
-			if (e instanceof IOException) {
-				try {
-					throw new ExecutionException(e.getMessage());
-				} catch (ExecutionException e1) {
-					// TODO Auto-generated catch block
-					e1.printStackTrace();
-				}
-			} else {
-				e.printStackTrace();
-			}
-		}
-		return Status.OK_STATUS;
-	  }
-	
-
-
-	public String getWsdlURI() {
-		return wsdlURI_;
-	}	
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/wsrt/Axis2SkelConfigWidgetFactory.java b/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/wsrt/Axis2SkelConfigWidgetFactory.java
deleted file mode 100644
index c21706f..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/wsrt/Axis2SkelConfigWidgetFactory.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070601   190505 pmoogk@ca.ibm.com - Peter Moogk
- *******************************************************************************/
-
-package org.eclipse.jst.ws.internal.axis2.creation.ui.wsrt;
-
-import org.eclipse.jst.ws.axis2.creation.core.command.Axis2DefaultingCommand;
-import org.eclipse.jst.ws.axis2.creation.core.data.DataModel;
-import org.eclipse.jst.ws.axis2.creation.core.messages.Axis2CreationUIMessages;
-import org.eclipse.jst.ws.internal.axis2.creation.ui.widgets.skeleton.WSDL2JAVASkelConfigWidget;
-import org.eclipse.wst.command.internal.env.core.data.DataMappingRegistry;
-import org.eclipse.wst.command.internal.env.ui.widgets.INamedWidgetContributor;
-import org.eclipse.wst.command.internal.env.ui.widgets.INamedWidgetContributorFactory;
-import org.eclipse.wst.command.internal.env.ui.widgets.SimpleWidgetContributor;
-import org.eclipse.wst.command.internal.env.ui.widgets.WidgetContributor;
-import org.eclipse.wst.command.internal.env.ui.widgets.WidgetContributorFactory;
-import org.eclipse.wst.command.internal.env.ui.widgets.WidgetDataContributor;
-
-public class Axis2SkelConfigWidgetFactory implements INamedWidgetContributorFactory {
-
-	private SimpleWidgetContributor  skelConfig1WidgetContrib;
-	private DataModel                model;
-
-	public Axis2SkelConfigWidgetFactory(){	  
-	}
-
-	public INamedWidgetContributor getFirstNamedWidget(){
-		if( skelConfig1WidgetContrib == null ) init();
-		return skelConfig1WidgetContrib;
-	}
-
-	public INamedWidgetContributor getNextNamedWidget( INamedWidgetContributor widgetContributor){
-		if( skelConfig1WidgetContrib == null ) init();
-		INamedWidgetContributor nextWidgetContrib = null;
-		return nextWidgetContrib;
-	}
-
-	public void registerDataMappings(DataMappingRegistry dataRegistry){
-		// Map the data model from the defaulting command to this widget factory.
-		// The framework will actually to the call to getWebServiceDataModel in
-		// the ExampleDefaultingCommand class and then call the setWebServiceDataModel
-		// method in this class.
-		dataRegistry.addMapping( Axis2DefaultingCommand.class, 
-                             "WebServiceDataModel",  //$NON-NLS-1$
-								             Axis2SkelConfigWidgetFactory.class );
-	}
-
-	public void setWebServiceDataModel( DataModel model ){
-		this.model = model;
-	}
-
-	private void init(){
-		WSDL2JAVASkelConfigWidget  skel1 = new WSDL2JAVASkelConfigWidget( model );
-
-		skelConfig1WidgetContrib  = createWidgetContributor( 
-				Axis2CreationUIMessages.LABEL_JAVA_2_WSDL_PAGE_HEADING,
-				Axis2CreationUIMessages.LABEL_JAVA_2_WSDL_PAGE_SUB_HEADING, 
-				skel1 );
-	}
-
-	private SimpleWidgetContributor createWidgetContributor(String title, 
-															String description, 
-															final WidgetDataContributor contributor){
-		SimpleWidgetContributor widgetContrib  = new SimpleWidgetContributor();
-		widgetContrib.setTitle(title);
-		widgetContrib.setDescription(description);
-		widgetContrib.setFactory( new WidgetContributorFactory(){
-			public WidgetContributor create(){
-				return contributor;
-			}
-		});
-
-		return widgetContrib;
-	}   
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/wsrt/Axis2WebService.java b/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/wsrt/Axis2WebService.java
deleted file mode 100644
index 23a4479..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/wsrt/Axis2WebService.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 runtime to the framework for 168762
- * 20070425   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070815   187840 sandakith@wso2.com - Lahiru Sandakith
- * 20080129   209411 kathy@ca.ibm.com - Kathy Chan
- *******************************************************************************/
-package org.eclipse.jst.ws.internal.axis2.creation.ui.wsrt;
-
-import java.util.Vector;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jst.ws.axis2.creation.core.command.Axis2BUCommand;
-import org.eclipse.jst.ws.axis2.creation.core.command.Axis2BUServiceCreationCommand;
-import org.eclipse.jst.ws.axis2.creation.core.command.Axis2BuildProjectCommand;
-import org.eclipse.jst.ws.axis2.creation.core.command.Axis2CleanupCommand;
-import org.eclipse.jst.ws.axis2.creation.core.command.Axis2DefaultingCommand;
-import org.eclipse.jst.ws.axis2.creation.core.command.Axis2ServicesXMLValidationCommand;
-import org.eclipse.jst.ws.axis2.creation.core.command.Axis2SkelImplCommand;
-import org.eclipse.jst.ws.axis2.creation.core.command.Axis2TDCommand;
-import org.eclipse.jst.ws.axis2.creation.core.command.Axis2TDServiceCreationCommand;
-import org.eclipse.jst.ws.axis2.creation.core.command.Axis2WSDL2JavaCommand;
-import org.eclipse.jst.ws.axis2.creation.core.command.Axis2WebservicesServerCommand;
-import org.eclipse.jst.ws.axis2.creation.core.data.DataModel;
-import org.eclipse.wst.command.internal.env.core.ICommandFactory;
-import org.eclipse.wst.command.internal.env.core.SimpleCommandFactory;
-import org.eclipse.wst.common.environment.IEnvironment;
-import org.eclipse.wst.ws.internal.wsrt.AbstractWebService;
-import org.eclipse.wst.ws.internal.wsrt.IContext;
-import org.eclipse.wst.ws.internal.wsrt.ISelection;
-import org.eclipse.wst.ws.internal.wsrt.WebServiceInfo;
-import org.eclipse.wst.ws.internal.wsrt.WebServiceScenario;
-
-public class Axis2WebService extends AbstractWebService
-{
-//	private Axis2WebServiceInfo axis2WebServiceInfo;
-
-	public Axis2WebService(WebServiceInfo info)
-	{
-		super(info);
-	}
-
-	public ICommandFactory assemble(IEnvironment env, IContext ctx,
-			ISelection sel, String project, String earProject)
-	{
-		return null;
-	}
-
-	public ICommandFactory deploy(IEnvironment env, IContext ctx, ISelection sel,
-			String project, String earProject)
-	{
-		return null;
-	}
-
-	public ICommandFactory develop(IEnvironment env, IContext ctx, ISelection sel,
-			String project, String earProject)
-	{
-		Vector commands = new Vector();
-		DataModel model = new DataModel();
-		//EclipseEnvironment environment = (EclipseEnvironment)env;
-
-		model.setWebProjectName(project);
-
-		if (ctx.getScenario().getValue() == WebServiceScenario.BOTTOMUP)	{ 
-			commands.add(new Axis2DefaultingCommand( model,this, ctx.getScenario().getValue() ) );
-			commands.add(new Axis2BUCommand( model ) );
-			commands.add(new Axis2ServicesXMLValidationCommand());
-			commands.add(new Axis2BUServiceCreationCommand(model,this,project));
-			commands.add(new Axis2WebservicesServerCommand(model, ctx.getScenario().getValue() ));
-			//Including command to build for the fix 187840
-			commands.add( new Axis2BuildProjectCommand(
-					ResourcesPlugin.getWorkspace().getRoot().getProject(project),true));
-		} 
-		else if (ctx.getScenario().getValue() == WebServiceScenario.TOPDOWN) {  
-			commands.add(new Axis2DefaultingCommand( model,this, ctx.getScenario().getValue()  ) );
-			commands.add(new Axis2TDCommand( model) );
-			commands.add(new Axis2WSDL2JavaCommand( model) );
-			commands.add( new Axis2BuildProjectCommand(
-						ResourcesPlugin.getWorkspace().getRoot().getProject(project),true));
-			commands.add(new Axis2TDServiceCreationCommand(model,this,project));
-			commands.add(new Axis2WebservicesServerCommand(model, ctx.getScenario().getValue()));
-			//yes, again invoke the build command to redeploy the service after complete full build
-			commands.add( new Axis2BuildProjectCommand(
-						ResourcesPlugin.getWorkspace().getRoot().getProject(project),true));
-			commands.add(new Axis2SkelImplCommand(this.getWebServiceInfo(),model));
-			commands.add(new Axis2CleanupCommand());
-		} 
-		else 
-		{
-			return null;
-		}
-
-		return new SimpleCommandFactory(commands);
-	}
-
-	public ICommandFactory install(IEnvironment env, IContext ctx, ISelection sel,
-			String project, String earProject)
-	{
-		return null;
-	}
-
-	public ICommandFactory run(IEnvironment env, IContext ctx, ISelection sel,
-			String project, String earProject)
-	{
-		Vector commands = new Vector();
-
-		
-			commands.add(new Axis2CheckWSDLCommand(this));
-			
-
-			return new SimpleCommandFactory(commands);
-
-	}
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/wsrt/Axis2WebServiceInfo.java b/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/wsrt/Axis2WebServiceInfo.java
deleted file mode 100644
index 5235e9d..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/wsrt/Axis2WebServiceInfo.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- *******************************************************************************/
-
-package org.eclipse.jst.ws.internal.axis2.creation.ui.wsrt;
-
-public class Axis2WebServiceInfo {
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/wsrt/Axis2WebServiceRuntime.java b/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/wsrt/Axis2WebServiceRuntime.java
deleted file mode 100644
index 0dfb583..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.ui/src/org/eclipse/jst/ws/internal/axis2/creation/ui/wsrt/Axis2WebServiceRuntime.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070110   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- *******************************************************************************/
-
-package org.eclipse.jst.ws.internal.axis2.creation.ui.wsrt;
-
-import org.eclipse.jst.ws.internal.axis2.consumption.ui.wsrt.Axis2WebServiceClient;
-import org.eclipse.wst.ws.internal.wsrt.AbstractWebServiceRuntime;
-import org.eclipse.wst.ws.internal.wsrt.IWebService;
-import org.eclipse.wst.ws.internal.wsrt.IWebServiceClient;
-import org.eclipse.wst.ws.internal.wsrt.WebServiceClientInfo;
-import org.eclipse.wst.ws.internal.wsrt.WebServiceInfo;
-
-public class Axis2WebServiceRuntime extends AbstractWebServiceRuntime
-{
-
-	public IWebService getWebService(WebServiceInfo info){
-		return new Axis2WebService(info);
-	}
-
-	public IWebServiceClient getWebServiceClient(WebServiceClientInfo info){
-		return new Axis2WebServiceClient(info);
-	}
-	
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.ui/.classpath b/bundles/org.eclipse.jst.ws.axis2.ui/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.ui/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/bundles/org.eclipse.jst.ws.axis2.ui/.cvsignore b/bundles/org.eclipse.jst.ws.axis2.ui/.cvsignore
deleted file mode 100644
index 7722bc8..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.ui/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-build.xml
-javaCompiler...args
diff --git a/bundles/org.eclipse.jst.ws.axis2.ui/.project b/bundles/org.eclipse.jst.ws.axis2.ui/.project
deleted file mode 100644
index acc7e17..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.ui/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.ws.axis2.ui</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-</projectDescription>
diff --git a/bundles/org.eclipse.jst.ws.axis2.ui/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.jst.ws.axis2.ui/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index c69c26a..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.ui/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,57 +0,0 @@
-#Tue Mar 20 10:45:38 LKT 2007
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
-org.eclipse.jdt.core.compiler.problem.deprecation=warning
-org.eclipse.jdt.core.compiler.problem.deprecationInDeprecatedCode=disabled
-org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled
-org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore
-org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore
-org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore
-org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning
-org.eclipse.jdt.core.compiler.problem.finallyBlockNotCompletingNormally=warning
-org.eclipse.jdt.core.compiler.problem.forbiddenReference=error
-org.eclipse.jdt.core.compiler.problem.hiddenCatchBlock=warning
-org.eclipse.jdt.core.compiler.problem.incompatibleNonInheritedInterfaceMethod=warning
-org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore
-org.eclipse.jdt.core.compiler.problem.indirectStaticAccess=ignore
-org.eclipse.jdt.core.compiler.problem.localVariableHiding=ignore
-org.eclipse.jdt.core.compiler.problem.methodWithConstructorName=warning
-org.eclipse.jdt.core.compiler.problem.missingDeprecatedAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.noEffectAssignment=warning
-org.eclipse.jdt.core.compiler.problem.noImplicitStringConversion=warning
-org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore
-org.eclipse.jdt.core.compiler.problem.nullReference=ignore
-org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod=warning
-org.eclipse.jdt.core.compiler.problem.parameterAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.possibleAccidentalBooleanAssignment=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
-org.eclipse.jdt.core.compiler.problem.specialParameterHidingField=disabled
-org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=warning
-org.eclipse.jdt.core.compiler.problem.suppressWarnings=enabled
-org.eclipse.jdt.core.compiler.problem.syntheticAccessEmulation=ignore
-org.eclipse.jdt.core.compiler.problem.typeParameterHiding=warning
-org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
-org.eclipse.jdt.core.compiler.problem.undocumentedEmptyBlock=ignore
-org.eclipse.jdt.core.compiler.problem.unhandledWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.unnecessaryElse=ignore
-org.eclipse.jdt.core.compiler.problem.unnecessaryTypeCheck=ignore
-org.eclipse.jdt.core.compiler.problem.unqualifiedFieldAccess=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownException=ignore
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionWhenOverriding=disabled
-org.eclipse.jdt.core.compiler.problem.unusedImport=warning
-org.eclipse.jdt.core.compiler.problem.unusedLabel=warning
-org.eclipse.jdt.core.compiler.problem.unusedLocal=warning
-org.eclipse.jdt.core.compiler.problem.unusedParameter=ignore
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenImplementingAbstract=disabled
-org.eclipse.jdt.core.compiler.problem.unusedParameterWhenOverridingConcrete=disabled
-org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/bundles/org.eclipse.jst.ws.axis2.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.jst.ws.axis2.ui/META-INF/MANIFEST.MF
deleted file mode 100644
index 7d30760..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.ui/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,17 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %PLUGIN_NAME
-Bundle-SymbolicName: org.eclipse.jst.ws.axis2.ui;singleton:=true
-Bundle-Version: 1.0.201.qualifier
-Bundle-Activator: org.eclipse.jst.ws.axis2.ui.plugin.WebServiceAxis2UIPlugin
-Bundle-Vendor: %PLUGIN_PROVIDER
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.jst.ws.axis2.core,
- org.eclipse.jst.ws,
- org.eclipse.jst.ws.ui
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.jst.ws.axis2.ui.plugin,
- org.eclipse.jst.ws.internal.axis2.consumption.ui.preferences
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/bundles/org.eclipse.jst.ws.axis2.ui/about.html b/bundles/org.eclipse.jst.ws.axis2.ui/about.html
deleted file mode 100644
index 9e73bda..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.ui/about.html
+++ /dev/null
@@ -1,34 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<HTML>
-
-<head>
-<title>About</title>
-<meta http-equiv=Content-Type content="text/html; charset=ISO-8859-1">
-</head>
-
-<BODY lang="EN-US">
-
-<H3>About This Content</H3>
-
-<P>June 06, 2007</P>
-
-<H3>License</H3>
-
-<P>The Eclipse Foundation makes available all content in this plug-in 
-("Content"). Unless otherwise indicated below, the Content is provided to you 
-under the terms and conditions of the Eclipse Public License Version 1.0 
-("EPL"). A copy of the EPL is available at
-<A href="http://www.eclipse.org/org/documents/epl-v10.php">http://www.eclipse.org/org/documents/epl-v10.php</A>. 
-For purposes of the EPL, "Program" will mean the Content.</P>
-
-<P>If you did not receive this Content directly from the Eclipse Foundation, the 
-Content is being redistributed by another party ("Redistributor") and different 
-terms and conditions may apply to your use of any object code in the Content. 
-Check the Redistributor's license that was provided with the Content. If no such 
-license exists, contact the Redistributor. Unless otherwise indicated below, the 
-terms and conditions of the EPL still apply to any source code in the Content 
-and such source code may be obtained at
-<A href="http://www.eclipse.org/">http://www.eclipse.org/</A>.</P>
-
-</BODY>
-</HTML>
diff --git a/bundles/org.eclipse.jst.ws.axis2.ui/build.properties b/bundles/org.eclipse.jst.ws.axis2.ui/build.properties
deleted file mode 100644
index 9e0863d..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.ui/build.properties
+++ /dev/null
@@ -1,21 +0,0 @@
-###############################################################################
-# Copyright (c) 2007 WSO2 Inc 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:
-# WSO2 Inc - initial API and implementation
-# yyyymmdd bug      Email and other contact information
-# -------- -------- -----------------------------------------------------------
-# 20070130   168762 sandakith@wso2.com - Lahiru Sandakith, Initial API Contribution
-# 20070502   184302 sandakith@wso2.com - Lahiru Sandakith, Fix copyright for Axis2 plugins
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.properties,\
-               plugin.xml,\
-               about.html
diff --git a/bundles/org.eclipse.jst.ws.axis2.ui/plugin.properties b/bundles/org.eclipse.jst.ws.axis2.ui/plugin.properties
deleted file mode 100644
index 6a63c11..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.ui/plugin.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-###############################################################################
-# Copyright (c) 2007 WSO2 Inc. 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:
-# WSO2 Inc. - initial API and implementation
-# yyyymmdd bug      Email and other contact information
-# -------- -------- -----------------------------------------------------------
-# 20070118   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 runtime to the framework for 168762
-# 20070501   184617 sandakith@wso2.com - Lahiru Sandakith, Provide plugin details
-###############################################################################
-#
-
-#
-# Messages in plugin.xml.
-PLUGIN_NAME=Webservice Axis2 UI Plug-in
-PLUGIN_PROVIDER=WSO2
-
-# Web Services Preferance Pages
-# Categories
-PREFERENCE_CATEGORY_AXIS2_RUNTIME=Axis2 Preferences 
diff --git a/bundles/org.eclipse.jst.ws.axis2.ui/plugin.xml b/bundles/org.eclipse.jst.ws.axis2.ui/plugin.xml
deleted file mode 100644
index 5f22106..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.ui/plugin.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<plugin>
-  
-   <extension point="org.eclipse.ui.preferencePages">     
-      <page
-            name="%PREFERENCE_CATEGORY_AXIS2_RUNTIME"
-            category="org.eclipse.wst.ws.internal.ui.preferences.name"
-            class="org.eclipse.jst.ws.internal.axis2.consumption.ui.preferences.Axis2RuntimePreferencePage"
-            id="org.eclipse.jst.ws.internal.axis2.consumption.ui.preferences.Axis2RuntimePreferencePage">
-      </page>
-   </extension>
-   
-</plugin>
\ No newline at end of file
diff --git a/bundles/org.eclipse.jst.ws.axis2.ui/src/org/eclipse/jst/ws/axis2/ui/plugin/WebServiceAxis2UIPlugin.java b/bundles/org.eclipse.jst.ws.axis2.ui/src/org/eclipse/jst/ws/axis2/ui/plugin/WebServiceAxis2UIPlugin.java
deleted file mode 100644
index adba846..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.ui/src/org/eclipse/jst/ws/axis2/ui/plugin/WebServiceAxis2UIPlugin.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070130   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  runtime to the framework for 168762
- * 20070425   183046 sandakith@wso2.com - Lahiru Sandakith
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.ui.plugin;
-
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class WebServiceAxis2UIPlugin extends AbstractUIPlugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.jst.ws.axis2.ui";
-
-	// The shared instance
-	private static WebServiceAxis2UIPlugin plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public WebServiceAxis2UIPlugin() {
-		plugin = this;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
-	 */
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static WebServiceAxis2UIPlugin getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.ui/src/org/eclipse/jst/ws/internal/axis2/consumption/ui/preferences/Axis2RuntimePreferencePage.java b/bundles/org.eclipse.jst.ws.axis2.ui/src/org/eclipse/jst/ws/internal/axis2/consumption/ui/preferences/Axis2RuntimePreferencePage.java
deleted file mode 100644
index 0fe6514..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.ui/src/org/eclipse/jst/ws/internal/axis2/consumption/ui/preferences/Axis2RuntimePreferencePage.java
+++ /dev/null
@@ -1,334 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 WSO2 Inc. 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:
- * WSO2 Inc. - initial API and implementation
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20070130   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- *                      runtime to the framework for 168762
- * 20070425   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070501   180284 sandakith@wso2.com - Lahiru Sandakith
- * 20070511   186440 sandakith@wso2.com - Lahiru Sandakith fix 186440
- * 20070513   186430 sandakith@wso2.com - Lahiru Sandakith, fix for 186430
- *                      Text not accessible on AXIS2 wizard pages.
- * 20070516   183147 sandakith@wso2.com - Lahiru Sandakith Fix for the persisting DBCS paths
- * 20070523   174876 sandakith@wso2.com - Lahiru Sandakith, Persist Preferences inside Framework
- * 20070603   188740 sandakith@wso2.com - Lahiru Sandakith, 
- * 20070604   190505 sandakith@wso2.com - Lahiru Sandakith, 
- * 20070604   190067 pmoogk@ca.ibm.com - Peter Moogk
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- * 20070827   188732 sandakith@wso2.com - Lahiru Sandakith, Restore defaults for preferences
- * 20071030	  207618 zina@ca.ibm.com - Zina Mostafia, Page GUI sequence using tab is not correct ( violates Accessibility)
- *******************************************************************************/
-package org.eclipse.jst.ws.internal.axis2.consumption.ui.preferences;
-
-import java.io.File;
-
-import org.eclipse.jface.preference.PreferencePage;
-import org.eclipse.jst.ws.axis2.core.constant.Axis2Constants;
-import org.eclipse.jst.ws.axis2.core.context.Axis2EmitterContext;
-import org.eclipse.jst.ws.axis2.core.context.Axis2EmitterDefaults;
-import org.eclipse.jst.ws.axis2.core.plugin.WebServiceAxis2CorePlugin;
-import org.eclipse.jst.ws.axis2.core.plugin.messages.Axis2CoreUIMessages;
-import org.eclipse.jst.ws.axis2.core.utils.Axis2CoreUtils;
-import org.eclipse.jst.ws.axis2.core.utils.RuntimePropertyUtils;
-import org.eclipse.jst.ws.axis2.ui.plugin.WebServiceAxis2UIPlugin;
-import org.eclipse.jst.ws.internal.ui.common.UIUtils;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.swt.widgets.TabFolder;
-import org.eclipse.swt.widgets.TabItem;
-import org.eclipse.swt.widgets.Text;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
-
-public class Axis2RuntimePreferencePage extends PreferencePage implements IWorkbenchPreferencePage {
-
-	private Text axis2Path; 
-	private Text statusLabel;
-	private Combo aarExtensionCombo; 
-	private Combo serviceDatabindingCombo;
-	private Combo clientDatabindingCombo;
-	private Button generateServerSideInterfaceCheckBoxButton;
-	private Button generateAllCheckBoxButton;
-	private Button syncAndAsyncRadioButton;
-	private Button syncOnlyRadioButton;
-	private Button asyncOnlyRadioButton;
-	private Button clientTestCaseCheckBoxButton;
-	private Button clientGenerateAllCheckBoxButton;
-
-	protected Control createContents(Composite superparent) {
-		
-		UIUtils uiUtils = new UIUtils(WebServiceAxis2UIPlugin.PLUGIN_ID);
-		final Composite  mainComp = uiUtils.createComposite(superparent, 1);
-		
-		TabFolder axis2PreferenceTab = new TabFolder(mainComp, SWT.WRAP);
-		axis2PreferenceTab.setLayoutData( new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH) );
-
-		
-		//-----------------------------Axis2 Runtime Location Group------------------------------//
-		TabItem runtimeInstalLocationItem = new TabItem(axis2PreferenceTab, SWT.WRAP);
-		runtimeInstalLocationItem.setText(Axis2CoreUIMessages.AXIS2_RUNTIME);
-		runtimeInstalLocationItem.setToolTipText(Axis2CoreUIMessages.AXIS2_RUNTIME_TOOLTIP);
-		
-		Composite runtimeTab = uiUtils.createComposite(axis2PreferenceTab, 1);
-		runtimeTab.setLayoutData( new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH ) );
-		Composite runtimeGroup = uiUtils.createComposite(runtimeTab, 3);
-
-		runtimeInstalLocationItem.setControl(runtimeTab);
-		runtimeTab.setToolTipText(Axis2CoreUIMessages.AXIS2_RUNTIME_TOOLTIP);
-
-		axis2Path = uiUtils.createText(runtimeGroup, Axis2CoreUIMessages.AXIS2_RUNTIME_LOCATION , null, null , SWT.BORDER);
-		
-		Button browseButton = uiUtils.createPushButton(runtimeGroup, Axis2CoreUIMessages.LABEL_BROUSE, null, null);
-		browseButton.addSelectionListener( new SelectionAdapter() {
-			public void widgetSelected(SelectionEvent e) {
-				handleBrowse(mainComp.getShell());
-			}     
-		}); 
-
-		axis2Path.addModifyListener( new ModifyListener(){
-			public void modifyText(ModifyEvent e){
-				statusUpdate(runtimeExist(axis2Path.getText()));
-				// runtimeTab.layout();
-			}
-		});
-		new org.eclipse.swt.widgets.Label(runtimeTab, SWT.HORIZONTAL);  // Leave some vertical space.
-		statusLabel = new Text(runtimeTab, SWT.BACKGROUND | SWT.READ_ONLY | SWT.CENTER | SWT.WRAP | SWT.H_SCROLL);
-		statusLabel.setLayoutData( new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH) );
-
-		//--------------------------------Axis2 Runtime Preferences------------------------------//
-
-		TabItem codegenPreferencesItem = new TabItem(axis2PreferenceTab, SWT.WRAP);
-		codegenPreferencesItem.setText(Axis2CoreUIMessages.AXIS2_PREFERENCES);
-		codegenPreferencesItem.setToolTipText(Axis2CoreUIMessages.AXIS2_PREFERENCES_TOOLTIP);
-
-		Composite codegenGroup = uiUtils.createComposite(axis2PreferenceTab, 1);
-		codegenPreferencesItem.setControl(codegenGroup);
-		codegenGroup.setToolTipText(Axis2CoreUIMessages.AXIS2_PREFERENCES_TOOLTIP);
-
-		///////////////////////////////////////////////////////////////////////////////////////////
-
-		//Service Codegen Options
-		Composite serviceCodegenGroup = uiUtils.createComposite(codegenGroup, 1);
-
-		Text serviceCodegenGroupLabel= new Text(serviceCodegenGroup, SWT.READ_ONLY |SWT.WRAP);
-		serviceCodegenGroupLabel.setText(Axis2CoreUIMessages.LABEL_WEB_SERVICE_CODEGEN);
-
-		Composite dataBindComp = uiUtils.createComposite(serviceCodegenGroup, 2);
-		//Data binding
-		serviceDatabindingCombo = uiUtils.createCombo(dataBindComp, Axis2CoreUIMessages.LABEL_DATABINDING, null, null, SWT.READ_ONLY);
-
-		//the server side interface option
-		generateServerSideInterfaceCheckBoxButton = uiUtils.createCheckbox(serviceCodegenGroup, Axis2CoreUIMessages.LABEL_GENERATE_SERVERSIDE_INTERFACE, null, null);
-
-		// generate all
-		generateAllCheckBoxButton = uiUtils.createCheckbox(serviceCodegenGroup, Axis2CoreUIMessages.LABEL_GENERATE_ALL, null,null);
-
-		uiUtils.createHorizontalSeparator(codegenGroup,2);
-		///////////////////////////////////////////////////////////////////////////////////////////
-
-		///Client Codegen Options
-		Composite clientCodegenGroup = uiUtils.createComposite(codegenGroup, 1);
-		Text clientCodegenGroupLabel= new Text(clientCodegenGroup, SWT.READ_ONLY);
-		clientCodegenGroupLabel.setText(Axis2CoreUIMessages.LABEL_WEB_SERVICE_CLIENT_CODEGEN);
-
-		Group clientModeRadioComp = uiUtils.createGroup(clientCodegenGroup, Axis2CoreUIMessages.LABEL_CLIENT_SIDE, null, null);
-
-		//client side buttons
-		syncAndAsyncRadioButton = uiUtils.createRadioButton(clientModeRadioComp, Axis2CoreUIMessages.LABEL_SYNC_AND_ASYNC, null, null);
-		syncOnlyRadioButton 	= uiUtils.createRadioButton(clientModeRadioComp,Axis2CoreUIMessages.LABEL_SYNC, null, null);
-		asyncOnlyRadioButton 	= uiUtils.createRadioButton(clientModeRadioComp, Axis2CoreUIMessages.LABEL_ASYNC, null, null);
-
-		Composite dataBind = uiUtils.createComposite(clientCodegenGroup, 2);
-		clientDatabindingCombo = uiUtils.createCombo(dataBind, Axis2CoreUIMessages.LABEL_DATABINDING, null, null, SWT.READ_ONLY);
-
-		// generate test case option
-		clientTestCaseCheckBoxButton = uiUtils.createCheckbox(clientCodegenGroup, Axis2CoreUIMessages.LABEL_GENERATE_TESTCASE_CAPTION, null, null);
-
-		// generate all
-		clientGenerateAllCheckBoxButton = uiUtils.createCheckbox(clientCodegenGroup, Axis2CoreUIMessages.LABEL_GENERATE_ALL, null, null);
-
-
-		uiUtils.createHorizontalSeparator(codegenGroup,2);
-
-		///////////////////////////////////////////////////////////////////////////////////////////
-
-		///AAR Options
-		Composite aarGroup = uiUtils.createComposite(codegenGroup,1);
-
-		Text arrGroupLabel= new Text(aarGroup, SWT.READ_ONLY);
-		arrGroupLabel.setText(Axis2CoreUIMessages.LABEL_WEB_SERVICE_AAR);
-
-		Composite aarExtGroup = uiUtils.createComposite(aarGroup,2);
-
-		//aar extention 
-		aarExtensionCombo = uiUtils.createCombo(aarExtGroup, Axis2CoreUIMessages.LABEL_AAR_EXTENTION, null, null, SWT.READ_ONLY );
-
-		initializeValues();
-		axis2PreferenceTab.setEnabled(true);
-		axis2PreferenceTab.setVisible(true);
-		return mainComp;
-	}
-
-	public void init(IWorkbench workbench) {
-	}
-
-
-	/**
-	 * Pops up the file browse dialog box
-	 */
-	private void handleBrowse(Shell parent) {
-		DirectoryDialog fileDialog = new DirectoryDialog(parent);
-		String fileName = fileDialog.open();
-		if (fileName != null) {
-			axis2Path.setText(fileName);
-		}
-	}
-
-	private void statusUpdate(boolean status){
-		if(statusLabel != null){
-			if(!axis2Path.getText().equals("")){
-				if (status) {
-					statusLabel.setText(Axis2CoreUIMessages.LABEL_AXIS2_RUNTIME_LOAD);
-				} else {
-					statusLabel.setText(Axis2CoreUIMessages.LABEL_AXIS2_RUNTIME_LOAD_ERROR);
-				}
-			}else{
-				statusLabel.setText(Axis2CoreUIMessages.LABEL_AXIS2_RUNTIME_NOT_EXIT);
-			}
-		}
-	}
-
-	private boolean runtimeExist(String path){
-
-		File axis2HomeDir = new File(path);
-		if (!axis2HomeDir.isDirectory()) 
-			return false;
-
-		String axis2LibPath = Axis2CoreUtils.addAnotherNodeToPath(axis2HomeDir.getAbsolutePath(), "lib");
-		String axis2WebappPath = Axis2CoreUtils.addAnotherNodeToPath(axis2HomeDir.getAbsolutePath(), "webapp");
-		if (new File(axis2LibPath).isDirectory() && new File(axis2WebappPath).isDirectory()) 
-			return true;
-		else {
-			String axis2WarPath = Axis2CoreUtils.addAnotherNodeToPath( path, "axis2.war");
-			if (new File(axis2WarPath).isFile()) {
-				RuntimePropertyUtils.writeWarStausToPropertiesFile(true);
-				return true;
-			} else 				
-				return false;
-		}
-	}
-
-	private void storeValues(){
-		// set values in the persistent context 
-		Axis2EmitterContext context = WebServiceAxis2CorePlugin.getDefault().getAxisEmitterContext();
-		context.setAxis2RuntimeLocation( axis2Path.getText());
-		RuntimePropertyUtils.writeServerPathToPropertiesFile(axis2Path.getText());
-		context.setServiceDatabinding(serviceDatabindingCombo.getItem(serviceDatabindingCombo.getSelectionIndex()));
-		context.setServiceInterfaceSkeleton( generateServerSideInterfaceCheckBoxButton.getSelection());
-		context.setServiceGenerateAll(generateAllCheckBoxButton.getSelection());
-		context.setAsync(asyncOnlyRadioButton.getSelection());
-		context.setSync(syncOnlyRadioButton.getSelection());
-		context.setClientDatabinding(clientDatabindingCombo.getItem(clientDatabindingCombo.getSelectionIndex()));
-		context.setClientTestCase(clientTestCaseCheckBoxButton.getSelection());
-		context.setClientGenerateAll(clientGenerateAllCheckBoxButton.getSelection());
-		context.setAarExtention(aarExtensionCombo.getText());
-	}
-
-	/**
-	 * Initializes states of the controls using default values
-	 * in the preference store.
-	 */
-	private void initializeDefaults() {
-		aarExtensionCombo.select(0);
-		serviceDatabindingCombo.select(0);
-		clientDatabindingCombo.select(0);
-		generateServerSideInterfaceCheckBoxButton.setSelection(Axis2EmitterDefaults.isServiceInterfaceSkeleton());
-		generateAllCheckBoxButton.setSelection(Axis2EmitterDefaults.isServiceGenerateAll());
-		syncAndAsyncRadioButton.setSelection(((Axis2EmitterDefaults.isClientSync() || Axis2EmitterDefaults.isClientAsync())==false)?true:
-			(Axis2EmitterDefaults.isClientSync()) && Axis2EmitterDefaults.isClientAsync());
-		syncOnlyRadioButton.setSelection( Axis2EmitterDefaults.isClientSync() && !Axis2EmitterDefaults.isClientAsync());
-		asyncOnlyRadioButton.setSelection(
-				Axis2EmitterDefaults.isClientAsync() && !Axis2EmitterDefaults.isClientSync());
-
-		clientTestCaseCheckBoxButton.setSelection(Axis2EmitterDefaults.isClientTestCase());
-		clientGenerateAllCheckBoxButton.setSelection(Axis2EmitterDefaults.isClientGenerateAll());
-		axis2Path.setText(Axis2EmitterDefaults.getAxis2RuntimeLocation());
-	}
-
-	private void initializeValues()
-	{
-		Axis2EmitterContext context = WebServiceAxis2CorePlugin.getDefault().getAxisEmitterContext();
-
-		String[] databindingItems = {context.getServiceDatabinding().toUpperCase()};
-		serviceDatabindingCombo.setItems(databindingItems);
-		serviceDatabindingCombo.select(0);
-		clientDatabindingCombo.setItems(databindingItems);
-		clientDatabindingCombo.select(0);
-
-		generateServerSideInterfaceCheckBoxButton.setSelection( context.isServiceInterfaceSkeleton());
-		generateAllCheckBoxButton.setSelection(context.isServiceGenerateAll());
-
-		syncAndAsyncRadioButton.setSelection(((context.isSync() || context.isAsync())==false) ?true
-				:(context.isSync()) && context.isAsync());
-		syncOnlyRadioButton.setSelection(context.isSync() && !context.isAsync() );
-		asyncOnlyRadioButton.setSelection(context.isAsync() && !context.isSync());
-
-		clientTestCaseCheckBoxButton.setSelection(context.isClientTestCase());
-		clientGenerateAllCheckBoxButton.setSelection(context.isClientGenerateAll());
-
-		String[] aarExtentionItems = { Axis2Constants.AAR };
-		aarExtensionCombo.setItems(aarExtentionItems);
-		aarExtensionCombo.select(0);
-		
-		String serverPath = context.getAxis2RuntimeLocation();
-		if ( serverPath != null){
-			axis2Path.setText(serverPath);
-			statusUpdate(runtimeExist(serverPath));
-			RuntimePropertyUtils.writeWarStausToPropertiesFile(false);
-		}
-		else
-			statusUpdate(false);
-	}
-
-	/**
-	 * Default button has been pressed.
-	 */
-	protected void performDefaults() {
-		super.performDefaults();
-		initializeDefaults();
-	}
-
-	/**
-	 * Apply button has been pressed.
-	 */
-	protected void performApply() {
-		performOk();
-	}
-
-	/**
-	 * OK button has been pressed.
-	 */	
-	public boolean performOk() {
-		storeValues();
-		return true;
-	}
-
-}
