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/.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 cdcf232..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.0
-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/build.properties b/bundles/org.eclipse.jst.ws.axis2.ui/build.properties
deleted file mode 100644
index d937ee6..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.ui/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
-# -------- -------- -----------------------------------------------------------
-# 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
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 d4f7638..0000000
--- a/bundles/org.eclipse.jst.ws.axis2.ui/src/org/eclipse/jst/ws/internal/axis2/consumption/ui/preferences/Axis2RuntimePreferencePage.java
+++ /dev/null
@@ -1,459 +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
- *******************************************************************************/
-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.plugin.data.ServerModel;
-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.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.DirectoryDialog;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.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 Label statusLabel;
-	@SuppressWarnings("unused")
-	private IStatus status = Status.OK_STATUS;
-	private boolean webappExist = false;
-	private boolean isWar = false;
-	private String statusBanner = null;
-	
-
-	  
-	protected Control createContents(Composite superparent) {
-		status = Status.OK_STATUS;
-		
-		final Composite  mainComp = new Composite( superparent, SWT.NONE );
-		
-		TabFolder axis2PreferenceTab = new TabFolder(mainComp, SWT.NONE);
-		TabItem runtimeInstalLocationItem = new TabItem(axis2PreferenceTab, SWT.NONE);
-		runtimeInstalLocationItem.setText(Axis2CoreUIMessages.AXIS2_RUNTIME);
-		runtimeInstalLocationItem.setToolTipText(Axis2CoreUIMessages.AXIS2_RUNTIME_TOOLTIP);
-		
-		//-----------------------------Axis2 Rintume Location Group------------------------------//
-		Group runtimeGroup = new Group(axis2PreferenceTab, SWT.NONE);
-		runtimeGroup.setText("Axis2 Rintume Location");
-		runtimeInstalLocationItem.setControl(runtimeGroup);
-		runtimeGroup.setToolTipText(Axis2CoreUIMessages.AXIS2_RUNTIME_TOOLTIP);
-		
-		Label label = new Label( runtimeGroup, SWT.NONE );
-		label.setText( Axis2CoreUIMessages.AXIS2_LOCATION );
-		label.setLocation(10,30);
-		label.setSize(100,20);
-		
-		axis2Path = new Text( runtimeGroup, SWT.BORDER );
-		String serverPath = null;
-		if (ServerModel.getAxis2ServerPath()==null||ServerModel.getAxis2ServerPath().equals("")){
-			serverPath = (RuntimePropertyUtils.getServerPathFromPropertiesFile() == null) ? "" 
-					: RuntimePropertyUtils.getServerPathFromPropertiesFile();
-			axis2Path.setText(serverPath);
-			ServerModel.setAxis2ServerPath( serverPath );
-		}else{
-			axis2Path.setText(ServerModel.getAxis2ServerPath());
-			serverPath = ServerModel.getAxis2ServerPath();
-		}
-
-		webappExist =runtimeExist(serverPath);
-		if(isWar){
-			updateWarStatus(true);
-		}else{
-			updateWarStatus(false);
-		}
-		axis2Path.setLocation(110,30);
-		axis2Path.setSize(400, 20);
-		axis2Path.addModifyListener( new ModifyListener(){
-			public void modifyText(ModifyEvent e){
-				ServerModel.setAxis2ServerPath( axis2Path.getText() );
-				webappExist =runtimeExist(axis2Path.getText());
-				status = RuntimePropertyUtils.writeServerPathToPropertiesFile(
-						axis2Path.getText());
-				if (webappExist) {
-					status = Status.OK_STATUS;
-					statusUpdate(true);
-				}else{
-					status = Status.CANCEL_STATUS;
-					statusUpdate(false);
-				}
-			}
-		});
-		browseButton = new Button( runtimeGroup, SWT.NONE );
-		browseButton.setText(Axis2CoreUIMessages.LABEL_BROUSE);
-		browseButton.setLocation(520,30);
-		browseButton.setSize(70, 20);
-		browseButton.addSelectionListener( new SelectionAdapter()
-		{
-			public void widgetSelected(SelectionEvent e)
-			{
-				handleBrowse(mainComp.getShell());
-			}     
-		}); 
-	
-		if(axis2Path.getText().equals(Axis2CoreUIMessages.NULL)){
-			status = new Status( IStatus.ERROR, 
-					"id", 
-					0, 
-					Axis2CoreUIMessages.ERROR_INVALID_AXIS2_SERVER_LOCATION, 
-					null ); 
-		}
-		
-		
-		statusLabel = new Label( runtimeGroup, SWT.NONE );
-		statusLabel.setLocation(20,100);
-		statusLabel.setSize(560,40);
-		statusLabel.setAlignment(SWT.CENTER);
-		
-		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());
-		
-		TabItem codegenPreferencesItem = new TabItem(axis2PreferenceTab, SWT.NONE);
-		codegenPreferencesItem.setText(Axis2CoreUIMessages.AXIS2_PREFERENCES);
-		codegenPreferencesItem.setToolTipText(Axis2CoreUIMessages.AXIS2_PREFERENCES_TOOLTIP);
-		
-		//--------------------------------Axis2 Runtime Preferences------------------------------//
-		
-		Group codegenGroup = new Group(axis2PreferenceTab, SWT.NONE);
-		codegenGroup.setText("Axis2 Runtime Preferences");
-		codegenPreferencesItem.setControl(codegenGroup);
-		codegenGroup.setToolTipText(Axis2CoreUIMessages.AXIS2_PREFERENCES_TOOLTIP);
-		
-		//Service Codegen Options
-		Label serviceCodegenLabel = new Label( codegenGroup, SWT.NONE );
-		serviceCodegenLabel.setText( Axis2CoreUIMessages.LABEL_WEB_SERVICE_CODEGEN);
-		serviceCodegenLabel.setLocation(10,30);
-		serviceCodegenLabel.setSize(200,20);
-		
-		//Data binding
-		Label databindingLabel = new Label( codegenGroup, SWT.NONE );
-		databindingLabel.setText( Axis2CoreUIMessages.LABEL_DATABINDING);
-		databindingLabel.setLocation(10,60);
-		databindingLabel.setSize(200,20);
-		
-		final Text databindingText = new Text( codegenGroup,SWT.BORDER );
-		databindingText.setText(ServerModel.getServiceDatabinding());
-		databindingText.addModifyListener( new ModifyListener() {
-			public void modifyText(ModifyEvent e){
-				ServerModel.setServiceDatabinding( databindingText.getText() );
-			}
-		});
-		databindingText.setLocation(220,60);
-		databindingText.setSize(100,20);
-		
-		// generate test case option
-		final Button testCaseCheckBoxButton = new Button(codegenGroup, SWT.CHECK);
-		testCaseCheckBoxButton.setText(Axis2CoreUIMessages.LABEL_GENERATE_TESTCASE_CAPTION);
-		testCaseCheckBoxButton.setSelection(ServerModel.isServiceTestcase());
-		testCaseCheckBoxButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				ServerModel.setServiceTestcase(testCaseCheckBoxButton.getSelection());
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-		testCaseCheckBoxButton.setLocation(10, 90);
-		testCaseCheckBoxButton.setSize(300, 15);
-
-		//model.setServerXMLCheck(true);
-
-		//the server side interface option
-		final Button generateServerSideInterfaceCheckBoxButton = 
-							new Button(codegenGroup, SWT.CHECK);
-		generateServerSideInterfaceCheckBoxButton.setText(
-				Axis2CoreUIMessages.LABEL_GENERATE_SERVERSIDE_INTERFACE);
-		generateServerSideInterfaceCheckBoxButton.setSelection(
-									ServerModel.isServiceInterfaceSkeleton());
-		generateServerSideInterfaceCheckBoxButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				ServerModel.setServiceInterfaceSkeleton(
-						generateServerSideInterfaceCheckBoxButton.getSelection());
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-		generateServerSideInterfaceCheckBoxButton.setLocation(10, 120);
-		generateServerSideInterfaceCheckBoxButton.setSize(300, 15);
-
-		// generate all
-		final Button generateAllCheckBoxButton = new Button(codegenGroup, SWT.CHECK);
-		generateAllCheckBoxButton.setSelection(ServerModel.isServiceGenerateAll());
-		generateAllCheckBoxButton.setText(Axis2CoreUIMessages.LABEL_GENERATE_ALL);
-		generateAllCheckBoxButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				ServerModel.setServiceGenerateAll(generateAllCheckBoxButton.getSelection());
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-		generateAllCheckBoxButton.setLocation(10, 150);
-		generateAllCheckBoxButton.setSize(350, 15);
-		
-		///////////////////////////////////////////////////////////////////////////////////////////
-		
-		//seperator
-		Label seperatorLabel0 = new Label( codegenGroup, SWT.SEPARATOR|SWT.BORDER);
-		seperatorLabel0.setLocation(10,185);
-		seperatorLabel0.setSize(570,1);
-		
-		///Client Codegen Options
-		Label clientCodegenLabel = new Label( codegenGroup, SWT.NONE );
-		clientCodegenLabel.setText( Axis2CoreUIMessages.LABEL_WEB_SERVICE_CLIENT_CODEGEN);
-		clientCodegenLabel.setLocation(10,200);
-		clientCodegenLabel.setSize(200,20);
-		
-		//Client type label 
-		Label clientLabel = new Label(codegenGroup, SWT.HORIZONTAL | SWT.NULL);
-		clientLabel.setText(Axis2CoreUIMessages.LABEL_CLIENT_SIDE);
-		clientLabel.setLocation(10,240);
-		clientLabel.setSize(70,20); 
-		
-		//client side buttons
-		final Button syncAndAsyncRadioButton = new Button(codegenGroup, SWT.RADIO);
-		syncAndAsyncRadioButton.setText(Axis2CoreUIMessages.LABEL_SYNC_AND_ASYNC);
-		syncAndAsyncRadioButton.setVisible(true);
-		syncAndAsyncRadioButton.setSelection(
-				((ServerModel.isAsync() || ServerModel.isSync())==false)
-				?true
-				:(ServerModel.isAsync() && ServerModel.isSync()));
-		syncAndAsyncRadioButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				ServerModel.setSync(syncAndAsyncRadioButton.getSelection());
-				ServerModel.setAsync(syncAndAsyncRadioButton.getSelection());
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-		syncAndAsyncRadioButton.setLocation(80,240);
-		syncAndAsyncRadioButton.setSize(190,20); 
-		
-		final Button syncOnlyRadioButton = new Button(codegenGroup, SWT.RADIO);
-		syncOnlyRadioButton.setText(Axis2CoreUIMessages.LABEL_SYNC);
-		syncOnlyRadioButton.setSelection(ServerModel.isSync() && !ServerModel.isAsync() );
-		syncOnlyRadioButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				ServerModel.setSync(syncOnlyRadioButton.getSelection());
-				ServerModel.setAsync(!syncOnlyRadioButton.getSelection());
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-		syncOnlyRadioButton.setLocation(280,240);
-		syncOnlyRadioButton.setSize(170,20); 
-
-		final Button asyncOnlyRadioButton = new Button(codegenGroup, SWT.RADIO);
-		asyncOnlyRadioButton.setText(Axis2CoreUIMessages.LABEL_ASYNC);
-		asyncOnlyRadioButton.setSelection(ServerModel.isAsync() && !ServerModel.isSync());
-		asyncOnlyRadioButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				ServerModel.setAsync(asyncOnlyRadioButton.getSelection());
-				ServerModel.setSync(!asyncOnlyRadioButton.getSelection());
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-		asyncOnlyRadioButton.setLocation(460,240);
-		asyncOnlyRadioButton.setSize(170,20);
-		
-		//Data binding
-		Label clientDatabindingLabel = new Label( codegenGroup, SWT.NONE );
-		clientDatabindingLabel.setText( Axis2CoreUIMessages.LABEL_DATABINDING);
-		clientDatabindingLabel.setLocation(10,270);
-		clientDatabindingLabel.setSize(200,20);
-		
-		final Text databindingText1 = new Text( codegenGroup, SWT.BORDER );
-		databindingText1.setText(ServerModel.getCleintDatabinding());
-		databindingText1.addModifyListener( new ModifyListener() {
-			public void modifyText(ModifyEvent e){
-				ServerModel.setAxis2ServerPath( databindingText1.getText() );
-			}
-		});
-		databindingText1.setLocation(220,270);
-		databindingText1.setSize(100,20);
-		
-		
-		// generate test case option
-		final Button clientTestCaseCheckBoxButton = new Button(codegenGroup, SWT.CHECK);
-		clientTestCaseCheckBoxButton.setText(Axis2CoreUIMessages.LABEL_GENERATE_TESTCASE_CAPTION);
-		clientTestCaseCheckBoxButton.setSelection(ServerModel.isClientTestcase());
-		clientTestCaseCheckBoxButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				ServerModel.setClientTestcase(clientTestCaseCheckBoxButton.getSelection());
-			}
-
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-		clientTestCaseCheckBoxButton.setLocation(10,300);
-		clientTestCaseCheckBoxButton.setSize(300, 15);
-
-
-		// generate all
-		final Button clientGenerateAllCheckBoxButton = new Button(codegenGroup, SWT.CHECK);
-		clientGenerateAllCheckBoxButton.setSelection(ServerModel.isClientGenerateAll());
-		clientGenerateAllCheckBoxButton.setText(Axis2CoreUIMessages.LABEL_GENERATE_ALL);
-		clientGenerateAllCheckBoxButton.addSelectionListener(new SelectionListener() {
-			public void widgetSelected(SelectionEvent e) {
-				ServerModel.setClientGenerateAll(clientGenerateAllCheckBoxButton.getSelection());
-			}
-			public void widgetDefaultSelected(SelectionEvent e) {
-			}
-		});
-		clientGenerateAllCheckBoxButton.setLocation(10, 330);
-		clientGenerateAllCheckBoxButton.setSize(400, 15);
-		
-		///////////////////////////////////////////////////////////////////////////////////////////
-
-		//seperator
-		Label seperatorLabel1 = new Label( codegenGroup, SWT.SEPARATOR|SWT.BORDER);
-		seperatorLabel1.setLocation(10,365);
-		seperatorLabel1.setSize(570,1);
-		
-		///AAR Options
-		Label aarLabel = new Label( codegenGroup, SWT.NONE );
-		aarLabel.setText( Axis2CoreUIMessages.LABEL_WEB_SERVICE_AAR);
-		aarLabel.setLocation(10,380);
-		aarLabel.setSize(200,20);
-		
-		//aar extention 
-		Label aarExtentionLabel = new Label( codegenGroup, SWT.NONE );
-		aarExtentionLabel.setText( Axis2CoreUIMessages.LABEL_AAR_EXTENTION);
-		aarExtentionLabel.setLocation(10,420);
-		aarExtentionLabel.setSize(200,20);
-		
-		final Text aarExtentionText = new Text( codegenGroup, SWT.BORDER);
-		aarExtentionText.setText(ServerModel.getAarExtention());
-		aarExtentionText.addModifyListener( new ModifyListener() {
-			public void modifyText(ModifyEvent e){
-				ServerModel.setAarExtention( aarExtentionText.getText() );
-			}
-		});
-		aarExtentionText.setLocation(220,420);
-		aarExtentionText.setSize(100,20);
-		
-
-		axis2PreferenceTab.setSize(640, 500);
-		
-	    return mainComp;
-	}
-
-	public void init(IWorkbench workbench) {
-		// TODO Auto-generated method stub
-	}
-	
-	  
-	/**
-	 * 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);
-			ServerModel.setAxis2ServerPath( 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){
-		ServerModel.setAxis2ServerPathRepresentsWar(status);
-		RuntimePropertyUtils.writeWarStausToPropertiesFile(status);
-	}
-	
-}
