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 f83f2bf..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.1.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 ec9a381..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,593 +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
- *******************************************************************************/
-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.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.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.utils.ClassLoadingUtil;
-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 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;
-	Label   label, fillLabel, fillLabel1, fillLabel2, fillLabel3, fillLabel4, fillLabel5, fillLabel6;
-	//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();
-		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(Axis2ConsumptionUIMessages.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) {
-				//loadPortNames();
-				model.setServiceName(serviceNameCombo.getText());
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-
-		// port name
-		label = new Label(mainComp, SWT.NULL);
-		label.setText(Axis2ConsumptionUIMessages.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(Axis2ConsumptionUIMessages.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(Axis2ConsumptionUIMessages.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);
-		fillLabel.setLayoutData(gd);
-		
-		//Client type label 
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 3;
-		Text clientlabel = new Text(mainComp,SWT.BACKGROUND | SWT.READ_ONLY);
-		clientlabel.setText(Axis2ConsumptionUIMessages.LABEL_CLIENT_SIDE);
-		clientlabel.setLayoutData(gd);
-		
-		//client side buttons
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 1;
-		syncAndAsyncRadioButton = new Button(mainComp, SWT.RADIO);
-		syncAndAsyncRadioButton.setLayoutData(gd);
-		syncAndAsyncRadioButton.setText(Axis2ConsumptionUIMessages.LABEL_SYNC_AND_ASYNC);
-		syncAndAsyncRadioButton.setVisible(true);
-		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) {
-			}
-		});
-
-		
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 1;
-		syncOnlyRadioButton = new Button(mainComp, SWT.RADIO);
-		syncOnlyRadioButton.setLayoutData(gd);
-		syncOnlyRadioButton.setText(Axis2ConsumptionUIMessages.LABEL_SYNC);
-		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) {
-			}
-		});
-
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 1;
-		asyncOnlyRadioButton = new Button(mainComp, SWT.RADIO);
-		asyncOnlyRadioButton.setLayoutData(gd);
-		asyncOnlyRadioButton
-				.setText(Axis2ConsumptionUIMessages.LABEL_ASYNC);
-		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());
-		
-		//filling label 
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 3;
-		fillLabel = new Label(mainComp, SWT.HORIZONTAL | SWT.NULL);
-		fillLabel.setLayoutData(gd);
-		
-		// generate test case option
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 3;
-		testCaseCheckBoxButton = new Button(mainComp, SWT.CHECK);
-		testCaseCheckBoxButton.setLayoutData(gd);
-		testCaseCheckBoxButton.setText(Axis2ConsumptionUIMessages.LABEL_GENERATE_TESTCASE_CAPTION);
-		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 = new Button(mainComp, SWT.CHECK);
-		gd = new GridData(GridData.FILL_HORIZONTAL);
-		gd.horizontalSpan = 3;
-		generateAllCheckBoxButton.setLayoutData(gd);
-		generateAllCheckBoxButton.setSelection(context.isClientGenerateAll());
-		generateAllCheckBoxButton.setText(Axis2ConsumptionUIMessages.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;
-		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);
-		
-		//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
-        		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.core/.classpath b/bundles/org.eclipse.jst.ws.axis2.core/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.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.core/.cvsignore b/bundles/org.eclipse.jst.ws.axis2.core/.cvsignore
deleted file mode 100644
index 7722bc8..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-build.xml
-javaCompiler...args
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/.project b/bundles/org.eclipse.jst.ws.axis2.core/.project
deleted file mode 100644
index 2230d2d..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.jst.ws.axis2.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.core/.settings/org.eclipse.jdt.core.prefs b/bundles/org.eclipse.jst.ws.axis2.core/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 6e7793f..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,57 +0,0 @@
-#Tue Mar 20 10:45:04 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.core/META-INF/MANIFEST.MF b/bundles/org.eclipse.jst.ws.axis2.core/META-INF/MANIFEST.MF
deleted file mode 100644
index aa4cfb8..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,36 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %PLUGIN_NAME
-Bundle-SymbolicName: org.eclipse.jst.ws.axis2.core;singleton:=true
-Bundle-Version: 1.0.2.qualifier
-Bundle-Activator: org.eclipse.jst.ws.axis2.core.plugin.WebServiceAxis2CorePlugin
-Bundle-Vendor: %PLUGIN_PROVIDER
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.core.resources,
- org.apache.ant,
- org.eclipse.ui,
- org.eclipse.wst.common.project.facet.core,
- org.eclipse.wst.common.project.facet.ui,
- org.eclipse.wst.common.modulecore,
- org.eclipse.jst.j2ee.web,
- org.eclipse.jst.j2ee,
- org.eclipse.jst.j2ee.core,
- org.eclipse.emf.common,
- org.eclipse.emf.ecore,
- org.eclipse.jem,
- org.eclipse.wst.command.env,
- org.eclipse.wst.command.env.core,
- org.eclipse.jst.ws,
- org.eclipse.wst.common.environment,
- org.eclipse.wst.common.frameworks,
- org.eclipse.wst.common.frameworks.ui,
- org.eclipse.wst.command.env.ui,
- org.eclipse.wst.server.core
-Eclipse-LazyStart: true
-Export-Package: org.eclipse.jst.ws.axis2.core.constant,
- org.eclipse.jst.ws.axis2.core.context,
- org.eclipse.jst.ws.axis2.core.plugin,
- org.eclipse.jst.ws.axis2.core.plugin.messages,
- org.eclipse.jst.ws.axis2.core.utils
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/about.html b/bundles/org.eclipse.jst.ws.axis2.core/about.html
deleted file mode 100644
index 9e73bda..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.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.core/build.properties b/bundles/org.eclipse.jst.ws.axis2.core/build.properties
deleted file mode 100644
index 0da9e2e..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.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
-# -------- -------- -----------------------------------------------------------
-# 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               plugin.properties,\
-               icons/,\
-               about.html
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/icons/axis2-facet-add.gif b/bundles/org.eclipse.jst.ws.axis2.core/icons/axis2-facet-add.gif
deleted file mode 100644
index e862ced..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/icons/axis2-facet-add.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/icons/axis2-facet.ico b/bundles/org.eclipse.jst.ws.axis2.core/icons/axis2-facet.ico
deleted file mode 100644
index 0e52a10..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/icons/axis2-facet.ico
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/plugin.properties b/bundles/org.eclipse.jst.ws.axis2.core/plugin.properties
deleted file mode 100644
index e7b1282..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/plugin.properties
+++ /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
-# -------- -------- -----------------------------------------------------------
-# 20070405   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 Core Plug-in
-PLUGIN_PROVIDER=WSO2
-
-AXIS2_CATOGERY_LABEL=Axis2 Web Services
-AXIS2_CATOGERY_DISCRIPTION=Enables Web Services generation through Axis2 Web services engine.
-
-AXIS2_FACET_CORE_LABEL=Axis2 Web Services Core
-AXIS2_FACET_CORE_DISCRIPTION=Prepare the Project for Web Services generation through Axis2 Web services engine.
-
-
-AXIS2_FACET_EXT_LABEL=Axis2 Web Services Extensions
-AXIS2_FACET_EXT_DISCRIPTION=Prepare the Project for additional Web services support with the Axis2 Web services runtime.
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/plugin.xml b/bundles/org.eclipse.jst.ws.axis2.core/plugin.xml
deleted file mode 100644
index 69a6d64..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/plugin.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<plugin>
-
-	<extension point="org.eclipse.wst.common.project.facet.core.facets">
-	
-	  <category id="axis2.category">
-    	<label>%AXIS2_CATOGERY_LABEL</label>
-    	<description>%AXIS2_CATOGERY_DISCRIPTION</description>
-  	  </category>
-
-		  <project-facet id="axis2.core">
-			<label>%AXIS2_FACET_CORE_LABEL</label>
-			<description>%AXIS2_FACET_CORE_DISCRIPTION</description>
-			<member category="axis2.category "/>
-		  </project-facet>
-
-		<project-facet-version facet="axis2.core" version="1.1">
-		    <constraint>
-      			<requires facet="jst.web" version="2.2,2.3,2.4,2.5"/>
-    		</constraint>
-    		<action type="INSTALL">
-      			<delegate class="org.eclipse.jst.ws.axis2.facet.deligate.Axis2CoreFacetInstallDelegate"/>
-    		</action>
-<!--
-    		<action type="UNINSTALL">
-      			<delegate class="org.eclipse.jst.ws.axis2.facet.deligate.Axis2CoreFacetUnInstallDelegate"/>
-    		</action>
--->
-  		</project-facet-version>
-
-		  <project-facet id="axis2.ext">
-			<label>%AXIS2_FACET_EXT_LABEL</label>
-			<description>%AXIS2_FACET_EXT_DISCRIPTION</description>
-			<member category="axis2.category" />
-		  </project-facet>
-
-		<project-facet-version facet="axis2.ext" version="1.1">
-		    <constraint>
-      			<requires facet="axis2.core" version="1.1"/>
-    		</constraint>
-    		<action type="INSTALL">
-      			<delegate class="org.eclipse.jst.ws.axis2.facet.deligate.Axis2ExtFacetInstallDelegate"/>
-    		</action>
-<!--
-    		<action type="UNINSTALL">
-      			<delegate class="org.eclipse.jst.ws.axis2.facet.deligate.Axis2ExtFacetUnInstallDelegate"/>
-    		</action>
--->
-  		</project-facet-version>
-  
-	</extension>
-	
-	<extension point="org.eclipse.wst.common.project.facet.ui.images">
-  		<image facet="axis2.core" path="icons/axis2-facet-add.gif"/>
-  		<image facet="axis2.ext" path="icons/axis2-facet-add.gif"/>
-  		<image category="axis2.category" path="icons/axis2-facet.ico"/>
-	</extension>
-	
-	<extension
-       point="org.eclipse.wst.common.project.facet.core.runtimes">
-    <supported>
-      <runtime-component
-         any="true"/>
-      <facet
-         id="axis2.core"
-         version="1.1"/>
-      <facet
-         id="axis2.ext"
-         version="1.1"/>
-    </supported>
-   </extension>
-
-
-</plugin>
\ No newline at end of file
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/constant/Axis2Constants.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/constant/Axis2Constants.java
deleted file mode 100644
index f517250..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/constant/Axis2Constants.java
+++ /dev/null
@@ -1,92 +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
- * -------- -------- -----------------------------------------------------------
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- * 20071011   205972 sandakith@wso2.com - Lahiru Sandakith, Axis2 Libraries License files fix
- * 20071029   206967 sandakith@wso2.com - Lahiru Sandakith
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.core.constant;
-
-public class Axis2Constants {
-	
-	//Axis2 Core Plugin Constants  	
-	public static final String DIR_TEMPWAR="tempwar";							//$NON-NLS-1$
-	public static final String DIR_EXPLOADED_TEMPWAR="exploadedwar";			//$NON-NLS-1$
-	public static final String DIR_LIB="lib";									//$NON-NLS-1$
-	public static final String DIR_TEST="test";									//$NON-NLS-1$
-	public static final String FILE_AXIS2_WAR="axis2.war";						//$NON-NLS-1$
-	public static final String  NULL="";										//$NON-NLS-1$
-	public static final String ADB="adb";										//$NON-NLS-1$
-	public static final String AAR="aar";										//$NON-NLS-1$
-	public static final String JAR="jar";										//$NON-NLS-1$
-	public static final String TXT="txt";										//$NON-NLS-1$
-	public static final String TEMP_AXIS2_FACET_DIR="org.apache.axis2.facet";	//$NON-NLS-1$
-	public static final String DIR_DOT_METADATA=".metadata";					//$NON-NLS-1$
-	public static final String DIR_DOT_PLUGINS=".plugins";						//$NON-NLS-1$
-	public static final String DIR_UNZIP="nzip";								//$NON-NLS-1$
-	public static final String LOCAL_SERVER_PORT="http://localhost:8080";		//$NON-NLS-1$
-	public static final String SERVICES="services";								//$NON-NLS-1$
-	public static final String WEBAPP_EXPLODED_SERVER_LOCATION_FILE=
-			"server.properties";												//$NON-NLS-1$
-	public static final String SERVER_STATUS_LOCATION_FILE="status.properties";	//$NON-NLS-1$
-	public static final String WAR_STATUS_LOCATION_FILE="war.properties";		//$NON-NLS-1$
-	public static final String PROPERTY_KEY_PATH="path";						//$NON-NLS-1$
-	public static final String PROPERTY_KEY_STATUS="status";					//$NON-NLS-1$
-	public static final String SERVER_STATUS_PASS="pass";						//$NON-NLS-1$
-	public static final String SERVER_STATUS_FAIL="fail";						//$NON-NLS-1$
-	
-	//Axis2 Creation Plugin Constants 
-	public static final String FILE_SERVICES_XML="services.xml";				//$NON-NLS-1$
-	public static final String FILE_XML="*.xml";								//$NON-NLS-1$
-	public static final String DIR_META_INF="META-INF";							//$NON-NLS-1$
-	public static final String DIR_BUILD="build";								//$NON-NLS-1$
-	public static final String DIR_SRC="src";									//$NON-NLS-1$
-	public static final String DIR_CLASSES="classes";							//$NON-NLS-1$
-	public static final String DIR_RESOURCES="resources";						//$NON-NLS-1$
-	public static final String DIR_WEB_INF="WEB-INF";							//$NON-NLS-1$
-	public static final String DIR_SERVICES="services";							//$NON-NLS-1$
-	public static final String DIR_WEBSERVICES="webservices";					//$NON-NLS-1$
-	public static final String DIR_WEBCONTENT="WebContent";						//$NON-NLS-1$
-	public static final String JAR_TASK="jar";									//$NON-NLS-1$
-	public static final String AXIS2_PROJECT="org.eclipse.jst.ws.axis2";		//$NON-NLS-1$
-	public static final String CODEGEN_RESULTS="codegen";						//$NON-NLS-1$
-	public static final String DATA_BINDING_ADB="ADB";							//$NON-NLS-1$
-	public static final String DATA_BINDING_NONE="NONE";						//$NON-NLS-1$
-	public static final String SKELETON_SUFFIX="Skeleton.java";					//$NON-NLS-1$
-	
-	
-	//Axis2 Consumption Plugin Constants  
-	public static final String JUNIT_JAR="junit.jar";							//$NON-NLS-1$
-	public static final String JUNIT_BUNDLE="org.junit";						//$NON-NLS-1$
-	public static final String DIR_AXIS2_WEB="axis2-web";						//$NON-NLS-1$
-	public static final String FILE_WEB_XML="web.xml";							//$NON-NLS-1$
-	public static final String FILE_SERVLET_API="servletapi";					//$NON-NLS-1$
-	public static final String[] AXIS2_LIB_PREFIXES = {							//$NON-NLS-1$
-        "ant",
-        "axiom",
-        "axis2",
-        "commons",
-        "log4j",
-        "neethi",
-        "stax",
-        "wsdl4j",
-        "wstx",
-        "xbean",
-        "XmlSchema",
-        "woden",
-        "activation",
-        "annogen",
-        "backport-util",
-        "mex-impl",
-        "mail"
-	};
-}	
-	
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/context/Axis2EmitterContext.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/context/Axis2EmitterContext.java
deleted file mode 100644
index 7d72172..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/context/Axis2EmitterContext.java
+++ /dev/null
@@ -1,96 +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
- * -------- -------- -----------------------------------------------------------
- * 20070516   183147 sandakith@wso2.com - Lahiru Sandakith Fix for the persisting DBCS paths
- * 20070523   174876 sandakith@wso2.com - Lahiru Sandakith, Persist Preferences inside Framework
- *******************************************************************************/ 
-package org.eclipse.jst.ws.axis2.core.context;
-
-public interface Axis2EmitterContext {
-
-	/**
-	 * This constant string is used to lookup the runtime location general
-	 * preference from the plugins local preferences store.
-	 */
-	public static final String PREFERENCE_AXIS2_RUNTIME_LOCATION = "axis2RuntimeLocation";
-	public static final String PREFERENCE_AXIS2_SERVER_IS_WAR = "axis2ServerPathRepresentsWar";
-	//Axis2 Preferences
-	//Service Code generation Options
-	public static final String PREFERENCE_SERVICE_DATABINDING = "serviceDatabinding"; 
-	public static final String PREFERENCE_SERVICE_INTERFACE_SKELETON = "serviceInterfaceSkeleton"; 
-	public static final String PREFERENCE_SERVICE_GENERATE_ALL = "serviceGenerateAll"; 
-	
-	//Client Code generation Options
-	public static final String PREFERENCE_CLIENT_SYNC = "sync"; 
-	public static final String PREFERENCE_CLIENT_ASYNC = "async"; 
-	public static final String PREFERENCE_CLIENT_DATABINDING = "cleintDatabinding"; 
-	public static final String PREFERENCE_CLIENT_TESTCASE = "clientTestcase"; 
-	public static final String PREFERENCE_CLIENT_GENERATE_ALL = "clientGenerateAll"; 
-	
-	//Service Archive Options
-	public static final String PREFERENCE_AAR_EXTENTION  = "aarExtention";
-
-	/**
-	 * @param selection set the axis2 runtime location.
-	 */
-	public void setAxis2RuntimeLocation(String runtimeLocation);
-
-	/**
-	 * @param returns the axis2 runtime location.
-	 */
-	public String getAxis2RuntimeLocation();
-	
-	public boolean isAxis2ServerPathRepresentsWar();
-
-	public void setAxis2ServerPathRepresentsWar(String isWar);
-
-	//Service Code generation Options
-
-	public void setServiceDatabinding(String serviceDatabinding);
-
-	public String getServiceDatabinding();
-
-	public void setServiceInterfaceSkeleton(boolean serviceInterfaceSkeleton);
-
-	public boolean isServiceInterfaceSkeleton();
-
-	public void setServiceGenerateAll(boolean serviceGenerateAll);
-
-	public boolean isServiceGenerateAll();
-
-
-	//Client Code generation Options
-	public void setSync(boolean clientSync);
-
-	public boolean isSync();
-
-	public void setAsync(boolean clientAsync);
-
-	public boolean isAsync();
-
-	public void setClientDatabinding(String clientDatabinding);
-
-	public String getClientDatabinding();
-
-	public void setClientTestCase(boolean clientTestCase);
-
-	public boolean isClientTestCase();
-
-	public void setClientGenerateAll(boolean clientGenerateAll);
-
-	public boolean isClientGenerateAll();
-
-	//AAR Options
-	public void setAarExtention(String aarExtention);
-
-	public String getAarExtention();
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/context/Axis2EmitterDefaults.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/context/Axis2EmitterDefaults.java
deleted file mode 100644
index 6fac9c8..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/context/Axis2EmitterDefaults.java
+++ /dev/null
@@ -1,96 +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
- * -------- -------- -----------------------------------------------------------
- * 20070516   183147 sandakith@wso2.com - Lahiru Sandakith Fix for the persisting DBCS paths
- * 20070523   174876 sandakith@wso2.com - Lahiru Sandakith, Persist Preferences inside Framework
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- *******************************************************************************/ 
-package org.eclipse.jst.ws.axis2.core.context;
-
-import org.eclipse.jst.ws.axis2.core.constant.Axis2Constants;
-
-public class Axis2EmitterDefaults {
-
-	public static final String PREFERENCE_AXIS2_RUNTIME_LOCATION_DEFAULT = "";
-	public static final boolean PREFERENCE_AXIS2_SERVER_IS_WAR = false;
-
-	//Axis2 Preferences
-	//Service Code generation Options
-	public static final String PREFERENCE_SERVICE_DATABINDING_DEFAULT = Axis2Constants.ADB;
-	public static final boolean PREFERENCE_SERVICE_INTERFACE_SKELETON_DEFAULT = false;
-	public static final boolean PREFERENCE_SERVICE_GENERATE_ALL_DEFAULT = false;
-
-	//Client Code generation Options
-	public static final boolean PREFERENCE_CLIENT_SYNC_DEFAULT =  false;
-	public static final boolean PREFERENCE_CLIENT_ASYNC_DEFAULT =  false;
-	public static final String PREFERENCE_CLIENT_DATABINDING_DEFAULT  = Axis2Constants.ADB;
-	public static final boolean PREFERENCE_CLIENT_TESTCASE_DEFAULT = false;
-	public static final boolean PREFERENCE_CLIENT_GENERATE_ALL_DEFAULT = false;
-
-	//Service Archive Options
-	private static String PREFERENCE_AAR_EXTENTION_DEFAULT  = Axis2Constants.AAR;	//aarExtention
-
-
-	/**
-	 * @return returns the default setting for runtime location.
-	 */
-	public static String getAxis2RuntimeLocation() {
-		return PREFERENCE_AXIS2_RUNTIME_LOCATION_DEFAULT;
-	}
-	
-	public static boolean isAxis2ServerPathRepresentsWar() {
-		return PREFERENCE_AXIS2_SERVER_IS_WAR;
-	}
-
-
-	//Service Code generation Options
-
-	public static String getServiceDatabinding(){
-		return PREFERENCE_SERVICE_DATABINDING_DEFAULT;
-	}
-
-	public static boolean isServiceInterfaceSkeleton(){
-		return PREFERENCE_SERVICE_INTERFACE_SKELETON_DEFAULT;
-	}
-
-	public static boolean isServiceGenerateAll(){
-		return PREFERENCE_SERVICE_GENERATE_ALL_DEFAULT;
-	}
-
-
-	//Client Code generation Options
-
-	public static boolean isClientSync(){
-		return PREFERENCE_CLIENT_SYNC_DEFAULT;
-	}
-
-	public static boolean isClientAsync(){
-		return PREFERENCE_CLIENT_ASYNC_DEFAULT;
-	}
-
-	public static String getClientDatabinding(){
-		return PREFERENCE_CLIENT_DATABINDING_DEFAULT;
-	}
-
-	public static boolean isClientTestCase(){
-		return PREFERENCE_CLIENT_TESTCASE_DEFAULT;
-	}
-
-	public static boolean isClientGenerateAll(){
-		return PREFERENCE_CLIENT_GENERATE_ALL_DEFAULT;
-	}
-
-	//Service AAR Options
-	public static String getAarExtention(){
-		return PREFERENCE_AAR_EXTENTION_DEFAULT;
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/context/PersistentAxis2EmitterContext.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/context/PersistentAxis2EmitterContext.java
deleted file mode 100644
index b26fe1c..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/context/PersistentAxis2EmitterContext.java
+++ /dev/null
@@ -1,152 +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
- * -------- -------- -----------------------------------------------------------
- * 20070516   183147 sandakith@wso2.com - Lahiru Sandakith Fix for the persisting DBCS paths
- * 20070523   174876 sandakith@wso2.com - Lahiru Sandakith, Persist Preferences inside Framework
- *******************************************************************************/ 
-package org.eclipse.jst.ws.axis2.core.context;
-
-import org.eclipse.jst.ws.axis2.core.plugin.WebServiceAxis2CorePlugin;
-import org.eclipse.wst.command.internal.env.context.PersistentContext;
-
-public class PersistentAxis2EmitterContext extends PersistentContext implements
-		Axis2EmitterContext {
-
-	private static PersistentAxis2EmitterContext context_ = null;
-
-	public static PersistentAxis2EmitterContext getInstance() 
-	{
-		if (context_ == null) {
-			context_ = new PersistentAxis2EmitterContext();
-			context_.load();
-		}
-		return context_;
-	}
-	
-	public void load(){
-		setDefault(PREFERENCE_AXIS2_RUNTIME_LOCATION, Axis2EmitterDefaults.getAxis2RuntimeLocation());
-		setDefault(PREFERENCE_AXIS2_SERVER_IS_WAR, Axis2EmitterDefaults.isAxis2ServerPathRepresentsWar());
-		//service defaults
-		setDefault(PREFERENCE_SERVICE_DATABINDING, Axis2EmitterDefaults.getServiceDatabinding());
-		setDefault(PREFERENCE_SERVICE_INTERFACE_SKELETON, Axis2EmitterDefaults.isServiceInterfaceSkeleton());
-		setDefault(PREFERENCE_SERVICE_GENERATE_ALL, Axis2EmitterDefaults.isServiceGenerateAll());
-		//client defaults
-		setDefault(PREFERENCE_CLIENT_SYNC, Axis2EmitterDefaults.isClientSync());
-		setDefault(PREFERENCE_CLIENT_ASYNC, Axis2EmitterDefaults.isClientAsync());
-		setDefault(PREFERENCE_CLIENT_DATABINDING, Axis2EmitterDefaults.getClientDatabinding());
-		setDefault(PREFERENCE_CLIENT_TESTCASE, Axis2EmitterDefaults.isClientTestCase());
-		setDefault(PREFERENCE_CLIENT_GENERATE_ALL, Axis2EmitterDefaults.isClientGenerateAll());
-		//AAR Defaults
-		setDefault(PREFERENCE_AAR_EXTENTION, Axis2EmitterDefaults.getAarExtention());
-
-	}
-	
-	private PersistentAxis2EmitterContext() 	{
-		super(WebServiceAxis2CorePlugin.getInstance());
-	}
-
-	public String getAxis2RuntimeLocation() {
-		return getValueAsString(PREFERENCE_AXIS2_RUNTIME_LOCATION);
-	}
-
-	public void setAxis2RuntimeLocation(String runtimeLocation) {
-		setValue(PREFERENCE_AXIS2_RUNTIME_LOCATION, runtimeLocation);
-	}
-	
-	public boolean isAxis2ServerPathRepresentsWar() {
-		return getValueAsBoolean(PREFERENCE_AXIS2_SERVER_IS_WAR);
-	}
-
-	public void setAxis2ServerPathRepresentsWar(String isWar) {
-		setValue(PREFERENCE_AXIS2_SERVER_IS_WAR, isWar);
-	}
-	
-	//Service 
-	
-	public String getServiceDatabinding() {
-		return getValueAsString(PREFERENCE_SERVICE_DATABINDING);
-	}
-	
-	public void setServiceDatabinding(String serviceDatabinding) {
-		setValue(PREFERENCE_SERVICE_DATABINDING, serviceDatabinding);
-	}
-	
-	public boolean isServiceInterfaceSkeleton() {
-		return getValueAsBoolean(PREFERENCE_SERVICE_INTERFACE_SKELETON);
-	}
-	
-	public void setServiceInterfaceSkeleton(boolean serviceInterfaceSkeleton) {
-		setValue(PREFERENCE_SERVICE_INTERFACE_SKELETON, serviceInterfaceSkeleton);	
-	}	
-	
-	public boolean isServiceGenerateAll() {
-		return getValueAsBoolean(PREFERENCE_SERVICE_GENERATE_ALL);
-	}
-	
-	public void setServiceGenerateAll(boolean serviceGenerateAll) {
-		setValue(PREFERENCE_SERVICE_GENERATE_ALL, serviceGenerateAll);
-	}
-	
-	
-	//Client
-	
-	public boolean isSync() {
-		return getValueAsBoolean(PREFERENCE_CLIENT_SYNC);
-	}
-	
-	public void setSync(boolean clientSync) {
-		setValue(PREFERENCE_CLIENT_SYNC, clientSync);
-	}
-
-	public boolean isAsync() {
-		return getValueAsBoolean(PREFERENCE_CLIENT_ASYNC);
-	}
-	
-	public void setAsync(boolean clientAsync) {
-		setValue(PREFERENCE_CLIENT_ASYNC, clientAsync);
-	}
-	
-	public String getClientDatabinding() {
-		return getValueAsString(PREFERENCE_CLIENT_DATABINDING);
-	}
-	
-	public void setClientDatabinding(String clientDatabinding) {
-		setValue(PREFERENCE_CLIENT_DATABINDING, clientDatabinding);
-	}
-	
-	public boolean isClientTestCase() {
-		return getValueAsBoolean(PREFERENCE_CLIENT_TESTCASE);
-	}
-	
-	public void setClientTestCase(boolean clientTestCase) {
-		setValue(PREFERENCE_CLIENT_TESTCASE, clientTestCase);
-	}
-
-	public boolean isClientGenerateAll() {
-		return getValueAsBoolean(PREFERENCE_CLIENT_GENERATE_ALL);
-	}
-
-	public void setClientGenerateAll(boolean clientGenrateAll) {
-		setValue(PREFERENCE_CLIENT_GENERATE_ALL, clientGenrateAll);
-	}
-
-	
-	//AAR Options
-	
-	public String getAarExtention(){
-		return getValueAsString(PREFERENCE_AAR_EXTENTION);
-	}
-	
-	public void setAarExtention(String aarExtention){
-		setValue(PREFERENCE_AAR_EXTENTION, aarExtention);
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/context/ServiceContext.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/context/ServiceContext.java
deleted file mode 100644
index b2b41a8..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/context/ServiceContext.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
- * -------- -------- -----------------------------------------------------------
- * 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
- * 20070508   175030 sandakith@wso2.com - Lahiru Sandakith, Refactor BuServiceContext 
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.core.context;
-
-public class ServiceContext {
-	
-	private static ServiceContext instance;
-	private static String serviceName; 
-	
-	//singleton
-	private ServiceContext(){}
-	
-	public static ServiceContext getInstance(){
-		if (instance == null) {
-			instance = new ServiceContext();
-		}
-		return instance;
-	}
-
-	public String getServiceName() {
-		return serviceName;
-	}
-
-	public void setServiceName(String serviceName) {
-		ServiceContext.serviceName = serviceName;
-	}
-	
-	
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/plugin/WebServiceAxis2CorePlugin.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/plugin/WebServiceAxis2CorePlugin.java
deleted file mode 100644
index 5b3adee..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/plugin/WebServiceAxis2CorePlugin.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
- * -------- -------- -----------------------------------------------------------
- * 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
- * 20070516   183147 sandakith@wso2.com - Lahiru Sandakith Fix for the persisting DBCS paths
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.core.plugin;
-
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.jst.ws.axis2.core.context.Axis2EmitterContext;
-import org.eclipse.jst.ws.axis2.core.context.PersistentAxis2EmitterContext;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class WebServiceAxis2CorePlugin extends Plugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.jst.ws.axis2.core";
-
-	// The shared instance
-	private static WebServiceAxis2CorePlugin instance_;
-	
-
-	private PersistentAxis2EmitterContext axis2EmitterContext_;
-	
-	/**
-	 * The constructor
-	 */
-	public WebServiceAxis2CorePlugin() {
-		super();
-		if (instance_ == null) {
-			instance_ = this;
-		}
-	}
-
-	
-	public Axis2EmitterContext getAxisEmitterContext(){
-		if (axis2EmitterContext_ == null) 
-	  		axis2EmitterContext_ = PersistentAxis2EmitterContext.getInstance();
-		return axis2EmitterContext_;
-	}
-	/*
-	 * (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 {
-		instance_ = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static WebServiceAxis2CorePlugin getDefault() {
-		return instance_;
-	}
-	
-	 // This method is needed to keep the logging from blowing up.
-	  public String toString()
-	  {
-	    return PLUGIN_ID;  
-	  }
-	  
-		/**
-		* Returns the singleton instance of this plugin. Equivalent to calling
-		* (WebServiceWasConsumptionPlugin)Platform.getPlugin("org.eclipse.jst.ws.was.v5.tp");
-		* @return The WebServiceAxisConsumptionCorePlugin singleton.
-		*/
-		static public WebServiceAxis2CorePlugin getInstance() {
-			return instance_;
-		}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/plugin/messages/Axis2CoreUI.properties b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/plugin/messages/Axis2CoreUI.properties
deleted file mode 100644
index 3d0c145..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/plugin/messages/Axis2CoreUI.properties
+++ /dev/null
@@ -1,53 +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
-# 20070501   180284 sandakith@wso2.com - Lahiru Sandakith
-# 20070508   184450 sandakith@wso2.com - Lahiru Sandakith fix 184450, more information for user
-# 20070511   186440 sandakith@wso2.com - Lahiru Sandakith fix 186440
-# 20070510   172926 sandakith@wso2.com - Lahiru Sandakith, Fix 172926 Use Util Classes
-# 20070517   187307 sandakith@wso2.com - Lahiru Sandakith, Fix 187307 Property File Fix
-# 20070604   190067 pmoogk@ca.ibm.com - Peter Moogk
-###############################################################################
-
-LABEL_BROUSE=Browse
-LABEL_WEB_SERVICE_CODEGEN=Web service codegen options
-LABEL_WEB_SERVICE_CLIENT_CODEGEN=Web service client codegen options
-LABEL_WEB_SERVICE_AAR=Web service archive options
-LABEL_DATABINDING=Default Databinding
-LABEL_AAR_EXTENTION=AAR default extension
-LABEL_AXIS2_RUNTIME_LOAD=Axis2 runtime loaded successfully  !!!
-LABEL_AXIS2_RUNTIME_LOAD_ERROR=Error occurred during loading Axis2 Runtime. Please select the correct Axis2 runtime folder !!
-LABEL_GENERATE_TESTCASE_CAPTION=Generate test case to test the service
-LABEL_GENERATE_SERVERSIDE_INTERFACE=Generate an interface for skeleton
-LABEL_GENERATE_ALL=Generate all types for all elements referred by schemas
-LABEL_CLIENT_SIDE=Client mode
-LABEL_SYNC_AND_ASYNC=Generate both sync and async
-LABEL_SYNC=Generate sync style only
-LABEL_ASYNC=Generate async style only
-
-AXIS2_LOCATION=Axis2 Runtime
-AXIS2_RUNTIME=Axis2 Runtime
-AXIS2_PREFERENCES=Axis2 Preferences
-AXIS2_RUNTIME_TOOLTIP=Browse and select Axis2 Binary distribution folder or folder contains Axis2 war distribution
-AXIS2_PREFERENCES_TOOLTIP=Please select the default preferences for Axis2 Runtime
-AXIS2_RUNTIME_LOCATION=Axis2 Runtime Location
-AXIS2_RUNTIME_PREFERENCES=Axis2 Runtime Preferences
-LABEL_AXIS2_RUNTIME_NOT_EXIT=Browse and select location of the Axis2 binary distribution or the folder which contains the Axis2 war distribution. 
-ERROR_INVALID_AXIS2_SERVER_LOCATION=Invalid Axis2 Webapp location
-
-ERROR_INVALID_FILE_READ_WRITEL=Exception occurred while reading or writing file {0}
-ERROR_SERVER_IS_NOT_SET=The Axis2 facets cannot be installed since the Axis2 runtime location has not been set.  \nPlease go to the Web Services preference page and set the Axis2 runtime location under Axis2 Preferences.
-
-PROGRESS_INSTALL_AXIS2_RUNTIME=Installing Axis2 Runtime...
-PROGRESS_UNINSTALL_AXIS2_RUNTIME=UnInstalling the Axis2 Runtime...
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/plugin/messages/Axis2CoreUIMessages.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/plugin/messages/Axis2CoreUIMessages.java
deleted file mode 100644
index 741c5e4..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/plugin/messages/Axis2CoreUIMessages.java
+++ /dev/null
@@ -1,71 +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
- * 20070501   180284 sandakith@wso2.com - Lahiru Sandakith
- * 20070511   186440 sandakith@wso2.com - Lahiru Sandakith fix 186440
- * 20070510   172926 sandakith@wso2.com - Lahiru Sandakith, Fix 172926 Use Util Classes
- * 20070517   187307 sandakith@wso2.com - Lahiru Sandakith, Fix 187307 Property File Fix
- * 20070518        187311 sandakith@wso2.com - Lahiru Sandakith, Fixing test resource addition
- * 20070808   194906 sandakith@wso2.com - Lahiru Sandakith, Fixing 194906 Runtime lib issue
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.core.plugin.messages;
-
-import org.eclipse.osgi.util.NLS;
-
-public final class Axis2CoreUIMessages extends NLS {
-
-	private static final String BUNDLE_NAME = 
-			"org.eclipse.jst.ws.axis2.core.plugin.messages.Axis2CoreUI";		//$NON-NLS-1$
-
-	private Axis2CoreUIMessages() {
-		// Do not instantiate
-	}
-
-	public static String LABEL_BROUSE;
-	public static String LABEL_WEB_SERVICE_CODEGEN;
-	public static String LABEL_WEB_SERVICE_CLIENT_CODEGEN;
-	public static String LABEL_WEB_SERVICE_AAR;
-	public static String LABEL_AAR_EXTENTION;
-	public static String LABEL_DATABINDING;
-	public static String LABEL_AXIS2_RUNTIME_LOAD;
-	public static String LABEL_AXIS2_RUNTIME_LOAD_ERROR;
-	public static String LABEL_AXIS2_RUNTIME_NOT_EXIT;
-	public static String LABEL_GENERATE_TESTCASE_CAPTION;
-	public static String LABEL_GENERATE_SERVERSIDE_INTERFACE;
-	public static String LABEL_GENERATE_ALL;
-	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 AXIS2_LOCATION;
-	public static String AXIS2_RUNTIME;
-	public static String AXIS2_PREFERENCES;
-	public static String AXIS2_RUNTIME_TOOLTIP;
-	public static String AXIS2_PREFERENCES_TOOLTIP;
-	public static String AXIS2_RUNTIME_LOCATION;
-	public static String AXIS2_RUNTIME_PREFERENCES;
-
-	public static String ERROR_INVALID_AXIS2_SERVER_LOCATION;
-	public static String ERROR_INVALID_FILE_READ_WRITEL;
-	public static String ERROR_SERVER_IS_NOT_SET;
-
-	public static String PROGRESS_INSTALL_AXIS2_RUNTIME;
-	public static String PROGRESS_UNINSTALL_AXIS2_RUNTIME;
-	
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, Axis2CoreUIMessages.class);
-	}
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/utils/Axis2CoreUtils.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/utils/Axis2CoreUtils.java
deleted file mode 100644
index 3f43432..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/utils/Axis2CoreUtils.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
- * -------- -------- -----------------------------------------------------------
- * 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
- * 20070501   180284 sandakith@wso2.com - Lahiru Sandakith
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.core.utils;
-
-import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.jst.ws.axis2.core.constant.Axis2Constants;
-
-public class Axis2CoreUtils {
-	
-	private static boolean alreadyComputedTempAxis2Directory = false;
-	private static String tempAxis2Dir = null;
-	
-	public static String tempAxis2Directory() {
-		if (!alreadyComputedTempAxis2Directory){
-			String[] nodes = {Axis2Constants.DIR_DOT_METADATA,
-					Axis2Constants.DIR_DOT_PLUGINS,
-					Axis2Constants.TEMP_AXIS2_FACET_DIR};
-			tempAxis2Dir =FileUtils.addNodesToPath(
-					ResourcesPlugin.getWorkspace().getRoot().getLocation().toOSString(), nodes); 
-			alreadyComputedTempAxis2Directory= true;
-		}
-		return tempAxis2Dir;
-	}
-	
-	public static String tempAxis2WebappFileLocation() {
-		return
-		addAnotherNodeToPath(tempAxis2Directory(),
-				Axis2Constants.WEBAPP_EXPLODED_SERVER_LOCATION_FILE);
-	}
-	
-	
-	public static String tempRuntimeStatusFileLocation() {
-		return
-		addAnotherNodeToPath(tempAxis2Directory(),
-				Axis2Constants.SERVER_STATUS_LOCATION_FILE);
-	}
-	
-	public static String tempWarStatusFileLocation() {
-		return
-		addAnotherNodeToPath(tempAxis2Directory(),
-				Axis2Constants.WAR_STATUS_LOCATION_FILE);
-	}
-	
-	public static String addAnotherNodeToPath(String currentPath, String newNode) {
-		return currentPath + File.separator + newNode;
-	}
-	
-	public static void  writePropertyToFile(File file,String key, String value) throws IOException {
-		Writer out = new BufferedWriter(new OutputStreamWriter(
-						new FileOutputStream(file), "8859_1"));
-	       out.write(key+"="+value+"\n");
-	       out.close();
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/utils/ClassLoadingUtil.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/utils/ClassLoadingUtil.java
deleted file mode 100644
index 06d6e36..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/utils/ClassLoadingUtil.java
+++ /dev/null
@@ -1,131 +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
- * 20070919   202299 sandakith@wso2.com - Lahiru Sandakith Fix for AIOB Exp
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.core.utils;
-
-import java.io.File;
-import java.net.MalformedURLException;
-import java.net.URL;
-
-import org.apache.tools.ant.AntClassLoader;
-import org.apache.tools.ant.Project;
-import org.apache.tools.ant.types.Path;
-
-public class ClassLoadingUtil {
-
-	private static String[] axis2ClassPath = null;
-	private static String[] classLoadPath = null;
-	private static int libCount = 0;
-	private static AntClassLoader antClassLoader;
-	private static boolean libsLoaded = false;
-	private static URL[] urls = null;
-	private static boolean alreadyInit = false;
-	private static boolean initByClient = false;
-	
-	public static void init(String project) {
-		if (!alreadyInit) {
-
-		//Obtain a ant class loader instance
-			if(antClassLoader==null){
-		antClassLoader =  new AntClassLoader();
-			}
-		
-		// Set the class loader to child first
-		antClassLoader.setParentFirst(false);
-		
-			if ((classLoadPath ==null) || !libsLoaded){
-				classLoadPath = getAxis2Libs(project);
-			}
-			
-			if(urls == null){
-				urls= new URL[classLoadPath.length];
-			}else if(urls != null && (urls.length)!=(classLoadPath.length)){
-				urls= new URL[classLoadPath.length];
-			}
-
-		Path classpath = new Path(new Project());
-		
-		try{
-			for (int i = 0; i < classLoadPath.length; i++) {
-				//Create a File object on the root of the directory containing the class file
-				if(classLoadPath[i]!=null){
-					File file = new File(classLoadPath[i]);
-					// Convert File to a URL
-					URL url = file.toURL();          
-					urls[i]= url;
-					classpath.setPath(classLoadPath[i]);
-				}
-			}
-			
-		}catch(MalformedURLException e){
-			e.printStackTrace();
-		}
-			antClassLoader.setClassPath(classpath);
-			alreadyInit = true;
-				}
-			}
-
-	
-	
-	public static Class loadClassFromAntClassLoader(String fillyQualifiedClassName){
-		
-		Class cls = null;
-		try{	
-			cls = antClassLoader.loadClass(fillyQualifiedClassName);
-		} catch (ClassNotFoundException e) {
-			e.printStackTrace();
-		}
-		return cls;
-	}
-	
-	
-	private static String[] getAxis2Libs(String project){
-		File webContainerPath = new File(FacetContainerUtils.pathToWebProjectContainerLib(project));
-		axis2ClassPath = new String[webContainerPath.list().length];
-		libCount = 0;
-		visitAllFiles(webContainerPath);
-		return axis2ClassPath;
-	}
-
-
-	public static void visitAllFiles(File dir) {
-		if(!dir.toString().endsWith(".txt")){
-			if (dir.isDirectory()) {
-
-				String[] children = dir.list();
-				for (int i=0; i<children.length; i++) {
-					visitAllFiles(new File(dir, children[i]));
-				}
-
-			} else {
-				axis2ClassPath[libCount]=dir.getAbsolutePath();
-				libCount+=1;
-			}
-
-		}
-		libsLoaded = true;
-	}
-
-	public static void cleanAntClassLoader(){
-		if(initByClient){
-			antClassLoader.cleanup();
-			alreadyInit = false;
-		}
-}
-	public static void setInitByClient(boolean status){
-		initByClient = status;
-	}
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/utils/FacetContainerUtils.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/utils/FacetContainerUtils.java
deleted file mode 100644
index 9333b7c..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/utils/FacetContainerUtils.java
+++ /dev/null
@@ -1,186 +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
- * -------- -------- -----------------------------------------------------------
- * 20070222  168766 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  facet to the framework for 168766
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070510   172926 sandakith@wso2.com - Lahiru Sandakith, Fix 172926 Use Util Classes
- * 20070606   177421 sandakith@wso2.com - fix web.xml wiped out when Axis2 facet
- * 20070612   192047 sandakith@wso2.com - Lahiru Sandakith, 192047
- * 20070612   192047 kathy@ca.ibm.com   - Kathy Chan
- * 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.core.utils;
-
-import java.io.File;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.jst.ws.axis2.core.constant.Axis2Constants;
-import org.eclipse.jst.ws.axis2.core.plugin.WebServiceAxis2CorePlugin;
-import org.eclipse.jst.ws.internal.common.J2EEUtils;
-import org.eclipse.jst.ws.internal.common.ServerUtils;
-import org.eclipse.wst.server.core.IServer;
-import org.eclipse.wst.server.core.ServerCore;
-
-public class FacetContainerUtils {
-	
-	public static IPath getWorkspace(){
-		return ResourcesPlugin.getWorkspace().getRoot().getLocation();
-	}
-	
-	public static IProject getProjectName(String project){
-		String projectString = replaceEscapecharactors(project.toString());
-		return ResourcesPlugin.getWorkspace().getRoot().getProject(
-				getProjectNameFromFramewokNameString(projectString));
-	}
-	
-	public static IPath getProjectRoot(String project){
-		String projectString = replaceEscapecharactors(project.toString());
-		return ResourcesPlugin.getWorkspace().getRoot().getProject(
-				getProjectNameFromFramewokNameString(projectString)).getLocation();
-	}
-
-	public static String  pathToWebProjectContainer(String project) {
-		IPath projectRoot = getProjectRoot(project);
-		IPath currentDynamicWebProjectDir = J2EEUtils.getWebContentPath(
-				getProjectName(project));
-		IPath currentDynamicWebProjectDirWithoutProjectRoot = J2EEUtils.getWebContentPath(
-				getProjectName(project)).removeFirstSegments(1).makeAbsolute();
-		if(projectRoot.toOSString().contains(getWorkspace().toOSString())){
-			return getWorkspace()
-						.append(currentDynamicWebProjectDir).toOSString();
-		}else{
-			return projectRoot
-						.append(currentDynamicWebProjectDirWithoutProjectRoot).toOSString();
-		}
-		
-	}
-	
-	public static String  pathToWebProjectContainerWEBINF(String project) {
-		IPath projectRoot = getProjectRoot(project);
-		IPath webContainerWEBINFDir = J2EEUtils.getWebInfPath(
-				getProjectName(project));
-		IPath webContainerWEBINFDirWithoutProjectRoot = J2EEUtils.getWebInfPath(
-				getProjectName(project)).removeFirstSegments(1).makeAbsolute();
-		if(projectRoot.toOSString().contains(getWorkspace().toOSString())){
-			return getWorkspace()
-						.append(webContainerWEBINFDir).toOSString();
-		}else{
-			return projectRoot
-						.append(webContainerWEBINFDirWithoutProjectRoot).toOSString();
-		}
-	}
-	
-	public static String  pathToWebProjectContainerMETAINF(String project) {
-		String containerDirectory = pathToWebProjectContainer(project);
-		String webContainerMETAINF = Axis2Constants.DIR_META_INF;
-		String webContainerMETAINFString = Axis2CoreUtils.addAnotherNodeToPath(
-												containerDirectory,
-												webContainerMETAINF);
-		return webContainerMETAINFString;
-	}
-	
-	public static String  pathToWebProjectContainerAxis2Web(String project) {
-		String containerDirectory = pathToWebProjectContainer(project);
-		String webContainerAxis2Web = Axis2Constants.DIR_AXIS2_WEB;
-		String webContainerAxis2WebString = Axis2CoreUtils.addAnotherNodeToPath(
-				containerDirectory,
-												webContainerAxis2Web);
-		return webContainerAxis2WebString;
-	}
-	
-	public static String pathToWebProjectContainerLib(String project){
-		String webContainerWEBINFString = pathToWebProjectContainerWEBINF(project);
-		return  Axis2CoreUtils.addAnotherNodeToPath(
-				webContainerWEBINFString,
-				Axis2Constants.DIR_LIB);
-		
-	}
-	
-	public static String pathToWebProjectContainerWebXML(String project){
-		String webContainerWEBINFString = pathToWebProjectContainerWEBINF(project);
-		return  Axis2CoreUtils.addAnotherNodeToPath(
-				webContainerWEBINFString,
-				"web.xml");
-	}
-	
-	//Fix for the windows build not working
-	private static String replaceEscapecharactors(String vulnarableString){
-		if (vulnarableString.indexOf("/")!=-1){
-			vulnarableString = vulnarableString.replace('/', File.separator.charAt(0));
-		}
-		return vulnarableString;
-	}
-	
-	
-	private static String getProjectNameFromFramewokNameString(String frameworkProjectString){
-		if (frameworkProjectString.indexOf(getSplitCharactor())== -1){
-			return frameworkProjectString;
-		}else{
-			return frameworkProjectString.split(getSplitCharactors())[1];
-		}
-	}
-	
-	
-	private static String getSplitCharactor(){
-		//Windows check (because from inside wtp in return I received a hard coded path)
-		if (File.separatorChar == '\\'){
-			return "\\" ;
-		}else{
-			return File.separator;
-		}
-	}
-	
-	public static String pathToAxis2CoreFacetTempDirectory(String project){
-	//
-		String pluginAxis2CoreTempDir = WebServiceAxis2CorePlugin
-        .getInstance().getStateLocation().toOSString();
-		String projectString = replaceEscapecharactors(project);
-		return FileUtils.addAnotherNodeToPath(pluginAxis2CoreTempDir, projectString);
-		
-		
-	}
-	
-	private static String getSplitCharactors(){
-		//Windows check (because from inside wtp in return I received a hard coded path)
-		if (File.separatorChar == '\\'){
-			return "\\" + File.separator;
-		}else{
-			return File.separator;
-		}
-	}
-	
-	
-	public static String getDeployedWSDLURL(IProject serverProject, 
-											String ServerFactoryId, 
-											String ServerInstanceId,
-											String serviceName){ 
-		// Note that ServerCore.findServer() might return null if the server cannot be found and
-		// ServerUtils.getEncodedWebComponentURL() can handle null server properly (by using ServerFactoryId)
-		String deployedWSDLURLpath = null;
-		IServer server = null;
-		if (ServerInstanceId != null) {
-			server = ServerCore.findServer(ServerInstanceId);
-		}
-		deployedWSDLURLpath = ServerUtils.getEncodedWebComponentURL(serverProject, 
-				ServerFactoryId, server);
-		if (deployedWSDLURLpath == null) {
-			deployedWSDLURLpath = Axis2Constants.LOCAL_SERVER_PORT;
-		}
-		String[] deployedWSDLURLParts = {Axis2Constants.SERVICES,serviceName};
-		return FileUtils.addNodesToURL(deployedWSDLURLpath, deployedWSDLURLParts)+"?wsdl";
-	}
-	
-	
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/utils/FileUtils.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/utils/FileUtils.java
deleted file mode 100644
index 7c9b19e..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/utils/FileUtils.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation, 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
- * -------- -------- -----------------------------------------------------------
- * IBM Corporation, 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
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070730   194786 sandakith@wso2.com - Lahiru Sandakith, adding servletapi jar filter
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.core.utils;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-public class FileUtils
-{
-	public FileUtils(){
-		super();
-	}
-
-	public static void copyFile(String src, String dest) {
-		InputStream is = null;
-		FileOutputStream fos = null;
-
-		try
-		{
-			is = new FileInputStream(src);
-			fos = new FileOutputStream(dest);
-			int c = 0;
-			byte[] array = new byte[1024];
-			while ((c = is.read(array)) >= 0){
-				fos.write(array, 0, c);
-			}
-		}
-		catch (Exception e)	{
-			e.printStackTrace();
-		}
-		finally	{
-			try	{
-				fos.close();
-				is.close();
-			}
-			catch (Exception e)	{
-				e.printStackTrace();
-			}
-		}
-	}
-
-	public static File createFileAndParentDirectories(String fileName) throws Exception {
-		File file = new File(fileName);
-		File parent = file.getParentFile();
-		if (!parent.exists()){
-			parent.mkdirs();
-		}
-		file.createNewFile();
-		return file;
-	}
-	
-	public static boolean deleteDir(File dir) {
-        if (dir.isDirectory()) {
-            String[] children = dir.list();
-            for (int i=0; i<children.length; i++) {
-                boolean success = deleteDir(new File(dir, children[i]));
-                if (!success) {
-                    return false;
-                }
-            }
-        }
-        return dir.delete();
-    }
-
-	public static void deleteDirectories(File dir) {
-		File[] children = dir.listFiles();
-		for (int i = 0; i < children.length; i++){
-			if (children[i].list() != null && children[i].list().length > 0){
-				deleteDirectories(children[i]);
-			}
-			else{
-				children[i].delete();
-			}
-		}
-		dir.delete();
-	}
-
-	public static void deleteDirectories(String dir) {
-		File directory = new File(dir);
-		deleteDirectories(directory);
-	}
-
-	public static void createTargetFile(String sourceFileName, String targetFileName) 
-							throws Exception {
-		createTargetFile(sourceFileName, targetFileName, false);
-	}
-
-	public static void createTargetFile(String sourceFileName, String targetFileName, 
-						boolean overwrite) throws Exception{
-		File idealResultFile = new File(targetFileName);
-		if (overwrite || !idealResultFile.exists())
-		{
-			FileUtils.createFileAndParentDirectories(targetFileName);
-			FileUtils.copyFile(sourceFileName, targetFileName);
-		}
-	}
-
-	public static boolean createDirectory(String directory){
-		// Create a directory; all ancestor directories must exist
-		boolean success = (new File(directory)).mkdir();
-		if (!success) {
-			// Directory creation failed
-		}
-		return success;  
-	}
-
-	public static boolean createDirectorys(String directory){
-		// Create a directory; all ancestor directories must exist
-		boolean success = (new File(directory)).mkdirs();
-		if (!success) {
-			// Directory creation failed
-		}
-		return success;  
-	}
-
-	//Copies all files under srcDir to dstDir.
-	// If dstDir does not exist, it will be created.
-	public static void copyDirectory(File srcDir, File dstDir) throws IOException {
-		if (srcDir.isDirectory()) {
-			if (!dstDir.exists()) {
-				dstDir.mkdir();
-			}
-
-			String[] children = srcDir.list();
-			for (int i=0; i<children.length; i++) {
-				copyDirectory(new File(srcDir, children[i]),
-						new File(dstDir, children[i]));
-			}
-		} else {
-			copy(srcDir, dstDir);
-		}
-	}
-
-	//Copies src file to dst file.
-	// If the dst file does not exist, it is created
-	public static void copy(File src, File dst) throws IOException {
-		InputStream in = new FileInputStream(src);
-		OutputStream out = new FileOutputStream(dst);
-
-		// Transfer bytes from in to out
-		byte[] buf = new byte[1024];
-		int len;
-		while ((len = in.read(buf)) > 0) {
-			out.write(buf, 0, len);
-		}
-		in.close();
-		out.close();
-	}
-
-	public static String addAnotherNodeToPath(String currentPath, String newNode) {
-		return currentPath + File.separator + newNode;
-	}
-	
-	public static String addNodesToPath(String currentPath, String[] newNode) {
-		String returnPath=currentPath;
-		for (int i = 0; i < newNode.length; i++) {
-			returnPath = returnPath + File.separator + newNode[i];
-		}
-		return returnPath;
-	}
-	
-	public static String addNodesToPath(StringBuffer currentPath, String[] pathNodes) {
-		for (int i = 0; i < pathNodes.length; i++){
-			currentPath.append(File.separator);
-			currentPath.append(pathNodes[i]);
-		}
-		return currentPath.toString();
-	}
-	
-	public static String addNodesToURL(String currentPath, String[] newNode) {
-		String returnPath=currentPath;
-		for (int i = 0; i < newNode.length; i++) {
-			returnPath = returnPath + "/" + newNode[i];
-		}
-		return returnPath;
-	}
-	
-    /**
-     * Get the list of file with a prefix of <code>fileNamePrefix</code> &amp; an extension of
-     * <code>extension</code>
-     *
-     * @param sourceDir      The directory in which to search the files
-     * @param fileNamePrefix The prefix to look for
-     * @param extension      The extension to look for
-     * @return The list of file with a prefix of <code>fileNamePrefix</code> &amp; an extension of
-     *         <code>extension</code>
-     */
-    public static File[] getMatchingFiles(String sourceDir, String fileNamePrefix, String extension) {
-        List fileList = new ArrayList();
-        File libDir = new File(sourceDir);
-        String libDirPath = libDir.getAbsolutePath();
-        String[] items = libDir.list();
-        if (items != null) {
-            for (int i = 0; i < items.length; i++) {
-                String item = items[i];
-                if (fileNamePrefix != null && extension != null) {
-                    if (item.startsWith(fileNamePrefix) && item.endsWith(extension)) {
-                        fileList.add(new File(libDirPath + File.separator + item));
-                    }
-                } else if (fileNamePrefix == null && extension != null) {
-                    if (item.endsWith(extension)) {
-                        fileList.add(new File(libDirPath + File.separator + item));
-                    }
-                } else if (fileNamePrefix != null && extension == null) {
-                    if (item.startsWith(fileNamePrefix)) {
-                        fileList.add(new File(libDirPath + File.separator + item));
-                    }
-                } else {
-                    fileList.add(new File(libDirPath + File.separator + item));
-                }
-            }
-            return (File[]) fileList.toArray(new File[fileList.size()]);
-        }
-        return new File[0];
-    }
-    
-    /**
-     * Filter out files inside a <code>sourceDir</code> with matching <codefileNamePrefix></code>
-     * and <code>extension</code>
-     * @param sourceDir 		The directory to filter the files
-     * @param fileNamePrefix	The filtering filename prefix 
-     * @param extension			The filtering file extension
-     */
-    public static void filterOutRestrictedFiles(String sourceDir, String fileNamePrefix, String extension){
-    	File[] resultedMatchingFiles = getMatchingFiles(sourceDir, fileNamePrefix, extension);
-    	for (int i = 0; i < resultedMatchingFiles.length; i++) {
-			File matchingFilePath = new File(resultedMatchingFiles[i].getAbsolutePath());
-			matchingFilePath.delete();
-		}
-    }
-    
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/utils/RuntimePropertyUtils.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/utils/RuntimePropertyUtils.java
deleted file mode 100644
index cd3a291..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/core/utils/RuntimePropertyUtils.java
+++ /dev/null
@@ -1,191 +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
- * 20070501   180284 sandakith@wso2.com - Lahiru Sandakith
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.core.utils;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.Properties;
-
-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.plugin.messages.Axis2CoreUIMessages;
-
-public class RuntimePropertyUtils {
-	private static File PropertiesFileDir,serverPropertiesFile,statusPropertyFile,warPropertyFile;
-	private static IStatus status;
-	private static Properties properties;
-	
-	private static void init(){
-		PropertiesFileDir = new File(Axis2CoreUtils.tempAxis2Directory());
-		if (!PropertiesFileDir.exists()){
-			PropertiesFileDir.mkdirs();
-		}
-		properties = new Properties();
-	}
-	
-	private static void serverPropertiesFileInit() throws IOException{
-		serverPropertiesFile = new File(Axis2CoreUtils.tempAxis2WebappFileLocation());
-		if (!serverPropertiesFile.exists()){
-			serverPropertiesFile.createNewFile();
-		}
-		properties.load(new FileInputStream(serverPropertiesFile));
-	}
-	
-	private static void statusPropertiesFileInit() throws IOException{
-		statusPropertyFile = new File(Axis2CoreUtils.tempRuntimeStatusFileLocation());
-		if (!statusPropertyFile.exists()){
-			statusPropertyFile.createNewFile();
-		}
-		properties.load(new FileInputStream(statusPropertyFile));
-	}
-	
-	private static void warPropertiesFileInit() throws IOException{
-		warPropertyFile = new File(Axis2CoreUtils.tempWarStatusFileLocation());
-		if (!warPropertyFile.exists()){
-			warPropertyFile.createNewFile();
-		}
-		properties.load(new FileInputStream(warPropertyFile));
-	}
-	
-	
-	
-	public static IStatus writeServerPathToPropertiesFile(String axis2Path) {
-		//Fix for properties file skipping the File seperator charactor 
-		// on windows when loading again
-		String axis2PathNew = null;
-		if ((axis2Path.indexOf("\\")) != -1) {
-			axis2PathNew = axis2Path.replace(File.separator, File.separator+File.separator);;
-		}else{
-			axis2PathNew=axis2Path;
-		}
-		try {
-			init();
-			serverPropertiesFileInit();
-			if(! (properties.size()== 0)){
-				if(properties.containsKey(Axis2Constants.PROPERTY_KEY_PATH)){
-					properties.remove(Axis2Constants.PROPERTY_KEY_PATH);
-				}
-			}
-				Axis2CoreUtils.writePropertyToFile(serverPropertiesFile, 
-						Axis2Constants.PROPERTY_KEY_PATH,
-												   axis2PathNew);
-		} catch (FileNotFoundException e) {
-			updateStatusError();
-		} catch (IOException e) {
-			updateStatusError();
-		}
-		
-		return status;
-	}
-	
-	public static String getServerPathFromPropertiesFile(){
-		init();
-		String serverPath = null;
-		serverPropertiesFile = new File(Axis2CoreUtils.tempAxis2WebappFileLocation());
-		if (!serverPropertiesFile.exists()){
-			updateStatusError();			
-		}
-		try {
-			properties.load(new FileInputStream(serverPropertiesFile));
-			if(properties.containsKey(Axis2Constants.PROPERTY_KEY_PATH)){
-				serverPath = properties.getProperty(Axis2Constants.PROPERTY_KEY_PATH);
-			}
-		} catch (FileNotFoundException e) {
-			updateStatusError();
-		} catch (IOException e) {
-			updateStatusError();
-		}
-		return serverPath;
-	}
-	
-	
-	public static IStatus writeServerStausToPropertiesFile(String runtimeStatus) {
-		try {
-			init();
-			statusPropertiesFileInit();
-			if(! (properties.size()== 0)){
-				if(properties.containsKey(Axis2Constants.PROPERTY_KEY_STATUS)){
-					properties.remove(Axis2Constants.PROPERTY_KEY_STATUS);
-				}
-			}
-			Axis2CoreUtils.writePropertyToFile(statusPropertyFile, 
-					Axis2Constants.PROPERTY_KEY_STATUS, 
-		            runtimeStatus);
-		} catch (FileNotFoundException e) {
-			updateStatusError(); 
-		} catch (IOException e) {
-			updateStatusError();
-		}
-		
-		return status;
-	}
-	
-	public static IStatus writeWarStausToPropertiesFile(boolean warStatus) {
-		try {
-			init();
-			warPropertiesFileInit();
-			if(! (properties.size()== 0)){
-				if(properties.containsKey(Axis2Constants.PROPERTY_KEY_STATUS)){
-					properties.remove(Axis2Constants.PROPERTY_KEY_STATUS);
-				}
-			}
-			Axis2CoreUtils.writePropertyToFile(warPropertyFile, 
-					Axis2Constants.PROPERTY_KEY_STATUS, 
-		            String.valueOf(warStatus));
-		} catch (FileNotFoundException e) {
-			updateStatusError(); 
-		} catch (IOException e) {
-			updateStatusError();
-		}
-		
-		return status;
-	}
-	
-	public static boolean getWarStatusFromPropertiesFile(){
-		init();
-		boolean warStatus = false;
-		warPropertyFile = new File(Axis2CoreUtils.tempWarStatusFileLocation());
-		if (!warPropertyFile.exists()){
-			updateStatusError();			
-		}
-		try {
-			properties.load(new FileInputStream(warPropertyFile));
-			if(properties.containsKey(Axis2Constants.PROPERTY_KEY_STATUS)){
-				warStatus = Boolean.parseBoolean(
-						properties.getProperty(Axis2Constants.PROPERTY_KEY_STATUS));
-			}
-		} catch (FileNotFoundException e) {
-			updateStatusError();
-		} catch (IOException e) {
-			updateStatusError();
-		}
-		return warStatus;
-	}
-
-	private static void updateStatusError(){
-			status = new Status( IStatus.ERROR, 
-					"id", 
-					0, 
-					Axis2CoreUIMessages.ERROR_INVALID_AXIS2_SERVER_LOCATION, 
-					null ); 
-		}
-		
-	}
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/commands/Axis2WebservicesServerCommand.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/commands/Axis2WebservicesServerCommand.java
deleted file mode 100644
index ce072b1..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/commands/Axis2WebservicesServerCommand.java
+++ /dev/null
@@ -1,177 +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  168766 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  facet to the framework for 168766
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070501   180284 sandakith@wso2.com - Lahiru Sandakith
- * 20070523   174876 sandakith@wso2.com - Lahiru Sandakith, Persist Preferences inside Framework
- * 20070606   177421 sandakith@wso2.com - fix web.xml wiped out when Axis2 facet
- * 20070808   194906 sandakith@wso2.com - Lahiru Sandakith, Fixing 194906 Runtime lib issue
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- * 20071011   205972 sandakith@wso2.com - Lahiru Sandakith, Axis2 Libraries License files fix
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.facet.commands;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-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.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.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.core.utils.FileUtils;
-import org.eclipse.jst.ws.axis2.core.utils.RuntimePropertyUtils;
-import org.eclipse.jst.ws.axis2.facet.utils.Axis2RuntimeUtils;
-import org.eclipse.jst.ws.axis2.facet.utils.Axis2WebappUtils;
-import org.eclipse.jst.ws.axis2.facet.utils.ContentCopyUtils;
-import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
-
-public class Axis2WebservicesServerCommand extends
-AbstractDataModelOperation {
-
-	IProject project;
-	Axis2EmitterContext context;
-	
-	public Axis2WebservicesServerCommand(IProject project){
-		context = WebServiceAxis2CorePlugin.getDefault().getAxisEmitterContext();
-		this.project = project;
-	}
-
-	public IStatus execute(IProgressMonitor monitor, IAdaptable info)
-	throws ExecutionException {
-		return Status.OK_STATUS;
-	}
-	
-	public IStatus executeOverride(IProgressMonitor monitor)  {
-		//Copy the axis2 facet in to this project
-		IStatus status =null;
-		String runtimeLocation = null;
-		ContentCopyUtils contentCopyUtils = new ContentCopyUtils();
-		try {
-			if(context.isAxis2ServerPathRepresentsWar() 
-					|| RuntimePropertyUtils.getWarStatusFromPropertiesFile()){
-				runtimeLocation = Axis2RuntimeUtils.copyAxis2War(
-														monitor,
-														Axis2Constants.PROPERTY_KEY_PATH);
-			}else{
-
-				runtimeLocation = Axis2WebappUtils.copyAxis2War(
-														monitor,
-														Axis2Constants.PROPERTY_KEY_PATH);
-			}
-		} catch (FileNotFoundException e) {
-			return handleExceptionStatus(e);
-		} catch (IOException e) {
-			return handleExceptionStatus(e);
-		} catch (Exception e) {
-			return handleExceptionStatus(e);
-		}
-		
-		//First Setting the libs folder as ignored and then copy the content of the runtime
-		IPath libPath = new Path(runtimeLocation);
-		libPath = libPath.append(Axis2Constants.DIR_WEB_INF);
-		libPath = libPath.append(Axis2Constants.DIR_LIB);
-		List<String> ignoreList = new ArrayList<String>();
-		ignoreList.add(libPath.toOSString());
-		contentCopyUtils.updateCheckList(ignoreList);
-		
-		status = contentCopyUtils.copyDirectoryRecursivelyIntoWorkspace(
-				runtimeLocation, 
-				FacetContainerUtils.pathToWebProjectContainer(project.toString()), 
-				monitor,
-				false
-		);
-		
-		// After that copy the nesessery set of libraries to the project again
-		List<String> includeList = new ArrayList<String>();
-		contentCopyUtils.updateCheckList(loadIncludeListWithAxis2Libs(libPath.toOSString(),
-				includeList));
-		String[] nodes = {Axis2Constants.DIR_WEB_INF,Axis2Constants.DIR_LIB};
-		status = contentCopyUtils.copyDirectoryRecursivelyIntoWorkspace(
-				libPath.toOSString(), 
-				FileUtils.addNodesToPath(
-						FacetContainerUtils.pathToWebProjectContainer(project.toString()), 
-						nodes), 
-				monitor,
-				true
-		);
-
-		//Merge web.xml Files
-		MergeWEBXMLCommand mergeWebXMLCommand = new MergeWEBXMLCommand();
-		mergeWebXMLCommand.setExtraAxis2TagsAdded(false);
-		mergeWebXMLCommand.setServerProject(project);
-		mergeWebXMLCommand.exexuteOverride(monitor);
-
-		//clean up tempery files
-		File tempFacetDirectory = new File(runtimeLocation);
-		if (tempFacetDirectory.exists() && context.isAxis2ServerPathRepresentsWar()) {
-			FileUtils.deleteDir(tempFacetDirectory);
-		}
-		status = Status.OK_STATUS;
-		return status;
-	}
-	
-	private void cleanupIfFacetStatusFailed(String runtimeLocation){
-		File tempFacetDirectory = new File(runtimeLocation);
-		if (tempFacetDirectory.exists()) {
-			FileUtils.deleteDir(tempFacetDirectory);
-		}
-	}
-	
-	private IStatus handleExceptionStatus(Exception e){
-		IStatus status = null;
-		status = new Status(1,project.toString(),1,Axis2CoreUIMessages.ERROR_SERVER_IS_NOT_SET,e);
-		cleanupIfFacetStatusFailed(Axis2CoreUtils.tempAxis2Directory());
-		return status;
-	}
-	
-	/**
-	 * Load the exact libraries list from the axis2 jars with the correct versions to the 
-	 * <code>path</code>. Doing it this way introduce the scalability to the solution 
-	 * where the need comes in the future releases to include additional libraries and 
-	 * if needed filter out some libraries.
-	 * @param runtimeLocation
-	 * @param includeList
-	 * @return loaded list
-	 */
-	private List loadIncludeListWithAxis2Libs(String path, List includeList){
-		for (int i = 0; i < Axis2Constants.AXIS2_LIB_PREFIXES.length; i++) {
-			File[] jarFileList = FileUtils.getMatchingFiles(path,
-					Axis2Constants.AXIS2_LIB_PREFIXES[i], 
-					Axis2Constants.JAR);
-			for (int j = 0; j < jarFileList.length; j++) {
-				includeList.add(jarFileList[j].getAbsolutePath());
-			}
-			//Fix for the 205972 
-			File[] licenseFileList = FileUtils.getMatchingFiles(path,
-					Axis2Constants.AXIS2_LIB_PREFIXES[i], 
-					Axis2Constants.TXT);
-			for (int k = 0; k < licenseFileList.length; k++) {
-				includeList.add(licenseFileList[k].getAbsolutePath());
-			}
-		}
-		return includeList;
-	}
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/commands/MergeWEBXMLCommand.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/commands/MergeWEBXMLCommand.java
deleted file mode 100644
index 2bac8fb..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/commands/MergeWEBXMLCommand.java
+++ /dev/null
@@ -1,237 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2003, 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:
- * IBM Corporation - initial API and implementation
- * WSO2 Inc. - modified and fix web.xml wiped out when Axis2 facet
- * yyyymmdd bug      Email and other contact information
- * -------- -------- -----------------------------------------------------------
- * 20060515   115225 sengpl@ca.ibm.com - Seng Phung-Lu
- * 20070606   177421 sandakith@wso2.com - fix web.xml wiped out when Axis2 facet
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.facet.commands;
-
-
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import org.eclipse.core.resources.IProject;
-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.j2ee.model.IModelProvider;
-import org.eclipse.jst.j2ee.model.ModelProviderManager;
-import org.eclipse.jst.j2ee.webapplication.ErrorCodeErrorPage;
-import org.eclipse.jst.j2ee.webapplication.Servlet;
-import org.eclipse.jst.j2ee.webapplication.ServletMapping;
-import org.eclipse.jst.j2ee.webapplication.ServletType;
-import org.eclipse.jst.j2ee.webapplication.WebApp;
-import org.eclipse.jst.j2ee.webapplication.WebapplicationFactory;
-import org.eclipse.jst.javaee.core.DisplayName;
-import org.eclipse.jst.javaee.core.JavaeeFactory;
-import org.eclipse.jst.javaee.core.UrlPatternType;
-import org.eclipse.jst.javaee.web.WebFactory;
-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;
-
-public class MergeWEBXMLCommand extends AbstractDataModelOperation {
-
-	private IProject serverProject;
-	private boolean extraAxis2TagsAdded = false;
-
-  public MergeWEBXMLCommand( ) {
-  }
-
-	public IStatus execute( IProgressMonitor monitor, IAdaptable adaptable ){
-		return Status.OK_STATUS;
-	}
-	
-	public IStatus exexuteOverride( IProgressMonitor monitor){
-		IEnvironment environment = getEnvironment();
-		if (serverProject != null) {
-			IStatus status = null;
-			status = mergeWebXML(getAxisServletDescriptor());
-			if (status.getSeverity() == Status.ERROR) {
-				environment.getStatusHandler().reportError(status);
-				return status;
-			}
-			status = mergeWebXML(getAdmintServletDescriptor());
-			if (status.getSeverity() == Status.ERROR) {
-				environment.getStatusHandler().reportError(status);
-				return status;
-			}
-		}
-		return Status.OK_STATUS;
-	}
-	
-	private IStatus mergeWebXML(final ServletDescriptor servletDescriptor){
-		IStatus status = Status.OK_STATUS;
-		final IModelProvider provider = ModelProviderManager.getModelProvider(serverProject);
-		provider.modify(new Runnable(){
-			public void run() {
-				Object object = provider.getModelObject();
-				if (object instanceof org.eclipse.jst.javaee.web.WebApp){
-					org.eclipse.jst.javaee.web.WebApp javaeeWebApp = 
-									(org.eclipse.jst.javaee.web.WebApp) object;
-					addJavaeeServlet(serverProject, servletDescriptor, javaeeWebApp);
-				}
-				if (object instanceof org.eclipse.jst.j2ee.webapplication.WebApp){
-					WebApp webApp = (WebApp) object;
-					addServlet(serverProject, servletDescriptor, webApp);
-				}
-			}
-			
-		}, null);
-		return status;
-	}
-	
-	private ServletDescriptor getAxisServletDescriptor() {
-
-		ServletDescriptor sd = new ServletDescriptor();
-		sd._name = "AxisServlet"; //$NON-NLS-1$
-		sd._displayName = "Apache-Axis Servlet"; //$NON-NLS-1$
-		sd._className = "org.apache.axis2.transport.http.AxisServlet"; //$NON-NLS-1$
-		sd._mappings = new String[] { "/servlet/AxisServlet", //$NON-NLS-1$
-										"*.jws", //$NON-NLS-1$
-										"/services/*" }; //$NON-NLS-1$
-		//sd._loadOnStartup = new Integer(1);
-		return sd;
-	}
-
-	private ServletDescriptor getAdmintServletDescriptor() {
-		ServletDescriptor sd = new ServletDescriptor();
-		sd._name = "AxisAdminServlet"; //$NON-NLS-1$
-		sd._displayName = "Apache-Axis Admin Servlet Web Admin"; //$NON-NLS-1$
-		sd._className = "org.apache.axis2.transport.http.AxisAdminServlet"; //$NON-NLS-1$
-		sd._mappings = new String[] { "/axis2-admin/*"	}; //$NON-NLS-1$
-		sd._loadOnStartup = new Integer(100);
-		return sd;
-	}
-
-	public IStatus addServlet(IProject webProject, ServletDescriptor servletDescriptor,
-																			WebApp webapp) {
-		try {
-			   List theServlets = webapp.getServlets();
-			   for (int i = 0; i < theServlets.size(); i++) {
-				Servlet aServlet = (Servlet) theServlets.get(i);
-				if (aServlet.getServletName().equals(servletDescriptor._name)) {
-					return Status.OK_STATUS;
-				 }
-			   }
-			   
-			   WebapplicationFactory factory = WebapplicationFactory.eINSTANCE;
-
-			   Servlet servlet = factory.createServlet();
-			   ServletType servletType = factory.createServletType();
-			   servlet.setWebType(servletType);
-			   servlet.setServletName(servletDescriptor._name);
-			   servletType.setClassName(servletDescriptor._className);
-			   if(servletDescriptor._displayName != null){
-			     servlet.setDisplayName(servletDescriptor._displayName);
-			   }
-			   if(servletDescriptor._loadOnStartup != null){
-				  servlet.setLoadOnStartup(servletDescriptor._loadOnStartup);
-			   }
-			   if(servletDescriptor._params != null){
-				  Properties properties = servlet.getParamsAsProperties();
-				  properties.putAll(servletDescriptor._params);
-			   }
-			   webapp.getServlets().add(servlet);
-			
-			   if(servletDescriptor._mappings != null){
-				  for(int i=0; i<servletDescriptor._mappings.length; i++){
-					ServletMapping servletMapping = factory.createServletMapping();
-					servletMapping.setServlet(servlet);
-					servletMapping.setUrlPattern(servletDescriptor._mappings[i]);
-					webapp.getServletMappings().add(servletMapping);					
-				  }
-			   }
-			   
-			   if (!extraAxis2TagsAdded) {
-				    //add the welcome file list
-				    webapp.getFileList().addFileNamed("/axis2-web/index.jsp");
-				    
-				    //add the error pages
-				    ErrorCodeErrorPage errorPage404 = factory.createErrorCodeErrorPage();
-				    errorPage404.setErrorCode("404");
-				    errorPage404.setLocation("/axis2-web/Error/error404.jsp");
-				    webapp.getErrorPages().add(errorPage404);
-				    
-				    ErrorCodeErrorPage errorPage500 = factory.createErrorCodeErrorPage();
-				    errorPage500.setErrorCode("500");
-				    errorPage500.setLocation("/axis2-web/Error/error500.jsp");
-				    webapp.getErrorPages().add(errorPage500);
-				    extraAxis2TagsAdded = true;
-			   }
-			   
-			return Status.OK_STATUS;
-		} catch (Exception e) {
-
-			return StatusUtils.errorStatus(
-					"MSG_ERROR_UPDATE_WEB_XML",
-					e);
-		}
-	}
-	
-	private void addJavaeeServlet(IProject webProject, ServletDescriptor servletDescriptor,
-			org.eclipse.jst.javaee.web.WebApp webapp) {
-		List theServlets = webapp.getServlets();
-		for (int i = 0; i < theServlets.size(); i++) {
-			org.eclipse.jst.javaee.web.Servlet aServlet = 
-								(org.eclipse.jst.javaee.web.Servlet) theServlets.get(i);
-			if (aServlet.getServletName().equals(servletDescriptor._name)) {
-				return;
-			}
-		}
-		WebFactory factory = WebFactory.eINSTANCE;
-		org.eclipse.jst.javaee.web.Servlet servlet = factory.createServlet();
-		servlet.setServletName(servletDescriptor._name);
-		servlet.setServletClass(servletDescriptor._className);
-		if(servletDescriptor._displayName != null){
-			DisplayName displayNameObj = JavaeeFactory.eINSTANCE.createDisplayName();
-			displayNameObj.setValue(servletDescriptor._displayName);
-			servlet.getDisplayNames().add(displayNameObj);  
-		}
-		if(servletDescriptor._loadOnStartup != null){
-			servlet.setLoadOnStartup(servletDescriptor._loadOnStartup);
-		}
-		webapp.getServlets().add(servlet);
-		if(servletDescriptor._mappings != null){
-			for(int i=0; i<servletDescriptor._mappings.length; i++){
-				org.eclipse.jst.javaee.web.ServletMapping servletMapping = 
-													factory.createServletMapping();			
-				servletMapping.setServletName(servlet.getServletName());
-				UrlPatternType url = JavaeeFactory.eINSTANCE.createUrlPatternType();
-				url.setValue(servletDescriptor._mappings[i]);
-				servletMapping.getUrlPatterns().add(url);
-				webapp.getServletMappings().add(servletMapping);					
-			}
-		}
-	}
-  
-
-  public void setServerProject(IProject serverProject) {
-    this.serverProject = serverProject;
-  }
-  
-  public void setExtraAxis2TagsAdded(boolean flag) {
-	    this.extraAxis2TagsAdded = flag;
-  }
-
-	public class ServletDescriptor {
-		String _name;
-		String _className;
-		String _displayName;
-		Map _params;
-		String[] _mappings;
-		Integer _loadOnStartup;
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/deligate/Axis2CoreFacetInstallDelegate.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/deligate/Axis2CoreFacetInstallDelegate.java
deleted file mode 100644
index a86a4b8..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/deligate/Axis2CoreFacetInstallDelegate.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  168766 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  facet to the framework for 168766
- * 20070501   180284 sandakith@wso2.com - Lahiru Sandakith
- * 20070606   177421 sandakith@wso2.com - fix web.xml wiped out when Axis2 facet
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- * 20071010   204182 kathy@ca.ibm.com - Kathy Chan, check for Xalan TransformerFactoryImpl
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.facet.deligate;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.ws.axis2.core.constant.Axis2Constants;
-import org.eclipse.jst.ws.axis2.core.plugin.messages.Axis2CoreUIMessages;
-import org.eclipse.jst.ws.axis2.core.utils.RuntimePropertyUtils;
-import org.eclipse.jst.ws.axis2.facet.commands.Axis2WebservicesServerCommand;
-import org.eclipse.wst.common.project.facet.core.IDelegate;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-public class Axis2CoreFacetInstallDelegate implements IDelegate {
-
-	private IStatus status;
-
-	public void execute(IProject project, IProjectFacetVersion arg1, Object arg2,
-			IProgressMonitor monitor) throws CoreException {
-		monitor.beginTask(Axis2CoreUIMessages.PROGRESS_INSTALL_AXIS2_RUNTIME, 2 );
-
-		// Defect 204182 - If the xalan transformer factory TransformerFactoryImpl is loadable, use that as the XSLT processor.
-		// Otherwise, just use the default XSLT processor.
-		try {
-			Class.forName("org.apache.xalan.processor.TransformerFactoryImpl");
-			System.setProperty("javax.xml.transform.TransformerFactory", "org.apache.xalan.processor.TransformerFactoryImpl");
-		}
-		catch (ClassNotFoundException e) {
-			// Do nothing.  Just leave as default.
-		}
-		
-		Axis2WebservicesServerCommand command = new Axis2WebservicesServerCommand(project); 
-		status = command.executeOverride(monitor);
-		if (status.getCode() == Status.OK_STATUS.getCode() ){
-			RuntimePropertyUtils.writeServerStausToPropertiesFile(
-					Axis2Constants.SERVER_STATUS_PASS);
-		}else{
-			RuntimePropertyUtils.writeServerStausToPropertiesFile(
-					Axis2Constants.SERVER_STATUS_FAIL);
-			throw new CoreException(status);
-		}
-		monitor.worked( 1 );
-		monitor.done();
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/deligate/Axis2CoreFacetUnInstallDelegate.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/deligate/Axis2CoreFacetUnInstallDelegate.java
deleted file mode 100644
index e6104c5..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/deligate/Axis2CoreFacetUnInstallDelegate.java
+++ /dev/null
@@ -1,42 +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  168766 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 20070611  192002 kathy@ca.ibm.com - Kathy Chan
- * 										  facet to the framework for 168766
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.facet.deligate;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jst.ws.axis2.core.plugin.messages.Axis2CoreUIMessages;
-import org.eclipse.wst.common.project.facet.core.IDelegate;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-public class Axis2CoreFacetUnInstallDelegate implements IDelegate {
-	
-	private IStatus status;
-	
-	public void execute(IProject project, IProjectFacetVersion arg1, Object arg2,
-			IProgressMonitor monitor) throws CoreException {
-		monitor.beginTask(Axis2CoreUIMessages.PROGRESS_UNINSTALL_AXIS2_RUNTIME, 2 );
-			// TODO rollback the dynamic web project to the previous state.
-	        status = Status.OK_STATUS;
-			monitor.worked( 1 );
-	}
-	
-	public IStatus getStatus(){
-		return status;
-	}
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/deligate/Axis2ExtFacetInstallDelegate.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/deligate/Axis2ExtFacetInstallDelegate.java
deleted file mode 100644
index 5d7f5cb..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/deligate/Axis2ExtFacetInstallDelegate.java
+++ /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
- * -------- -------- -----------------------------------------------------------
- * 20070213  168766 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  facet to the framework for 168766
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.facet.deligate;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.wst.common.project.facet.core.IDelegate;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-public class Axis2ExtFacetInstallDelegate implements IDelegate {
-
-	public void execute(IProject arg0, IProjectFacetVersion arg1, Object arg2,
-			IProgressMonitor arg3) throws CoreException {
-			//TODO This will include the more requirements that needed to be automated
-			//	   when we cover the other RFE s in future.
-	}
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/deligate/Axis2ExtFacetUnInstallDelegate.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/deligate/Axis2ExtFacetUnInstallDelegate.java
deleted file mode 100644
index edc71cf..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/deligate/Axis2ExtFacetUnInstallDelegate.java
+++ /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
- * -------- -------- -----------------------------------------------------------
- * 20070213  168766 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  facet to the framework for 168766
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.facet.deligate;
-
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.wst.common.project.facet.core.IDelegate;
-import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion;
-
-public class Axis2ExtFacetUnInstallDelegate implements IDelegate {
-
-	public void execute(IProject arg0, IProjectFacetVersion arg1, Object arg2,
-			IProgressMonitor arg3) throws CoreException {
-			//TODO This will include the more requirements that needed to be automated
-			//	   when we cover the other RFE s in future.
-	}
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/messages/Axis2FacetUI.properties b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/messages/Axis2FacetUI.properties
deleted file mode 100644
index ccd1839..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/messages/Axis2FacetUI.properties
+++ /dev/null
@@ -1,17 +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
-# -------- -------- -----------------------------------------------------------
-# 20070214   168762 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse 
-# 										  the Axis2 facet to the framework for 168762
-# 20070517   187307 sandakith@wso2.com - Lahiru Sandakith, Fix 187307 Property File Fix
-###############################################################################
-
-
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/messages/Axis2FacetUIMessages.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/messages/Axis2FacetUIMessages.java
deleted file mode 100644
index 41e0a26..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/messages/Axis2FacetUIMessages.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
- * -------- -------- -----------------------------------------------------------
- * 20070213  168766 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  facet to the framework for 168766
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070517   187307 sandakith@wso2.com - Lahiru Sandakith, Fix 187307 Property File Fix
- * 20070606   177421 sandakith@wso2.com - fix web.xml wiped out when Axis2 facet
- * 20070730   194786 sandakith@wso2.com - Lahiru Sandakith, adding servletapi jar filter
- * 20070808   194906 sandakith@wso2.com - Lahiru Sandakith, Fixing 194906 Runtime lib issue
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.facet.messages;
-
-import org.eclipse.osgi.util.NLS;
-
-public final class Axis2FacetUIMessages extends NLS {
-
-	private static final String BUNDLE_NAME = 
-				"org.eclipse.jst.ws.axis2.facet.messages.Axis2FacetUI";//$NON-NLS-1$
-
-	private Axis2FacetUIMessages() {
-		// Do not instantiate
-	}
-
-	static {
-		NLS.initializeMessages(BUNDLE_NAME, Axis2FacetUIMessages.class);
-	}
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/model/FacetModel.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/model/FacetModel.java
deleted file mode 100644
index ba0d68e..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/model/FacetModel.java
+++ /dev/null
@@ -1,29 +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
- * -------- -------- -----------------------------------------------------------
- * 20070222  168766 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  facet to the framework for 168766
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.facet.model;
-
-public class FacetModel {
-	
-	private static String webFacetConinerDir;
-
-	public static String getWebFacetConinerDir() {
-		return webFacetConinerDir;
-	}
-
-	public static void setWebFacetConinerDir(String inputWebFacetConinerDir) {
-		webFacetConinerDir = inputWebFacetConinerDir;
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/plugin/Axis2FacetPlugin.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/plugin/Axis2FacetPlugin.java
deleted file mode 100644
index c95e133..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/plugin/Axis2FacetPlugin.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
- * -------- -------- -----------------------------------------------------------
- * 20070213  168766 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  facet to the framework for 168766
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.facet.plugin;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class Axis2FacetPlugin extends AbstractUIPlugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.apache.axis2.facet";
-
-	// The shared instance
-	private static Axis2FacetPlugin plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public Axis2FacetPlugin() {
-		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);
-	}
-
-	public static Axis2FacetPlugin getDefault() {
-		return plugin;
-	}
-	
-	public static Axis2FacetPlugin getInstance() {
-		return plugin;
-	}
-	
-    public static void log( final Exception e ){
-        final String msg = e.getMessage() + "";
-        log( new Status( IStatus.ERROR, PLUGIN_ID, IStatus.OK, msg, e ) );
-    }
-
-    public static void log( final IStatus status ){
-        getInstance().getLog().log( status );
-    }
-
-    public static void log( final String msg ){
-        log( new Status( IStatus.ERROR, PLUGIN_ID, IStatus.OK, msg, null ) );
-    }
-
-    public static IStatus createErrorStatus( final String msg ){
-        return createErrorStatus( msg, null );
-    }
-
-    public static IStatus createErrorStatus( final String msg,
-                                             final Exception e ){
-        return new Status( IStatus.ERROR, PLUGIN_ID, 0, msg, e );
-    }
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/utils/Axis2RuntimeUtils.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/utils/Axis2RuntimeUtils.java
deleted file mode 100644
index c6ebdb9..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/utils/Axis2RuntimeUtils.java
+++ /dev/null
@@ -1,201 +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  168766 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  facet to the framework for 168766
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070501   180284 sandakith@wso2.com - Lahiru Sandakith
- * 20070516   183147 sandakith@wso2.com - Lahiru Sandakith Fix for the persisting DBCS paths
- * 20070523   174876 sandakith@wso2.com - Lahiru Sandakith, Persist Preferences inside Framework
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.facet.utils;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.channels.FileChannel;
-import java.util.Enumeration;
-import java.util.SortedSet;
-import java.util.TreeSet;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.Path;
-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.Axis2CoreUtils;
-import org.eclipse.jst.ws.axis2.core.utils.FileUtils;
-
-public class Axis2RuntimeUtils {
-	
-	public static final int ZIP=0, UNZIP = 1;
-	protected static int mode = UNZIP;
-	static ZipFile zipFile;
-	protected static byte[] b;
-	static SortedSet createdDirs;
-	static String outputPath;
-	static Axis2EmitterContext context;
-
-	public static String  copyAxis2War(IProgressMonitor monitor, String Axis2Home)
-							throws FileNotFoundException, IOException{
-		context = WebServiceAxis2CorePlugin.getDefault().getAxisEmitterContext();
-		String tempWarFile = null;
-		String tempWarLocation = null;
-		String  tempUnzipLocation = null;
-		try {
-			if (new File (Axis2CoreUtils.tempAxis2Directory()).isDirectory()) {
-				tempWarLocation = Axis2CoreUtils.addAnotherNodeToPath(
-															Axis2CoreUtils.tempAxis2Directory(),
-															Axis2Constants.DIR_TEMPWAR);
-			File tempWarLocationFile= new File(tempWarLocation);
-			if (tempWarLocationFile.exists()) {
-				FileUtils.deleteDirectories(tempWarLocationFile);
-			}
-			tempWarLocationFile.mkdirs();
-			tempWarFile = Axis2CoreUtils.addAnotherNodeToPath(
-															tempWarLocation,	
-															Axis2Constants.FILE_AXIS2_WAR);
-			new File(tempWarFile).createNewFile();
-			String axis2RuntimrLocation = null;
-			if(context.getAxis2RuntimeLocation()!=null){
-				axis2RuntimrLocation = context.getAxis2RuntimeLocation();
-			}else{
-			    Axis2EmitterContext context = WebServiceAxis2CorePlugin
-												.getDefault().getAxisEmitterContext();
-			    axis2RuntimrLocation =  context.getAxis2RuntimeLocation();
-
-			}
-					String axis2WarFile = Axis2CoreUtils.addAnotherNodeToPath(
-										axis2RuntimrLocation,
-										Axis2Constants.FILE_AXIS2_WAR);
-					FileChannel srcChannel = new FileInputStream(axis2WarFile).getChannel();
-					FileChannel dstChannel = new FileOutputStream(tempWarFile).getChannel();
-					// Copy file contents from source to destination
-					dstChannel.transferFrom(srcChannel, 0, srcChannel.size());
-					// Close the channels
-					srcChannel.close();
-					dstChannel.close();
-				
-				//unzip this into another foulder
-				tempUnzipLocation = FileUtils.addAnotherNodeToPath(tempWarLocation, 
-						Axis2Constants.DIR_UNZIP);
-				File tempUnzipLocationFile= new File(tempUnzipLocation);
-				if (!tempUnzipLocationFile.exists()) {
-					tempUnzipLocationFile.mkdirs();
-				}
-				unzipAxis2War(tempWarFile,tempUnzipLocation );
-
-				}
-			
-			IPath tempWebXMLLocationPath = new Path(tempUnzipLocation)
-											   .append(Axis2Constants.DIR_WEB_INF)
-											   .append(Axis2Constants.FILE_WEB_XML);
-			//delete the axis2 web.xml File(DWP already have)
-			new File(tempWebXMLLocationPath.toOSString()).delete();
-				
-			//} else {
-				//Throws an error message
-			//}
-		} catch (FileNotFoundException e) {
-			throw e;	
-		} catch (IOException e) {
-			throw e;
-		}
-
-		return tempUnzipLocation;
-	}
-	
-	
-	private static void unzipAxis2War(String fileName,String outputPath){
-	      b = new byte[8092];
-	      setOutputPath(outputPath);
-	      if (fileName.endsWith(".war") )
-	        unZip(fileName);
-	      else
-	    	  throw new IllegalStateException("Wrong file type" + fileName);
-	}
-
-	/** For a given Zip file, process each entry. */
-	public static void unZip(String fileName) {
-	
-	  createdDirs = new TreeSet();
-	  try {
-	    zipFile = new ZipFile(fileName);
-	    Enumeration all = zipFile.entries();
-	    while (all.hasMoreElements()) {
-	      unzipFile((ZipEntry) all.nextElement());
-	    }
-	  } catch (IOException e) {
-	    e.printStackTrace();
-	  }
-	}
-
-	
-	protected static void unzipFile(ZipEntry e) throws IOException {
-
-	  boolean warnedMkDir = false;
-	    String zipName = e.getName();
-	    switch (mode) {
-	    case UNZIP:
-	      if (zipName.startsWith("/")) {
-	        if (!warnedMkDir)
-	        warnedMkDir = true;
-	        zipName = zipName.substring(1);
-	      }
-	      if (zipName.endsWith("/")) {
-	        return;
-	      }
-	      int ix = zipName.lastIndexOf('/');
-	      if (ix > 0) {
-	        String dirName = zipName.substring(0, ix);
-	        if (!createdDirs.contains(dirName)) {
-	          File d = new File(getOutputPath()+File.separator+dirName);
-	          if (!(d.exists() && d.isDirectory())) {
-	            if (!d.mkdirs()) {
-	              throw new IllegalStateException("Warning: unable to mkdir " + dirName);
-	            }
-	            createdDirs.add(dirName);
-	          }
-	        }
-	      }
-          FileOutputStream os = new FileOutputStream(getOutputPath()+File.separator+zipName);
-	      InputStream is = zipFile.getInputStream(e);
-	      int n = 0;
-	      while ((n = is.read(b)) > 0)
-	        os.write(b, 0, n);
-	      is.close();
-	      os.close();
-	      break;
-	    default:
-	      throw new IllegalStateException("mode value (" + mode + ") bad");
-	    }
-	  }
-
-	
-
-	public static String getOutputPath() {
-		return outputPath;
-	}
-
-
-	public static void setOutputPath(String outputPath) {
-		Axis2RuntimeUtils.outputPath = outputPath;
-	}
-
-		    
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/utils/Axis2WebappUtils.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/utils/Axis2WebappUtils.java
deleted file mode 100644
index a153888..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/utils/Axis2WebappUtils.java
+++ /dev/null
@@ -1,119 +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
- * -------- -------- -----------------------------------------------------------
- * 20070410 168766 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  facet to the framework for 168766
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070501   180284 sandakith@wso2.com - Lahiru Sandakith
- * 20070507   185686 sandakith@wso2.com - Lahiru Sandakith
- * 20070516   183147 sandakith@wso2.com - Lahiru Sandakith Fix for the persisting DBCS paths
- * 20070523   174876 sandakith@wso2.com - Lahiru Sandakith, Persist Preferences inside Framework
- * 20070730   194786 sandakith@wso2.com - Lahiru Sandakith, adding servletapi jar filter
- * 20070824   200515 sandakith@wso2.com - Lahiru Sandakith, NON-NLS move to seperate file
- * 20071120   205228 sandakith@wso2.com	- Lahiru Sandakith, Axis2 Runtime change issue.
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.facet.utils;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-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.Axis2CoreUtils;
-import org.eclipse.jst.ws.axis2.core.utils.FileUtils;
-
-public class Axis2WebappUtils {
-
-	private static String tempWarLocation = null;
-	private static boolean alreadyWarExist = false;
-	private static Axis2EmitterContext context;
-	private static String axis2HomeLocation = null;
-
-	public static String  copyAxis2War(IProgressMonitor monitor, String Axis2Home)
-										throws FileNotFoundException, IOException{
-		context = WebServiceAxis2CorePlugin.getDefault().getAxisEmitterContext();
-
-		if( ! ( alreadyWarExist && context.getAxis2RuntimeLocation().equals(axis2HomeLocation) )){
-			if(context.getAxis2RuntimeLocation() != null){
-				axis2HomeLocation = context.getAxis2RuntimeLocation();
-			}
-			File tempAxis2Directory = new File (Axis2CoreUtils.tempAxis2Directory());
-			if(!tempAxis2Directory.exists()){
-				tempAxis2Directory.mkdirs();
-			}
-			if (tempAxis2Directory.isDirectory()) {
-				tempWarLocation = Axis2CoreUtils.addAnotherNodeToPath(
-						Axis2CoreUtils.tempAxis2Directory(),
-						Axis2Constants.DIR_EXPLOADED_TEMPWAR);
-				File tempWarLocationFile= new File(tempWarLocation);
-				if (tempWarLocationFile.exists()) {
-					FileUtils.deleteDirectories(tempWarLocationFile);
-				}
-				tempWarLocationFile.mkdirs();
-		
-					String axis2WebappLocation = Axis2CoreUtils.addAnotherNodeToPath(
-							axis2HomeLocation,
-							"webapp");
-					String axis2LibFile = Axis2CoreUtils.addAnotherNodeToPath(
-							axis2HomeLocation,
-					"lib");
-					String axis2ConfFile = Axis2CoreUtils.addAnotherNodeToPath(
-							axis2HomeLocation,
-					"conf");
-					String axis2RepositoryFile = Axis2CoreUtils.addAnotherNodeToPath(
-							axis2HomeLocation,
-					"repository");
-					String axis2TempWebInfFile = Axis2CoreUtils.addAnotherNodeToPath(
-							tempWarLocation,
-					"WEB-INF");
-					String axis2TempWebInfLibFile = Axis2CoreUtils.addAnotherNodeToPath(
-							axis2TempWebInfFile,
-					"lib");
-					String axis2TempWebInfConfFile = Axis2CoreUtils.addAnotherNodeToPath(
-							axis2TempWebInfFile,
-					"conf");
-					String axis2TempWebBuildFile = Axis2CoreUtils.addAnotherNodeToPath(
-							tempWarLocation,
-					"build.xml");
-					String axis2TempWebXMLFile = Axis2CoreUtils.addAnotherNodeToPath(
-							axis2TempWebInfFile,
-							Axis2Constants.FILE_WEB_XML);
-
-					//Copy the webapp content 
-					FileUtils.copyDirectory(new File(axis2WebappLocation), tempWarLocationFile);
-					////delete the axis2 web.xml File(DWP already have)
-					new File(axis2TempWebBuildFile).delete();
-					//delete the web.xml File
-					new File(axis2TempWebXMLFile).delete();
-					//Copy libs 
-					FileUtils.copyDirectory(new File(axis2LibFile),
-											new File(axis2TempWebInfLibFile));
-					//copy conf/axis2.xml
-					FileUtils.copyDirectory(new File(axis2ConfFile), 
-											new File(axis2TempWebInfConfFile));
-					//Copy modules and services 					
-					FileUtils.copyDirectory(new File(axis2RepositoryFile), 
-											new File(axis2TempWebInfFile));
-					//Filter out the servletapi jars
-					FileUtils.filterOutRestrictedFiles(axis2TempWebInfLibFile,
-							Axis2Constants.FILE_SERVLET_API,"jar");
-					
-					alreadyWarExist= true;
-				}
-
-		}	
-		return tempWarLocation;
-	}
-
-}
diff --git a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/utils/ContentCopyUtils.java b/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/utils/ContentCopyUtils.java
deleted file mode 100644
index 18814b7..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.core/src/org/eclipse/jst/ws/axis2/facet/utils/ContentCopyUtils.java
+++ /dev/null
@@ -1,399 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2007 IBM Corporation, 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
- * -------- -------- -----------------------------------------------------------
- * IBM Corporation,  WSO2 Inc. - initial API and implementation
- * WSO2 Inc. - initial extended API and implementation
- * 20070213  168766 sandakith@wso2.com - Lahiru Sandakith, Initial code to introduse the Axis2 
- * 										  facet to the framework for 168766
- * 20070426   183046 sandakith@wso2.com - Lahiru Sandakith
- * 20070606   177421 sandakith@wso2.com - fix web.xml wiped out when Axis2 facet
- * 20070808   194906 sandakith@wso2.com - Lahiru Sandakith, Fixing 194906 Runtime lib issue
- * 20070813   196173  sandakith@wso2.com - Lahiru Sandakith, Fix 196173, DWP custom location fix
- *******************************************************************************/
-package org.eclipse.jst.ws.axis2.facet.utils;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-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.core.plugin.messages.Axis2CoreUIMessages;
-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;
-
-public class ContentCopyUtils {
-
-	private static IWorkspaceRoot root_ = null;
-	private static IWorkspace workspace_ = null;
-	private List fileAndDirectoriesList = new ArrayList();
-	FileInputStream finStream = null;		
-	private List checkList = 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 IStatus : Status of the operation
-	 */
-	public IStatus copyDirectoryRecursivelyIntoWorkspace(String sourceDir, 
-						String destinationDir,IProgressMonitor monitor, boolean includeListSet) {
-		IStatus status = Status.OK_STATUS;
-		//First of all clear the content in the targeted list
-		fileAndDirectoriesList.clear();
-		File axis2WebappFolder = new File(sourceDir);
-		if (includeListSet) {
-			visitAllDirsAndFilesWithIncludeList(axis2WebappFolder,checkList);
-		}else{
-			visitAllDirsAndFilesWithIgnoreList(axis2WebappFolder,checkList);
-		}
-		
-		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){
-						makeFolderPathAtLocation(context,  
-								targetPath,
-								monitor);
-					}else{
-						if (finStream != null) {
-							createFileAtLocation(context,  
-									targetPath,
-									finStream,
-									monitor);
-						}
-						finStream.close();
-					}
-				}
-			}
-		} catch (IOException e) {
-			status = StatusUtils.errorStatus(
-					NLS.bind(Axis2CoreUIMessages.ERROR_INVALID_FILE_READ_WRITEL,
-							 new String[]{e.getLocalizedMessage()}), e);
-		} catch (CoreException e) {
-			status = StatusUtils.errorStatus(
-					NLS.bind(Axis2CoreUIMessages.ERROR_INVALID_FILE_READ_WRITEL,
-							 new String[]{e.getLocalizedMessage()}), e);
-		}
-
-		return status;
-
-	}
-	
-	public void updateCheckList(List list){
-		checkList = list;
-	}
-
-	/**
-	 * Load the list with directory contents (files/folders) excluding the ignore list
-	 * @param dir
-	 * @param ignoreList
-	 */
-	private void visitAllDirsAndFilesWithIgnoreList(File dir, List ignoreList) {
-		if(!checkCheckListHit(dir,ignoreList)){
-			fileAndDirectoriesList.add(dir.getAbsolutePath());
-			if (dir.isDirectory()) {
-				String[] children = dir.list();
-				for (int i=0; i<children.length; i++) {
-					visitAllDirsAndFilesWithIgnoreList(new File(dir, children[i]),ignoreList);
-				}
-			}
-		}
-	}
-	
-	/**
-	 * Load the list with directory contents (files/folders) only match with the include list 
-	 * @param dir
-	 * @param includeList
-	 */
-	private void visitAllDirsAndFilesWithIncludeList(File dir, List includeList) {
-		if(checkCheckListHit(dir,includeList)){
-			fileAndDirectoriesList.add(dir.getAbsolutePath());
-		}
-		if (dir.isDirectory()) {
-			String[] children = dir.list();
-			for (int i=0; i<children.length; i++) {
-				visitAllDirsAndFilesWithIncludeList(new File(dir, children[i]),includeList);
-			}
-		}
-	}
-	
-	/**
-	 * Check the <code>file</code> pass in, matches a file in the <code>list</code>
-	 * @param file 
-	 * @param list
-	 * @return result of the check
-	 */
-	private boolean checkCheckListHit(File file, List list){
-		if(list != null){
-			Iterator iterator = list.iterator();
-			while (iterator.hasNext()) {
-				String elem = (String) iterator.next();
-				if(elem.equals(file.getAbsoluteFile().toString())){
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-	
-	private static IFolder makeFolder (
-		    ResourceContext  resourceContext,
-		    IContainer       parent,
-		    String           folderName,
-		    IProgressMonitor progressMonitor )
-		  
-		  throws CoreException
-		  {
-		    IResource child  = parent.findMember(folderName);
-		    if( child == null )
-		    {
-		      IFolder folder = parent.getFolder(new Path(folderName));
-		      folder.create(true,true,null);
-		      return folder;
-		    }
-		    else if( child.getType() == IResource.FOLDER )
-		    {
-		      return (IFolder)child;
-		    }
-		    else
-		    {
-		      throw new CoreException(
-		        new Status( IStatus.ERROR, 
-		                    "ResourceUtils",
-		                    0, 
-		                    NLS.bind("ERROR",//EnvironmentMessages.MSG_ERROR_RESOURCE_NOT_FOLDER,
-							                 new Object[]{ parent.getFullPath().append(folderName).toString() }),
-					null ) );
-		    }
-		  }
-
-	
-	public static IContainer makeFolderPathAtLocation (
-			   ResourceContext  resourceContext,
-			   IContainer       resource,
-			   IProgressMonitor progressMonitor )
-			 
-			   throws CoreException
-			   {
-				 if (resource.exists())
-				 {
-					 if (resource instanceof IContainer)
-					 {
-						 return (IContainer) resource;
-					 }
-					 else
-					 {
-						 throw new CoreException(
-								 new Status( IStatus.ERROR, 
-										 "ResourceUtils",
-										 0, 
-										 NLS.bind("ERROR",
-												 new Object[]{ resource.getFullPath().toString() }),
-												 null ) );
-					 }
-				 }
-				 else
-				 {
-					 IContainer parent = makeFolderPathAtLocation(resourceContext, 
-							 			resource.getParent(), 
-							 			progressMonitor );
-					 String folderName = resource.getName();
-					 
-					 return makeFolder(resourceContext, parent, folderName, progressMonitor  );
-				 }
-			 }
-	
-	
-	 /**
-	  * Creates a path of folders.
-	  * Do not call with an absolutePath of less than one segment.
-	  * @param resourceContext the resource context for making folders.
-	  * @param absolutePath the path of folders that will be created.
-	  * @param progressMonitor the progress monitor to be used.
-	  * @param statusHandler the status handler.
-	  * @return returns the IContainer of the created folder.
-	  */
-	 public static IContainer makeFolderPathAtLocation (
-	   ResourceContext  resourceContext,
-	   IPath            absolutePath,
-	   IProgressMonitor progressMonitor )
-	 
-	   throws CoreException
-	 {
-	 	return makeFolderPathAtLocation(resourceContext,
- 			getWorkspaceRoot().getContainerForLocation(absolutePath),
-	 		//getWorkspaceRoot().getContainerForLocation(new Path("/home/sandakith/temp/Test/Test/WebContent")),
-	 		//"/home/sandakith/Eclipse_Workspace/workspace/testThis"
-	 		progressMonitor);
-	 }
-	 
-	 
-	 public static IWorkspaceRoot getWorkspaceRoot ()
-	  {
-	    if (root_ == null)
-	    {
-	      root_ = ResourcesPlugin.getWorkspace().getRoot();
-	    }
-	    return root_;
-	  }
-	
-	  public static IFile createFileAtLocation (
-			     ResourceContext resourceContext,
-			     IPath           absolutePath,
-			     InputStream     inputStream,
-			     IProgressMonitor progressMonitor )
-
-			     throws CoreException 
-			   {    
-			     if (!absolutePath.isAbsolute())
-			     {
-			       throw new CoreException(new Status(IStatus.ERROR, "ResourceUtils",0,
-			    		   NLS.bind("ERROR",//EnvironmentMessages.MSG_ERROR_PATH_NOT_ABSOLUTE,
-			    		   new Object[] {absolutePath.toString()}),null));
-			     }
-			     if (absolutePath.segmentCount() < 1)
-			     {
-			       throw new CoreException(new Status(IStatus.ERROR,"ResourceUtils",0,
-			    		   NLS.bind("ERROR",//EnvironmentMessages.MSG_ERROR_PATH_EMPTY,
-			    		   new Object[] {absolutePath.toString()}),null));
-			     }
-			     if (absolutePath.segmentCount() < 2)
-			     {
-			       throw new CoreException(new Status(IStatus.ERROR,"ResourceUtils",0,
-			    		   NLS.bind("ERROR",//EnvironmentMessages.MSG_ERROR_PATH_NOT_FOLDER,
-			    		   new Object[] {absolutePath.toString()}),null));
-			     }
-			     IContainer parent   = makeFolderPathAtLocation(resourceContext, 
-			    		 				absolutePath.removeLastSegments(1), progressMonitor);
-			     String     fileName = absolutePath.lastSegment();
-			     
-			     return makeFile(resourceContext, parent, fileName, inputStream, progressMonitor);
-			   }
-	
-	
-	  private static IFile makeFile (
-			    ResourceContext  resourceContext,
-			    IContainer       parent,
-			    String           fileName,
-			    InputStream      inputStream,
-			    IProgressMonitor progressMonitor )
-			 
-			    throws CoreException
-			  {
-			    IResource child  = parent.findMember(fileName);
-			    
-			    if( child != null )
-			    {
-			      if( child.getType() == IResource.FILE )
-			      {
-			    
-			        //We have permission to overwrite so check if file is read-only
-			        if(child.getResourceAttributes()!=null && 
-			        						child.getResourceAttributes().isReadOnly() )
-			        {
-			          IFile[] files = new IFile[1];
-			          files[0] = (IFile)child;
-			        }
-
-			        //Change the contents of the existing file.
-			        IFile file = parent.getFile( new Path(fileName) );
-			        file.setContents( inputStream, true, true, null );
-			        
-			        return file;
-			      
-			      }
-			      else
-			      {
-			        throw new CoreException( 
-			          new Status( IStatus.ERROR,
-			                      "ResourceUtils",
-			                      0, 
-			                      NLS.bind("ERROR",
-							                       new Object[] {parent.getFullPath().append(fileName)}),
-								  null ) );
-			      }
-			    }
-			    else
-			    {
-			      //Create a new file.
-			      IFile file = parent.getFile( new Path(fileName) );
-			      file.create( inputStream, true, null);
-			      
-			      return file;
-			    }
-			  }
-	  
-	  public static IWorkspace getWorkspace ()
-	  {
-	    if (workspace_ == null)
-	    {
-	      if (root_ == null)
-	      {
-	        root_ = ResourcesPlugin.getWorkspace().getRoot();
-	      }
-	      
-	      workspace_ = root_.getWorkspace();
-	    }
-	    
-	    return workspace_;
-	  }
-	  
-}
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 9b3c263..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,30 +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.2.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
-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 4fb4c7d..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/build.properties
+++ /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
-# -------- -------- -----------------------------------------------------------
-# 20070507   185686 sandakith@wso2.com - Lahiru Sandakith
-###############################################################################
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               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/plugin.xml b/bundles/org.eclipse.jst.ws.axis2.creation.core/plugin.xml
deleted file mode 100644
index 1f01135..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/plugin.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-<plugin>
-
-    
-</plugin>
\ 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/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 4033417..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/command/Axis2WSDL2JavaCommand.java
+++ /dev/null
@@ -1,202 +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
- * 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
- *******************************************************************************/
-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;
-        
-	try {
-		//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); 
-	}
-		
-		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 cbf1dfd..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.creation.core/src/org/eclipse/jst/ws/axis2/creation/core/messages/Axis2CreationUI.properties
+++ /dev/null
@@ -1,48 +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
-# 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
-###############################################################################
-#
-# Axis2 server component type labels
-#
-LABEL_HAVE_SERVICES_XML_FILE=Have a services.xml file
-LABEL_DEFAULT_SERVICES_XML_FILE=Generate 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 on this page
-LABEL_BROWSE=&Browse
-LABEL_JAVA_2_WSDL_PAGE_HEADING=Axis2 Web Service skeleton Java Bean Configuration
-LABEL_JAVA_2_WSDL_PAGE_SUB_HEADING=Please select the appropriate options for the code generation
-LABEL_SERVICE_NAME_CAPTION=Service Name
-LABEL_GENERATE_TESTCASE_CAPTION=Generate test case to test the service
-LABEL_DATABINDING_CAPTION=Databinding Name
-LABEL_PORTNAME=Port Name
-LABEL_GENERATE_ALL=Generate all types for all elements referred by schemas
-LABEL_GENERATE_SERVERSIDE_INTERFACE=Generate an Interface for 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 while 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.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 504644b..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.1.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 90afd2a..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.ui/src/org/eclipse/jst/ws/internal/axis2/consumption/ui/preferences/Axis2RuntimePreferencePage.java
+++ /dev/null
@@ -1,580 +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
- *******************************************************************************/
-package org.eclipse.jst.ws.internal.axis2.consumption.ui.preferences;
-
-import java.io.File;
-
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-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.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.events.SelectionListener;
-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.Control;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Label;
-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 Button browseButton; 
-  private Text axis2Path; 
-  private Text statusLabel;
-  @SuppressWarnings("unused")
-  private IStatus status = Status.OK_STATUS;
-  private boolean webappExist = false;
-  private boolean isWar = false;
-  private String statusBanner = null;
-  Axis2EmitterContext context;
-  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) {
-    context = WebServiceAxis2CorePlugin.getDefault().getAxisEmitterContext();
-    status = Status.OK_STATUS;
-    
-    final Composite  mainComp = new Composite( superparent, SWT.NONE );
-    
-    mainComp.setLayout( new GridLayout() );
-    mainComp.setLayoutData( new GridData( GridData.FILL_BOTH ) );
-    
-    TabFolder axis2PreferenceTab = new TabFolder(mainComp, SWT.NONE);
-    
-    axis2PreferenceTab.setLayoutData( new GridData( GridData.FILL_BOTH ) );
-    
-    //-----------------------------Axis2 Runtime Location Group------------------------------//
-    TabItem runtimeInstalLocationItem = new TabItem(axis2PreferenceTab, SWT.NONE);
-    runtimeInstalLocationItem.setText(Axis2CoreUIMessages.AXIS2_RUNTIME);
-    runtimeInstalLocationItem.setToolTipText(Axis2CoreUIMessages.AXIS2_RUNTIME_TOOLTIP);
-    
-    final Composite runtimeGroup = new Composite(axis2PreferenceTab, SWT.NONE);
-    
-    runtimeInstalLocationItem.setControl(runtimeGroup);
-    runtimeGroup.setToolTipText(Axis2CoreUIMessages.AXIS2_RUNTIME_TOOLTIP);
-    
-    GridLayout layout = new GridLayout();
-    
-    layout.numColumns = 3;
-    layout.marginHeight = 10;
-    runtimeGroup.setLayout( layout );
-    runtimeGroup.setLayoutData( new GridData( GridData.FILL_BOTH ) );
-
-        
-    Label label = new Label( runtimeGroup, SWT.NONE );
-    label.setText( Axis2CoreUIMessages.AXIS2_RUNTIME_LOCATION );
-    
-    axis2Path = new Text( runtimeGroup, SWT.BORDER );
-    String serverPath = null;
-    if (!(context.getAxis2RuntimeLocation()==null)){
-          serverPath = context.getAxis2RuntimeLocation();
-          axis2Path.setText(serverPath);
-    }else{
-      //never come here
-    }
-
-    webappExist =runtimeExist(serverPath);
-    if(isWar){
-      updateWarStatus(true);
-    }else{
-      updateWarStatus(false);
-    }
-    
-    GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-    
-    gd.minimumWidth = 40;
-    axis2Path.setLayoutData(gd);
-    axis2Path.addModifyListener( new ModifyListener(){
-      public void modifyText(ModifyEvent e){
-        context.setAxis2RuntimeLocation( axis2Path.getText() );
-        webappExist =runtimeExist(axis2Path.getText());
-        storeValues();
-        status = RuntimePropertyUtils.writeServerPathToPropertiesFile(
-            axis2Path.getText());
-        if (webappExist) {
-          status = Status.OK_STATUS;
-          statusUpdate(true);
-        }else{
-          status = Status.CANCEL_STATUS;
-          statusUpdate(false);
-        }
-        
-        runtimeGroup.layout();
-      }
-    });
-    
-    browseButton = new Button( runtimeGroup, SWT.NONE );
-    browseButton.setText(Axis2CoreUIMessages.LABEL_BROUSE);
-    
-    browseButton.addSelectionListener( new SelectionAdapter()
-    {
-      public void widgetSelected(SelectionEvent e)
-      {
-        handleBrowse(mainComp.getShell());
-      }     
-    }); 
-  
-    if(axis2Path.getText().equals(Axis2Constants.NULL)){
-      status = new Status( IStatus.ERROR, 
-          "id", 
-          0, 
-          Axis2CoreUIMessages.ERROR_INVALID_AXIS2_SERVER_LOCATION, 
-          null ); 
-    }
-    
-    Label separator = new Label( runtimeGroup, SWT.NONE);  // Leave some vertical space.
-    
-    gd = new GridData();
-    gd.horizontalSpan = 3;
-    separator.setText( " " );
-    separator.setLayoutData( gd );
-    
-    statusLabel = new Text(runtimeGroup,SWT.BACKGROUND | SWT.READ_ONLY | SWT.CENTER);
-    gd = new GridData();
-    gd.horizontalSpan = 3;
-    gd.horizontalAlignment = GridData.CENTER;
-    statusLabel.setLayoutData( gd );
-    
-    if (axis2Path.getText().equals("")) {
-      statusBanner = Axis2CoreUIMessages.LABEL_AXIS2_RUNTIME_NOT_EXIT;
-    } else if ( !axis2Path.getText().equals("") && (!webappExist)) {
-      statusBanner = Axis2CoreUIMessages.LABEL_AXIS2_RUNTIME_LOAD_ERROR;
-    }else{
-      statusBanner = Axis2CoreUIMessages.LABEL_AXIS2_RUNTIME_LOAD;
-    }
-    statusLabel.setText(statusBanner);
-    
-    webappExist =runtimeExist(axis2Path.getText());
-    
-    //--------------------------------Axis2 Runtime Preferences------------------------------//
-    
-    TabItem codegenPreferencesItem = new TabItem(axis2PreferenceTab, SWT.NONE);
-    codegenPreferencesItem.setText(Axis2CoreUIMessages.AXIS2_PREFERENCES);
-    codegenPreferencesItem.setToolTipText(Axis2CoreUIMessages.AXIS2_PREFERENCES_TOOLTIP);
-    
-    Composite codegenGroup = new Composite(axis2PreferenceTab, SWT.NONE);
-    codegenPreferencesItem.setControl(codegenGroup);
-    codegenGroup.setToolTipText(Axis2CoreUIMessages.AXIS2_PREFERENCES_TOOLTIP);
-    
-    layout = new GridLayout();
-    codegenGroup.setLayout(layout);
-    layout.numColumns = 2;
-    layout.marginHeight = 10;
-    gd = new GridData(GridData.FILL_BOTH);
-    codegenGroup.setLayoutData( gd );
-    
-    //Service Codegen Options
-    Text serviceCodegenLabel = new Text(codegenGroup,SWT.BACKGROUND | SWT.READ_ONLY);
-    serviceCodegenLabel.setText( Axis2CoreUIMessages.LABEL_WEB_SERVICE_CODEGEN);
-    
-    gd = new GridData(GridData.FILL_HORIZONTAL);
-    gd.horizontalSpan = 2;
-    serviceCodegenLabel.setLayoutData(gd);
-
-    //Data binding
-    Label databindingLabel = new Label( codegenGroup, SWT.NONE );
-    databindingLabel.setText( Axis2CoreUIMessages.LABEL_DATABINDING);
-  
-    //Data binding items
-    final String[] databindingItems = {context.getServiceDatabinding().toUpperCase()};
-    
-    serviceDatabindingCombo = new Combo(codegenGroup,SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY);
-    serviceDatabindingCombo.setItems(databindingItems);
-    serviceDatabindingCombo.select(0);
-    context.setServiceDatabinding(serviceDatabindingCombo.getItem(0));
-    serviceDatabindingCombo.addSelectionListener(new SelectionAdapter(){
-        public void widgetSelected(SelectionEvent e) {
-          context.setServiceDatabinding(serviceDatabindingCombo
-              .getItem(serviceDatabindingCombo.getSelectionIndex()));
-        }
-    });
-    
-    //the server side interface option
-    generateServerSideInterfaceCheckBoxButton = 
-              new Button(codegenGroup, SWT.CHECK);
-    generateServerSideInterfaceCheckBoxButton.setText(
-        Axis2CoreUIMessages.LABEL_GENERATE_SERVERSIDE_INTERFACE);
-    generateServerSideInterfaceCheckBoxButton.setSelection(
-                  context.isServiceInterfaceSkeleton());
-    generateServerSideInterfaceCheckBoxButton.addSelectionListener(new SelectionListener() {
-      public void widgetSelected(SelectionEvent e) {
-        context.setServiceInterfaceSkeleton(
-            generateServerSideInterfaceCheckBoxButton.getSelection());
-      }
-      public void widgetDefaultSelected(SelectionEvent e) {
-      }
-    });
-    
-    gd = new GridData(GridData.FILL_HORIZONTAL);
-    gd.horizontalSpan = 2;
-    generateServerSideInterfaceCheckBoxButton.setLayoutData(gd);
-
-    // generate all
-    generateAllCheckBoxButton = new Button(codegenGroup, SWT.CHECK);
-    generateAllCheckBoxButton.setSelection(context.isServiceGenerateAll());
-    generateAllCheckBoxButton.setText(Axis2CoreUIMessages.LABEL_GENERATE_ALL);
-    generateAllCheckBoxButton.addSelectionListener(new SelectionListener() {
-      public void widgetSelected(SelectionEvent e) {
-        context.setServiceGenerateAll(generateAllCheckBoxButton.getSelection());
-      }
-      public void widgetDefaultSelected(SelectionEvent e) {
-      }
-    });
-    
-    gd = new GridData(GridData.FILL_HORIZONTAL);
-    gd.horizontalSpan = 2;
-    generateAllCheckBoxButton.setLayoutData(gd);
-
-    ///////////////////////////////////////////////////////////////////////////////////////////
-    
-    //seperator
-    Label seperatorLabel0 = new Label( codegenGroup, SWT.SEPARATOR | SWT.HORIZONTAL );
-    
-    gd = new GridData(GridData.FILL_HORIZONTAL);
-    gd.horizontalSpan = 2;
-    gd.verticalIndent=5;
-    seperatorLabel0.setLayoutData(gd);
-            
-    ///Client Codegen Options
-    Text clientCodegenLabel = new Text(codegenGroup,SWT.BACKGROUND | SWT.READ_ONLY);
-    clientCodegenLabel.setText( Axis2CoreUIMessages.LABEL_WEB_SERVICE_CLIENT_CODEGEN);
-    
-    gd = new GridData(GridData.FILL_HORIZONTAL);
-    gd.horizontalSpan = 2;
-    gd.verticalIndent=5;
-    clientCodegenLabel.setLayoutData(gd);
-    
-    //Client type label 
-    Label clientLabel = new Label(codegenGroup, SWT.HORIZONTAL | SWT.NULL);
-    clientLabel.setText(Axis2CoreUIMessages.LABEL_CLIENT_SIDE);
-    
-    //client side buttons
-    syncAndAsyncRadioButton = new Button(codegenGroup, SWT.RADIO);
-    syncAndAsyncRadioButton.setText(Axis2CoreUIMessages.LABEL_SYNC_AND_ASYNC);
-    syncAndAsyncRadioButton.setVisible(true);
-    syncAndAsyncRadioButton.setSelection(
-        ((context.isSync() || context.isAsync())==false)
-        ?true
-        :(context.isSync()) && context.isAsync());
-    //context.setAsync(syncAndAsyncRadioButton.getSelection());
-    syncAndAsyncRadioButton.addSelectionListener(new SelectionListener() {
-      public void widgetSelected(SelectionEvent e) {
-        context.setAsync(syncAndAsyncRadioButton.getSelection());
-        context.setSync(syncAndAsyncRadioButton.getSelection());
-        
-      }
-      public void widgetDefaultSelected(SelectionEvent e) {
-      }
-    });
-
-    // Skip a column
-    new Label( codegenGroup, SWT.NONE );
-    
-    syncOnlyRadioButton = new Button(codegenGroup, SWT.RADIO);
-    syncOnlyRadioButton.setText(Axis2CoreUIMessages.LABEL_SYNC);
-    syncOnlyRadioButton.setSelection(context.isSync() && !context.isAsync() );
-    syncOnlyRadioButton.addSelectionListener(new SelectionListener() {
-      public void widgetSelected(SelectionEvent e) {
-        context.setAsync(!syncOnlyRadioButton.getSelection());
-        context.setSync(syncOnlyRadioButton.getSelection());
-      }
-      public void widgetDefaultSelected(SelectionEvent e) {
-      }
-    });
-    
-    // Skip a column
-    new Label( codegenGroup, SWT.NONE );
-
-    asyncOnlyRadioButton = new Button(codegenGroup, SWT.RADIO);
-    asyncOnlyRadioButton.setText(Axis2CoreUIMessages.LABEL_ASYNC);
-    asyncOnlyRadioButton.setSelection(context.isAsync() && !context.isSync());
-    asyncOnlyRadioButton.addSelectionListener(new SelectionListener() {
-      public void widgetSelected(SelectionEvent e) {
-        context.setAsync(asyncOnlyRadioButton.getSelection());
-        context.setSync(!asyncOnlyRadioButton.getSelection());
-      }
-      public void widgetDefaultSelected(SelectionEvent e) {
-      }
-    });
-    
-    //Data binding
-    Label clientDatabindingLabel = new Label( codegenGroup, SWT.NONE );
-    clientDatabindingLabel.setText( Axis2CoreUIMessages.LABEL_DATABINDING);
-    
-    clientDatabindingCombo = new Combo(codegenGroup,SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY);
-    clientDatabindingCombo.setItems(databindingItems);
-    clientDatabindingCombo.select(0);
-    context.setClientDatabinding(clientDatabindingCombo.getItem(0));
-    clientDatabindingCombo.addSelectionListener(new SelectionAdapter(){
-        public void widgetSelected(SelectionEvent e) {
-            context.setClientDatabinding(clientDatabindingCombo
-                .getItem(clientDatabindingCombo.getSelectionIndex()));
-        }
-    });
-    
-    // generate test case option
-    clientTestCaseCheckBoxButton = new Button(codegenGroup, SWT.CHECK);
-    clientTestCaseCheckBoxButton.setText(Axis2CoreUIMessages.LABEL_GENERATE_TESTCASE_CAPTION);
-    clientTestCaseCheckBoxButton.setSelection(context.isClientTestCase());
-    clientTestCaseCheckBoxButton.addSelectionListener(new SelectionListener() {
-      public void widgetSelected(SelectionEvent e) {
-        context.setClientTestCase(clientTestCaseCheckBoxButton.getSelection());
-      }
-
-      public void widgetDefaultSelected(SelectionEvent e) {
-      }
-    });
-    
-    gd = new GridData(GridData.FILL_HORIZONTAL);
-    gd.horizontalSpan = 2;
-    clientTestCaseCheckBoxButton.setLayoutData(gd);
-
-    // generate all
-    clientGenerateAllCheckBoxButton = new Button(codegenGroup, SWT.CHECK);
-    clientGenerateAllCheckBoxButton.setSelection(context.isClientGenerateAll());
-    clientGenerateAllCheckBoxButton.setText(Axis2CoreUIMessages.LABEL_GENERATE_ALL);
-    clientGenerateAllCheckBoxButton.addSelectionListener(new SelectionListener() {
-      public void widgetSelected(SelectionEvent e) {
-        context.setClientGenerateAll(clientGenerateAllCheckBoxButton.getSelection());
-      }
-      public void widgetDefaultSelected(SelectionEvent e) {
-      }
-    });
-    
-    gd = new GridData(GridData.FILL_HORIZONTAL);
-    gd.horizontalSpan = 2;
-    clientGenerateAllCheckBoxButton.setLayoutData(gd);
-    
-    ///////////////////////////////////////////////////////////////////////////////////////////
-
-    //seperator
-    Label seperatorLabel11 = new Label( codegenGroup, SWT.SEPARATOR | SWT.HORIZONTAL );
-    
-    gd = new GridData(GridData.FILL_HORIZONTAL);
-    gd.horizontalSpan = 2;
-    gd.verticalIndent=5;
-    seperatorLabel11.setLayoutData(gd);
-
-    ///AAR Options
-    Text aarLabel = new Text(codegenGroup,SWT.BACKGROUND | SWT.READ_ONLY);
-    aarLabel.setText( Axis2CoreUIMessages.LABEL_WEB_SERVICE_AAR);
-    
-    gd = new GridData(GridData.FILL_HORIZONTAL);
-    gd.horizontalSpan = 2;
-    gd.verticalIndent=5;
-    aarLabel.setLayoutData(gd);
-    
-    //aar extention 
-    Label aarExtentionLabel = new Label( codegenGroup, SWT.NONE );
-    aarExtentionLabel.setText( Axis2CoreUIMessages.LABEL_AAR_EXTENTION);
-    
-    //AAR extention items
-    final String[] aarExtentionItems = { Axis2Constants.AAR };
-    
-    aarExtensionCombo = new Combo(codegenGroup,SWT.DROP_DOWN | SWT.BORDER | SWT.READ_ONLY);
-    aarExtensionCombo.setItems(aarExtentionItems);
-    aarExtensionCombo.select(0);
-    context.setAarExtention( aarExtensionCombo.getItem(0) );
-    aarExtensionCombo.addSelectionListener(new SelectionAdapter(){
-        public void widgetSelected(SelectionEvent e) {
-            int index = aarExtensionCombo.getSelectionIndex();
-            context.setAarExtention(aarExtensionCombo.getItem(index));
-        }
-    });
-    
-        
-    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);
-      context.setAxis2RuntimeLocation( axis2Path.getText() );
-      if(isWar){
-        updateWarStatus(true);
-      }else{
-        updateWarStatus(false);
-      }
-    }
-  }
-  
-  private void statusUpdate(boolean status){
-    if(statusLabel != null){
-      if(!axis2Path.getText().equals("")){
-    if (status) {
-      statusLabel.setText(Axis2CoreUIMessages.LABEL_AXIS2_RUNTIME_LOAD);
-      this.setErrorMessage(null);
-    } else {
-      statusLabel.setText(Axis2CoreUIMessages.LABEL_AXIS2_RUNTIME_LOAD_ERROR);
-          //this.setErrorMessage(Axis2CoreUIMessages.LABEL_AXIS2_RUNTIME_LOAD_ERROR);
-    }
-      }else{
-        statusLabel.setText(Axis2CoreUIMessages.LABEL_AXIS2_RUNTIME_NOT_EXIT);
-      }
-    }
-  }
-  
-  private boolean runtimeExist(String path){
-    isWar=false;
-    File axis2HomeDir = new File(path);
-    if (axis2HomeDir.isDirectory()) {
-      String axis2LibPath = Axis2CoreUtils.addAnotherNodeToPath(
-                          axis2HomeDir.getAbsolutePath(),
-                          "lib");
-      String axis2WebappPath = Axis2CoreUtils.addAnotherNodeToPath(
-          axis2HomeDir.getAbsolutePath(),
-          "webapp");
-      if (new File(axis2LibPath).isDirectory() && new File(axis2WebappPath).isDirectory()) {
-        statusUpdate(true);
-        return true;
-      } else {
-        String axis2WarPath = Axis2CoreUtils.addAnotherNodeToPath(
-            path,
-            "axis2.war");
-        if (new File(axis2WarPath).isFile()) {
-          isWar = true;
-          statusUpdate(true);
-          return true;
-        } else {
-          statusUpdate(false);
-          return false;
-        }
-      }
-    }else{
-      statusUpdate(false);
-      return false;
-    }
-  }
-  
-  private void updateWarStatus(boolean status){
-    RuntimePropertyUtils.writeWarStausToPropertiesFile(status);
-  }
-  
-  private void storeValues(){
-      // get the persistent context from the plugin
-      context.setAxis2RuntimeLocation( axis2Path.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());
-	  context.setServiceInterfaceSkeleton(Axis2EmitterDefaults.isServiceInterfaceSkeleton());
-	  generateAllCheckBoxButton.setSelection(Axis2EmitterDefaults.isServiceGenerateAll());
-	  context.setServiceGenerateAll(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());
-	  context.setSync(Axis2EmitterDefaults.isClientSync());
-	  context.setAsync(Axis2EmitterDefaults.isClientAsync());
-	  clientTestCaseCheckBoxButton.setSelection(Axis2EmitterDefaults.isClientTestCase());
-	  context.setClientTestCase(Axis2EmitterDefaults.isClientTestCase());
-	  clientGenerateAllCheckBoxButton.setSelection(Axis2EmitterDefaults.isClientGenerateAll());
-	  context.setClientGenerateAll(Axis2EmitterDefaults.isClientGenerateAll());
-  }
-
-  /**
-   * Default button has been pressed.
-   */
-  protected void performDefaults() {
-	  super.performDefaults();
-	  initializeDefaults();
-  }
-
-  /**
-   * Apply button has been pressed.
-   */
-  protected void performApply() {
-	  super.performApply();
-  }
-
-  /**
-   * Cancel button has been pressed.
-   */	
-  public boolean performCancel() {
-	  return super.performCancel();
-  }
-
-  /**
-   * OK button has been pressed.
-   */	
-  public boolean performOk() {
-	  return super.performOk();
-  }
-  
-}
