diff --git a/core/org.eclipse.ptp.core.tests/.classpath b/core/org.eclipse.ptp.core.tests/.classpath
deleted file mode 100644
index 16d067f..0000000
--- a/core/org.eclipse.ptp.core.tests/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/core/org.eclipse.ptp.core.tests/.project b/core/org.eclipse.ptp.core.tests/.project
deleted file mode 100644
index 6c8add1..0000000
--- a/core/org.eclipse.ptp.core.tests/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.core.tests</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>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/core/org.eclipse.ptp.core.tests/.settings/org.eclipse.jdt.core.prefs b/core/org.eclipse.ptp.core.tests/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index d830758..0000000
--- a/core/org.eclipse.ptp.core.tests/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,74 +0,0 @@
-#Sat Nov 07 12:58:41 EST 2009
-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.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-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=warning
-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.fatalOptionalError=enabled
-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.missingHashCodeMethod=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-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=warning
-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.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=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=warning
-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.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-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.unusedParameterIncludeDocCommentReference=enabled
-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.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/core/org.eclipse.ptp.core.tests/META-INF/MANIFEST.MF b/core/org.eclipse.ptp.core.tests/META-INF/MANIFEST.MF
deleted file mode 100644
index b6a89eb..0000000
--- a/core/org.eclipse.ptp.core.tests/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,10 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.ptp.core.tests;singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-Vendor: %pluginProvider
-Require-Bundle: org.eclipse.core.runtime,
- org.junit,
- org.eclipse.ptp.core
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/core/org.eclipse.ptp.core.tests/build.properties b/core/org.eclipse.ptp.core.tests/build.properties
deleted file mode 100644
index 34d2e4d..0000000
--- a/core/org.eclipse.ptp.core.tests/build.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
diff --git a/core/org.eclipse.ptp.core.tests/plugin.properties b/core/org.eclipse.ptp.core.tests/plugin.properties
deleted file mode 100644
index b3cca65..0000000
--- a/core/org.eclipse.ptp.core.tests/plugin.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2010 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
-###############################################################################
-
-pluginName=PTP Core Tests
-pluginProvider=Eclipse PTP
diff --git a/core/org.eclipse.ptp.core.tests/src/org/eclipse/ptp/core/tests/AttributeIndexSetTests.java b/core/org.eclipse.ptp.core.tests/src/org/eclipse/ptp/core/tests/AttributeIndexSetTests.java
deleted file mode 100644
index 06c5a4d..0000000
--- a/core/org.eclipse.ptp.core.tests/src/org/eclipse/ptp/core/tests/AttributeIndexSetTests.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*******************************************************************************
-* Copyright (c) 2010 Los Alamos National Laboratory 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:
-* 	LANL - Initial API and implementation
-*******************************************************************************/
-
-package org.eclipse.ptp.core.tests;
-
-import java.util.Arrays;
-import java.util.BitSet;
-import java.util.HashSet;
-import java.util.Set;
-
-import junit.framework.TestCase;
-
-import org.eclipse.ptp.core.attributes.IllegalValueException;
-import org.eclipse.ptp.core.attributes.IntegerAttribute;
-import org.eclipse.ptp.core.attributes.IntegerAttributeDefinition;
-import org.eclipse.ptp.core.elements.attributes.AttributeIndexSet;
-
-
-/**
- * @author Randy M. Roberts
- *
- */
-public class AttributeIndexSetTests extends TestCase {
-	
-	private static void assertComplete(AttributeIndexSet<IntegerAttribute> indexSet) {
-		BitSet expected = indexSet.getIndexSet();
-		BitSet actual = new BitSet();
-		for (IntegerAttribute i1 : indexSet.getAttributes()) {
-			BitSet bs1 = indexSet.getIndexSet(i1);
-			actual.or(bs1);
-		}
-		assertEquals(expected, actual);
-	}
-	
-	private static void assertDisjoint(AttributeIndexSet<IntegerAttribute> indexSet) {
-		for (IntegerAttribute i1 : indexSet.getAttributes()) {
-			BitSet bs1 = indexSet.getIndexSet(i1);
-			for (IntegerAttribute i2 : indexSet.getAttributes()) {
-				if (i1.equals(i2)) {
-					continue;
-				}
-				BitSet bs2 = indexSet.getIndexSet(i2);
-				boolean intersects = bs1.intersects(bs2);
-				if (intersects) {
-					fail(bs1 + " and " + bs2 + " are not disjoint index sets");
-				}
-			}
-		}
-	}
-
-	/**
-	 * @param bitset
-	 * @param is
-	 */
-	private static void set(BitSet bitset, int[] is) {
-		for (int i : is) {
-			bitset.set(i);
-		}
-	}
-	
-	private IntegerAttributeDefinition definition;
-	
-	private AttributeIndexSet<IntegerAttribute> testingIndexSet;
-	
-	@Override
-	public void setUp() {
-		try {
-			testingIndexSet = new AttributeIndexSet<IntegerAttribute>();
-			final BitSet indices = new BitSet();
-			definition = new IntegerAttributeDefinition("xxx", "name", "description", true, -42);
-			IntegerAttribute attr;
-			
-			attr = definition.create(1);
-			indices.set(0, 5);
-			indices.set(100, 105);
-			testingIndexSet.setAttribute(attr, indices);
-			
-			attr = definition.create(3);
-			indices.clear();
-			indices.set(200, 205);
-			indices.set(300, 305);
-			testingIndexSet.setAttribute(attr, indices);
-			
-			attr = definition.create(5);
-			indices.clear();
-			set(indices, new int[]{1,101,201,301,401});
-			testingIndexSet.setAttribute(attr, indices);
-			
-		} catch (IllegalValueException e) {
-			fail(e.getMessage());
-		}
-	}
-	
-	@Override
-	public void tearDown() {
-		testingIndexSet = null;
-		definition = null;
-	}
-	
-	public void testClearAttributes() throws IllegalValueException {
-		BitSet clearedSet = new BitSet();
-		set(clearedSet, new int[]{2,102,202,302,402});
-		testingIndexSet.clearAttributes(clearedSet);
-		
-		assertDisjoint(testingIndexSet);
-		assertComplete(testingIndexSet);
-
-		BitSet expected;
-		BitSet actual;
-
-		expected = new BitSet();
-		set(expected, new int[]{0, 1, 3, 4, 100, 101, 103, 104, 200, 201, 203, 204, 300, 301, 303, 304, 401});
-		actual = testingIndexSet.getIndexSet();
-		assertEquals(expected, actual);
-		
-		expected = new BitSet();
-		set(expected, new int[]{0, 3, 4, 100, 103, 104});
-		actual = getIndexSet(testingIndexSet, 1);
-		assertEquals(expected, actual);
-		
-		expected = new BitSet();
-		set(expected, new int[]{200, 203, 204, 300, 303, 304});
-		actual = getIndexSet(testingIndexSet, 3);
-		assertEquals(expected, actual);
-		
-		expected = new BitSet();
-		set(expected, new int[]{1, 101, 201, 301, 401});
-		actual = getIndexSet(testingIndexSet, 5);
-		assertEquals(expected, actual);
-		
-		// let's do another clearAttributes
-		clearedSet.clear();
-		clearedSet.set(200, 400);
-		testingIndexSet.clearAttributes(clearedSet);
-		
-		assertDisjoint(testingIndexSet);
-		assertComplete(testingIndexSet);
-
-		expected.clear();
-		set(expected, new int[]{0, 1, 3, 4, 100, 101, 103, 104, 401});
-		actual = testingIndexSet.getIndexSet();
-		assertEquals(expected, actual);
-
-		expected = new BitSet();
-		set(expected, new int[]{0, 3, 4, 100, 103, 104});
-		actual = getIndexSet(testingIndexSet, 1);
-		assertEquals(expected, actual);
-		
-		actual = getIndexSet(testingIndexSet, 3);
-		assertTrue(actual.isEmpty());
-		
-		expected = new BitSet();
-		set(expected, new int[]{1, 101, 401});
-		actual = getIndexSet(testingIndexSet, 5);
-		assertEquals(expected, actual);
-		
-		Set<IntegerAttribute> actualAttrs = testingIndexSet.getAttributes();
-		Set<IntegerAttribute> expectedAttrs = new HashSet<IntegerAttribute>(
-				Arrays.asList(definition.create(1),	definition.create(5)));
-		assertEquals(expectedAttrs, actualAttrs);
-	}
-	
-	public void testGetAttributes() throws IllegalValueException {
-		Set<IntegerAttribute> expected = new HashSet<IntegerAttribute>();
-		expected.add(definition.create(1));
-		expected.add(definition.create(3));
-		expected.add(definition.create(5));
-		Set<IntegerAttribute> actual = testingIndexSet.getAttributes();
-		assertEquals(expected, actual);
-	}
-	
-	public void testGetAtttribute() throws IllegalValueException {
-		IntegerAttribute ia;
-		ia = testingIndexSet.getAttribute(1);		
-		assertEquals(definition.create(5), ia);
-		
-		ia = testingIndexSet.getAttribute(2);		
-		assertEquals(definition.create(1), ia);
-		
-		ia = testingIndexSet.getAttribute(500);		
-		assertNull(ia);
-	}
-
-	public void testSubset() throws IllegalValueException {
-		final BitSet expected = new BitSet();
-		BitSet actual;
-
-		BitSet subSet = new BitSet();
-		subSet.set(3, 5);
-		subSet.set(103, 201);
-		AttributeIndexSet<IntegerAttribute> results = testingIndexSet.getSubset(subSet);
-
-		assertDisjoint(results);
-		assertComplete(results);
-
-		set(expected, new int[]{3,4,103,104,200});
-		actual = results.getIndexSet();
-		assertEquals(expected, actual);
-
-		expected.clear();
-		set(expected, new int[]{3,4,103,104});
-		actual = getIndexSet(results, 1);
-		assertEquals(expected, actual);
-
-		expected.clear();
-		set(expected, new int[]{200});
-		actual = getIndexSet(results, 3);
-		assertEquals(expected, actual);
-
-		actual = getIndexSet(results, 5);
-		assertTrue(actual.isEmpty());
-	}
-
-	public void testValIndexSetupByAttr1() throws IllegalValueException {
-		BitSet expected = new BitSet();
-		set(expected, new int[]{0, 2, 3, 4, 100, 102, 103, 104});
-		
-		BitSet actual = getIndexSet(testingIndexSet, 1);
-		assertEquals(expected, actual);
-	}
-	
-	public void testValIndexSetupByAttr2() throws IllegalValueException {
-		BitSet actual = getIndexSet(testingIndexSet, 2);
-		assertTrue(actual.isEmpty());
-	}
-	
-	public void testValIndexSetupByAttr3() throws IllegalValueException {
-		BitSet expected = new BitSet();
-		set(expected, new int[]{200, 202, 203, 204, 300, 302, 303, 304});
-		
-		BitSet actual = getIndexSet(testingIndexSet, 3);
-		assertEquals(expected, actual);
-	}
-
-	public void testValIndexSetupByAttr5() throws IllegalValueException {
-		BitSet expected = new BitSet();
-		set(expected, new int[]{1,101,201,301,401});
-		
-		BitSet actual = getIndexSet(testingIndexSet, 5);
-		assertEquals(expected, actual);
-	}
-
-	public void testValIndexSetupIsComplete() {
-		assertComplete(testingIndexSet);
-	}
-
-	public void testValIndexSetupIsDisjoint() {
-		assertDisjoint(testingIndexSet);
-	}
-	
-	public void testValIndexSetupTotalBitSet() {
-		BitSet expected = new BitSet();
-		set(expected, new int[]{0, 1, 2, 3, 4, 100, 101, 102, 103, 104, 200, 201, 202, 203, 204, 300, 301, 302, 303, 304, 401});
-		assertEquals(expected, testingIndexSet.getIndexSet());
-	}
-	
-	private BitSet getIndexSet(AttributeIndexSet<IntegerAttribute> indexSet, int value) throws IllegalValueException {
-		return indexSet.getIndexSet(definition.create(value));
-	}
-}
diff --git a/core/org.eclipse.ptp.core.tests/src/org/eclipse/ptp/core/tests/RangeSetTests.java b/core/org.eclipse.ptp.core.tests/src/org/eclipse/ptp/core/tests/RangeSetTests.java
deleted file mode 100644
index 0ba5cd0..0000000
--- a/core/org.eclipse.ptp.core.tests/src/org/eclipse/ptp/core/tests/RangeSetTests.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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 - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ptp.core.tests;
-
-import junit.framework.TestCase;
-
-public class RangeSetTests extends TestCase {
-	
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	@Override
-	protected void setUp() throws Exception {
-		
-	}
-
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#tearDown()
-	 */
-	@Override
-	protected void tearDown() throws Exception {
-		
-	}
-	
-}
diff --git a/core/org.eclipse.ptp.core.tests/src/org/eclipse/ptp/core/tests/suite/CoreTestSuite.java b/core/org.eclipse.ptp.core.tests/src/org/eclipse/ptp/core/tests/suite/CoreTestSuite.java
deleted file mode 100644
index 0a285a9..0000000
--- a/core/org.eclipse.ptp.core.tests/src/org/eclipse/ptp/core/tests/suite/CoreTestSuite.java
+++ /dev/null
@@ -1,28 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 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 - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ptp.core.tests.suite;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.ptp.core.tests.AttributeIndexSetTests;
-import org.eclipse.ptp.core.tests.RangeSetTests;
-
-public class CoreTestSuite {
-	public static Test suite() {
-		TestSuite suite = new TestSuite(CoreTestSuite.class.getName());
-		
-		suite.addTestSuite(RangeSetTests.class);
-		suite.addTestSuite(AttributeIndexSetTests.class);
-		return suite;
-	}
-
-}
diff --git a/core/org.eclipse.ptp.remote.core.tests/.classpath b/core/org.eclipse.ptp.remote.core.tests/.classpath
deleted file mode 100644
index 64c5e31..0000000
--- a/core/org.eclipse.ptp.remote.core.tests/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<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="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/core/org.eclipse.ptp.remote.core.tests/.project b/core/org.eclipse.ptp.remote.core.tests/.project
deleted file mode 100644
index 9f0f2fe..0000000
--- a/core/org.eclipse.ptp.remote.core.tests/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.remote.core.tests</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>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/core/org.eclipse.ptp.remote.core.tests/.settings/org.eclipse.jdt.core.prefs b/core/org.eclipse.ptp.remote.core.tests/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index d830758..0000000
--- a/core/org.eclipse.ptp.remote.core.tests/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,74 +0,0 @@
-#Sat Nov 07 12:58:41 EST 2009
-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.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-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=warning
-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.fatalOptionalError=enabled
-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.missingHashCodeMethod=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-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=warning
-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.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=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=warning
-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.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-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.unusedParameterIncludeDocCommentReference=enabled
-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.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/core/org.eclipse.ptp.remote.core.tests/META-INF/MANIFEST.MF b/core/org.eclipse.ptp.remote.core.tests/META-INF/MANIFEST.MF
deleted file mode 100644
index 7c44467..0000000
--- a/core/org.eclipse.ptp.remote.core.tests/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,17 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.ptp.remote.core.tests;singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-Vendor: %pluginProvider
-Require-Bundle: org.eclipse.core.runtime,
- org.junit,
- org.eclipse.ptp.remote.core;bundle-version="3.0.0",
- org.eclipse.ptp.remote.ui;bundle-version="3.0.0",
- com.jcraft.jsch;bundle-version="0.1.41",
- org.eclipse.core.filesystem;bundle-version="1.2.0",
- org.eclipse.core.tests.harness;bundle-version="3.5.0",
- org.eclipse.ptp.remotetools.core;bundle-version="2.1.9",
- org.eclipse.ptp.remote.remotetools.core;bundle-version="3.0.0",
- org.eclipse.ptp.remotetools.environment.core;bundle-version="1.3.3"
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/core/org.eclipse.ptp.remote.core.tests/build.properties b/core/org.eclipse.ptp.remote.core.tests/build.properties
deleted file mode 100644
index 34d2e4d..0000000
--- a/core/org.eclipse.ptp.remote.core.tests/build.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
diff --git a/core/org.eclipse.ptp.remote.core.tests/plugin.properties b/core/org.eclipse.ptp.remote.core.tests/plugin.properties
deleted file mode 100755
index 99a7365..0000000
--- a/core/org.eclipse.ptp.remote.core.tests/plugin.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2009 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
-###############################################################################
-
-pluginName=PTP Remote Core Tests
-pluginProvider=Eclipse PTP
diff --git a/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/core/tests/FileStoreTests.java b/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/core/tests/FileStoreTests.java
deleted file mode 100644
index 6b5f26d..0000000
--- a/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/core/tests/FileStoreTests.java
+++ /dev/null
@@ -1,147 +0,0 @@
-package org.eclipse.ptp.core.tests;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.net.URI;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.tests.harness.CoreTest;
-import org.eclipse.ptp.remote.core.IRemoteConnection;
-import org.eclipse.ptp.remote.core.IRemoteConnectionManager;
-import org.eclipse.ptp.remote.core.IRemoteFileManager;
-import org.eclipse.ptp.remote.core.IRemoteServices;
-import org.eclipse.ptp.remote.core.PTPRemoteCorePlugin;
-import org.eclipse.ptp.remote.core.exception.RemoteConnectionException;
-
-public class FileStoreTests extends CoreTest {
-	private static final String CONNECTION_NAME = "test_connection";
-	private static final String USERNAME = "user";
-	private static final String PASSWORD = "password";
-	private static final String HOST = "localhost";
-	private static final String PATH1 = "/home/user/sftp_test";
-	private static final String PATH2 = PATH1 + "/.file1";
-	private static final String TEST_STRING = "a string containing fairly *()(*&^$%## random text";
-
-	private IRemoteServices fRemoteServices;
-	private IRemoteConnection fRemoteConnection;
-	private IRemoteFileManager fRemoteFileManager;
-	
-	public void testFileStore() {
-		URI	path1Uri = fRemoteFileManager.toURI(PATH1);
-		URI	path2Uri = fRemoteFileManager.toURI(PATH2);
-		assertNotNull(path1Uri);
-		assertNotNull(path2Uri);
-		
-		IFileStore store1 = null;
-		IFileStore store2 = null;
-		
-		try {
-			store1 = EFS.getStore(path1Uri);
-			store2 = EFS.getStore(path2Uri);
-		} catch (CoreException e) {
-			fail("2.0", e);
-		}
-		
-		for (int i = 0; i < 5; i++) {
-			assertFalse(store1.fetchInfo().exists());
-			try {
-				store1.mkdir(EFS.NONE, null);
-			} catch (CoreException e) {
-				fail("3.0", e);
-			}
-			assertTrue(store1.fetchInfo().exists());
-			
-			assertFalse(store2.fetchInfo().exists());
-			try {
-				OutputStream stream = store2.openOutputStream(EFS.NONE, null);
-				assertNotNull(stream);
-				BufferedWriter buf = new BufferedWriter(new OutputStreamWriter(stream));
-				buf.write(TEST_STRING);
-				buf.close();
-			} catch (Exception e) {
-				fail("4.0", e);
-			}
-			assertTrue(store2.fetchInfo().exists());
-			
-			try {
-				InputStream stream = store2.openInputStream(EFS.NONE, null);
-				assertNotNull(stream);
-				BufferedReader buf = new BufferedReader(new InputStreamReader(stream));
-				String line = buf.readLine().trim();
-				assertTrue(line.equals(TEST_STRING));
-				buf.close();
-			} catch (Exception e) {
-				fail("5.0", e);
-			}
-	
-			try {
-				store2.delete(EFS.NONE, null);
-			} catch (CoreException e) {
-				fail("6.0", e);
-			}
-			assertFalse(store2.fetchInfo().exists());
-	
-			try {
-				store1.delete(EFS.NONE, null);
-			} catch (CoreException e) {
-				fail("7.0", e);
-			}
-			assertFalse(store1.fetchInfo().exists());
-		}
-
-	}
-
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	@Override
-	protected void setUp() throws Exception {
-		fRemoteServices = PTPRemoteCorePlugin.getDefault().getRemoteServices("org.eclipse.ptp.remote.RemoteTools");
-		assertNotNull(fRemoteServices);
-		
-		IRemoteConnectionManager connMgr = fRemoteServices.getConnectionManager();
-		assertNotNull(connMgr);
-		
-		Map<String, String> map = new HashMap<String, String>();
-		map.put("ptp.localhost-selection", "false");
-		map.put("ptp.login-username", USERNAME);
-		map.put("ptp.login-password", PASSWORD);
-		map.put("ptp.connection-address", HOST);
-		map.put("ptp.connection-port", "22");
-		map.put("ptp.key-path", "");
-		map.put("ptp.key-passphrase", "");
-		map.put("ptp.is-passwd-auth", "true");
-		map.put("ptp.connection-timeout", "5");
-		map.put("ptp.cipher-type", "default");
-		
-		try {
-			fRemoteConnection = connMgr.newConnection(CONNECTION_NAME, map);
-		} catch (RemoteConnectionException e) {
-			fail(e.getLocalizedMessage());
-		}
-		assertNotNull(fRemoteConnection);
-		
-		fRemoteFileManager = fRemoteServices.getFileManager(fRemoteConnection);
-		assertNotNull(fRemoteFileManager);
-	}
-
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#tearDown()
-	 */
-	@Override
-	protected void tearDown() throws Exception {
-		fRemoteConnection.close();
-		IRemoteConnectionManager connMgr = fRemoteServices.getConnectionManager();
-		assertNotNull(connMgr);
-		connMgr.removeConnection(fRemoteConnection);
-	}
-	
-}
diff --git a/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/core/tests/RemoteConnectionTests.java b/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/core/tests/RemoteConnectionTests.java
deleted file mode 100644
index 46f7159..0000000
--- a/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/core/tests/RemoteConnectionTests.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package org.eclipse.ptp.core.tests;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.HashMap;
-import java.util.Map;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.ptp.remote.core.IRemoteConnection;
-import org.eclipse.ptp.remote.core.IRemoteConnectionManager;
-import org.eclipse.ptp.remote.core.IRemoteProcess;
-import org.eclipse.ptp.remote.core.IRemoteProcessBuilder;
-import org.eclipse.ptp.remote.core.IRemoteServices;
-import org.eclipse.ptp.remote.core.PTPRemoteCorePlugin;
-import org.eclipse.ptp.remote.core.exception.RemoteConnectionException;
-
-public class RemoteConnectionTests extends TestCase {
-	private static final String USERNAME = "user"; //$NON-NLS-1$
-	private static final String PASSWORD = "password"; //$NON-NLS-1$
-	private static final String HOST = "localhost"; //$NON-NLS-1$
-	
-	private IRemoteServices fRemoteServices;
-	private IRemoteConnection fRemoteConnection;
-	
-	public void testEnv() {
-		String var = fRemoteConnection.getEnv("SHELL"); //$NON-NLS-1$
-		assertNotNull(var);
-		
-		var = fRemoteConnection.getEnv("FOO_VAR_SHOULD_NOT_BE_DEFINED"); //$NON-NLS-1$
-		assertNull(var);
-		
-		assertNotNull(fRemoteConnection.getProperty("os.name")); //$NON-NLS-1$
-		assertNotNull(fRemoteConnection.getProperty("os.arch")); //$NON-NLS-1$
-		assertNotNull(fRemoteConnection.getProperty("os.version")); //$NON-NLS-1$
-		assertNotNull(fRemoteConnection.getProperty("file.separator")); //$NON-NLS-1$
-		assertNotNull(fRemoteConnection.getProperty("path.separator")); //$NON-NLS-1$
-		assertNotNull(fRemoteConnection.getProperty("line.separator")); //$NON-NLS-1$
-		
-		IRemoteProcessBuilder builder = fRemoteServices.getProcessBuilder(fRemoteConnection, "env"); //$NON-NLS-1$
-		builder.environment().put("FOO", "BAR"); //$NON-NLS-1$ //$NON-NLS-2$
-		builder.environment().put("USER", "FOO"); //$NON-NLS-1$ //$NON-NLS-2$
-		try {
-			IRemoteProcess proc = builder.start();
-			BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream()));
-			String line;
-			while ((line = stdout.readLine()) != null) {
-				String[] kv = line.trim().split("="); //$NON-NLS-1$
-				assertTrue(kv.length == 2);
-				if (kv[0].equals("FOO")) assertTrue(kv[1].equals("BAR")); //$NON-NLS-1$ //$NON-NLS-2$
-				if (kv[0].equals("USER")) assertTrue(kv[1].equals("FOO")); //$NON-NLS-1$ //$NON-NLS-2$
-			}
-		} catch (IOException e) {
-			fail();
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	@Override
-	protected void setUp() throws Exception {
-		fRemoteServices = PTPRemoteCorePlugin.getDefault().getRemoteServices("org.eclipse.ptp.remote.RemoteTools"); //$NON-NLS-1$
-		assertNotNull(fRemoteServices);
-		
-		IRemoteConnectionManager connMgr = fRemoteServices.getConnectionManager();
-		assertNotNull(connMgr);
-		
-		Map<String, String> map = new HashMap<String, String>();
-		map.put("ptp.localhost-selection", "false"); //$NON-NLS-1$ //$NON-NLS-2$
-		map.put("ptp.login-username", USERNAME); //$NON-NLS-1$
-		map.put("ptp.login-password", PASSWORD); //$NON-NLS-1$
-		map.put("ptp.connection-address", HOST); //$NON-NLS-1$
-		map.put("ptp.connection-port", "22"); //$NON-NLS-1$ //$NON-NLS-2$
-		map.put("ptp.key-path", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		map.put("ptp.key-passphrase", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		map.put("ptp.is-passwd-auth", "true"); //$NON-NLS-1$ //$NON-NLS-2$
-		map.put("ptp.connection-timeout", "5"); //$NON-NLS-1$ //$NON-NLS-2$
-		map.put("ptp.cipher-type", "default"); //$NON-NLS-1$ //$NON-NLS-2$
-		
-		try {
-			fRemoteConnection = connMgr.newConnection("test_connection", map); //$NON-NLS-1$
-		} catch (RemoteConnectionException e) {
-			fail(e.getLocalizedMessage());
-		}
-		assertNotNull(fRemoteConnection);
-		
-		try {
-			fRemoteConnection.open(new NullProgressMonitor());
-		} catch (RemoteConnectionException e) {
-			fail(e.getLocalizedMessage());
-		}
-		assertTrue(fRemoteConnection.isOpen());
-	}
-
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#tearDown()
-	 */
-	@Override
-	protected void tearDown() throws Exception {
-		fRemoteConnection.close();
-		IRemoteConnectionManager connMgr = fRemoteServices.getConnectionManager();
-		assertNotNull(connMgr);
-		connMgr.removeConnection(fRemoteConnection);
-	}
-	
-}
diff --git a/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/core/tests/RemoteCopyTests.java b/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/core/tests/RemoteCopyTests.java
deleted file mode 100644
index da22130..0000000
--- a/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/core/tests/RemoteCopyTests.java
+++ /dev/null
@@ -1,185 +0,0 @@
-package org.eclipse.ptp.core.tests;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.HashMap;
-import java.util.Map;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.ptp.remote.remotetools.core.RemoteToolsServices;
-import org.eclipse.ptp.remote.remotetools.core.environment.PTPTargetControl;
-import org.eclipse.ptp.remotetools.core.IRemoteExecutionManager;
-import org.eclipse.ptp.remotetools.core.IRemoteExecutionTools;
-import org.eclipse.ptp.remotetools.core.IRemoteScript;
-import org.eclipse.ptp.remotetools.core.RemoteProcess;
-import org.eclipse.ptp.remotetools.environment.EnvironmentPlugin;
-import org.eclipse.ptp.remotetools.environment.core.TargetElement;
-import org.eclipse.ptp.remotetools.environment.core.TargetTypeElement;
-import org.eclipse.ptp.remotetools.exception.CancelException;
-import org.eclipse.ptp.remotetools.exception.RemoteConnectionException;
-import org.eclipse.ptp.remotetools.exception.RemoteExecutionException;
-
-public class RemoteCopyTests extends TestCase {
-	private static final String USERNAME = "user"; //$NON-NLS-1$
-	private static final String PASSWORD = "password"; //$NON-NLS-1$
-	private static final String HOST = "localhost"; //$NON-NLS-1$
-	
-	private PTPTargetControl fTargetControl;
-	private IRemoteExecutionManager fExecutionManager;
-	private IRemoteExecutionTools fExecutionTools;
-	private TargetTypeElement fTarget;
-	private TargetElement fElement;
-	
-	public void testCopy() {
-		for (int i = 0; i < 50; i++) {
-			IRemoteScript script = fExecutionTools.createScript();
-			script.setScript("echo hi there");
-			RemoteProcess p = null;
-			try {
-				p = fExecutionTools.executeProcess(script);
-			} catch (RemoteExecutionException e) {
-				fail();
-			} catch (RemoteConnectionException e) {
-				fail();
-			} catch (CancelException e) {
-				fail();
-			}
-			assertNotNull(p);
-			BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
-			try {
-				String line;
-				while ((line = br.readLine()) != null) {
-					System.out.println("read \""+line+"\"");
-					assertTrue(line.startsWith("hi there"));
-				}
-			} catch (IOException e) {
-				fail();
-			}
-//			try {
-//				p.waitFor();
-//			} catch (InterruptedException e) {
-//			}
-		}
-		
-//		IRemoteScript script = fExecutionTools.createScript();
-//		script.setScript("cat > /tmp/xxx.script");
-//		RemoteProcess p = null;
-//		try {
-//			p = fExecutionTools.executeProcess(script);
-//		} catch (RemoteExecutionException e) {
-//			fail();
-//		} catch (RemoteConnectionException e) {
-//			fail();
-//		} catch (CancelException e) {
-//			fail();
-//		}
-//		assertNotNull(p);
-//		BufferedWriter b = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
-//		try {
-//			b.write("this is a test\n");
-//			b.write("this is a test2\n");
-//			b.close();
-//		} catch (IOException e) {
-//			fail();
-//		}
-//		try {
-//			p.waitFor();
-//		} catch (InterruptedException e) {
-//		}
-//	
-//		script = fExecutionTools.createScript();
-//		script.setScript("cat >> /tmp/xxx.script");
-//		p = null;
-//		try {
-//			p = fExecutionTools.executeProcess(script);
-//		} catch (RemoteExecutionException e) {
-//			fail();
-//		} catch (RemoteConnectionException e) {
-//			fail();
-//		} catch (CancelException e) {
-//			fail();
-//		}
-//		assertNotNull(p);
-//		b = new BufferedWriter(new OutputStreamWriter(p.getOutputStream()));
-//		try {
-//			b.write("this is a test4\n");
-//			b.write("this is a test5\n");
-//			b.close();
-//		} catch (IOException e) {
-//			fail();
-//		}
-//		try {
-//			p.waitFor();
-//		} catch (InterruptedException e) {
-//		}
-//		
-//		script = fExecutionTools.createScript();
-//		script.setScript("cat < /tmp/xxx.script");
-//		p = null;
-//		try {
-//			p = fExecutionTools.executeProcess(script);
-//		} catch (RemoteExecutionException e) {
-//			fail();
-//		} catch (RemoteConnectionException e) {
-//			fail();
-//		} catch (CancelException e) {
-//			fail();
-//		}
-//		assertNotNull(p);
-//		BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
-//		try {
-//			String line;
-//			while ((line = br.readLine()) != null) {
-//				System.out.println("read \""+line+"\"");
-//			}
-//		} catch (IOException e) {
-//			fail();
-//		}
-//		try {
-//			p.waitFor();
-//		} catch (InterruptedException e) {
-//		}
-
-	}
-
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	@Override
-	protected void setUp() throws Exception {
-		Map<String, String> map = new HashMap<String, String>();
-		map.put("ptp.localhost-selection", "false"); //$NON-NLS-1$ //$NON-NLS-2$
-		map.put("ptp.login-username", USERNAME); //$NON-NLS-1$
-		map.put("ptp.login-password", PASSWORD); //$NON-NLS-1$
-		map.put("ptp.connection-address", HOST); //$NON-NLS-1$
-		map.put("ptp.connection-port", "22"); //$NON-NLS-1$ //$NON-NLS-2$
-		map.put("ptp.key-path", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		map.put("ptp.key-passphrase", ""); //$NON-NLS-1$ //$NON-NLS-2$
-		map.put("ptp.is-passwd-auth", "true"); //$NON-NLS-1$ //$NON-NLS-2$
-		map.put("ptp.connection-timeout", "5"); //$NON-NLS-1$ //$NON-NLS-2$
-		map.put("ptp.cipher-type", "default"); //$NON-NLS-1$ //$NON-NLS-2$
-		
-		fTarget = RemoteToolsServices.getTargetTypeElement();
-		String id = EnvironmentPlugin.getDefault().getEnvironmentUniqueID();
-		TargetElement element = new TargetElement(fTarget, HOST, map, id);
-		fTarget.addElement(element);
-		fTargetControl = (PTPTargetControl)element.getControl();
-		fTargetControl.create(new NullProgressMonitor());
-		fExecutionManager = fTargetControl.createExecutionManager();
-		fExecutionTools = fExecutionManager.getExecutionTools();
-		assertNotNull(fExecutionTools);
-	}
-
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#tearDown()
-	 */
-	@Override
-	protected void tearDown() throws Exception {
-		fExecutionManager.close();
-		fTarget.removeElement(fElement);
-	}
-	
-}
diff --git a/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/core/tests/SFTPTests.java b/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/core/tests/SFTPTests.java
deleted file mode 100644
index 07e04f7..0000000
--- a/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/core/tests/SFTPTests.java
+++ /dev/null
@@ -1,191 +0,0 @@
-package org.eclipse.ptp.core.tests;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-
-import junit.framework.TestCase;
-
-import com.jcraft.jsch.ChannelSftp;
-import com.jcraft.jsch.JSch;
-import com.jcraft.jsch.Session;
-import com.jcraft.jsch.SftpATTRS;
-import com.jcraft.jsch.SftpException;
-import com.jcraft.jsch.UIKeyboardInteractive;
-import com.jcraft.jsch.UserInfo;
-
-public class SFTPTests extends TestCase {
-	private static final String USERNAME = "user"; //$NON-NLS-1$
-	private static final String PASSWORD = "password"; //$NON-NLS-1$
-	private static final String HOST = "localhost"; //$NON-NLS-1$
-	private static final String PATH1 = "/home/user/sftp_test"; //$NON-NLS-1$
-	private static final String PATH2 = PATH1 + "/.file1"; //$NON-NLS-1$
-	private static final String TEST_STRING = "a string containing fairly *()(*&^$%## random text"; //$NON-NLS-1$
-	
-	
-	private class SSHUserInfo implements UserInfo, UIKeyboardInteractive {
-		private SSHUserInfo() { }
-
-		public String getPassword() {
-			return PASSWORD;
-		}
-		
-		public void setPassword(String password) {
-		}
-
-		public boolean promptYesNo(String str) {
-			return true;
-		}
-
-		public String getPassphrase() {
-			return "";
-		}
-		
-		public void setPassphrase(String passphrase) {
-		}
-
-		public boolean promptPassphrase(String message) {
-			return false;
-		}
-
-		public boolean promptPassword(String message) {
-			return true;
-		}
-		
-		public void setUsePassword(boolean usePassword) {
-		}
-
-		public void showMessage(String message) {
-		}
-
-		public String[] promptKeyboardInteractive(final String destination,
-				final String name, final String instruction,
-				final String[] prompt, final boolean[] echo) {
-			if (prompt.length != 1
-					|| echo[0] != false) {
-				return null;
-			}
-			String[] response = new String[1];
-			response[0] = PASSWORD;
-			return response;
-		}
-	}
-	
-	private JSch jsch;
-	private Session session;
-	private ChannelSftp sftp;
-	
-	public void testSftp() {
-		for (int i = 0; i < 5; i++) {
-			System.out.print("starting test... ");
-			
-			// stat
-			SftpATTRS attrs = null;
-			try {
-				attrs = sftp.stat(PATH1);
-			} catch (SftpException e) {
-				assertTrue(e.id == ChannelSftp.SSH_FX_NO_SUCH_FILE);
-			} catch (Exception e) {
-				fail(e.getLocalizedMessage());
-			}
-			assertNull(attrs);
-			
-			// mkdir
-			
-			try {
-				sftp.mkdir(PATH1);
-			} catch (Exception e) {
-				fail(e.getLocalizedMessage());
-			}
-			attrs = null;
-			try {
-				attrs = sftp.stat(PATH1);
-			} catch (Exception e) {
-				fail(e.getLocalizedMessage());
-			}
-			assertNotNull(attrs);
-			assertTrue(attrs.isDir());
-			
-			// test write
-			attrs = null;
-			try {
-				attrs = sftp.stat(PATH2);
-			} catch (SftpException e) {
-				assertTrue(e.id == ChannelSftp.SSH_FX_NO_SUCH_FILE);
-			} catch (Exception e) {
-				fail(e.getLocalizedMessage());
-			}
-			assertNull(attrs);
-			
-			try {
-				OutputStream stream = sftp.put(PATH2);
-				assertNotNull(stream);
-				BufferedWriter buf = new BufferedWriter(new OutputStreamWriter(stream));
-				buf.write(TEST_STRING);
-				buf.close();
-			} catch (Exception e) {
-				fail(e.getLocalizedMessage());
-			}
-			
-			attrs = null;
-			try {
-				attrs = sftp.stat(PATH2);
-			} catch (Exception e) {
-				fail(e.getLocalizedMessage());
-			}
-			assertNotNull(attrs);
-	
-			// read
-			try {
-				InputStream stream = sftp.get(PATH2);
-				assertNotNull(stream);
-				BufferedReader buf = new BufferedReader(new InputStreamReader(stream));
-				String line = buf.readLine().trim();
-				assertTrue(line.equals(TEST_STRING));
-				buf.close();
-			} catch (Exception e) {
-				fail(e.getLocalizedMessage());
-			}
-			
-			try {
-				sftp.rm(PATH2);
-			} catch (SftpException e) {
-				fail(e.getLocalizedMessage());
-			}
-			
-			try {
-				sftp.rmdir(PATH1);
-			} catch (SftpException e) {
-				fail(e.getLocalizedMessage());
-			}
-			
-			System.out.println("completed");
-		}
-	}
-
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	@Override
-	protected void setUp() throws Exception {
-		jsch = new JSch();
-		session = jsch.getSession(USERNAME, HOST);
-		session.setUserInfo(new SSHUserInfo());
-		session.connect();
-		sftp = (ChannelSftp) session.openChannel("sftp");
-		sftp.connect();
-	}
-
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#tearDown()
-	 */
-	@Override
-	protected void tearDown() throws Exception {
-		sftp.disconnect();
-		session.disconnect();
-	}
-	
-}
diff --git a/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/remote/core/tests/suite/FileManagerTestSuite.java b/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/remote/core/tests/suite/FileManagerTestSuite.java
deleted file mode 100644
index b0c6a94..0000000
--- a/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/remote/core/tests/suite/FileManagerTestSuite.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.eclipse.ptp.remote.core.tests.suite;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.ptp.core.tests.FileStoreTests;
-import org.eclipse.ptp.core.tests.RemoteConnectionTests;
-import org.eclipse.ptp.core.tests.SFTPTests;
-
-public class FileManagerTestSuite {
-	public static Test suite() {
-		TestSuite suite = new TestSuite(FileManagerTestSuite.class.getName());
-		
-		suite.addTestSuite(FileStoreTests.class);
-		suite.addTestSuite(RemoteConnectionTests.class);
-		suite.addTestSuite(SFTPTests.class);
-		return suite;
-	}
-
-}
diff --git a/core/org.eclipse.ptp.utils.core.tests/.classpath b/core/org.eclipse.ptp.utils.core.tests/.classpath
deleted file mode 100644
index 64c5e31..0000000
--- a/core/org.eclipse.ptp.utils.core.tests/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<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="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/core/org.eclipse.ptp.utils.core.tests/.project b/core/org.eclipse.ptp.utils.core.tests/.project
deleted file mode 100644
index 8a5e69f..0000000
--- a/core/org.eclipse.ptp.utils.core.tests/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.utils.core.tests</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>
-		<buildCommand>
-			<name>org.eclipse.pde.api.tools.apiAnalysisBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.api.tools.apiAnalysisNature</nature>
-	</natures>
-</projectDescription>
diff --git a/core/org.eclipse.ptp.utils.core.tests/.settings/org.eclipse.jdt.core.prefs b/core/org.eclipse.ptp.utils.core.tests/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index d830758..0000000
--- a/core/org.eclipse.ptp.utils.core.tests/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,74 +0,0 @@
-#Sat Nov 07 12:58:41 EST 2009
-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.comparingIdentical=warning
-org.eclipse.jdt.core.compiler.problem.deadCode=warning
-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=warning
-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.fatalOptionalError=enabled
-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.missingHashCodeMethod=ignore
-org.eclipse.jdt.core.compiler.problem.missingOverrideAnnotation=ignore
-org.eclipse.jdt.core.compiler.problem.missingSerialVersion=warning
-org.eclipse.jdt.core.compiler.problem.missingSynchronizedOnInheritedMethod=ignore
-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=warning
-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.potentialNullReference=ignore
-org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning
-org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=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=warning
-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.unusedDeclaredThrownExceptionExemptExceptionAndThrowable=enabled
-org.eclipse.jdt.core.compiler.problem.unusedDeclaredThrownExceptionIncludeDocCommentReference=enabled
-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.unusedParameterIncludeDocCommentReference=enabled
-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.unusedWarningToken=warning
-org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/core/org.eclipse.ptp.utils.core.tests/META-INF/MANIFEST.MF b/core/org.eclipse.ptp.utils.core.tests/META-INF/MANIFEST.MF
deleted file mode 100644
index fea9f4d..0000000
--- a/core/org.eclipse.ptp.utils.core.tests/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,10 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.ptp.utils.core.tests;singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-Vendor: %pluginProvider
-Require-Bundle: org.eclipse.core.runtime,
- org.junit,
- org.eclipse.ptp.utils.core;bundle-version="1.0.0"
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/core/org.eclipse.ptp.utils.core.tests/build.properties b/core/org.eclipse.ptp.utils.core.tests/build.properties
deleted file mode 100644
index 34d2e4d..0000000
--- a/core/org.eclipse.ptp.utils.core.tests/build.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
diff --git a/core/org.eclipse.ptp.utils.core.tests/plugin.properties b/core/org.eclipse.ptp.utils.core.tests/plugin.properties
deleted file mode 100644
index c8959a9..0000000
--- a/core/org.eclipse.ptp.utils.core.tests/plugin.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-###############################################################################
-# Copyright (c) 2009 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
-###############################################################################
-
-pluginName=PTP Remote Core Tests
-pluginProvider=Eclipse PTP
diff --git a/core/org.eclipse.ptp.utils.core.tests/src/org/eclipse/ptp/utils/core/tests/ArgumentParserTests.java b/core/org.eclipse.ptp.utils.core.tests/src/org/eclipse/ptp/utils/core/tests/ArgumentParserTests.java
deleted file mode 100644
index 188def4..0000000
--- a/core/org.eclipse.ptp.utils.core.tests/src/org/eclipse/ptp/utils/core/tests/ArgumentParserTests.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/package org.eclipse.ptp.utils.core.tests;
-
-import junit.framework.TestCase;
-
-import org.eclipse.ptp.utils.core.ArgumentParser;
-
-public class ArgumentParserTests extends TestCase {
-	
-	public void testFileStore() {
-		ArgumentParser parser = new ArgumentParser("foobar", new String[] {"arg1", "arg2", "arg\\3", "arg\"4", "arg'5", "more arguments"}); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$ //$NON-NLS-6$ //$NON-NLS-7$
-		assertEquals("foobar arg1 arg2 arg\\3 arg\"4 arg'5 more\\ arguments", parser.getCommandLine(false));
-		assertEquals("foobar arg1 arg2 arg\\\\3 arg\\\"4 arg\\'5 more\\ arguments", parser.getCommandLine(true));
-		
-		parser = new ArgumentParser(" foo");
-		assertEquals("foo", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo ");
-		assertEquals("foo", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo");
-		assertEquals("foo", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a");
-		assertEquals("foo a", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo  a");
-		assertEquals("foo a", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a ");
-		assertEquals("foo a", parser.getCommandLine(true));
-		parser = new ArgumentParser(" foo a");
-		assertEquals("foo a", parser.getCommandLine(true));
-		parser = new ArgumentParser(" foo a ");
-		assertEquals("foo a", parser.getCommandLine(true));
-		parser = new ArgumentParser(" foo   a ");
-		assertEquals("foo a", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo	a");
-		assertEquals("foo a", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a	");
-		assertEquals("foo a", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo	a	");
-		assertEquals("foo a", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a b");
-		assertEquals("foo a b", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a b ");
-		assertEquals("foo a b", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a b c ");
-		assertEquals("foo a b c", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo\\ a b");
-		assertEquals("foo\\ a b", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo \\ab");
-		assertEquals("foo ab", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a\\ b\\ c ");
-		assertEquals("foo a\\ b\\ c", parser.getCommandLine(true));
-		parser = new ArgumentParser("\\foo a b c ");
-		assertEquals("foo a b c", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a b c\\");
-		assertEquals("foo a b c", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a \\b c");
-		assertEquals("foo a b c", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a\\'c b");
-		assertEquals("foo a\\'c b", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a\\\"c b");
-		assertEquals("foo a\\\"c b", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a \\'c b");
-		assertEquals("foo a \\'c b", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a \\\"c b");
-		assertEquals("foo a \\\"c b", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a\\' c b");
-		assertEquals("foo a\\' c b", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a\\\" c b");
-		assertEquals("foo a\\\" c b", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a \\' c b");
-		assertEquals("foo a \\' c b", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a \\\" c b");
-		assertEquals("foo a \\\" c b", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a c b\\'");
-		assertEquals("foo a c b\\'", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a c b\\\"");
-		assertEquals("foo a c b\\\"", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a c b \\'");
-		assertEquals("foo a c b \\\'", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a c b \\\"");
-		assertEquals("foo a c b \\\"", parser.getCommandLine(true));
-		parser = new ArgumentParser("\\'foo a c b");
-		assertEquals("\\\'foo a c b", parser.getCommandLine(true));
-		parser = new ArgumentParser("\\\"foo a c b");
-		assertEquals("\\\"foo a c b", parser.getCommandLine(true));
-		parser = new ArgumentParser("\\' foo a c b");
-		assertEquals("\\\' foo a c b", parser.getCommandLine(true));
-		parser = new ArgumentParser("\\\" foo a c b");		
-		assertEquals("\\\" foo a c b", parser.getCommandLine(true));
-		parser = new ArgumentParser("'foo a' b c d");
-		assertEquals("foo\\ a b c d", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a b 'c d'");
-		assertEquals("foo a b c\\ d", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a 'b c' d");
-		assertEquals("foo a b\\ c d", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a 'b\\e' d");
-		assertEquals("foo a b\\\\e d", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a \"b\\e\" d");
-		assertEquals("foo a b\\\\e d", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a 'b c d");
-		assertEquals("foo a b\\ c\\ d", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a \"b c d");
-		assertEquals("foo a b\\ c\\ d", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a \"b c\" d");
-		assertEquals("foo a b\\ c d", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a \"b c\"d");
-		assertEquals("foo a b\\ cd", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a 'b c' d");
-		assertEquals("foo a b\\ c d", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a 'b c'd");
-		assertEquals("foo a b\\ cd", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a 'b \" c' d");
-		assertEquals("foo a b\\ \\\"\\ c d", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a \"b ' c\" d");
-		assertEquals("foo a b\\ \\'\\ c d", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a 'b \\\" c' d");
-		assertEquals("foo a b\\ \\\\\\\"\\ c d", parser.getCommandLine(true));
-		parser = new ArgumentParser("foo a \"b \' c\" d");		
-		assertEquals("foo a b\\ \\'\\ c d", parser.getCommandLine(true));
-		parser = new ArgumentParser(new String[] {});
-		assertEquals("", parser.getCommandLine(true));
-		parser = new ArgumentParser(new String[] {"a"});
-		assertEquals("a", parser.getCommandLine(true));
-		parser = new ArgumentParser(new String[] {"av"});
-		assertEquals("av", parser.getCommandLine(true));
-		parser = new ArgumentParser(new String[] {"a d"});
-		assertEquals("a\\ d", parser.getCommandLine(true));
-		parser = new ArgumentParser(new String[] {"a", "a"});
-		assertEquals("a a", parser.getCommandLine(true));
-		parser = new ArgumentParser(new String[] {"av", "a"});
-		assertEquals("av a", parser.getCommandLine(true));
-		parser = new ArgumentParser(new String[] {"a d", "a"});
-		assertEquals("a\\ d a", parser.getCommandLine(true));
-		parser = new ArgumentParser(new String[] {"a", "b b"});
-		assertEquals("a b\\ b", parser.getCommandLine(true));
-		parser = new ArgumentParser(new String[] {"av", "b b"});
-		assertEquals("av b\\ b", parser.getCommandLine(true));
-		parser = new ArgumentParser(new String[] {"a d", "b b"});
-		assertEquals("a\\ d b\\ b", parser.getCommandLine(true));
-	}
-}
diff --git a/core/org.eclipse.ptp.utils.core.tests/src/org/eclipse/ptp/utils/core/tests/suite/UtilsCoreTestSuite.java b/core/org.eclipse.ptp.utils.core.tests/src/org/eclipse/ptp/utils/core/tests/suite/UtilsCoreTestSuite.java
deleted file mode 100644
index f2ce2a5..0000000
--- a/core/org.eclipse.ptp.utils.core.tests/src/org/eclipse/ptp/utils/core/tests/suite/UtilsCoreTestSuite.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ptp.utils.core.tests.suite;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.ptp.utils.core.tests.ArgumentParserTests;
-
-public class UtilsCoreTestSuite {
-	public static Test suite() {
-		TestSuite suite = new TestSuite(UtilsCoreTestSuite.class.getName());
-		
-		suite.addTestSuite(ArgumentParserTests.class);
-		return suite;
-	}
-
-}
diff --git a/rdt/org.eclipse.ptp.rdt.server.dstore/.classpath b/rdt/org.eclipse.ptp.rdt.server.dstore/.classpath
deleted file mode 100644
index 64c5e31..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<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="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/rdt/org.eclipse.ptp.rdt.server.dstore/.cvsignore b/rdt/org.eclipse.ptp.rdt.server.dstore/.cvsignore
deleted file mode 100644
index 4f2c660..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-rdt-server.jar
diff --git a/rdt/org.eclipse.ptp.rdt.server.dstore/.project b/rdt/org.eclipse.ptp.rdt.server.dstore/.project
deleted file mode 100644
index 530413b..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.rdt.server.dstore.dstore</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/rdt/org.eclipse.ptp.rdt.server.dstore/.settings/org.eclipse.jdt.core.prefs b/rdt/org.eclipse.ptp.rdt.server.dstore/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 2757620..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,8 +0,0 @@
-#Fri Apr 16 11:16:54 EDT 2010
-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.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/rdt/org.eclipse.ptp.rdt.server.dstore/META-INF/MANIFEST.MF b/rdt/org.eclipse.ptp.rdt.server.dstore/META-INF/MANIFEST.MF
deleted file mode 100644
index a4d56c8..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,26 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.ptp.rdt.server.dstore;singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-Activator: org.eclipse.ptp.rdt.server.dstore.Activator
-Bundle-Vendor: %pluginProvider
-Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.core.resources;bundle-version="3.6.0",
- org.eclipse.core.filesystem;bundle-version="1.3.0",
- org.eclipse.dstore.core;bundle-version="3.1.1",
- org.eclipse.jface;bundle-version="3.6.0",
- org.eclipse.ui;bundle-version="3.6.0",
- org.eclipse.cdt.core;bundle-version="5.2.0",
- org.eclipse.ptp.remote.core;bundle-version="4.0.0",
- org.eclipse.ptp.services.core;bundle-version="1.0.0",
- org.eclipse.ptp.rdt.core;bundle-version="1.1.0",
- org.eclipse.ptp.remote.ui;bundle-version="3.0.0",
- org.eclipse.ptp.services.ui;bundle-version="1.0.0",
- org.eclipse.ptp.rdt.ui;bundle-version="2.0.0",
- org.eclipse.rse.connectorservice.dstore;bundle-version="3.1.1",
- org.eclipse.rse.core;bundle-version="3.1.1"
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-ActivationPolicy: lazy
-Export-Package: org.eclipse.ptp.rdt.server.dstore.core,
- org.eclipse.ptp.rdt.server.dstore.ui
diff --git a/rdt/org.eclipse.ptp.rdt.server.dstore/about.html b/rdt/org.eclipse.ptp.rdt.server.dstore/about.html
deleted file mode 100755
index 48f115f..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/about.html
+++ /dev/null
@@ -1,22 +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">
-<h2>About This Content</h2>
- 
-<p>June 12, 2008</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; 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 (&quot;Redistributor&quot;) 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.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/rdt/org.eclipse.ptp.rdt.server.dstore/build.properties b/rdt/org.eclipse.ptp.rdt.server.dstore/build.properties
deleted file mode 100644
index d505140..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/build.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               about.html,\
-               plugin.properties,\
-               rdt-server.jar
diff --git a/rdt/org.eclipse.ptp.rdt.server.dstore/plugin.properties b/rdt/org.eclipse.ptp.rdt.server.dstore/plugin.properties
deleted file mode 100755
index 81dfcc9..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/plugin.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-###############################################################################
-# Copyright (c) 2008, 2010 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
-###############################################################################
-pluginName=RDT DStore Server
-providerName=Eclipse.org
-RemoteToolsCIndexingService.name=Remote Tools DStore C/C++ Indexing Service
-RemoteToolsDStoreServer.name=Remote Tools DStore Server
\ No newline at end of file
diff --git a/rdt/org.eclipse.ptp.rdt.server.dstore/plugin.xml b/rdt/org.eclipse.ptp.rdt.server.dstore/plugin.xml
deleted file mode 100644
index 55a982e..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/plugin.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-        <extension
-           point="org.eclipse.ptp.remote.core.remoteServer">
-        <remoteServer
-              class="org.eclipse.ptp.rdt.server.dstore.core.DStoreServer"
-              id="org.eclipse.ptp.rdt.server.dstore.RemoteToolsDStoreServer"
-              launchCommand="java -Xms64m -Xmx128m -Xss2m -DA_PLUGIN_PATH=. -DDSTORE_TRACING_ON=false -Dclient.username=$USER -DDSTORE_SPIRIT_ON=true -jar ${payload} 0 60000"
-              name="%RemoteToolsDStoreServer.name"
-              payload="rdt-server.jar">
-        </remoteServer>
-     </extension>
-        <extension
-              point="org.eclipse.ptp.services.core.providers">
-           <provider
-                 class="org.eclipse.ptp.rdt.server.dstore.core.RemoteToolsCIndexServiceProvider"
-                 id="org.eclipse.ptp.rdt.server.dstore.RemoteToolsCIndexServiceProvider"
-                 name="%RemoteToolsCIndexingService.name"
-                 serviceId="org.eclipse.ptp.rdt.core.CIndexingService">
-           </provider>
-        </extension>
-        <extension
-           point="org.eclipse.ptp.services.ui.providerContributors">
-        <providerContributor
-              class="org.eclipse.ptp.rdt.server.dstore.ui.RemoteToolsCIndexServiceProviderContributer"
-              id="org.eclipse.ptp.rdt.server.dstore.ui.RemoteToolsCIndexServiceProvider">
-        </providerContributor>
-     </extension>
-</plugin>
diff --git a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/Activator.java b/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/Activator.java
deleted file mode 100644
index a9705af..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/Activator.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package org.eclipse.ptp.rdt.server.dstore;
-
-import org.eclipse.core.runtime.Plugin;
-import org.eclipse.ptp.rdt.server.dstore.internal.core.DebugUtil;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class Activator extends Plugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.ptp.rdt.server.dstore"; //$NON-NLS-1$
-
-	// The shared instance
-	private static Activator plugin;
-
-	/**
-	 * The constructor
-	 */
-	public Activator() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext)
-	 */
-	@Override
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		plugin = this;
-		DebugUtil.configurePluginDebugOptions();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext)
-	 */
-	@Override
-	public void stop(BundleContext context) throws Exception {
-		plugin = null;
-		super.stop(context);
-	}
-
-	/**
-	 * Returns the shared instance
-	 * 
-	 * @return the shared instance
-	 */
-	public static Activator getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/core/DStoreServer.java b/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/core/DStoreServer.java
deleted file mode 100644
index ff307fd..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/core/DStoreServer.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 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
- *******************************************************************************/
-package org.eclipse.ptp.rdt.server.dstore.core;
-
-import org.eclipse.dstore.core.client.ClientConnection;
-import org.eclipse.dstore.core.client.ConnectionStatus;
-import org.eclipse.dstore.core.model.DataStore;
-import org.eclipse.ptp.rdt.server.dstore.internal.core.DebugUtil;
-import org.eclipse.ptp.rdt.server.dstore.messages.Messages;
-import org.eclipse.ptp.remote.core.exception.RemoteConnectionException;
-import org.eclipse.ptp.remote.launch.core.AbstractRemoteServerRunner;
-
-public class DStoreServer extends AbstractRemoteServerRunner {
-	public static String SERVER_ID = "org.eclipse.ptp.rdt.server.dstore.RemoteToolsDStoreServer"; //$NON-NLS-1$
-
-	private enum DStoreState {
-		STARTING, WAITING, STARTED
-	};
-
-	private DStoreState fState = DStoreState.STARTING;
-	private ClientConnection fDStoreConnection = null;
-	private int fDStorePort = 0;
-
-	private static final String SUCCESS_STRING = "Server Started Successfully";  //$NON-NLS-1$
-
-	public DStoreServer() {
-		super(Messages.DStoreServer_0);
-	}
-
-	public DataStore getDataStore() {
-		if (fDStoreConnection == null) {
-			fDStoreConnection = new ClientConnection(getRemoteConnection().getName());
-		}
-		return fDStoreConnection.getDataStore();
-	}
-
-	@Override
-	protected void doFinishServer() {
-		if (fDStoreConnection != null) {
-			fDStoreConnection.disconnect();
-			fDStoreConnection = null;
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.remote.launch.core.AbstractRemoteServerRunner#doRestartServer
-	 * ()
-	 */
-	@Override
-	protected boolean doRestartServer() {
-		fState = DStoreState.STARTING;
-		return true;
-	}
-
-	@Override
-	protected boolean doStartServer() {
-		int port;
-		try {
-			port = getRemoteConnection().forwardLocalPort("localhost", fDStorePort, null); //$NON-NLS-1$
-		} catch (RemoteConnectionException e) {
-			if (DebugUtil.SERVER_TRACING) {
-				System.err.println(Messages.DStoreServer_1 + e.getLocalizedMessage()); 
-			}
-			return false;
-		}
-		fDStoreConnection.setHost("localhost"); //$NON-NLS-1$
-		fDStoreConnection.setPort(Integer.toString(port));
-		if (DebugUtil.SERVER_TRACING) {
-			System.out.println(Messages.DStoreServer_2); 
-		}
-		ConnectionStatus status = fDStoreConnection.connect(null, 0);
-		DataStore dataStore = fDStoreConnection.getDataStore();
-		dataStore.showTicket(null);
-		dataStore.registerLocalClassLoader(getClass().getClassLoader());
-		if (DebugUtil.SERVER_TRACING) {
-			System.out.println(Messages.DStoreServer_3); 
-		}
-		return status.isConnected();
-	}
-
-	@Override
-	protected boolean doVerifyServerRunningFromStderr(String output) {
-		switch (fState) {
-		case STARTING:
-			if (output.startsWith(SUCCESS_STRING)) {
-				fState = DStoreState.WAITING;
-			}
-			break;
-
-		case WAITING:
-			if (output.matches("^[0-9]+$")) { //$NON-NLS-1$
-				fDStorePort = Integer.parseInt(output);
-				fState = DStoreState.STARTED;
-			}
-			break;
-
-		case STARTED:
-			return true;
-		}
-
-		return false;
-	}
-
-	@Override
-	protected boolean doVerifyServerRunningFromStdout(String output) {
-		return false;
-	}
-}
diff --git a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/core/RemoteToolsCIndexServiceProvider.java b/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/core/RemoteToolsCIndexServiceProvider.java
deleted file mode 100644
index 47adee5..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/core/RemoteToolsCIndexServiceProvider.java
+++ /dev/null
@@ -1,402 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008, 2009 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 - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ptp.rdt.server.dstore.core;
-
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.ptp.internal.rdt.core.callhierarchy.ICallHierarchyService;
-import org.eclipse.ptp.internal.rdt.core.callhierarchy.RemoteCallHierarchyService;
-import org.eclipse.ptp.internal.rdt.core.includebrowser.IIncludeBrowserService;
-import org.eclipse.ptp.internal.rdt.core.includebrowser.RemoteIncludeBrowserService;
-import org.eclipse.ptp.internal.rdt.core.index.IIndexLifecycleService;
-import org.eclipse.ptp.internal.rdt.core.index.RemoteIndexLifecycleService;
-import org.eclipse.ptp.internal.rdt.core.model.IModelBuilderService;
-import org.eclipse.ptp.internal.rdt.core.model.RemoteModelBuilderService;
-import org.eclipse.ptp.internal.rdt.core.navigation.INavigationService;
-import org.eclipse.ptp.internal.rdt.core.navigation.RemoteNavigationService;
-import org.eclipse.ptp.internal.rdt.core.typehierarchy.ITypeHierarchyService;
-import org.eclipse.ptp.internal.rdt.core.typehierarchy.RemoteTypeHierarchyService;
-import org.eclipse.ptp.internal.rdt.ui.contentassist.IContentAssistService;
-import org.eclipse.ptp.internal.rdt.ui.contentassist.RemoteContentAssistService;
-import org.eclipse.ptp.internal.rdt.ui.search.ISearchService;
-import org.eclipse.ptp.internal.rdt.ui.search.RemoteSearchService;
-import org.eclipse.ptp.rdt.server.dstore.messages.Messages;
-import org.eclipse.ptp.rdt.ui.serviceproviders.IRemoteToolsIndexServiceProvider;
-import org.eclipse.ptp.remote.core.IRemoteConnection;
-import org.eclipse.ptp.remote.core.IRemoteServices;
-import org.eclipse.ptp.remote.core.PTPRemoteCorePlugin;
-import org.eclipse.ptp.services.core.IServiceProvider;
-import org.eclipse.ptp.services.core.IServiceProviderWorkingCopy;
-import org.eclipse.ptp.services.core.ServiceProvider;
-
-public class RemoteToolsCIndexServiceProvider extends ServiceProvider implements IRemoteToolsIndexServiceProvider,
-		IServiceProviderWorkingCopy {
-
-	protected IIndexLifecycleService fIndexLifecycleService = null;
-	protected INavigationService fNavigationService = null;
-	protected ICallHierarchyService fCallHierarchyService = null;
-	protected ITypeHierarchyService fTypeHierarchyService = null;
-	protected IIncludeBrowserService fIncludeBrowserService = null;
-	protected IModelBuilderService fModelBuilderService = null;
-	protected RemoteSearchService fSearchService = null;
-	protected IContentAssistService fContentAssistService = null;
-	protected RemoteToolsCIndexSubsystem fSubsystem = null;
-	protected boolean fIsDirty = false;
-	protected RemoteToolsCIndexServiceProvider fProvider = null;
-	protected boolean fIsConfigured = false;
-
-	public static final String NAME = Messages.RemoteToolsCIndexServiceProvider_0;
-	public static final String SERVICE_ID = "org.eclipse.ptp.rdt.core.CIndexingService"; //$NON-NLS-1$
-
-	private static final String SERVICE_ID_KEY = "service-name"; //$NON-NLS-1$
-	private static final String CONNECTION_NAME_KEY = "connection-name"; //$NON-NLS-1$
-	private static final String INDEX_LOCATION_KEY = "index-location"; //$NON-NLS-1$
-
-	public RemoteToolsCIndexServiceProvider() {
-	}
-
-	public RemoteToolsCIndexServiceProvider(RemoteToolsCIndexServiceProvider provider) {
-		fProvider = provider;
-		setProperties(provider.getProperties());
-		setDescriptor(provider.getDescriptor());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.services.core.ServiceProvider#copy()
-	 */
-	@Override
-	public IServiceProviderWorkingCopy copy() {
-		return new RemoteToolsCIndexServiceProvider(this);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rdt.core.serviceproviders.IIndexServiceProvider#
-	 * getCallHierarchyService()
-	 */
-	public synchronized ICallHierarchyService getCallHierarchyService() {
-		if (!isConfigured())
-			return null;
-
-		if (fCallHierarchyService == null)
-			fCallHierarchyService = new RemoteCallHierarchyService(fSubsystem);
-
-		return fCallHierarchyService;
-	}
-
-	/**
-	 * Get the host name for this connection.
-	 * 
-	 * @return host name
-	 */
-	public String getConnectionName() {
-		return getString(CONNECTION_NAME_KEY, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rdt.ui.serviceproviders.IIndexServiceProvider2#
-	 * getContentAssistService()
-	 */
-	public IContentAssistService getContentAssistService() {
-		if (!isConfigured())
-			return null;
-
-		if (fContentAssistService == null)
-			fContentAssistService = new RemoteContentAssistService(fSubsystem);
-
-		return fContentAssistService;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rdt.core.serviceproviders.IIndexServiceProvider#
-	 * getIncludeBrowserService()
-	 */
-	public synchronized IIncludeBrowserService getIncludeBrowserService() {
-		if (!isConfigured())
-			return null;
-
-		if (fIncludeBrowserService == null)
-			fIncludeBrowserService = new RemoteIncludeBrowserService(fSubsystem);
-
-		return fIncludeBrowserService;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rdt.core.serviceproviders.IIndexServiceProvider#
-	 * getIndexLifeCycleService()
-	 */
-	public synchronized IIndexLifecycleService getIndexLifeCycleService() {
-		if (!isConfigured())
-			return null;
-
-		if (fIndexLifecycleService == null)
-			fIndexLifecycleService = new RemoteIndexLifecycleService(fSubsystem);
-
-		return fIndexLifecycleService;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rdt.core.serviceproviders.IIndexServiceProvider#
-	 * getIndexLocation()
-	 */
-	public String getIndexLocation() {
-		initialize();
-		return getString(INDEX_LOCATION_KEY, ""); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rdt.core.serviceproviders.IIndexServiceProvider#
-	 * getModelBuilderService()
-	 */
-	public synchronized IModelBuilderService getModelBuilderService() {
-		if (!isConfigured())
-			return null;
-
-		if (fModelBuilderService == null)
-			fModelBuilderService = new RemoteModelBuilderService(fSubsystem);
-
-		return fModelBuilderService;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rdt.core.serviceproviders.IIndexServiceProvider#
-	 * getNavigationService()
-	 */
-	public synchronized INavigationService getNavigationService() {
-		if (!isConfigured())
-			return null;
-
-		if (fNavigationService == null)
-			fNavigationService = new RemoteNavigationService(fSubsystem);
-
-		return fNavigationService;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.services.core.IServiceProviderWorkingCopy#getOriginal()
-	 */
-	public IServiceProvider getOriginal() {
-		return fProvider;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.rdt.ui.serviceproviders.IRemoteToolsIndexServiceProvider#
-	 * getConnection()
-	 */
-	public IRemoteConnection getConnection() {
-		if (!isConfigured()) {
-			return null;
-		}
-		return getRemoteServices().getConnectionManager().getConnection(getConnectionName());
-	}
-
-	private IRemoteServices getRemoteServices() {
-		if (!isConfigured()) {
-			return null;
-		}
-		return PTPRemoteCorePlugin.getDefault().getRemoteServices(getServiceId());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rdt.ui.serviceproviders.IIndexServiceProvider2#
-	 * getSearchService()
-	 */
-	public ISearchService getSearchService() {
-		if (!isConfigured())
-			return null;
-
-		if (fSearchService == null)
-			fSearchService = new RemoteSearchService(fSubsystem);
-
-		return fSearchService;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.services.core.ServiceProvider#getServiceId()
-	 */
-	@Override
-	public String getServiceId() {
-		return getString(SERVICE_ID_KEY, null);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rdt.core.serviceproviders.IIndexServiceProvider#
-	 * getTypeHierarchyService()
-	 */
-	public synchronized ITypeHierarchyService getTypeHierarchyService() {
-		if (!isConfigured())
-			return null;
-
-		if (fTypeHierarchyService == null)
-			fTypeHierarchyService = new RemoteTypeHierarchyService(fSubsystem);
-
-		return fTypeHierarchyService;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.services.core.IServiceProvider#isConfigured()
-	 */
-	public boolean isConfigured() {
-		initialize();
-		return fIsConfigured;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.services.core.IServiceProviderWorkingCopy#isDirty()
-	 */
-	public boolean isDirty() {
-		return fIsDirty;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.services.core.ServiceProvider#putString(java.lang.String,
-	 * java.lang.String)
-	 */
-	@Override
-	public void putString(String key, String value) {
-		fIsDirty = true;
-		super.putString(key, value);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.services.core.IServiceProviderWorkingCopy#save()
-	 */
-	public void save() {
-		if (fProvider != null) {
-			fProvider.setProperties(getProperties());
-			fIsDirty = false;
-		}
-	}
-
-	/**
-	 * @param isConfigured
-	 */
-	public void setConfigured(boolean isConfigured) {
-		fIsConfigured = isConfigured;
-	}
-
-	/**
-	 * Set a new connection for this service provider. This will reset the index
-	 * and DStore server locations to their default values.
-	 * 
-	 * @param connection
-	 *            new connection
-	 */
-	public void setConnection(IRemoteConnection connection) {
-		setConnection(connection, true);
-	}
-
-	/**
-	 * Set the host name for this connection
-	 * 
-	 * @param hostName
-	 */
-	public void setConnectionName(String connectionName) {
-		putString(CONNECTION_NAME_KEY, connectionName);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.rdt.core.serviceproviders.IIndexServiceProvider#
-	 * setIndexLocation(java.lang.String)
-	 */
-	public void setIndexLocation(String path) {
-		putString(INDEX_LOCATION_KEY, path);
-	}
-
-	/**
-	 * @param serviceId
-	 */
-	public void setServiceId(String serviceId) {
-		putString(SERVICE_ID_KEY, serviceId);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see java.lang.Object#toString()
-	 */
-	@Override
-	public String toString() {
-		return "RemoteToolsCIndexServiceProvider(" + getIndexLocation() + ")"; //$NON-NLS-1$ //$NON-NLS-2$
-	}
-
-	private void initialize() {
-		if (fSubsystem == null && getServiceId() != null) {
-			IRemoteServices services = PTPRemoteCorePlugin.getDefault().getRemoteServices(getServiceId());
-			if (services != null && getConnectionName() != null) {
-				IRemoteConnection connection = services.getConnectionManager().getConnection(getConnectionName());
-				setConnection(connection, false);
-			}
-		}
-	}
-
-	/**
-	 * Set a new connection for this service provider. If reset is true the
-	 * index and DStore server locations will be reset to their default values.
-	 * 
-	 * @param connection
-	 *            new connection
-	 * @param reset
-	 *            reset locations to defaults
-	 */
-	private void setConnection(IRemoteConnection connection, boolean reset) {
-		setServiceId(connection.getRemoteServices().getId());
-		setConnectionName(connection.getName());
-		if (reset) {
-			IPath workingDir = new Path(connection.getWorkingDirectory());
-			setIndexLocation(workingDir.append(".eclipsesettings").toString()); //$NON-NLS-1$
-		}
-		if (fSubsystem != null) {
-			fSubsystem.dispose();
-		}
-		fSubsystem = new RemoteToolsCIndexSubsystem(this);
-		setConfigured(true);
-	}
-
-}
diff --git a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/core/RemoteToolsCIndexSubsystem.java b/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/core/RemoteToolsCIndexSubsystem.java
deleted file mode 100644
index 92c0f2b..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/core/RemoteToolsCIndexSubsystem.java
+++ /dev/null
@@ -1,1168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008, 2009 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 - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ptp.rdt.server.dstore.core;
-
-import java.io.IOException;
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.cdt.core.CCProjectNature;
-import org.eclipse.cdt.core.CProjectNature;
-import org.eclipse.cdt.core.index.IIndexFileLocation;
-import org.eclipse.cdt.core.model.CModelException;
-import org.eclipse.cdt.core.model.CoreModelUtil;
-import org.eclipse.cdt.core.model.ICContainer;
-import org.eclipse.cdt.core.model.ICElement;
-import org.eclipse.cdt.core.model.ICProject;
-import org.eclipse.cdt.core.model.IParent;
-import org.eclipse.cdt.core.model.ITranslationUnit;
-import org.eclipse.cdt.internal.core.parser.ParserMessages;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceVisitor;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.IWorkspaceRoot;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.AssertionFailedException;
-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.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.dstore.core.model.DE;
-import org.eclipse.dstore.core.model.DataElement;
-import org.eclipse.dstore.core.model.DataStore;
-import org.eclipse.dstore.core.model.DataStoreResources;
-import org.eclipse.dstore.core.model.DataStoreSchema;
-import org.eclipse.ptp.internal.rdt.core.IRemoteIndexerInfoProvider;
-import org.eclipse.ptp.internal.rdt.core.Serializer;
-import org.eclipse.ptp.internal.rdt.core.callhierarchy.CalledByResult;
-import org.eclipse.ptp.internal.rdt.core.callhierarchy.CallsToResult;
-import org.eclipse.ptp.internal.rdt.core.contentassist.Proposal;
-import org.eclipse.ptp.internal.rdt.core.contentassist.RemoteContentAssistInvocationContext;
-import org.eclipse.ptp.internal.rdt.core.includebrowser.IIndexIncludeValue;
-import org.eclipse.ptp.internal.rdt.core.index.RemoteIndexerProgress;
-import org.eclipse.ptp.internal.rdt.core.index.RemoteIndexerTask;
-import org.eclipse.ptp.internal.rdt.core.miners.CDTMiner;
-import org.eclipse.ptp.internal.rdt.core.model.Scope;
-import org.eclipse.ptp.internal.rdt.core.navigation.OpenDeclarationResult;
-import org.eclipse.ptp.internal.rdt.core.search.RemoteSearchMatch;
-import org.eclipse.ptp.internal.rdt.core.search.RemoteSearchQuery;
-import org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem;
-import org.eclipse.ptp.internal.rdt.core.typehierarchy.THGraph;
-import org.eclipse.ptp.rdt.core.RDTLog;
-import org.eclipse.ptp.rdt.core.resources.RemoteNature;
-import org.eclipse.ptp.rdt.core.serviceproviders.IIndexServiceProvider;
-import org.eclipse.ptp.rdt.ui.messages.Messages;
-import org.eclipse.ptp.rdt.ui.subsystems.ProjectChangeListener;
-import org.eclipse.ptp.rdt.ui.subsystems.StatusMonitor;
-import org.eclipse.ptp.remote.launch.core.RemoteServerManager;
-import org.eclipse.ptp.services.core.IService;
-import org.eclipse.ptp.services.core.IServiceConfiguration;
-import org.eclipse.ptp.services.core.IServiceProvider;
-import org.eclipse.ptp.services.core.ServiceModelManager;
-
-/**
- * An Remote Tools subsystem which is used to provide C/C++ indexing services
- * from a Miner running on a remote host. <strong>EXPERIMENTAL</strong>. This
- * class or interface has been added as part of a work in progress. There is no
- * guarantee that this API will work or that it will remain the same. Please do
- * not use this API without consulting with the RDT team.
- * 
- * @author crecoskie
- * 
- */
-public class RemoteToolsCIndexSubsystem implements ICIndexSubsystem {
-
-	private final Map<IProject, String> fInitializedProjects = new HashMap<IProject, String>();
-	private final ProjectChangeListener fProjectOpenListener = new ProjectChangeListener(this);
-	private final RemoteToolsCIndexServiceProvider fProvider;
-	private final List<String> fErrorMessages = new ArrayList<String>();
-	private DStoreServer fDStoreServer = null;
-
-	public RemoteToolsCIndexSubsystem(RemoteToolsCIndexServiceProvider provider) {
-		fProvider = provider;
-		ResourcesPlugin.getWorkspace().addResourceChangeListener(fProjectOpenListener);
-		generateErrorMessages();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#
-	 * checkAllProjects(org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void checkAllProjects(IProgressMonitor monitor) {
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IWorkspaceRoot workspaceRoot = workspace.getRoot();
-
-		for (IProject project : workspaceRoot.getProjects()) {
-			// is the project open? if not, there's not much we can do
-			if (!project.isOpen())
-				continue;
-
-			// is this an RDT C/C++ project?
-			// check the project natures... we care about the project if it has
-			// both the remote nature and
-			// at least one of the CDT natures
-			try {
-				if (!project.hasNature(RemoteNature.REMOTE_NATURE_ID)
-						|| !(project.hasNature(CProjectNature.C_NATURE_ID) || project.hasNature(CCProjectNature.CC_NATURE_ID)))
-					continue;
-
-				checkProject(project, monitor);
-			} catch (Throwable e) {
-				RDTLog.logError(e);
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#checkProject
-	 * (org.eclipse.core.resources.IProject,
-	 * org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public void checkProject(IProject project, IProgressMonitor monitor) {
-		if (project == null) {
-			return;
-		}
-
-		if (fInitializedProjects.containsKey(project)) {
-			String projectURI = project.getLocationURI().toString();
-			if (projectURI.equals(fInitializedProjects.get(project))) {
-				return;
-			} else {
-				// the project's uri is changed, so we need to initialize it
-				// again.
-				// no need to unregister its scope, since initializeScope
-				// handles it.
-			}
-		}
-		try {
-			initializeScope(project, monitor);
-		} catch (CoreException e) {
-			RDTLog.logError(e);
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#
-	 * computeCompletionProposals(org.eclipse.ptp.internal.rdt.core.model.Scope,
-	 * org.eclipse.ptp.internal.rdt.core.contentassist.
-	 * RemoteContentAssistInvocationContext,
-	 * org.eclipse.cdt.core.model.ITranslationUnit)
-	 */
-	public List<Proposal> computeCompletionProposals(Scope scope, RemoteContentAssistInvocationContext context,
-			ITranslationUnit unit) {
-		DataStore dataStore = getDataStore();
-		if (dataStore == null) {
-			return Collections.emptyList();
-		}
-
-		DataElement queryCmd = dataStore.localDescriptorQuery(dataStore.getDescriptorRoot(),
-				CDTMiner.C_CONTENT_ASSIST_COMPUTE_PROPOSALS);
-
-		if (queryCmd == null) {
-			return Collections.emptyList();
-		}
-
-		NullProgressMonitor monitor = new NullProgressMonitor();
-		StatusMonitor smonitor = StatusMonitor.getStatusMonitorFor(fProvider.getConnection(), dataStore);
-		ArrayList<Object> args = new ArrayList<Object>();
-
-		// need to know the scope
-		DataElement dataElement = dataStore.createObject(null, CDTMiner.T_SCOPE_SCOPENAME_DESCRIPTOR, scope.getName());
-		args.add(dataElement);
-
-		// invocation context
-		args.add(createSerializableElement(dataStore, context));
-
-		// translation unit
-		args.add(createSerializableElement(dataStore, unit));
-
-		// execute the command
-		DataElement status = dataStore.command(queryCmd, args, dataStore.getDescriptorRoot());
-
-		try {
-			smonitor.waitForUpdate(status, monitor);
-		} catch (Exception e) {
-			RDTLog.logError(e);
-		}
-
-		DataElement element = status.get(0);
-		String data = element.getName();
-		try {
-			Object result = Serializer.deserialize(data);
-			if (result == null || !(result instanceof List<?>)) {
-				return Collections.emptyList();
-			}
-			return (List<Proposal>) result;
-		} catch (IOException e) {
-			RDTLog.logError(e);
-		} catch (ClassNotFoundException e) {
-			RDTLog.logError(e);
-		}
-		return Collections.emptyList();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#
-	 * computeTypeGraph(org.eclipse.ptp.internal.rdt.core.model.Scope,
-	 * org.eclipse.cdt.core.model.ICElement,
-	 * org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public THGraph computeTypeGraph(Scope scope, ICElement input, IProgressMonitor monitor) {
-		Object result = sendRequest(CDTMiner.C_TYPE_HIERARCHY_COMPUTE_TYPE_GRAPH, new Object[] { scope, getBaseURI(), input },
-				monitor);
-		if (result == null) {
-			return new THGraph();
-		}
-		return (THGraph) result;
-	}
-
-	/**
-	 * Shutdown and clean up the subsystem
-	 */
-	public void dispose() {
-		if (fDStoreServer != null) {
-			fDStoreServer.cancel();
-		}
-		ResourcesPlugin.getWorkspace().removeResourceChangeListener(fProjectOpenListener);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#findInclude
-	 * (org.eclipse.ptp.internal.rdt.core.model.Scope,
-	 * org.eclipse.cdt.core.index.IIndexFileLocation, java.lang.String, int,
-	 * org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IIndexIncludeValue findInclude(Scope scope, IIndexFileLocation location, String name, int offset,
-			IProgressMonitor monitor) {
-		Object result = sendRequest(CDTMiner.C_INCLUDES_FIND_INCLUDE, new Object[] { scope, getBaseURI(), location, name, offset },
-				monitor);
-		if (result == null) {
-			return null;
-		}
-
-		return (IIndexIncludeValue) result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#findIncludedBy
-	 * (org.eclipse.ptp.internal.rdt.core.model.Scope,
-	 * org.eclipse.cdt.core.index.IIndexFileLocation,
-	 * org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IIndexIncludeValue[] findIncludedBy(Scope scope, IIndexFileLocation location, IProgressMonitor monitor) {
-		Object result = sendRequest(CDTMiner.C_INCLUDES_FIND_INCLUDED_BY, new Object[] { scope, getBaseURI(), location }, monitor);
-		if (result == null) {
-			return new IIndexIncludeValue[0];
-		}
-
-		return (IIndexIncludeValue[]) result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#findIncludesTo
-	 * (org.eclipse.ptp.internal.rdt.core.model.Scope,
-	 * org.eclipse.cdt.core.index.IIndexFileLocation,
-	 * org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IIndexIncludeValue[] findIncludesTo(Scope scope, IIndexFileLocation location, IProgressMonitor monitor) {
-		Object result = sendRequest(CDTMiner.C_INCLUDES_FIND_INCLUDES_TO, new Object[] { scope, getBaseURI(), location }, monitor);
-		if (result == null) {
-			return new IIndexIncludeValue[0];
-		}
-
-		return (IIndexIncludeValue[]) result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#
-	 * findTypeHierarchyInput(org.eclipse.ptp.internal.rdt.core.model.Scope,
-	 * org.eclipse.cdt.core.model.ICElement)
-	 */
-	public ICElement[] findTypeHierarchyInput(Scope scope, ICElement memberInput) {
-		Object result = sendRequest(CDTMiner.C_TYPE_HIERARCHY_FIND_INPUT1, new Object[] { scope, getBaseURI(), memberInput }, null);
-		if (result == null) {
-			return new ICElement[] { null, null };
-		}
-		return (ICElement[]) result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#
-	 * findTypeHierarchyInput(org.eclipse.ptp.internal.rdt.core.model.Scope,
-	 * org.eclipse.cdt.core.model.ITranslationUnit, int, int)
-	 */
-	public ICElement[] findTypeHierarchyInput(Scope scope, ITranslationUnit unit, int selectionStart, int selectionLength) {
-		Object result = sendRequest(CDTMiner.C_TYPE_HIERARCHY_FIND_INPUT2, new Object[] { scope, getBaseURI(), unit,
-				new Integer(selectionStart), new Integer(selectionLength) }, null);
-		if (result == null) {
-			return new ICElement[] { null, null };
-		}
-		return (ICElement[]) result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#getCallees
-	 * (org.eclipse.ptp.internal.rdt.core.model.Scope, java.lang.String,
-	 * java.lang.String, int, int, org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public CallsToResult getCallees(Scope scope, ICElement subject, IProgressMonitor monitor) {
-		monitor.beginTask(Messages.getString("RSECIndexSubsystem.6") + subject, 100); //$NON-NLS-1$
-		Object result = sendRequest(CDTMiner.C_CALL_HIERARCHY_GET_CALLS, new Object[] { scope, getBaseURI(), subject }, null);
-		if (result == null) {
-			return new CallsToResult();
-		}
-		return (CallsToResult) result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#getCallers
-	 * (org.eclipse.ptp.internal.rdt.core.model.Scope,
-	 * org.eclipse.cdt.core.model.ICElement,
-	 * org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public CalledByResult getCallers(Scope scope, ICElement subject, IProgressMonitor monitor) {
-		monitor.beginTask(Messages.getString("RSECIndexSubsystem.5") + subject, 100); //$NON-NLS-1$
-		Object result = sendRequest(CDTMiner.C_CALL_HIERARCHY_GET_CALLERS, new Object[] { scope, getBaseURI(), subject }, null);
-		if (result == null) {
-			return new CalledByResult();
-		}
-		return (CalledByResult) result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#
-	 * getCHDefinitions(org.eclipse.ptp.internal.rdt.core.model.Scope,
-	 * java.lang.String, java.lang.String, int, int,
-	 * org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public ICElement[] getCHDefinitions(Scope scope, ICElement subject, IProgressMonitor monitor) {
-		monitor.beginTask(Messages.getString("RSECIndexSubsystem.7") + subject, 100); //$NON-NLS-1$
-		Object result = sendRequest(CDTMiner.C_CALL_HIERARCHY_GET_DEFINITIONS_FROM_ELEMENT, new Object[] { scope, getBaseURI(),
-				subject }, null);
-		if (result == null) {
-			return new ICElement[0];
-		}
-		return (ICElement[]) result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#
-	 * getCHDefinitions(org.eclipse.ptp.internal.rdt.core.model.Scope,
-	 * org.eclipse.cdt.core.model.ITranslationUnit, int, int,
-	 * org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public ICElement[] getCHDefinitions(Scope scope, ITranslationUnit unit, int selectionStart, int selectionLength,
-			IProgressMonitor monitor) {
-		monitor.beginTask(Messages.getString("RSECIndexSubsystem.7") + unit, 100); //$NON-NLS-1$
-		Object result = sendRequest(CDTMiner.C_CALL_HIERARCHY_GET_DEFINITIONS_FROM_WORKING_COPY, new Object[] { scope,
-				getBaseURI(), unit, selectionStart, selectionLength }, null);
-		if (result == null) {
-			return new ICElement[0];
-		}
-		return (ICElement[]) result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#getModel
-	 * (org.eclipse.cdt.core.model.ITranslationUnit,
-	 * org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public ITranslationUnit getModel(ITranslationUnit unit, IProgressMonitor monitor) {
-		Object result = sendRequest(CDTMiner.C_MODEL_BUILDER, new Object[] { unit }, monitor);
-		if (result == null) {
-			return null;
-		}
-
-		// the working copy
-		return (ITranslationUnit) result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#indexDelta
-	 * (org.eclipse.ptp.internal.rdt.core.model.Scope, java.util.List,
-	 * java.util.List, java.util.List,
-	 * org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus indexDelta(Scope scope, IRemoteIndexerInfoProvider provider, List<ICElement> newElements,
-			List<ICElement> changedElements, List<ICElement> deletedElements, IProgressMonitor monitor, RemoteIndexerTask task) {
-
-		removeProblems(scope);
-		DataStore dataStore = getDataStore();
-		if (dataStore == null)
-			return Status.OK_STATUS;
-
-		DataElement result = getDataStore().createObject(null, CDTMiner.T_INDEX_STATUS_DESCRIPTOR, "index"); //$NON-NLS-1$
-		StatusMonitor smonitor = StatusMonitor.getStatusMonitorFor(fProvider.getConnection(), dataStore);
-		int workCount = newElements.size() + changedElements.size();
-		monitor.beginTask("Incrementally Indexing...", workCount); //$NON-NLS-1$
-
-		DataElement queryCmd = dataStore.localDescriptorQuery(dataStore.getDescriptorRoot(), CDTMiner.C_INDEX_DELTA);
-		if (queryCmd != null) {
-			ArrayList<Object> args = new ArrayList<Object>();
-
-			args.add(dataStore.createObject(null, CDTMiner.T_SCOPE_SCOPENAME_DESCRIPTOR, scope.getName()));
-
-			String serializedProvider = null;
-			try {
-				serializedProvider = Serializer.serialize(provider);
-			} catch (IOException e) {
-				RDTLog.logError(e);
-			}
-
-			args.add(dataStore.createObject(null, CDTMiner.T_INDEX_SCANNER_INFO_PROVIDER, serializedProvider));
-
-			for (ICElement element : newElements) {
-				String remotePath = convertURIToRemotePath(element.getLocationURI());
-				args.add(dataStore.createObject(null, CDTMiner.T_INDEX_DELTA_ADDED, remotePath));
-			}
-
-			for (ICElement element : changedElements) {
-				String remotePath = convertURIToRemotePath(element.getLocationURI());
-				args.add(dataStore.createObject(null, CDTMiner.T_INDEX_DELTA_CHANGED, remotePath));
-			}
-
-			for (ICElement element : deletedElements) {
-				String remotePath = convertURIToRemotePath(element.getLocationURI());
-				args.add(dataStore.createObject(null, CDTMiner.T_INDEX_DELTA_REMOVED, remotePath));
-			}
-
-			DataElement status = dataStore.command(queryCmd, args, result);
-
-			// poll for progress information until the operation is done or
-			// canceled
-			while (!status.getName().equals("done") && !status.getName().equals("cancelled") && !monitor.isCanceled()) { //$NON-NLS-1$ //$NON-NLS-2$
-				RemoteIndexerProgress progress = getIndexerProgress(status);
-				task.updateProgressInformation(progress);
-				try {
-					Thread.sleep(100);
-				} catch (InterruptedException e) {
-					RDTLog.logError(e);
-				}
-			}
-
-			try {
-				try {
-					smonitor.waitForUpdate(status, monitor);
-				} catch (InterruptedException e) { // Canceled
-					if (monitor.isCanceled())
-						cancelOperation(status.getParent());
-				}
-			} catch (Exception e) {
-				RDTLog.logError(e);
-			}
-
-			if (status.getName().equals("done") || status.getName().equals("cancelled") || monitor.isCanceled()) { //$NON-NLS-1$//$NON-NLS-2$
-				for (int i = 0; i < status.getNestedSize(); i++) {
-					DataElement element = status.get(i);
-					if (element != null && CDTMiner.T_INDEXING_ERROR.equals(element.getType())) { // Error
-																									// occurred
-																									// on
-																									// the
-																									// server
-						String message = element.getAttribute(DE.A_NAME) + ".  "; //$NON-NLS-1$
-						for (int j = 0; j < fErrorMessages.size(); j++) {
-							if (message.indexOf(fErrorMessages.get(j)) > 0) {
-								String msg = reportProblem(scope, message);
-								RDTLog.logWarning(msg);
-							}
-						}
-					}
-				}
-			}
-
-			monitor.done();
-		}
-
-		return Status.OK_STATUS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#isIndexed
-	 * (org.eclipse.ptp.internal.rdt.core.model.Scope,
-	 * org.eclipse.cdt.core.index.IIndexFileLocation,
-	 * org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public boolean isIndexed(Scope scope, IIndexFileLocation location, IProgressMonitor monitor) {
-		Object result = sendRequest(CDTMiner.C_INCLUDES_IS_INDEXED, new Object[] { scope, getBaseURI(), location }, monitor);
-		if (result != null) {
-			return Boolean.parseBoolean(result.toString());
-		}
-
-		return false;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#moveIndexFile
-	 * (java.lang.String, java.lang.String,
-	 * org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public String moveIndexFile(String scopeName, String newIndexLocation, IProgressMonitor monitor) {
-		String actualLocation = sendRequestStringResult(CDTMiner.C_MOVE_INDEX_FILE, new Object[] { scopeName, newIndexLocation },
-				monitor);
-		return actualLocation;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#openDeclaration
-	 * (org.eclipse.ptp.internal.rdt.core.model.Scope,
-	 * org.eclipse.cdt.core.model.ITranslationUnit, java.lang.String, int, int,
-	 * org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public OpenDeclarationResult openDeclaration(Scope scope, ITranslationUnit unit, String selectedText, int selectionStart,
-			int selectionLength, IProgressMonitor monitor) {
-		monitor.beginTask(Messages.getString("RSECIndexSubsystem.9"), 100); //$NON-NLS-1$
-		Object result = sendRequest(CDTMiner.C_NAVIGATION_OPEN_DECLARATION, new Object[] { scope, unit, selectedText,
-				selectionStart, selectionLength }, monitor);
-		if (result == null)
-			return OpenDeclarationResult.failureUnexpectedError();
-		return (OpenDeclarationResult) result;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#registerScope
-	 * (org.eclipse.ptp.internal.rdt.core.model.Scope, java.lang.String[],
-	 * org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus registerScope(Scope scope, List<ICElement> elements, String configLocation, IProgressMonitor monitor) {
-		DataStore dataStore = getDataStore();
-
-		if (dataStore != null) {
-
-			StatusMonitor smonitor = StatusMonitor.getStatusMonitorFor(fProvider.getConnection(), dataStore);
-
-			monitor.beginTask(Messages.getString("RSECIndexSubsystem.3"), 100); //$NON-NLS-1$
-
-			DataElement queryCmd = dataStore.localDescriptorQuery(dataStore.getDescriptorRoot(), CDTMiner.C_SCOPE_REGISTER);
-			if (queryCmd != null) {
-
-				ArrayList<Object> args = new ArrayList<Object>();
-
-				// need to know the scope
-				DataElement scopeElement = dataStore.createObject(null, CDTMiner.T_SCOPE_SCOPENAME_DESCRIPTOR, scope.getName());
-				args.add(scopeElement);
-
-				// need to know where to find the pdom file for the scope
-				DataElement configElement = dataStore.createObject(null, CDTMiner.T_SCOPE_CONFIG_LOCATION, configLocation);
-				args.add(configElement);
-
-				// add in the filenames
-				for (ICElement element : elements) {
-					addElement(dataStore, args, element);
-				}
-
-				// execute the command
-				DataElement status = dataStore.command(queryCmd, args, dataStore.getDescriptorRoot());
-
-				try {
-					smonitor.waitForUpdate(status, monitor);
-				} catch (Exception e) {
-					RDTLog.logError(e);
-				}
-			}
-		}
-
-		return Status.OK_STATUS;
-
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#reindexScope
-	 * (org.eclipse.ptp.internal.rdt.core.model.Scope,
-	 * org.eclipse.ptp.internal.rdt.core.IRemoteIndexerInfoProvider,
-	 * org.eclipse.core.runtime.IProgressMonitor,
-	 * org.eclipse.ptp.internal.rdt.core.index.RemoteIndexerTask)
-	 */
-	public IStatus reindexScope(Scope scope, IRemoteIndexerInfoProvider provider, String indexLocation, IProgressMonitor monitor,
-			RemoteIndexerTask task) {
-		removeProblems(scope);
-		DataStore dataStore = getDataStore();
-		if (dataStore == null)
-			return Status.OK_STATUS;
-
-		DataElement result = getDataStore().createObject(null, CDTMiner.T_INDEX_STATUS_DESCRIPTOR, "index"); //$NON-NLS-1$
-		StatusMonitor smonitor = StatusMonitor.getStatusMonitorFor(fProvider.getConnection(), dataStore);
-		monitor.beginTask("Rebuilding indexing...", 100); //$NON-NLS-1$
-
-		DataElement queryCmd = dataStore.localDescriptorQuery(dataStore.getDescriptorRoot(), CDTMiner.C_INDEX_REINDEX);
-		if (queryCmd != null) {
-			ArrayList<Object> args = new ArrayList<Object>();
-
-			args.add(dataStore.createObject(null, CDTMiner.T_SCOPE_SCOPENAME_DESCRIPTOR, scope.getName()));
-
-			String serializedProvider = null;
-			try {
-				serializedProvider = Serializer.serialize(provider);
-			} catch (IOException e) {
-				RDTLog.logError(e);
-			}
-
-			args.add(dataStore.createObject(null, CDTMiner.T_INDEX_SCANNER_INFO_PROVIDER, serializedProvider));
-			args.add(dataStore.createObject(null, CDTMiner.T_SCOPE_CONFIG_LOCATION, indexLocation));
-
-			DataElement status = dataStore.command(queryCmd, args, result);
-
-			// poll for progress information until the operation is done or
-			// canceled
-			while (!status.getName().equals("done") && !status.getName().equals("cancelled") && !monitor.isCanceled()) { //$NON-NLS-1$ //$NON-NLS-2$
-				RemoteIndexerProgress progress = getIndexerProgress(status);
-				task.updateProgressInformation(progress);
-				try {
-					Thread.sleep(100);
-				} catch (InterruptedException e) {
-					RDTLog.logError(e);
-				}
-			}
-
-			try {
-				try {
-					smonitor.waitForUpdate(status, monitor);
-				} catch (InterruptedException e) { // Canceled
-					if (monitor.isCanceled())
-						cancelOperation(status.getParent());
-				}
-			} catch (Exception e) {
-				RDTLog.logError(e);
-			}
-
-			if (status.getName().equals("done") || status.getName().equals("cancelled") || monitor.isCanceled()) { //$NON-NLS-1$//$NON-NLS-2$
-				for (int i = 0; i < status.getNestedSize(); i++) {
-					DataElement element = status.get(i);
-					if (element != null && CDTMiner.T_INDEXING_ERROR.equals(element.getType())) { // Error
-																									// occurred
-																									// on
-																									// the
-																									// server
-						String message = element.getAttribute(DE.A_NAME) + ".  "; //$NON-NLS-1$
-						for (int j = 0; j < fErrorMessages.size(); j++) {
-							if (message.indexOf(fErrorMessages.get(j)) > 0) {
-								String msg = reportProblem(scope, message);
-								RDTLog.logWarning(msg);
-							}
-						}
-					}
-				}
-			}
-			monitor.done();
-		}
-
-		return Status.OK_STATUS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#removeIndexFile
-	 * (org.eclipse.ptp.internal.rdt.core.model.Scope,
-	 * org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus removeIndexFile(Scope scope, IProgressMonitor monitor) {
-		sendRequest(CDTMiner.C_REMOVE_INDEX_FILE, new Object[] { scope }, monitor);
-		return Status.OK_STATUS;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#runQuery
-	 * (org.eclipse.ptp.internal.rdt.core.model.Scope,
-	 * org.eclipse.ptp.internal.rdt.core.search.RemoteSearchQuery,
-	 * org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	@SuppressWarnings("unchecked")
-	public List<RemoteSearchMatch> runQuery(Scope scope, RemoteSearchQuery query, IProgressMonitor monitor) {
-		monitor.beginTask(Messages.getString("RSECIndexSubsystem.8") + query.getScopeDescription(), 100); //$NON-NLS-1$
-		Object result = sendRequest(CDTMiner.C_SEARCH_RUN_QUERY, new Object[] { scope, getBaseURI(), query }, null);
-		if (result == null) {
-			return Collections.emptyList();
-		}
-		return (List<RemoteSearchMatch>) result;
-	}
-
-	/**
-	 * @param requestType
-	 * @param arguments
-	 * @param monitor
-	 * @return
-	 */
-	public Object sendRequest(String requestType, Object[] arguments, IProgressMonitor monitor) {
-		return sendRequest(requestType, arguments, monitor, true);
-	}
-
-	/**
-	 * @param requestType
-	 * @param arguments
-	 * @param monitor
-	 * @return
-	 */
-	public String sendRequestStringResult(String requestType, Object[] arguments, IProgressMonitor monitor) {
-		return (String) sendRequest(requestType, arguments, monitor, false);
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.internal.rdt.core.subsystems.ICIndexSubsystem#unregisterScope
-	 * (org.eclipse.ptp.internal.rdt.core.model.Scope,
-	 * org.eclipse.core.runtime.IProgressMonitor)
-	 */
-	public IStatus unregisterScope(Scope scope, IProgressMonitor monitor) {
-		IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(scope.getName());
-		fInitializedProjects.remove(project);
-
-		DataStore dataStore = getDataStore();
-
-		if (dataStore != null) {
-
-			// DataElement result = dataStore.createObject(null,
-			// CDTMiner.T_INDEX_STATUS_DESCRIPTOR, name);
-			// DataElement statusDescriptor =
-			// dataStore.createObjectDescriptor(null,
-			// CDTMiner.T_INDEX_STATUS_DESCRIPTOR);
-
-			// result.setDescriptor(statusDescriptor);
-
-			StatusMonitor smonitor = StatusMonitor.getStatusMonitorFor(fProvider.getConnection(), dataStore);
-
-			monitor.beginTask(Messages.getString("RSECIndexSubsystem.4"), 100); //$NON-NLS-1$
-
-			DataElement queryCmd = dataStore.localDescriptorQuery(dataStore.getDescriptorRoot(), CDTMiner.C_SCOPE_UNREGISTER);
-			if (queryCmd != null) {
-
-				ArrayList<Object> args = new ArrayList<Object>();
-
-				// need to know the scope
-				DataElement scopeElement = dataStore.createObject(null, CDTMiner.T_SCOPE_SCOPENAME_DESCRIPTOR, scope.getName());
-				args.add(scopeElement);
-
-				// execute the command
-				// DataElement status = dataStore.command(queryCmd,
-				// dataStore.getDescriptorRoot(), true);
-				DataElement status = dataStore.command(queryCmd, args, dataStore.getDescriptorRoot());
-
-				try {
-					smonitor.waitForUpdate(status, monitor);
-				} catch (Exception e) {
-					RDTLog.logError(e);
-				}
-			}
-		}
-
-		return Status.OK_STATUS;
-	}
-
-	private DataElement createSerializableElement(DataStore dataStore, Object object) {
-		try {
-			String serialized = Serializer.serialize(object);
-			return dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, serialized);
-		} catch (IOException e) {
-			RDTLog.logError(e);
-			return null;
-		}
-	}
-
-	private void generateErrorMessages() {
-		//    	fErrorMessages.add(ParserMessages.getFormattedString("ScannerProblemFactory.error.preproc.inclusionNotFound", "")); //$NON-NLS-1$ //$NON-NLS-2$
-		//    	fErrorMessages.add(ParserMessages.getFormattedString("ScannerProblemFactory.error.preproc.definitionNotFound", "")); //$NON-NLS-1$ //$NON-NLS-2$
-		fErrorMessages.add("Unresolved inclusion:"); //$NON-NLS-1$
-		fErrorMessages.add("Macro definition not found:"); //$NON-NLS-1$
-	}
-
-	private RemoteIndexerProgress getIndexerProgress(DataElement status) {
-		int num = status.getNestedSize();
-		if (num > 0) {
-			boolean foundProgressInfo = false;
-			int counter = 1;
-			DataElement element = null;
-			while (!foundProgressInfo && counter <= num) {
-				element = status.get(num - counter);
-				if (element != null && CDTMiner.T_INDEXER_PROGRESS_INFO.equals(element.getType())) {
-					foundProgressInfo = true;
-				}
-				counter++;
-			}
-			if (element != null && CDTMiner.T_INDEXER_PROGRESS_INFO.equals(element.getType())) {
-				String data = element.getName();
-				try {
-					Object result = Serializer.deserialize(data);
-					if (result == null || !(result instanceof RemoteIndexerProgress)) {
-						return null;
-					}
-					RemoteIndexerProgress info = (RemoteIndexerProgress) result;
-					return info;
-				} catch (IOException e) {
-					RDTLog.logError(e);
-				} catch (ClassNotFoundException e) {
-					RDTLog.logError(e);
-				}
-			}
-		}
-		return null;
-	}
-
-	private void initializeScope(IProject project, IProgressMonitor monitor) throws CoreException {
-		// get the service model configuration for this project
-		final ServiceModelManager serviceModelManager = ServiceModelManager.getInstance();
-		IServiceConfiguration config = serviceModelManager.getActiveConfiguration(project);
-
-		// is the indexing service associated with our service provider?
-		IService service = serviceModelManager.getService(RemoteToolsCIndexServiceProvider.SERVICE_ID);
-		IServiceProvider provider = config.getServiceProvider(service);
-
-		// if so, initialize a scope for the project consisting of all
-		// its translation units
-		final List<ICElement> cElements = new LinkedList<ICElement>();
-
-		IResourceVisitor fileCollector = new IResourceVisitor() {
-
-			public boolean visit(IResource resource) throws CoreException {
-				if (resource instanceof IFile) {
-					// add the path
-					ITranslationUnit tu = CoreModelUtil.findTranslationUnit((IFile) resource);
-					if (tu != null) {
-						cElements.add(tu);
-						return false;
-					}
-				}
-				return true;
-			}
-		};
-
-		// collect the translation units
-		project.accept(fileCollector);
-
-		String configLocation = ((IIndexServiceProvider) provider).getIndexLocation();
-		Scope scope = new Scope(project.getName());
-
-		// unregister the scope if there already is one
-		unregisterScope(scope, monitor);
-
-		// register the new scope
-		registerScope(scope, cElements, configLocation, monitor);
-
-		String projectURI = project.getLocationURI().toString();
-		fInitializedProjects.put(project, projectURI);
-
-	}
-
-	/**
-	 * Sends a request in a set format of arguments.
-	 * 
-	 * @param deserializeResult
-	 *            If true the result will be deserialized, if false it will
-	 *            treat the result as a raw string.
-	 */
-	private Object sendRequest(String requestType, Object[] arguments, IProgressMonitor monitor, boolean deserializeResult) {
-		DataStore dataStore = getDataStore();
-		if (dataStore == null)
-			return null;
-
-		DataElement queryCmd = dataStore.localDescriptorQuery(dataStore.getDescriptorRoot(), requestType);
-		if (queryCmd == null)
-			return null;
-
-		StatusMonitor smonitor = StatusMonitor.getStatusMonitorFor(fProvider.getConnection(), dataStore);
-		ArrayList<Object> args = new ArrayList<Object>();
-
-		for (Object argument : arguments) {
-			if (argument instanceof Scope) {
-				DataElement dataElement = dataStore.createObject(null, CDTMiner.T_SCOPE_SCOPENAME_DESCRIPTOR, ((Scope) argument)
-						.getName());
-				args.add(dataElement);
-			} else if (argument instanceof String) {
-				DataElement dataElement = dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, (String) argument);
-				args.add(dataElement);
-			} else if (argument instanceof Integer || argument instanceof Boolean || argument instanceof Character
-					|| argument instanceof Double || argument instanceof Float) {
-				DataElement dataElement = dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, argument.toString());
-				args.add(dataElement);
-			} else {
-				args.add(createSerializableElement(dataStore, argument));
-			}
-		}
-
-		// execute the command
-		DataElement status = dataStore.command(queryCmd, args, dataStore.getDescriptorRoot());
-
-		try {
-			monitor = monitor == null ? new NullProgressMonitor() : monitor;
-			smonitor.waitForUpdate(status, monitor);
-		} catch (Exception e) {
-			RDTLog.logError(e);
-		}
-
-		DataElement element = status.get(0);
-		if (element == null) {
-			return null;
-		}
-
-		if (DataStoreResources.model_error.equals(element.getType())) { // Error
-																		// occurred
-																		// on
-																		// the
-																		// server
-			RDTLog.logError(status.getValue()); // prints the server error stack
-												// trace to the log
-			return null;
-		}
-
-		String data = element.getName();
-		if (!deserializeResult)
-			return data;
-
-		try {
-			Object result = Serializer.deserialize(data);
-			return result;
-		} catch (IOException e) {
-			RDTLog.logError(e);
-		} catch (ClassNotFoundException e) {
-			RDTLog.logError(e);
-		}
-		return null;
-	}
-
-	/**
-	 * @param dataStore
-	 * @param args
-	 * @param filePath
-	 * @param element
-	 */
-	protected void addElement(DataStore dataStore, ArrayList<Object> args, ICElement element) {
-
-		String filePath = null;
-
-		// if it's a translation unit, we can just add it
-		if (element instanceof ITranslationUnit) {
-			filePath = convertURIToRemotePath(element.getLocationURI());
-		}
-
-		else {
-			// if it's a container or a project, add the child elements
-			if (element instanceof ICContainer || element instanceof ICProject) {
-				try {
-					ICElement[] children = ((IParent) element).getChildren();
-
-					for (int k = 0; k < children.length; k++)
-						addElement(dataStore, args, children[k]);
-
-				} catch (CModelException e) {
-					RDTLog.logError(e);
-				}
-			}
-
-		}
-
-		if (filePath != null) {
-			DataElement fileElement = dataStore.createObject(null, CDTMiner.T_INDEX_FILENAME_DESCRIPTOR, filePath);
-			args.add(fileElement);
-		}
-	}
-
-	protected void cancelOperation(DataElement command) {
-		// send cancel command
-		DataStore dataStore = command.getDataStore();
-		DataElement cmdDescriptor = command.getDescriptor();
-		DataElement cancelDescriptor = dataStore.localDescriptorQuery(cmdDescriptor, DataStoreSchema.C_CANCEL);
-		if (cancelDescriptor != null) {
-			dataStore.command(cancelDescriptor, command);
-		}
-	}
-
-	protected URI convertRemotePathToURI(String path) throws URISyntaxException {
-		return fProvider.getConnection().getRemoteServices().getFileManager(fProvider.getConnection()).toURI(path);
-	}
-
-	protected String convertURIToRemotePath(URI locationURI) {
-		return fProvider.getConnection().getRemoteServices().getFileManager(fProvider.getConnection()).toPath(locationURI)
-				.toString();
-	}
-
-	protected String getBaseURI() {
-		try {
-			return convertRemotePathToURI("/").toString(); //$NON-NLS-1$
-		} catch (URISyntaxException e) {
-			throw new AssertionFailedException(e.getLocalizedMessage());
-		}
-	}
-
-	protected DataStore getDataStore() {
-		if (fDStoreServer == null) {
-			fDStoreServer = (DStoreServer) RemoteServerManager.getServer(DStoreServer.SERVER_ID, fProvider.getConnection());
-		}
-		fDStoreServer.setWorkDir(fProvider.getIndexLocation());
-		DataStore dataStore = fDStoreServer.getDataStore();
-		if (!dataStore.isConnected()) {
-			if (fDStoreServer.startServer(new NullProgressMonitor())) {
-				DataElement status = dataStore.activateMiner("org.eclipse.ptp.internal.rdt.core.miners.CDTMiner"); //$NON-NLS-1$
-				StatusMonitor smonitor = StatusMonitor.getStatusMonitorFor(fProvider.getConnection(), dataStore);
-				try {
-					smonitor.waitForUpdate(status, new NullProgressMonitor());
-				} catch (InterruptedException e) {
-					// Data store will be disconnected if error occurs
-				}
-				return dataStore;
-			}
-			return null;
-		}
-		return dataStore;
-	}
-
-	protected void removeProblems(Scope scope) {
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IWorkspaceRoot workspaceRoot = workspace.getRoot();
-		IProject project = workspaceRoot.getProject(scope.getName());
-		try {
-			project.deleteMarkers("org.eclipse.ptp.rdt.ui.indexerproblemmarker", true, IResource.DEPTH_INFINITE); //$NON-NLS-1$
-		} catch (CoreException e) {
-			RDTLog.logError(e);
-		}
-	}
-
-	protected String reportProblem(Scope scope, String message) {
-		IWorkspace workspace = ResourcesPlugin.getWorkspace();
-		IWorkspaceRoot workspaceRoot = workspace.getRoot();
-		IProject project = workspaceRoot.getProject(scope.getName());
-
-		// parser for error message
-		int errorMessageStart = message.indexOf("Indexer: "); //$NON-NLS-1$
-		int errorMessageEnd = message.indexOf(": ", errorMessageStart + 9); //$NON-NLS-1$
-		String errorMessage = message.substring(errorMessageStart + 9, errorMessageEnd);
-
-		boolean includeError = true;
-		if (errorMessage.indexOf("inclusion") < 0) //$NON-NLS-1$
-			includeError = false;
-
-		// parser for include/macro name
-		int includeStart = errorMessageEnd + 2;
-		int includeEnd = message.indexOf(" in file: ", includeStart); //$NON-NLS-1$
-		String include = message.substring(includeStart, includeEnd);
-
-		// parse for file name and line number
-		int fileStart = includeEnd + 10;
-		int fileEnd = message.indexOf(":", fileStart); //$NON-NLS-1$
-		String fileName = message.substring(fileStart, fileEnd);
-
-		int lineStart = fileEnd;
-		int lineEnd = message.indexOf(".  ", lineStart); //$NON-NLS-1$
-		String lineNumber = message.substring(lineStart + 1, lineEnd);
-
-		// put error message back together
-		Object[] args = new Object[] { include, fileName, new Integer(lineNumber.replace(",", "")) }; //$NON-NLS-1$ //$NON-NLS-2$
-		String info = ParserMessages.getFormattedString("BaseProblemFactory.problemPattern", args); //$NON-NLS-1$
-		if (includeError)
-			info = ParserMessages.getFormattedString("ScannerProblemFactory.error.preproc.inclusionNotFound", info); //$NON-NLS-1$
-		else
-			info = ParserMessages.getFormattedString("ScannerProblemFactory.error.preproc.definitionNotFound", info); //$NON-NLS-1$
-
-		String infoMsg = Messages.getString("RSECIndexSubsystem.11"); //$NON-NLS-1$
-		String wholeMessage = MessageFormat.format(Messages.getString("RSECIndexSubsystem.12"), new Object[] { info }) + "  " + infoMsg; //$NON-NLS-1$ //$NON-NLS-2$
-
-		IFile file = null;
-		String projectLocation = project.getLocationURI().getPath();
-		fileStart = fileName.indexOf(projectLocation);
-		if (fileStart == -1) {
-			fileName = null;
-		} else {
-			fileName = fileName.substring(fileStart + projectLocation.length() + 1);
-			IPath path = new Path(fileName);
-			file = project.getFile(path);
-		}
-
-		if (file != null) {
-			try {
-				IMarker marker = file.createMarker("org.eclipse.ptp.rdt.ui.indexerproblemmarker"); //$NON-NLS-1$
-				marker.setAttribute(IMarker.LINE_NUMBER, Integer.parseInt(lineNumber.replace(",", ""))); //$NON-NLS-1$ //$NON-NLS-2$
-				marker.setAttribute(IMarker.MESSAGE, wholeMessage);
-				marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_WARNING);
-			} catch (CoreException e) {
-				RDTLog.logError(e);
-			}
-		} else {
-			try {
-				IMarker marker = project.createMarker("org.eclipse.ptp.rdt.ui.indexerproblemmarker"); //$NON-NLS-1$
-				marker.setAttribute(IMarker.MESSAGE, wholeMessage);
-				marker.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_WARNING);
-			} catch (CoreException e) {
-				RDTLog.logError(e);
-			}
-		}
-		return wholeMessage;
-	}
-
-}
diff --git a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/internal/core/DebugUtil.java b/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/internal/core/DebugUtil.java
deleted file mode 100644
index 65132c8..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/internal/core/DebugUtil.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- ******************************************************************************/
-package org.eclipse.ptp.rdt.server.dstore.internal.core;
-
-import org.eclipse.core.runtime.Platform;
-import org.eclipse.ptp.remote.core.PTPRemoteCorePlugin;
-
-public class DebugUtil {
-	public static boolean SERVER_TRACING = false;
-
-	private static final String SERVER_TRACING_OPTION = "org.eclipse.ptp.rdt.server.dstore/debug/tracing"; //$NON-NLS-1$
-
-	public static void configurePluginDebugOptions() {
-		if (PTPRemoteCorePlugin.getDefault().isDebugging()) {
-			String option = Platform.getDebugOption(SERVER_TRACING_OPTION);
-			if (option != null) {
-				SERVER_TRACING = option.equalsIgnoreCase("true"); //$NON-NLS-1$
-			}
-		}
-	}
-}
diff --git a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/messages/Messages.java b/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/messages/Messages.java
deleted file mode 100644
index 27dd109..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/messages/Messages.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.eclipse.ptp.rdt.server.dstore.messages;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ptp.rdt.server.dstore.messages.messages"; //$NON-NLS-1$
-	public static String DStoreIndexWidget_0;
-	public static String DStoreIndexWidget_1;
-	public static String DStoreServer_0;
-	public static String DStoreServer_1;
-	public static String DStoreServer_2;
-	public static String DStoreServer_3;
-	public static String RemoteToolsCIndexServiceProvider_0;
-	public static String RemoteToolsCIndexServiceProviderContributer_0;
-	public static String RemoteToolsCIndexServiceProviderContributer_1;
-	public static String RemoteToolsCIndexServiceProviderContributer_2;
-	public static String RemoteToolsCIndexServiceProviderContributer_3;
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/messages/messages.properties b/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/messages/messages.properties
deleted file mode 100644
index 27febd8..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/messages/messages.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-DStoreIndexWidget_0=Index location
-DStoreIndexWidget_1=Select Index File Location
-DStoreServer_0=Remote Tools DStore Server
-DStoreServer_1=DSTORE SERVER: port fowarding failed 
-DStoreServer_2=DSTORE SERVER CONNECTING...
-DStoreServer_3=DSTORE SERVER CONNECTED
-RemoteToolsCIndexServiceProvider_0=Remote Tools C/C++ Indexing Service
-RemoteToolsCIndexServiceProviderContributer_0=Connection
-RemoteToolsCIndexServiceProviderContributer_1=Provider:
-RemoteToolsCIndexServiceProviderContributer_2=Connection:
-RemoteToolsCIndexServiceProviderContributer_3=New...
diff --git a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/ui/DStoreIndexWidget.java b/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/ui/DStoreIndexWidget.java
deleted file mode 100644
index c99b7cf..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/ui/DStoreIndexWidget.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 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
- *******************************************************************************/
-package org.eclipse.ptp.rdt.server.dstore.ui;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.ptp.rdt.server.dstore.messages.Messages;
-import org.eclipse.ptp.rdt.server.dstore.ui.DStoreServerWidget.FieldModifier;
-import org.eclipse.ptp.remote.core.IRemoteConnection;
-import org.eclipse.ptp.remote.ui.widgets.RemoteDirectoryWidget;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-
-public class DStoreIndexWidget extends Composite {
-	private String fDefaultPath = null;
-	private final RemoteDirectoryWidget fDirectoryWidget;
-	private final ListenerList modifyListeners = new ListenerList();
-
-	public DStoreIndexWidget(Composite parent, int style) {
-		super(parent, style);
-
-		GridLayout layout = new GridLayout(2, false);
-		setLayout(layout);
-		setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		fDirectoryWidget = new RemoteDirectoryWidget(this, SWT.NONE, Messages.DStoreIndexWidget_0, fDefaultPath);
-		fDirectoryWidget.setBrowseMessage(Messages.DStoreIndexWidget_1); 
-		GridData data = new GridData(SWT.FILL, SWT.FILL, true, false);
-		data.horizontalSpan = 3;
-		fDirectoryWidget.setLayoutData(data); // set layout to grab horizontal
-												// space
-		fDirectoryWidget.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				fDefaultPath = fDirectoryWidget.getLocationPath();
-				e.data = FieldModifier.VALUE_INDEX_LOCATION;
-				notifyListeners(e);
-			}
-		});
-	}
-
-	public void addModifyListener(ModifyListener listener) {
-		modifyListeners.add(listener);
-	}
-
-	public String getLocationPath() {
-		return fDirectoryWidget.getLocationPath();
-	}
-
-	public void removeModifyListener(ModifyListener listener) {
-		modifyListeners.remove(listener);
-	}
-
-	public void setConnection(IRemoteConnection conn) {
-		fDirectoryWidget.setConnection(conn);
-	}
-
-	public void setLocationPath(String path) {
-		fDirectoryWidget.setLocationPath(path);
-	}
-
-	private void notifyListeners(ModifyEvent e) {
-		for (Object listener : modifyListeners.getListeners()) {
-			((ModifyListener) listener).modifyText(e);
-		}
-	}
-}
diff --git a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/ui/DStoreServerWidget.java b/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/ui/DStoreServerWidget.java
deleted file mode 100644
index b86c7bb..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/ui/DStoreServerWidget.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 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
- *******************************************************************************/
-package org.eclipse.ptp.rdt.server.dstore.ui;
-
-import org.eclipse.core.runtime.ListenerList;
-import org.eclipse.ptp.remote.core.IRemoteConnection;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-
-public class DStoreServerWidget extends Composite {
-	public enum FieldModifier {
-		VALUE_DSTORE_LOCATION, VALUE_DSTORE_COMMAND, VALUE_DSTORE_ENV, VALUE_INDEX_LOCATION
-	}
-
-	private final ListenerList modifyListeners = new ListenerList();
-
-	private final DStoreIndexWidget fIndexPage;
-
-	public DStoreServerWidget(Composite parent, int style) {
-		super(parent, style);
-
-		setFont(parent.getFont());
-		GridLayout layout = new GridLayout(1, false);
-		layout.marginHeight = 0;
-		layout.marginWidth = 0;
-		setLayout(layout);
-		setLayoutData(new GridData(GridData.FILL_BOTH));
-
-		fIndexPage = new DStoreIndexWidget(this, SWT.NONE);
-		fIndexPage.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				notifyListeners(e);
-			}
-		});
-	}
-
-	public void addModifyListener(ModifyListener listener) {
-		modifyListeners.add(listener);
-	}
-
-	public String getIndexLocation() {
-		return fIndexPage.getLocationPath();
-	}
-
-	public void removeModifyListener(ModifyListener listener) {
-		modifyListeners.remove(listener);
-	}
-
-	public void setConnection(IRemoteConnection conn) {
-		fIndexPage.setConnection(conn);
-	}
-
-	public void setIndexLocation(String path) {
-		fIndexPage.setLocationPath(path);
-	}
-
-	private void notifyListeners(ModifyEvent e) {
-		for (Object listener : modifyListeners.getListeners()) {
-			((ModifyListener) listener).modifyText(e);
-		}
-	}
-}
diff --git a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/ui/RemoteToolsCIndexServiceProviderContributer.java b/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/ui/RemoteToolsCIndexServiceProviderContributer.java
deleted file mode 100644
index 4438015..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/ui/RemoteToolsCIndexServiceProviderContributer.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ptp.rdt.server.dstore.ui;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardPage;
-import org.eclipse.ptp.rdt.server.dstore.core.RemoteToolsCIndexServiceProvider;
-import org.eclipse.ptp.rdt.server.dstore.messages.Messages;
-import org.eclipse.ptp.rdt.server.dstore.ui.DStoreServerWidget.FieldModifier;
-import org.eclipse.ptp.remote.core.IRemoteConnection;
-import org.eclipse.ptp.remote.core.IRemoteServices;
-import org.eclipse.ptp.remote.core.PTPRemoteCorePlugin;
-import org.eclipse.ptp.remote.ui.IRemoteUIConnectionManager;
-import org.eclipse.ptp.remote.ui.PTPRemoteUIPlugin;
-import org.eclipse.ptp.services.core.IServiceProvider;
-import org.eclipse.ptp.services.ui.IServiceProviderContributor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.ModifyEvent;
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.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.Group;
-import org.eclipse.swt.widgets.Label;
-
-public class RemoteToolsCIndexServiceProviderContributer implements IServiceProviderContributor {
-
-	private RemoteToolsCIndexServiceProvider fProvider;
-
-	private final Map<Integer, IRemoteServices> fComboIndexToRemoteServicesProviderMap = new HashMap<Integer, IRemoteServices>();
-	private IRemoteServices fSelectedServices;
-	private final Map<Integer, IRemoteConnection> fComboIndexToRemoteConnectionMap = new HashMap<Integer, IRemoteConnection>();
-	private IRemoteConnection fSelectedConnection;
-	private DStoreServerWidget fServerWidget;
-	private String fConfigPath;
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.services.ui.IServiceProviderContributor#
-	 * configureServiceProvider(org.eclipse.ptp.services.core.IServiceProvider,
-	 * org.eclipse.swt.widgets.Composite)
-	 */
-	public void configureServiceProvider(IServiceProvider sp, final Composite container) {
-		if (!(sp instanceof RemoteToolsCIndexServiceProvider))
-			throw new IllegalArgumentException(); // should never happen
-
-		fProvider = (RemoteToolsCIndexServiceProvider) sp;
-
-		container.setLayout(new GridLayout(1, false));
-
-		Group connectionGroup = new Group(container, SWT.NONE);
-		connectionGroup.setText(Messages.RemoteToolsCIndexServiceProviderContributer_0); 
-		connectionGroup.setLayout(new GridLayout(3, false));
-		connectionGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
-
-		// Label for "Provider:"
-		Label providerLabel = new Label(connectionGroup, SWT.LEFT);
-		providerLabel.setText(Messages.RemoteToolsCIndexServiceProviderContributer_1); 
-
-		// combo for providers
-		final Combo providerCombo = new Combo(connectionGroup, SWT.DROP_DOWN | SWT.READ_ONLY);
-		// set layout to grab horizontal space
-		GridData data = new GridData(SWT.BEGINNING, SWT.BEGINNING, false, false);
-		data.horizontalSpan = 2;
-		providerCombo.setLayoutData(data);
-
-		populateProviderCombo(providerCombo);
-
-		// connection combo
-		// Label for "Connection:"
-		Label connectionLabel = new Label(connectionGroup, SWT.LEFT);
-		connectionLabel.setText(Messages.RemoteToolsCIndexServiceProviderContributer_2); 
-
-		// combo for providers
-		final Combo connectionCombo = new Combo(connectionGroup, SWT.DROP_DOWN | SWT.READ_ONLY);
-		// set layout to grab horizontal space
-		connectionCombo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
-
-		// populate the combo with a list of providers
-		populateConnectionCombo(connectionCombo);
-
-		// new connection button
-		final Button newConnectionButton = new Button(connectionGroup, SWT.PUSH);
-		newConnectionButton.setText(Messages.RemoteToolsCIndexServiceProviderContributer_3); 
-		updateNewConnectionButtonEnabled(newConnectionButton);
-
-		newConnectionButton.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				IRemoteUIConnectionManager connectionManager = getUIConnectionManager();
-				if (connectionManager != null) {
-					connectionManager.newConnection(container.getShell());
-				}
-				// refresh list of connections
-				populateConnectionCombo(connectionCombo);
-			}
-		});
-
-		providerCombo.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				int selectionIndex = providerCombo.getSelectionIndex();
-				fSelectedServices = fComboIndexToRemoteServicesProviderMap.get(selectionIndex);
-				populateConnectionCombo(connectionCombo);
-				updateNewConnectionButtonEnabled(newConnectionButton);
-				fServerWidget.setConnection(fSelectedConnection);
-			}
-		});
-
-		connectionCombo.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				int selectionIndex = connectionCombo.getSelectionIndex();
-				fSelectedConnection = fComboIndexToRemoteConnectionMap.get(selectionIndex);
-				updateNewConnectionButtonEnabled(newConnectionButton);
-				fProvider.setConnection(fSelectedConnection);
-				fServerWidget.setConnection(fSelectedConnection);
-			}
-		});
-
-		fServerWidget = new DStoreServerWidget(container, SWT.NONE);
-		data = new GridData(SWT.FILL, SWT.FILL, true, false);
-		data.horizontalSpan = 3;
-		fServerWidget.setLayoutData(data); // set layout to grab horizontal
-											// space
-
-		/*
-		 * Set connection information before updating widget with saved data.
-		 */
-		fServerWidget.setConnection(fSelectedConnection);
-
-		fServerWidget.addModifyListener(new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				if (e.data == FieldModifier.VALUE_INDEX_LOCATION) {
-					fConfigPath = fServerWidget.getIndexLocation();
-					fProvider.setIndexLocation(fConfigPath);
-				}
-			}
-		});
-
-		/*
-		 * Initialize widget with default values. This will trigger ModifyEvents
-		 * on the widget to update the field variables.
-		 */
-		fServerWidget.setIndexLocation(fProvider.getIndexLocation());
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.services.ui.IServiceProviderContributor#getWizard(org
-	 * .eclipse.ptp.services.core.IServiceProvider,
-	 * org.eclipse.jface.wizard.IWizardPage)
-	 */
-	public IWizard getWizard(IServiceProvider provider, IWizardPage page) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.services.ui.IServiceProviderContributor#getWizardPages
-	 * (org.eclipse.jface.wizard.IWizard,
-	 * org.eclipse.ptp.services.core.IServiceProvider)
-	 */
-	public WizardPage[] getWizardPages(IWizard wizard, IServiceProvider provider) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	private IRemoteUIConnectionManager getUIConnectionManager() {
-		IRemoteUIConnectionManager connectionManager = PTPRemoteUIPlugin.getDefault().getRemoteUIServices(fSelectedServices)
-				.getUIConnectionManager();
-		return connectionManager;
-	}
-
-	private void populateConnectionCombo(final Combo connectionCombo) {
-		connectionCombo.removeAll();
-
-		// attempt to restore settings from saved state
-		IRemoteConnection connectionSelected = null;
-		if (fProvider.getServiceId() != null) {
-			IRemoteServices providerSelected = PTPRemoteCorePlugin.getDefault().getRemoteServices(fProvider.getServiceId());
-			if (providerSelected != null && fProvider.getConnectionName() != null) {
-				connectionSelected = providerSelected.getConnectionManager().getConnection(fProvider.getConnectionName());
-			}
-		}
-
-		IRemoteConnection[] connections = fSelectedServices.getConnectionManager().getConnections();
-		int toSelect = 0;
-
-		for (int k = 0; k < connections.length; k++) {
-			connectionCombo.add(connections[k].getName(), k);
-			fComboIndexToRemoteConnectionMap.put(k, connections[k]);
-			if (connectionSelected != null && connectionSelected.getName().equals(connections[k].getName())) {
-				toSelect = k;
-			}
-		}
-
-		// set selected connection to be the first one if we're not restoring
-		// from settings
-		connectionCombo.select(toSelect);
-		fSelectedConnection = fComboIndexToRemoteConnectionMap.get(toSelect);
-	}
-
-	private void populateProviderCombo(final Combo providerCombo) {
-		// attempt to restore settings from saved state
-		IRemoteServices providerSelected = null;
-		if (fProvider.getServiceId() != null) {
-			providerSelected = PTPRemoteCorePlugin.getDefault().getRemoteServices(fProvider.getServiceId());
-		}
-
-		// populate the combo with a list of providers
-		IRemoteServices[] providers = PTPRemoteCorePlugin.getDefault().getAllRemoteServices();
-		int toSelect = 0;
-
-		for (int k = 0; k < providers.length; k++) {
-			providerCombo.add(providers[k].getName(), k);
-			fComboIndexToRemoteServicesProviderMap.put(k, providers[k]);
-
-			if (providerSelected != null && providerSelected.getId().compareTo(providers[k].getId()) == 0) {
-				toSelect = k;
-			}
-		}
-
-		// set selected host to be the first one if we're not restoring from
-		// settings
-		providerCombo.select(toSelect);
-		fSelectedServices = fComboIndexToRemoteServicesProviderMap.get(toSelect);
-	}
-
-	private void updateNewConnectionButtonEnabled(Button button) {
-		IRemoteUIConnectionManager connectionManager = getUIConnectionManager();
-		button.setEnabled(connectionManager != null);
-	}
-}
diff --git a/rdt/org.eclipse.ptp.rdt.ui.tests/.classpath b/rdt/org.eclipse.ptp.rdt.ui.tests/.classpath
deleted file mode 100644
index 3aaeea8..0000000
--- a/rdt/org.eclipse.ptp.rdt.ui.tests/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<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="src" path="test"/>
-	<classpathentry kind="src" path="suite"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/rdt/org.eclipse.ptp.rdt.ui.tests/.project b/rdt/org.eclipse.ptp.rdt.ui.tests/.project
deleted file mode 100644
index f21926c..0000000
--- a/rdt/org.eclipse.ptp.rdt.ui.tests/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.rdt.ui.tests</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/rdt/org.eclipse.ptp.rdt.ui.tests/.settings/org.eclipse.jdt.core.prefs b/rdt/org.eclipse.ptp.rdt.ui.tests/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index f9482f2..0000000
--- a/rdt/org.eclipse.ptp.rdt.ui.tests/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-#Wed Nov 19 13:50:59 EST 2008
-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.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/rdt/org.eclipse.ptp.rdt.ui.tests/META-INF/MANIFEST.MF b/rdt/org.eclipse.ptp.rdt.ui.tests/META-INF/MANIFEST.MF
deleted file mode 100644
index d75a279..0000000
--- a/rdt/org.eclipse.ptp.rdt.ui.tests/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,25 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Tests Plug-in
-Bundle-SymbolicName: org.eclipse.ptp.rdt.ui.tests;singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Require-Bundle: org.eclipse.ptp.rdt.core;bundle-version="1.0.0",
- org.eclipse.ptp.rdt.core.tests;bundle-version="1.0.0",
- org.eclipse.ptp.rdt.ui;bundle-version="1.0.0",
- org.eclipse.cdt.ui.tests;bundle-version="5.0.2",
- org.eclipse.cdt.ui;bundle-version="5.0.2",
- org.eclipse.core.runtime;bundle-version="3.4.0",
- org.eclipse.cdt.core;bundle-version="5.0.2",
- org.eclipse.cdt.core.tests;bundle-version="5.0.1",
- org.junit;bundle-version="3.8.2",
- org.eclipse.ui;bundle-version="3.4.0",
- org.eclipse.core.resources;bundle-version="3.4.0",
- org.eclipse.jface.text;bundle-version="3.4.0",
- org.eclipse.ui.editors;bundle-version="3.4.0",
- org.eclipse.ptp.services.core;bundle-version="1.0.0"
-Export-Package: org.eclipse.ptp.rdt.ui.tests.navigation,
- org.eclipse.ptp.rdt.ui.tests.suite
-Bundle-Activator: org.eclipse.ptp.rdt.ui.tests.RDTUITestPlugin
-Bundle-ActivationPolicy: lazy
-Import-Package: org.eclipse.ui.part
diff --git a/rdt/org.eclipse.ptp.rdt.ui.tests/build.properties b/rdt/org.eclipse.ptp.rdt.ui.tests/build.properties
deleted file mode 100644
index 0a56acc..0000000
--- a/rdt/org.eclipse.ptp.rdt.ui.tests/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = test/,\
-           suite/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
diff --git a/rdt/org.eclipse.ptp.rdt.ui.tests/fixtures/navigation_test_project/test.c b/rdt/org.eclipse.ptp.rdt.ui.tests/fixtures/navigation_test_project/test.c
deleted file mode 100644
index ed3b53d..0000000
--- a/rdt/org.eclipse.ptp.rdt.ui.tests/fixtures/navigation_test_project/test.c
+++ /dev/null
@@ -1,5 +0,0 @@
-#import "test.h"
-
-int main(int argc, char **argv) {
-
-}
diff --git a/rdt/org.eclipse.ptp.rdt.ui.tests/fixtures/navigation_test_project/test.h b/rdt/org.eclipse.ptp.rdt.ui.tests/fixtures/navigation_test_project/test.h
deleted file mode 100644
index e69de29..0000000
--- a/rdt/org.eclipse.ptp.rdt.ui.tests/fixtures/navigation_test_project/test.h
+++ /dev/null
diff --git a/rdt/org.eclipse.ptp.rdt.ui.tests/suite/org/eclipse/ptp/rdt/ui/tests/RDTUITestPlugin.java b/rdt/org.eclipse.ptp.rdt.ui.tests/suite/org/eclipse/ptp/rdt/ui/tests/RDTUITestPlugin.java
deleted file mode 100644
index 49c77c6..0000000
--- a/rdt/org.eclipse.ptp.rdt.ui.tests/suite/org/eclipse/ptp/rdt/ui/tests/RDTUITestPlugin.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.eclipse.ptp.rdt.ui.tests;
-
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-
-public class RDTUITestPlugin extends AbstractUIPlugin {
-
-	
-	private static RDTUITestPlugin plugin;
-	
-	public RDTUITestPlugin() {
-		super();
-		plugin = this;
-	}
-
-	public static RDTUITestPlugin getDefault() {
-		return plugin;
-	}
-}
diff --git a/rdt/org.eclipse.ptp.rdt.ui.tests/suite/org/eclipse/ptp/rdt/ui/tests/suite/UIBasicTestSuite.java b/rdt/org.eclipse.ptp.rdt.ui.tests/suite/org/eclipse/ptp/rdt/ui/tests/suite/UIBasicTestSuite.java
deleted file mode 100644
index db76260..0000000
--- a/rdt/org.eclipse.ptp.rdt.ui.tests/suite/org/eclipse/ptp/rdt/ui/tests/suite/UIBasicTestSuite.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    IBM Corporation - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.ptp.rdt.ui.tests.suite;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-
-/**
- * Tests that do not require a connection to a remote server.
- */
-public class UIBasicTestSuite extends TestCase {
-	public static Test suite() {
-		TestSuite suite = new TestSuite(UIBasicTestSuite.class.getName());
-		// TODO add some tests
-		return suite;
-	}
-}
\ No newline at end of file
diff --git a/rdt/org.eclipse.ptp.rdt.ui.tests/suite/org/eclipse/ptp/rdt/ui/tests/suite/UIConnectionTestSuite.java b/rdt/org.eclipse.ptp.rdt.ui.tests/suite/org/eclipse/ptp/rdt/ui/tests/suite/UIConnectionTestSuite.java
deleted file mode 100644
index 7b468b7..0000000
--- a/rdt/org.eclipse.ptp.rdt.ui.tests/suite/org/eclipse/ptp/rdt/ui/tests/suite/UIConnectionTestSuite.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *    IBM Corporation - initial API and implementation
- *******************************************************************************/ 
-package org.eclipse.ptp.rdt.ui.tests.suite;
-
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.eclipse.ptp.rdt.ui.tests.navigation.NavigationTests;
-
-
-/**
- * Tests that require a connection to be run,
- * this suite must be launched from a ConnectionSuite.
- */
-public class UIConnectionTestSuite extends TestCase {
-	public static Test suite() {
-		TestSuite suite = new TestSuite(UIConnectionTestSuite.class.getName());
-		
-		suite.addTest(NavigationTests.suite());
-		
-		return suite;
-	}
-}
\ No newline at end of file
diff --git a/rdt/org.eclipse.ptp.rdt.ui.tests/test/org/eclipse/ptp/rdt/ui/tests/navigation/NavigationTests.java b/rdt/org.eclipse.ptp.rdt.ui.tests/test/org/eclipse/ptp/rdt/ui/tests/navigation/NavigationTests.java
deleted file mode 100644
index 16ec15e..0000000
--- a/rdt/org.eclipse.ptp.rdt.ui.tests/test/org/eclipse/ptp/rdt/ui/tests/navigation/NavigationTests.java
+++ /dev/null
@@ -1,182 +0,0 @@
-package org.eclipse.ptp.rdt.ui.tests.navigation;
-
-import java.net.URI;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.cdt.core.CCorePlugin;
-import org.eclipse.cdt.core.dom.ast.IASTName;
-import org.eclipse.cdt.core.dom.ast.IASTNode;
-import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
-import org.eclipse.cdt.core.index.IIndex;
-import org.eclipse.cdt.core.model.ILanguage;
-import org.eclipse.cdt.core.model.ITranslationUnit;
-import org.eclipse.cdt.internal.core.model.ASTCache.ASTRunnable;
-import org.eclipse.cdt.internal.core.parser.ParserException;
-import org.eclipse.cdt.internal.ui.editor.ASTProvider;
-import org.eclipse.cdt.internal.ui.editor.CEditor;
-import org.eclipse.cdt.ui.testplugin.EditorTestHelper;
-import org.eclipse.cdt.ui.tests.text.selection.CPPSelectionTestsAnyIndexer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.jface.text.ITextSelection;
-import org.eclipse.jface.text.TextSelection;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.ptp.internal.rdt.core.index.RemoteFastIndexer;
-import org.eclipse.ptp.internal.rdt.ui.search.actions.OpenDeclarationsAction;
-import org.eclipse.ptp.rdt.core.tests.ConnectionManager;
-import org.eclipse.ptp.rdt.core.tests.RemoteTestProject;
-import org.eclipse.ptp.services.core.ServiceModelManager;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IViewReference;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.PartInitException;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.texteditor.AbstractTextEditor;
-
-
-@SuppressWarnings("restriction")
-
-public class NavigationTests extends CPPSelectionTestsAnyIndexer {
-
-	private static final int MAX_WAIT_TIME = 120000;
-
-	/* I think a lot of the tests that fail do so because of two reasons:
-	 * - Headers are not being skipped as they should be, 
-	 *  
-	 */
-	private static final String[] TESTS_TO_RUN = {
-		"testBug93281",
-		"testBug207320",
-		"testTemplateClassMethod_207320",
-		//"testBasicDefinition", // FAIL cannot reproduce failure
-		"testBasicTemplateInstance_207320",
-		"testBug86829A",
-		//"testCPPSpecDeclsDefs", // FAIL cannot reproduce failure
-		"testBug168533",
-		"testBug95225",
-		//"testBug95202", // FAIL, should not fail when headers are skipped properly
-		"testBug101287",
-		"testBug102258",
-		"testBug103323",
-		"testBug78354",
-		//"testBug103697", // FAIL trying to use local path which fails
-		//"testBug108202", // FAIL
-		//"testCNavigationInCppProject_bug183973", // FAIL
-		//"testFuncWithTypedefForAnonymousStruct_190730", // FAIL
-		//"testFuncWithTypedefForAnonymousEnum_190730", // FAIL
-		"testMacroNavigation",
-		"testMacroNavigation_Bug208300",
-		"testIncludeNavigation",
-		//"testNavigationCppCallsC", // FAIL
-		//"testNavigationCCallsCpp", // FAIL
-		"testNavigationInDefinedExpression_215906",
-	};
-	
-	public static Test suite() {
-		//return suite(NavigationTests.class);
-		TestSuite suite = new TestSuite();
-		for(String testName : TESTS_TO_RUN)
-			suite.addTest(new NavigationTests(testName));
-		return suite;
-	}
-	
-	
-	private static final String PROJECT_NAME = "navigation_test_project";
-	
-	@Override
-	protected String getEditorID() {
-		return "org.eclipse.ptp.rdt.ui.editor.CEditor";
-	}
-
-	@Override
-	protected void waitUntilFileIsIndexed(IIndex index, IFile file, int maxmillis) throws Exception {
-		Thread.sleep(10000);
-        CCorePlugin.getIndexManager().joinIndexer(MAX_WAIT_TIME, new NullProgressMonitor());
-	}
-
-	public NavigationTests(String name) {
-		super(name, RemoteFastIndexer.ID);
-	}
-	
-	@Override
-	protected IASTNode testF3(IFile file, int offset, int length) throws ParserException, CoreException {
-		if (offset < 0)
-			throw new ParserException("offset can not be less than 0 and was " + offset); //$NON-NLS-1$
-		
-        IWorkbenchPage page = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-        IEditorPart part = null;
-        try {
-            part = page.openEditor(new FileEditorInput(file), getEditorID(), true); //$NON-NLS-1$
-        } catch (PartInitException e) {
-            assertFalse(true);
-        }
-        
-        if (part instanceof CEditor) {
-        	CEditor editor= (CEditor) part;
-    		EditorTestHelper.joinReconciler(EditorTestHelper.getSourceViewer(editor), 100, 500, 10);
-            ((AbstractTextEditor)part).getSelectionProvider().setSelection(new TextSelection(offset,length));
-            
-            final OpenDeclarationsAction action = (OpenDeclarationsAction) editor.getAction("OpenDeclarations"); //$NON-NLS-1$
-            action.runSync();
-			
-        	// update the file/part to point to the newly opened IFile/IEditorPart
-            part = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().getActiveEditor(); 
-            assertTrue (part instanceof CEditor);
-            editor= (CEditor) part;
-    		EditorTestHelper.joinReconciler(EditorTestHelper.getSourceViewer(editor), 100, 500, 10);
-
-    		// the action above should highlight the declaration, so now retrieve it and use that selection to get the IASTName selected on the TU
-            ISelection sel= editor.getSelectionProvider().getSelection();
-            
-            final IASTName[] result= {null};
-            if (sel instanceof ITextSelection) {
-            	final ITextSelection textSel = (ITextSelection)sel;
-            	ITranslationUnit tu = (ITranslationUnit)editor.getInputCElement();
-        		IStatus ok= ASTProvider.getASTProvider().runOnAST(tu, ASTProvider.WAIT_IF_OPEN, new NullProgressMonitor(), new ASTRunnable() {
-        			public IStatus runOnAST(ILanguage language, IASTTranslationUnit ast) throws CoreException {
-        				result[0]= ast.getNodeSelector(null).findName(textSel.getOffset(), textSel.getLength());
-        				return Status.OK_STATUS;
-        			}
-        		});
-        		assertTrue(ok.isOK());
-				return result[0];
-            }
-        }
-        
-        return null;
-    }
-	
-
-	protected void setUp() throws Exception {
-		//super.setUp();
-		
-		IWorkbenchPage page= PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage();
-		IViewReference[] refs= page.getViewReferences();
-		for (int i = 0; i < refs.length; i++) {
-			IViewReference viewReference = refs[i];
-			page.setPartState(viewReference, IWorkbenchPage.STATE_RESTORED);
-		}
-		
-		URI projectRootURI = ConnectionManager.getInstance().getWorkspaceURI(PROJECT_NAME);
-		RemoteTestProject remoteProject = new RemoteTestProject(PROJECT_NAME, projectRootURI);
-		
-		ConnectionManager.getInstance().resetServiceModel(remoteProject.getName());
-		ServiceModelManager.getInstance().printServiceModel();
-		
-		fCProject = remoteProject.getCProject();
-	
-		CCorePlugin.getIndexManager().setIndexerId(fCProject, RemoteFastIndexer.ID);
-	}
-	
-	
-	protected void tearDown() throws Exception {
-		super.tearDown(); 
-	}
-
-}
diff --git a/releng/.cvsignore b/releng/.cvsignore
deleted file mode 100644
index 3a4edf6..0000000
--- a/releng/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-.project
diff --git a/releng/org.eclipse.ptp.etfw.ppw-feature/.project b/releng/org.eclipse.ptp.etfw.ppw-feature/.project
deleted file mode 100644
index 97aabb8..0000000
--- a/releng/org.eclipse.ptp.etfw.ppw-feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.etfw.ppw-feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/releng/org.eclipse.ptp.etfw.ppw-feature/build.properties b/releng/org.eclipse.ptp.etfw.ppw-feature/build.properties
deleted file mode 100644
index 39b0777..0000000
--- a/releng/org.eclipse.ptp.etfw.ppw-feature/build.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-bin.includes = feature.xml,\
-               epl-v10.html,\
-               feature.properties,\
-               license.html
diff --git a/releng/org.eclipse.ptp.etfw.ppw-feature/epl-v10.html b/releng/org.eclipse.ptp.etfw.ppw-feature/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/releng/org.eclipse.ptp.etfw.ppw-feature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
-WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/releng/org.eclipse.ptp.etfw.ppw-feature/feature.properties b/releng/org.eclipse.ptp.etfw.ppw-feature/feature.properties
deleted file mode 100644
index c831e2b..0000000
--- a/releng/org.eclipse.ptp.etfw.ppw-feature/feature.properties
+++ /dev/null
@@ -1,151 +0,0 @@
-# "featureName" property - name of the feature
-featureName=PTP PPW Support
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse PTP
-
-# "updateSiteName" property - label for the update site
-updateSiteName=PPW Update Site
-
-# "description" property - description of the feature
-description=Adds support for Parallel Performance Wizard (PPW).
-
-# copyright
-copyright=\
-Copyright (c) 2010, University of Florida\n\
-\n\
-All rights reserved. This program and the accompanying materials\n\
-are made available under the terms of the Eclipse Public License\n\
-v1.0 which accompanies this distribution, and is available at\n\
-http://www.eclipse.org/legal/epl-v10.html\n\
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-Eclipse Foundation Software User Agreement\n\
-April 14, 2010\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the\n\
-Eclipse Foundation is provided to you under the terms and conditions of\n\
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
-provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse Foundation source code\n\
-repository ("Repository") in software modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-       - Content may be structured and packaged into modules to facilitate delivering,\n\
-         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-         plug-in fragments ("Fragments"), and features ("Features").\n\
-       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
-         in a directory named "plugins".\n\
-       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-       - The top-level (root) directory\n\
-       - Plug-in and Fragment directories\n\
-       - Inside Plug-ins and Fragments packaged as JARs\n\
-       - Sub-directories of the directory named "src" of certain Plug-ins\n\
-       - Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
-Update License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties" found within a Feature.\n\
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
-terms and conditions (or references to such terms and conditions) that\n\
-govern your use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-\n\Use of Provisioning Technology\n\
-\n\
-The Eclipse Foundation makes available provisioning software, examples of which include,\n\
-but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
-the purpose of allowing users to install software, documentation, information and/or\n\
-other materials (collectively "Installable Software"). This capability is provided with\n\
-the intent of allowing such users to install, extend and update Eclipse-based products.\n\
-Information about packaging Installable Software is available at\n\
-http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
-\n\
-You may use Provisioning Technology to allow other parties to install Installable Software.\n\
-You shall be responsible for enabling the applicable license agreements relating to the\n\
-Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
-in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
-making it available in accordance with the Specification, you further acknowledge your\n\
-agreement to, and the acquisition of all necessary rights to permit the following:\n\
-\n\
-       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
-          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
-          extending or updating the functionality of an Eclipse-based product.\n\
-       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
-          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
-       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
-          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
-          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
-          with the Specification. Such Installable Software Agreement must inform the user of the\n\
-          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
-          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
-          indication of agreement by the user, the provisioning Technology will complete installation\n\
-          of the Installable Software.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use, and\n\
-re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/releng/org.eclipse.ptp.etfw.ppw-feature/feature.xml b/releng/org.eclipse.ptp.etfw.ppw-feature/feature.xml
deleted file mode 100644
index ff1dc12..0000000
--- a/releng/org.eclipse.ptp.etfw.ppw-feature/feature.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.ptp.etfw.ppw"
-      label="%featureName"
-      version="1.0.1.qualifier"
-      provider-name="%providerName"
-      plugin="org.eclipse.ptp.etfw.ppw">
-
-   <description url="http://ppw.hcs.ufl.edu/">
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="%licenseURL">
-      %license
-   </license>
-
-   <url>
-      <update label="%updateSiteName" url="http://ppw.hcs.ufl.edu/eclipse/update/"/>
-   </url>
-
-   <requires>
-      <import plugin="org.eclipse.ptp.etfw" version="1.0.1" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.ui" version="3.5.1" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.core.runtime" version="3.5.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.debug.core" version="3.5.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.jface.text" version="3.5.1" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.ui.editors" version="3.5.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.ui.workbench.texteditor" version="3.5.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.ui.ide" version="3.5.1" match="greaterOrEqual"/>
-   </requires>
-
-   <plugin
-         id="org.eclipse.ptp.etfw.ppw"
-         download-size="0"
-         install-size="0"
-         version="1.0.2.qualifier"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ptp.etfw.ppw.jars"
-         download-size="0"
-         install-size="0"
-         version="1.0.0.qualifier"/>
-
-</feature>
diff --git a/releng/org.eclipse.ptp.etfw.ppw-feature/license.html b/releng/org.eclipse.ptp.etfw.ppw-feature/license.html
deleted file mode 100644
index c184ca3..0000000
--- a/releng/org.eclipse.ptp.etfw.ppw-feature/license.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
-<title>Eclipse Foundation Software User Agreement</title>
-</head>
-
-<body lang="EN-US">
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>April 14, 2010</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-
-<h3>Applicable Licenses</h3>
-
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
-   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-
-<ul>
-       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>
-
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-       <li>The top-level (root) directory</li>
-       <li>Plug-in and Fragment directories</li>
-       <li>Inside Plug-ins and Fragments packaged as JARs</li>
-       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-       <li>Feature directories</li>
-</ul>
-
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-
-<h3>Use of Provisioning Technology</h3>
-
-<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
-   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
-   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
-   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
-       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
-   (&quot;Specification&quot;).</p>
-
-<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
-   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
-   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
-   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
-
-<ol>
-       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
-       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
-       product.</li>
-       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
-       accessed and copied to the Target Machine.</li>
-       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
-       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
-       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
-       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
-       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
-</ol>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-
-<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
-</body>
-</html>
diff --git a/releng/org.eclipse.ptp.rdt.remotejars-feature/.project b/releng/org.eclipse.ptp.rdt.remotejars-feature/.project
deleted file mode 100644
index 8b117b5..0000000
--- a/releng/org.eclipse.ptp.rdt.remotejars-feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.rdt.remotejars-feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/releng/org.eclipse.ptp.rdt.remotejars-feature/build.properties b/releng/org.eclipse.ptp.rdt.remotejars-feature/build.properties
deleted file mode 100644
index e69de29..0000000
--- a/releng/org.eclipse.ptp.rdt.remotejars-feature/build.properties
+++ /dev/null
diff --git a/releng/org.eclipse.ptp.rdt.remotejars-feature/epl-v10.html b/releng/org.eclipse.ptp.rdt.remotejars-feature/epl-v10.html
deleted file mode 100644
index 022ad29..0000000
--- a/releng/org.eclipse.ptp.rdt.remotejars-feature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
-WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
diff --git a/releng/org.eclipse.ptp.rdt.remotejars-feature/feature.properties b/releng/org.eclipse.ptp.rdt.remotejars-feature/feature.properties
deleted file mode 100644
index 9bce7d3..0000000
--- a/releng/org.eclipse.ptp.rdt.remotejars-feature/feature.properties
+++ /dev/null
@@ -1,162 +0,0 @@
-#################################################################################
-# Copyright (c) 2009 IBM Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - Initial Implementation
-#
-#################################################################################
-
-# "featureName" property - name of the feature
-featureName=PTP Remote Development Tools DStore Server
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse PTP
-
-# "updateSiteName" property - label for the update site
-updateSiteName=Eclipse PTP Update Site
-
-# "description" property - description of the feature
-description=Feature for building the RDT DStore server.
-
-# copyright
-copyright=\
-Copyright (c) 2010 IBM Corporation.\n\
-All rights reserved. This program and the accompanying materials\n\
-are made available under the terms of the Eclipse Public License v1.0\n\
-which accompanies this distribution, and is available at\n\
-http://www.eclipse.org/legal/epl-v10.html\n
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-Eclipse Foundation Software User Agreement\n\
-April 14, 2010\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the\n\
-Eclipse Foundation is provided to you under the terms and conditions of\n\
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
-provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse Foundation source code\n\
-repository ("Repository") in software modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-       - Content may be structured and packaged into modules to facilitate delivering,\n\
-         extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-         plug-in fragments ("Fragments"), and features ("Features").\n\
-       - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
-         in a directory named "plugins".\n\
-       - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-         Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-         Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-         numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-       - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-         named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-       - The top-level (root) directory\n\
-       - Plug-in and Fragment directories\n\
-       - Inside Plug-ins and Fragments packaged as JARs\n\
-       - Sub-directories of the directory named "src" of certain Plug-ins\n\
-       - Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Provisioning Technology (as defined below), you must agree to a license ("Feature \n\
-Update License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties" found within a Feature.\n\
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
-terms and conditions (or references to such terms and conditions) that\n\
-govern your use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-       - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-       - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-       - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-       - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-       - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-\n\Use of Provisioning Technology\n\
-\n\
-The Eclipse Foundation makes available provisioning software, examples of which include,\n\
-but are not limited to, p2 and the Eclipse Update Manager ("Provisioning Technology") for\n\
-the purpose of allowing users to install software, documentation, information and/or\n\
-other materials (collectively "Installable Software"). This capability is provided with\n\
-the intent of allowing such users to install, extend and update Eclipse-based products.\n\
-Information about packaging Installable Software is available at\n\
-http://eclipse.org/equinox/p2/repository_packaging.html ("Specification").\n\
-\n\
-You may use Provisioning Technology to allow other parties to install Installable Software.\n\
-You shall be responsible for enabling the applicable license agreements relating to the\n\
-Installable Software to be presented to, and accepted by, the users of the Provisioning Technology\n\
-in accordance with the Specification. By using Provisioning Technology in such a manner and\n\
-making it available in accordance with the Specification, you further acknowledge your\n\
-agreement to, and the acquisition of all necessary rights to permit the following:\n\
-\n\
-       1. A series of actions may occur ("Provisioning Process") in which a user may execute\n\
-          the Provisioning Technology on a machine ("Target Machine") with the intent of installing,\n\
-          extending or updating the functionality of an Eclipse-based product.\n\
-       2. During the Provisioning Process, the Provisioning Technology may cause third party\n\
-          Installable Software or a portion thereof to be accessed and copied to the Target Machine.\n\
-       3. Pursuant to the Specification, you will provide to the user the terms and conditions that\n\
-          govern the use of the Installable Software ("Installable Software Agreement") and such\n\
-          Installable Software Agreement shall be accessed from the Target Machine in accordance\n\
-          with the Specification. Such Installable Software Agreement must inform the user of the\n\
-          terms and conditions that govern the Installable Software and must solicit acceptance by\n\
-          the end user in the manner prescribed in such Installable Software Agreement. Upon such\n\
-          indication of agreement by the user, the provisioning Technology will complete installation\n\
-          of the Installable Software.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use, and\n\
-re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/releng/org.eclipse.ptp.rdt.remotejars-feature/feature.xml b/releng/org.eclipse.ptp.rdt.remotejars-feature/feature.xml
deleted file mode 100644
index 19fca02..0000000
--- a/releng/org.eclipse.ptp.rdt.remotejars-feature/feature.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.ptp.rdt.remotejars"
-      label="%featureName"
-      version="4.0.0.qualifier"
-      provider-name="%providerName">
-
-   <description>
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="%licenseURL">
-      %license
-   </license>
-
-   <url>
-      <update label="%updateSiteName" url="http://download.eclipse.org/tools/ptp/releases/helios"/>
-   </url>
-
-   <requires>
-      <import plugin="org.eclipse.ptp.rdt.core" version="1.1.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.ptp.rdt.make.ui" version="1.0.1" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.ptp.rdt.managedbuilder.xlc.ui" version="1.0.0" match="greaterOrEqual"/>
-      <import plugin="org.eclipse.ptp.rdt.ui" version="2.0.0" match="greaterOrEqual"/>
-   </requires>
-
-   <plugin
-         id="org.eclipse.ptp.rdt.core.remotejars"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ptp.rdt.core.stubs"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
diff --git a/releng/org.eclipse.ptp.rdt.remotejars-feature/license.html b/releng/org.eclipse.ptp.rdt.remotejars-feature/license.html
deleted file mode 100644
index c184ca3..0000000
--- a/releng/org.eclipse.ptp.rdt.remotejars-feature/license.html
+++ /dev/null
@@ -1,107 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1" ?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
-<title>Eclipse Foundation Software User Agreement</title>
-</head>
-
-<body lang="EN-US">
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>April 14, 2010</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-
-<h3>Applicable Licenses</h3>
-
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse Foundation source code
-   repository (&quot;Repository&quot;) in software modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-
-<ul>
-       <li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-       <li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-       <li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-       <li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>
-
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-       <li>The top-level (root) directory</li>
-       <li>Plug-in and Fragment directories</li>
-       <li>Inside Plug-ins and Fragments packaged as JARs</li>
-       <li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-       <li>Feature directories</li>
-</ul>
-
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Provisioning Technology (as defined below), you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-       <li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-       <li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-       <li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-       <li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-       <li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-
-<h3>Use of Provisioning Technology</h3>
-
-<p>The Eclipse Foundation makes available provisioning software, examples of which include, but are not limited to, p2 and the Eclipse
-   Update Manager (&quot;Provisioning Technology&quot;) for the purpose of allowing users to install software, documentation, information and/or
-   other materials (collectively &quot;Installable Software&quot;). This capability is provided with the intent of allowing such users to
-   install, extend and update Eclipse-based products. Information about packaging Installable Software is available at <a
-       href="http://eclipse.org/equinox/p2/repository_packaging.html">http://eclipse.org/equinox/p2/repository_packaging.html</a>
-   (&quot;Specification&quot;).</p>
-
-<p>You may use Provisioning Technology to allow other parties to install Installable Software. You shall be responsible for enabling the
-   applicable license agreements relating to the Installable Software to be presented to, and accepted by, the users of the Provisioning Technology
-   in accordance with the Specification. By using Provisioning Technology in such a manner and making it available in accordance with the
-   Specification, you further acknowledge your agreement to, and the acquisition of all necessary rights to permit the following:</p>
-
-<ol>
-       <li>A series of actions may occur (&quot;Provisioning Process&quot;) in which a user may execute the Provisioning Technology
-       on a machine (&quot;Target Machine&quot;) with the intent of installing, extending or updating the functionality of an Eclipse-based
-       product.</li>
-       <li>During the Provisioning Process, the Provisioning Technology may cause third party Installable Software or a portion thereof to be
-       accessed and copied to the Target Machine.</li>
-       <li>Pursuant to the Specification, you will provide to the user the terms and conditions that govern the use of the Installable
-       Software (&quot;Installable Software Agreement&quot;) and such Installable Software Agreement shall be accessed from the Target
-       Machine in accordance with the Specification. Such Installable Software Agreement must inform the user of the terms and conditions that govern
-       the Installable Software and must solicit acceptance by the end user in the manner prescribed in such Installable Software Agreement. Upon such
-       indication of agreement by the user, the provisioning Technology will complete installation of the Installable Software.</li>
-</ol>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-
-<p><small>Java and all Java-based trademarks are trademarks of Oracle Corporation in the United States, other countries, or both.</small></p>
-</body>
-</html>
diff --git a/releng/org.eclipse.ptp.rdt.sdk-feature/.project b/releng/org.eclipse.ptp.rdt.sdk-feature/.project
deleted file mode 100644
index 2bc8ae3..0000000
--- a/releng/org.eclipse.ptp.rdt.sdk-feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.rdt.sdk-feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/releng/org.eclipse.ptp.rdt.sdk-feature/build.properties b/releng/org.eclipse.ptp.rdt.sdk-feature/build.properties
deleted file mode 100644
index 43c2986..0000000
--- a/releng/org.eclipse.ptp.rdt.sdk-feature/build.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-bin.includes = feature.xml,\
-               epl-v10.html,\
-               feature.properties,\
-               license.html
-
-generate.feature@org.eclipse.ptp.rdt.source=org.eclipse.ptp.rdt,\
-  exclude@org.eclipse.ptp.rdt.doc.user
diff --git a/releng/org.eclipse.ptp.rdt.sdk-feature/epl-v10.html b/releng/org.eclipse.ptp.rdt.sdk-feature/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/releng/org.eclipse.ptp.rdt.sdk-feature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
-WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/releng/org.eclipse.ptp.rdt.sdk-feature/feature.properties b/releng/org.eclipse.ptp.rdt.sdk-feature/feature.properties
deleted file mode 100644
index 30aa4cb..0000000
--- a/releng/org.eclipse.ptp.rdt.sdk-feature/feature.properties
+++ /dev/null
@@ -1,132 +0,0 @@
-#################################################################################
-# Copyright (c) 2010 IBM Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - Initial Implementation
-#
-#################################################################################
-
-# "featureName" property - name of the feature
-featureName=PTP Remote Development Tools SDK
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
-
-# "updateSiteName" property - label for the update site
-updateSiteName=Eclipse PTP Update Site
-
-# "description" property - description of the feature
-description=PTP components for supporting Remote Development Tools SDK
-
-# copyright
-copyright=\
-Copyright (c) 2008 IBM Corporation.\n\
-All rights reserved. This program and the accompanying materials\n\
-are made available under the terms of the Eclipse Public License v1.0\n\
-which accompanies this distribution, and is available at\n\
-http://www.eclipse.org/legal/epl-v10.html\n
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-Eclipse Foundation Software User Agreement\n\
-March 17, 2005\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the\n\
-Eclipse Foundation is provided to you under the terms and conditions of\n\
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
-provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse.org CVS\n\
-repository ("Repository") in CVS modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-	- Content may be structured and packaged into modules to facilitate delivering,\n\
-	  extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-	  plug-in fragments ("Fragments"), and features ("Features").\n\
-	- Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
-	  in a directory named "plugins".\n\
-	- A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-	  Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-	  Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-	  numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-	- Features may also include other Features ("Included Features"). Within a Feature, files\n\
-	  named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-	- The top-level (root) directory\n\
-	- Plug-in and Fragment directories\n\
-	- Inside Plug-ins and Fragments packaged as JARs\n\
-	- Sub-directories of the directory named "src" of certain Plug-ins\n\
-	- Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Eclipse Update Manager, you must agree to a license ("Feature Update\n\
-License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties" found within a Feature.\n\
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
-terms and conditions (or references to such terms and conditions) that\n\
-govern your use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-	- Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-	- Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-	- Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-	- IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
-	- Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-	- Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use, and\n\
-re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/releng/org.eclipse.ptp.rdt.sdk-feature/feature.xml b/releng/org.eclipse.ptp.rdt.sdk-feature/feature.xml
deleted file mode 100644
index a2d7448..0000000
--- a/releng/org.eclipse.ptp.rdt.sdk-feature/feature.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.ptp.rdt.sdk"
-      label="%featureName"
-      version="4.0.0.qualifier"
-      provider-name="%providerName">
-
-   <description url="http://eclipse.org/ptp">
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="%licenseURL">
-      %license
-   </license>
-
-   <url>
-      <update label="%updateSiteName" url="http://download.eclipse.org/tools/ptp/releases/galileo"/>
-   </url>
-
-   <includes
-         id="org.eclipse.ptp.rdt.source"
-         version="0.0.0"/>
-
-   <requires>
-      <import feature="org.eclipse.ptp.rdt"/>
-   </requires>
-
-</feature>
diff --git a/releng/org.eclipse.ptp.rdt.sdk-feature/license.html b/releng/org.eclipse.ptp.rdt.sdk-feature/license.html
deleted file mode 100644
index c6af966..0000000
--- a/releng/org.eclipse.ptp.rdt.sdk-feature/license.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<title>Eclipse.org Software User Agreement</title>
-</head>
-
-<body lang="EN-US" link=blue vlink=purple>
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>March 17, 2005</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-   
-<h3>Applicable Licenses</h3>   
-   
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-   
-<ul>
-	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>   
- 
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Inside Plug-ins and Fragments packaged as JARs</li>
-	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
-</ul>
-		
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
-	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-   
-<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
-</body>
-</html>
diff --git a/releng/org.eclipse.ptp.rdt.sdk-feature/sourceTemplateFeature/eclipse_update_120.jpg b/releng/org.eclipse.ptp.rdt.sdk-feature/sourceTemplateFeature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/releng/org.eclipse.ptp.rdt.sdk-feature/sourceTemplateFeature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/releng/org.eclipse.ptp.rdt.sdk-feature/sourceTemplateFeature/epl-v10.html b/releng/org.eclipse.ptp.rdt.sdk-feature/sourceTemplateFeature/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/releng/org.eclipse.ptp.rdt.sdk-feature/sourceTemplateFeature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
-WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/releng/org.eclipse.ptp.rdt.sdk-feature/sourceTemplateFeature/feature.properties b/releng/org.eclipse.ptp.rdt.sdk-feature/sourceTemplateFeature/feature.properties
deleted file mode 100644
index fc86d08..0000000
--- a/releng/org.eclipse.ptp.rdt.sdk-feature/sourceTemplateFeature/feature.properties
+++ /dev/null
@@ -1,132 +0,0 @@
-#################################################################################
-# Copyright (c) 2010 IBM Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - Initial Implementation
-#
-#################################################################################
-
-# "featureName" property - name of the feature
-featureName=PTP Remote Development Tools source
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
-
-# "updateSiteName" property - label for the update site
-updateSiteName=Eclipse PTP Update Site
-
-# "description" property - description of the feature
-description=PTP components for supporting Remote Development Tools source code
-
-# copyright
-copyright=\
-Copyright (c) 2008 IBM Corporation.\n\
-All rights reserved. This program and the accompanying materials\n\
-are made available under the terms of the Eclipse Public License v1.0\n\
-which accompanies this distribution, and is available at\n\
-http://www.eclipse.org/legal/epl-v10.html\n
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-Eclipse Foundation Software User Agreement\n\
-March 17, 2005\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the\n\
-Eclipse Foundation is provided to you under the terms and conditions of\n\
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
-provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse.org CVS\n\
-repository ("Repository") in CVS modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-	- Content may be structured and packaged into modules to facilitate delivering,\n\
-	  extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-	  plug-in fragments ("Fragments"), and features ("Features").\n\
-	- Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
-	  in a directory named "plugins".\n\
-	- A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-	  Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-	  Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-	  numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-	- Features may also include other Features ("Included Features"). Within a Feature, files\n\
-	  named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-	- The top-level (root) directory\n\
-	- Plug-in and Fragment directories\n\
-	- Inside Plug-ins and Fragments packaged as JARs\n\
-	- Sub-directories of the directory named "src" of certain Plug-ins\n\
-	- Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Eclipse Update Manager, you must agree to a license ("Feature Update\n\
-License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties" found within a Feature.\n\
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
-terms and conditions (or references to such terms and conditions) that\n\
-govern your use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-	- Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-	- Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-	- Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-	- IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
-	- Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-	- Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use, and\n\
-re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/releng/org.eclipse.ptp.rdt.sdk-feature/sourceTemplateFeature/license.html b/releng/org.eclipse.ptp.rdt.sdk-feature/sourceTemplateFeature/license.html
deleted file mode 100644
index c6af966..0000000
--- a/releng/org.eclipse.ptp.rdt.sdk-feature/sourceTemplateFeature/license.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<title>Eclipse.org Software User Agreement</title>
-</head>
-
-<body lang="EN-US" link=blue vlink=purple>
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>March 17, 2005</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-   
-<h3>Applicable Licenses</h3>   
-   
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-   
-<ul>
-	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>   
- 
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Inside Plug-ins and Fragments packaged as JARs</li>
-	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
-</ul>
-		
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
-	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-   
-<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
-</body>
-</html>
diff --git a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/.project b/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/.project
deleted file mode 100644
index bb70207..0000000
--- a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.rdt.xlc.sdk-feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/build.properties b/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/build.properties
deleted file mode 100644
index 6a8c4ad..0000000
--- a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-bin.includes = feature.xml,\
-               epl-v10.html,\
-               feature.properties,\
-               license.html
-
-generate.feature@org.eclipse.ptp.rdt.xlc.source=org.eclipse.ptp.rdt.xlc
diff --git a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/epl-v10.html b/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
-WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/feature.properties b/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/feature.properties
deleted file mode 100644
index 0e8673d..0000000
--- a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/feature.properties
+++ /dev/null
@@ -1,132 +0,0 @@
-#################################################################################
-# Copyright (c) 2010 IBM Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - Initial Implementation
-#
-#################################################################################
-
-# "featureName" property - name of the feature
-featureName=PTP Remote Development Tools XL C/C++ Compiler Support SDK
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
-
-# "updateSiteName" property - label for the update site
-updateSiteName=Eclipse PTP Update Site
-
-# "description" property - description of the feature
-description=Remote support for the IBM XL C/C++ compilers (SDK).
-
-# copyright
-copyright=\
-Copyright (c) 2008 IBM Corporation.\n\
-All rights reserved. This program and the accompanying materials\n\
-are made available under the terms of the Eclipse Public License v1.0\n\
-which accompanies this distribution, and is available at\n\
-http://www.eclipse.org/legal/epl-v10.html\n
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-Eclipse Foundation Software User Agreement\n\
-March 17, 2005\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the\n\
-Eclipse Foundation is provided to you under the terms and conditions of\n\
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
-provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse.org CVS\n\
-repository ("Repository") in CVS modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-	- Content may be structured and packaged into modules to facilitate delivering,\n\
-	  extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-	  plug-in fragments ("Fragments"), and features ("Features").\n\
-	- Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
-	  in a directory named "plugins".\n\
-	- A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-	  Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-	  Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-	  numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-	- Features may also include other Features ("Included Features"). Within a Feature, files\n\
-	  named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-	- The top-level (root) directory\n\
-	- Plug-in and Fragment directories\n\
-	- Inside Plug-ins and Fragments packaged as JARs\n\
-	- Sub-directories of the directory named "src" of certain Plug-ins\n\
-	- Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Eclipse Update Manager, you must agree to a license ("Feature Update\n\
-License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties" found within a Feature.\n\
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
-terms and conditions (or references to such terms and conditions) that\n\
-govern your use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-	- Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-	- Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-	- Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-	- IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
-	- Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-	- Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use, and\n\
-re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/feature.xml b/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/feature.xml
deleted file mode 100644
index 6728c27..0000000
--- a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/feature.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.ptp.rdt.xlc.sdk"
-      label="%featureName"
-      version="4.0.0.qualifier"
-      provider-name="%providerName">
-
-   <description>
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="%licenseURL">
-      %license
-   </license>
-
-   <url>
-      <update label="%updateSiteName" url="http://download.eclipse.org/tools/ptp/releases/galileo"/>
-   </url>
-
-   <includes
-         id="org.eclipse.ptp.rdt.xlc.source"
-         version="0.0.0"/>
-
-   <requires>
-      <import feature="org.eclipse.ptp.rdt.xlc"/>
-   </requires>
-
-</feature>
diff --git a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/license.html b/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/license.html
deleted file mode 100644
index c6af966..0000000
--- a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/license.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<title>Eclipse.org Software User Agreement</title>
-</head>
-
-<body lang="EN-US" link=blue vlink=purple>
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>March 17, 2005</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-   
-<h3>Applicable Licenses</h3>   
-   
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-   
-<ul>
-	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>   
- 
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Inside Plug-ins and Fragments packaged as JARs</li>
-	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
-</ul>
-		
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
-	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-   
-<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
-</body>
-</html>
diff --git a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/sourceTemplateFeature/eclipse_update_120.jpg b/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/sourceTemplateFeature/eclipse_update_120.jpg
deleted file mode 100644
index bfdf708..0000000
--- a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/sourceTemplateFeature/eclipse_update_120.jpg
+++ /dev/null
Binary files differ
diff --git a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/sourceTemplateFeature/epl-v10.html b/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/sourceTemplateFeature/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/sourceTemplateFeature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
-WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/sourceTemplateFeature/feature.properties b/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/sourceTemplateFeature/feature.properties
deleted file mode 100644
index 0535efe..0000000
--- a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/sourceTemplateFeature/feature.properties
+++ /dev/null
@@ -1,132 +0,0 @@
-#################################################################################
-# Copyright (c) 2010 IBM Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-# 
-# Contributors:
-#     IBM Corporation - Initial Implementation
-#
-#################################################################################
-
-# "featureName" property - name of the feature
-featureName=PTP Remote Development Tools XL C/C++ Compiler Support Source
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
-
-# "updateSiteName" property - label for the update site
-updateSiteName=Eclipse PTP Update Site
-
-# "description" property - description of the feature
-description=Remote support for the IBM XL C/C++ compilers (SDK) source code.
-
-# copyright
-copyright=\
-Copyright (c) 2008 IBM Corporation.\n\
-All rights reserved. This program and the accompanying materials\n\
-are made available under the terms of the Eclipse Public License v1.0\n\
-which accompanies this distribution, and is available at\n\
-http://www.eclipse.org/legal/epl-v10.html\n
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-Eclipse Foundation Software User Agreement\n\
-March 17, 2005\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the\n\
-Eclipse Foundation is provided to you under the terms and conditions of\n\
-the Eclipse Public License Version 1.0 ("EPL"). A copy of the EPL is\n\
-provided with this Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse.org CVS\n\
-repository ("Repository") in CVS modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-	- Content may be structured and packaged into modules to facilitate delivering,\n\
-	  extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-	  plug-in fragments ("Fragments"), and features ("Features").\n\
-	- Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java(TM) ARchive)\n\
-	  in a directory named "plugins".\n\
-	- A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-	  Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-	  Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-	  numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-	- Features may also include other Features ("Included Features"). Within a Feature, files\n\
-	  named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-	- The top-level (root) directory\n\
-	- Plug-in and Fragment directories\n\
-	- Inside Plug-ins and Fragments packaged as JARs\n\
-	- Sub-directories of the directory named "src" of certain Plug-ins\n\
-	- Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Eclipse Update Manager, you must agree to a license ("Feature Update\n\
-License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties" found within a Feature.\n\
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the\n\
-terms and conditions (or references to such terms and conditions) that\n\
-govern your use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-	- Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-	- Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-	- Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-	- IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
-	- Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-	- Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License, or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use, and\n\
-re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/sourceTemplateFeature/license.html b/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/sourceTemplateFeature/license.html
deleted file mode 100644
index c6af966..0000000
--- a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/sourceTemplateFeature/license.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<title>Eclipse.org Software User Agreement</title>
-</head>
-
-<body lang="EN-US" link=blue vlink=purple>
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>March 17, 2005</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-   
-<h3>Applicable Licenses</h3>   
-   
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-   
-<ul>
-	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>   
- 
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Inside Plug-ins and Fragments packaged as JARs</li>
-	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
-</ul>
-		
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
-	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-   
-<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
-</body>
-</html>
diff --git a/releng/org.eclipse.ptp.releng/.cvsignore b/releng/org.eclipse.ptp.releng/.cvsignore
deleted file mode 100644
index 3d9429e..0000000
--- a/releng/org.eclipse.ptp.releng/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-results
-tools
diff --git a/releng/org.eclipse.ptp.releng/.project b/releng/org.eclipse.ptp.releng/.project
deleted file mode 100644
index 4f01de7..0000000
--- a/releng/org.eclipse.ptp.releng/.project
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.releng</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-	</buildSpec>
-	<natures>
-	</natures>
-</projectDescription>
diff --git a/releng/org.eclipse.ptp.releng/build.sh b/releng/org.eclipse.ptp.releng/build.sh
deleted file mode 100644
index da9788b..0000000
--- a/releng/org.eclipse.ptp.releng/build.sh
+++ /dev/null
@@ -1,34 +0,0 @@
-#*******************************************************************************
-# Copyright (c) 2008, 2009 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
-#*******************************************************************************
-
-# export display for running the tests
-export DISPLAY=:1
-
-# set up to use the Java 5 JRE
-export PATH=/opt/public/common/ibm-java2-ppc-50/bin:$PATH
-
-# make sure we're in the releng project dir 
-cd `dirname $0`
-
-umask 0022
-
-# Checkout basebuilder to run the build
-mkdir -p tools
-cd tools
-cvs -d:pserver:anonymous@dev.eclipse.org:/cvsroot/eclipse \
-	checkout -r R35_RC2 org.eclipse.releng.basebuilder
-cd ..
-
-# Let's go!
-java -jar tools/org.eclipse.releng.basebuilder/plugins/org.eclipse.equinox.launcher.jar \
-	-ws gtk -arch ppc -os linux -application org.eclipse.ant.core.antRunner $*
-
-exit 0
diff --git a/releng/org.eclipse.ptp.releng/build.xml b/releng/org.eclipse.ptp.releng/build.xml
deleted file mode 100644
index 431361f..0000000
--- a/releng/org.eclipse.ptp.releng/build.xml
+++ /dev/null
@@ -1,844 +0,0 @@
-<project name="PTP" default="nightly">
-	<target name="hi">
-		<echo message="${eclipse.home}"/>
-	</target>
-	
-	<target name="build" depends="zips,p2,test"/>
-	<target name="nightly" depends="tag,zips,sign,p2,test,copy,check"/>
-	<target name="testbuild" depends="zips,test,copy"/>
-	<target name="buildcopy" depends="zips,copy"/>
-	
-	<target name="init">
-		<touch file="${user.home}/.cvspass" />
-		<tstamp/>
-		<property name="eclipseDist" value="/home/data/httpd/download.eclipse.org/eclipse/downloads/drops/S-3.6M6-201003121448/eclipse-SDK-3.6M6-linux-gtk-ppc.tar.gz"/>
-		<property name="cdtDist" value="/home/data/httpd/download.eclipse.org/tools/cdt/builds/7.0.0/I.I201003221356/cdt-master-7.0.0-I201003221356.zip"/>
-		<property name="mylynDist" value="/home/data/httpd/download.eclipse.org/tools/mylyn/update/helios/mylyn-3.4.0.I20100204-0200-e3.4.zip"/>
-		<property name="rseDist" value="/home/data/httpd/download.eclipse.org/dsdp/tm/downloads/drops/S-3.2M6-201003160452/RSE-SDK-3.2M6.zip"/>
-		<property name="tauJars" value="${user.home}/tau_jars.zip"/>
-		<property name="eclipseRelease" value="helios"/>
-		<property name="ptpBranchVersion" value="4.0.0"/>
-		<property name="timestamp" value="${DSTAMP}${TSTAMP}" />
-		<property name="forceContextQualifier" value="${timestamp}"/>
-		<property name="buildingOSGi" value="true"/>
-		<property name="buildDirectory" value="${basedir}/results"/>
-		<property name="copyToDir" value="/home/www/tools/ptp/builds/${eclipseRelease}"/>
-		<property name="testDirectory" value="${buildDirectory}/test"/>
-		<property name="baseLocation" value="${buildDirectory}/eclipse"/>
-		<property name="pde.build.scripts" value="${eclipse.pdebuild.scripts}"/>
-		<property name="collectingFolder" value="eclipse"/>
-		<property name="archivePrefix" value="eclipse"/>
-		<property name="buildType" value="I" />
-		<property name="buildId" value="${buildType}${timestamp}"/>
-		<property name="zipsdir" value="${buildDirectory}/${buildType}.${buildId}"/>
-		<property name="ptpMasterFile" value="ptp-master-${ptpBranchVersion}-${buildId}.zip"/>
-		<property name="eclipseTest" value="org.eclipse.test_3.2.0"/>
-		<property name="mailto" value="g.watson@computer.org"/>
-		<property name="eclipseRoot" value=":pserver:anonymous@dev.eclipse.org:/cvsroot/eclipse"/>
-		<property name="baseos" value="${osgi.os}"/>
-		<property name="basews" value="${osgi.ws}"/>
-		<property name="basearch" value="${osgi.arch}"/>
-		<property name="ptpTagBranch" value=""/>
-		<property name="photranTagBranch" value=""/>
-		<property name="tagname" value="v${timestamp}"/>
-		<property name="testReports" value="${zipsdir}/testReports"/>
-		<property name="junit-report-output" value="${testReports}"/>
-		<property name="jvm1.5" value="/opt/public/common/ibm-java2-ppc-50/bin/java"/>
-		<condition property="onWindows">
-			<os family="windows"/>
-		</condition>
-		<mkdir dir="${buildDirectory}"/>
-		<mkdir dir="${testReports}"/>
-	</target>
-	
-	<target name="fetch" depends="init">
-		<ant antfile="build.xml" dir="${pde.build.scripts}" target="preBuild">
-			<property name="builder" value="${basedir}/master"/>
-		</ant>
-		<ant antfile="build.xml" dir="${pde.build.scripts}" target="fetch">
-			<property name="builder" value="${basedir}/master"/>
-		</ant>
-	</target>
-	
-	<target name="unzip" depends="init" unless="dontUnzip">
-		<untar src="${eclipseDist}" dest="${buildDirectory}" compression="gzip"/>
-		<unzip src="${rseDist}" dest="${buildDirectory}"/>
-		<unzip src="${cdtDist}" dest="${buildDirectory}/eclipse"/>
-		<unzip src="${mylynDist}" dest="${buildDirectory}/eclipse"/>
-	</target>
-	
-	<target name="zips" depends="init,unzip">
-		<ant antfile="build.xml" dir="${pde.build.scripts}">
-			<property name="builder" value="${basedir}/master" />
-		</ant>
-		<concat destfile="${zipsdir}/compilelog.txt">
-			<fileset dir="${buildDirectory}/plugins" includes="**/*.bin.log"/>
-			<fileset dir="${buildDirectory}/plugins" includes="**/*@dot.log"/>
-		</concat>
-		<loadfile property="compileLog" srcFile="${zipsdir}/compilelog.txt"/>
-		<condition property="hasErrors">
-			<contains string="${compileLog}" substring=" ERROR"/>
-		</condition>
-		<move file="${zipsdir}/${ptpMasterFile}" todir="${buildDirectory}"/>
-		
-		<unzip src="${buildDirectory}/${ptpMasterFile}" dest="${buildDirectory}/site"/>
-		<copy file="${buildDirectory}/eclipse/epl-v10.html" todir="${buildDirectory}/site/eclipse"/>
-		<copy file="${buildDirectory}/eclipse/notice.html" todir="${buildDirectory}/site/eclipse"/>
-		<copy file="index.html" todir="${buildDirectory}/site/eclipse"/>
-		<mkdir dir="${buildDirectory}/site/eclipse/web"/>
-		<copy todir="${buildDirectory}/site/eclipse/web">
-			<fileset dir="web"/>
-		</copy>
-		<copy file="buildsite.xml" tofile="${buildDirectory}/site/eclipse/site.xml"/>
-		<replace file="${buildDirectory}/site/eclipse/site.xml">
-			<replacefilter token="@timeStamp@" value="${timestamp}"/>
-		</replace>
-		<copy file="pack.properties" todir="${buildDirectory}/site/eclipse"/>
-
-		<zip destfile="${zipsdir}/${ptpMasterFile}"
-			basedir="${buildDirectory}/site/eclipse"/>
-	</target>
-
-	<target name="sign" depends="init" unless="hasErrors">
-		<exec executable="sign">
-			<arg value="${buildDirectory}/${buildType}.${buildId}/${ptpMasterFile}"/>
-			<arg value="nomail"/>
-			<arg value="${buildDirectory}/signed"/>
-		</exec>
-		<waitfor maxwait="60" maxwaitunit="minute">
-			<available file="${buildDirectory}/signed/${ptpMasterFile}"/>
-		</waitfor>
-		<move file="${buildDirectory}/signed/${ptpMasterFile}" todir="${zipsdir}"/>
-	</target>
-	
-	<target name="test" depends="init" unless="hasErrors"/>
-	
-	<target name="check" depends="init" if="hasErrors">
-		<echo>BUILD FAILED</echo>
-		<echo>Errors were detected in the build output.</echo>
-	</target>
-		
-	<target name="copy" depends="init" unless="hasErrors">
-		<mkdir dir="${copyToDir}/${buildType}.${buildId}"/>
-		<copy todir="${copyToDir}/${buildType}.${buildId}">
-			<fileset dir="${buildDirectory}/${buildType}.${buildId}"/>
-		</copy>
-		<chmod perm="g+w" dir="${copyToDir}/${buildType}.${buildId}">
-			<dirset dir="${copyToDir}/${buildType}.${buildId}"/>
-		</chmod>
-		<!-- Create symlink to latest build -->
-		<delete file="${copyToDir}/latest" followsymlinks="false" failonerror="false"/>
-		<!--symlink action="delete" link="${copyToDir}/latest" failonerror="false"/-->
-		<symlink link="${copyToDir}/latest" resource="${copyToDir}/${buildType}.${buildId}" overwrite="true"/>
-		<delete file="${copyToDir}/ptp-master-${ptpBranchVersion}-latest.zip" followsymlinks="false" failonerror="false"/>
-		<!--symlink action="delete" link="${copyToDir}/ptp-master-${ptpBranchVersion}-latest.zip" failonerror="false"/-->
-		<symlink link="${copyToDir}/ptp-master-${ptpBranchVersion}-latest.zip" resource="${copyToDir}/${buildType}.${buildId}/${ptpMasterFile}" overwrite="true"/>
-		<delete file="${copyToDir}/rdt-server-unix-${ptpBranchVersion}-latest.tar" followsymlinks="false" failonerror="false"/>
-		<!--symlink action="delete" link="${copyToDir}/rdt-server-unix-${ptpBranchVersion}-latest.tar" failonerror="false"/-->
-		<symlink link="${copyToDir}/rdt-server-unix-${ptpBranchVersion}-latest.tar" resource="${copyToDir}/${buildType}.${buildId}/rdt-server-unix-${ptpBranchVersion}.tar" overwrite="true"/>
-	</target>
-	
-	<target name="p2" depends="init" unless="hasErrors">
-		<!-- unzip the signed master site -->
-		<property name="p2dir" value="${zipsdir}/p2"/>
-		<property name="destination" value="${zipsdir}/${ptpMasterFile}"/>
-		
-		<unzip src="${destination}" dest="${p2dir}"/>
-		
-		<!-- generate p2 metadata -->
-		<antcall target="p2.metadata.generator">
-			<param name="p2site" value="${p2dir}"/>
-		</antcall>
-		
-		<!-- zip everything back up -->
-		<zip destfile="${destination}"
-			basedir="${p2dir}"/>
-		<delete dir="${p2dir}"/>
-	</target>
-		
-    <target name="p2.metadata.generator">
-    	<echo message="Generate p2 Metadata" />
-    	<property name="p2site" value="${zipsdir}/p2"/>
-    	<property name="launcher" value="${basedir}/tools/org.eclipse.releng.basebuilder/plugins/org.eclipse.equinox.launcher.jar"/>
-    	<java jar="${launcher}" fork="true" timeout="10800000" jvm="${jvm1.5}" failonerror="true" maxmemory="768m" dir="${buildDirectory}/eclipse">
-            <arg line="-application org.eclipse.equinox.p2.metadata.generator.EclipseGenerator" />
-            <arg line="-updateSite ${p2site}"/>
-        	<arg line="-site file:${p2site}/site.xml"/>
-        	<arg line="-metadataRepository file:${p2site}"/>
-        	<arg line="-metadataRepositoryName PTP Update Site"/>
-        	<arg line="-artifactRepository file:${p2site}"/>
-        	<arg line="-artifactRepositoryName PTP Artifacts"/>
-        	<arg line="-compress"/>
-        	<arg line="-reusePack200Files"/>
-        	<arg line="-noDefaultIUs"/>
-        	<arg line="-vmargs -Xmx256M"/>
-        </java>
-	</target>
-	
-	<target name="tagone">
-		<cvs cvsroot="/cvsroot/tools" command="rtag ${tagbranch} ${tagname} ${tagmodule}"/>
-	</target>
-	
-	<target name="tag" depends="init">
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.master"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		
-		<!--Features-->
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.utils-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.core-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.remote-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.remote.remotetools-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.remote.rse-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.remotetools-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.rm.ibm.ll-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.rm.ibm.pe-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.rm.mpich2-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.rm.openmpi-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.rm.slurm-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.rm.pbs-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.external-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.sdm-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.pldt-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.pldt.lapi-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.pldt.upc-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.etfw-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.etfw.tau-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.etfw.tau.fortran-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.rdt-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.rdt.xlc-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>	
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.rdt.remotetools-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>	
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.services-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.isp-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		
-		<!--Plugins-->
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/core/org.eclipse.ptp.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/core/org.eclipse.ptp.utils.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/core/org.eclipse.ptp.utils.ui"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/core/org.eclipse.ptp.proxy.protocol"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/core/org.eclipse.ptp.remote.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/core/org.eclipse.ptp.remote.remotetools.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/core/org.eclipse.ptp.remote.remotetools.ui"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/core/org.eclipse.ptp.remote.rse.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/core/org.eclipse.ptp.remote.rse.ui"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/core/org.eclipse.ptp.remote.ui"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.ibm.ll.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.ibm.ll.help"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.ibm.ll.proxy"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>			
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.ibm.ll.ui"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.ibm.pe.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.ibm.pe.help"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.ibm.pe.proxy"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.ibm.pe.ui"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.mpi.mpich2.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.mpi.mpich2.proxy"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.mpi.mpich2.ui"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.mpi.openmpi.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.mpi.openmpi.ui"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.pbs.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.pbs.jproxy"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.pbs.ui"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.proxy.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.slurm.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.slurm.proxy"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.slurm.ui"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-			<param name="tagmodule" value="org.eclipse.ptp/rms/org.eclipse.ptp.rm.ui"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/core/org.eclipse.ptp.ui"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/debug/org.eclipse.ptp.debug.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/debug/org.eclipse.ptp.debug.sdm"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/debug/org.eclipse.ptp.debug.sdm.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/debug/org.eclipse.ptp.debug.sdm.ui"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/debug/org.eclipse.ptp.debug.ui"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/debug/org.eclipse.ptp.debug.sdm"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/core/org.eclipse.ptp.proxy"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/core/org.eclipse.ptp.utils"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.remotetools.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.remotetools.environment.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.remotetools.environment.generichost"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.remotetools.environment.launcher"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.remotetools.environment.ui"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.remotetools.preferences"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.remotetools.utils"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/core/org.eclipse.ptp.launch"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/doc/org.eclipse.ptp.help"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.pldt.common"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.pldt.help"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.pldt.lapi"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.pldt.mpi.analysis"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>			
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.pldt.mpi.analysis.cdt"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.pldt.mpi.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.pldt.openmp.analysis"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.pldt.openmp.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.pldt.openmp.ui.pv"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.pldt.upc"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/org.eclipse.ptp.pldt.wizards"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.tau"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.tau.jars"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.tau.papiselect"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.tau.perfdmf"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.tau.selinst"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.tau.selinstfort"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.toolopts"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.feedback"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.core.remotejars"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.core.stubs"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.services"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.ui"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.servers.dstore"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.doc.user"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.managedbuilder.xlc.ui"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.xlc"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.make.ui"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.core.tests"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.services.test"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.ui.test"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.aix.ppc"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.linux.ppc"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.linux.x86"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.linux.x86_64"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.macosx.ppc"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.macosx.x86"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.parallel"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/core/org.eclipse.ptp.services.core"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/core/org.eclipse.ptp.services.test"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/core/org.eclipse.ptp.services.ui"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/isp/org.eclipse.ptp.isp"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/isp/org.eclipse.ptp.isp.help"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran-dev-docs"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>	
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran-feature"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>	
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran-samples"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>	
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.cdtinterface"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>
-        <antcall target="tagone">
-            <param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.cdtinterface.vpg"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-        </antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.cmdline"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>	
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.core"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.core.intel"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.core.vpg"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.core.vpg.preprocessor.c"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.core.vpg.preprocessor.c.tests"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.core.vpg.tests"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.core.vpg.tests.failing"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.doc.user"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.errorparsers.xlf"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.intel-feature"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>	
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.managedbuilder.core"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.managedbuilder.gnu.ui"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.managedbuilder.intel.ui"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.managedbuilder.ui"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.managedbuilder.xlf.ui"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.master"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.releng"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>	
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.ui"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.ui.vpg"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>	
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.ui.vpg.preprocessor.c"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>	
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.vpg-feature"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.photran.xlf-feature"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.rephraserengine-feature"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.rephraserengine-support"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-		</antcall>
-        <antcall target="tagone">
-            <param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.rephraserengine.core"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-        </antcall>
-        <antcall target="tagone">
-            <param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.rephraserengine.core.refactoring"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-        </antcall>
-        <antcall target="tagone">
-            <param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.rephraserengine.core.vpg"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-        </antcall>
-        <antcall target="tagone">
-            <param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.rephraserengine.core.vpg.tests"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-        </antcall>
-        <antcall target="tagone">
-            <param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.rephraserengine.doc.isv"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-        </antcall>
-        <antcall target="tagone">
-            <param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.rephraserengine.examples.testing"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-        </antcall>
-        <antcall target="tagone">
-            <param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.rephraserengine.examples.text"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-        </antcall>
-        <antcall target="tagone">
-            <param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.rephraserengine.testing.junit3"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-        </antcall>
-        <antcall target="tagone">
-            <param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.rephraserengine.ui"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-        </antcall>
-        <antcall target="tagone">
-            <param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.rephraserengine.ui.refactoring"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-        </antcall>
-        <antcall target="tagone">
-            <param name="tagmodule" value="org.eclipse.ptp/photran/org.eclipse.rephraserengine.ui.vpg"/>
-			<param name="tagbranch" value="${photranTagBranch}"/>
-        </antcall>
-	</target>
-</project>
diff --git a/releng/org.eclipse.ptp.releng/buildsite.xml b/releng/org.eclipse.ptp.releng/buildsite.xml
deleted file mode 100644
index 1c9c002..0000000
--- a/releng/org.eclipse.ptp.releng/buildsite.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-   <description url="http://download.eclipse.org/tools/ptp/releases/galileo">
-      Parallel Tools Platform Helios Update Site
-   </description>
-   <feature url="features/org.eclipse.ptp_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp" version="4.0.0.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.remote.rse_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.remote.rse" version="4.0.0.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.pldt.upc_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.pldt.upc" version="4.0.0.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.etfw.tau_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.etfw.tau" version="4.0.0.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-    <feature url="features/org.eclipse.ptp.etfw.tau.fortran_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.etfw.tau.fortran" version="4.0.0.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.rdt_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.rdt" version="4.0.0.@timeStamp@">
-      <category name="Remote Development Tools"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.rdt.xlc_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.rdt.xlc" version="4.0.0.@timeStamp@">
-      <category name="Remote Development Tools"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.rdt.remotetools_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.rdt.remotetools" version="4.0.0.@timeStamp@">
-      <category name="Remote Development Tools"/>
-   </feature>
-   <feature url="features/org.eclipse.photran_6.0.0.@timeStamp@.jar" id="org.eclipse.photran" version="6.0.0.@timeStamp@">
-      <category name="Fortran Development Tools (Photran)"/>
-   </feature>
-   <feature url="features/org.eclipse.photran.intel_6.0.0.@timeStamp@.jar" id="org.eclipse.photran.intel" version="6.0.0.@timeStamp@" os="linux">
-      <category name="Fortran Development Tools (Photran)"/>
-   </feature>
-   <feature url="features/org.eclipse.photran.xlf_6.0.0.@timeStamp@.jar" id="org.eclipse.photran.xlf" version="6.0.0.@timeStamp@">
-      <category name="Fortran Development Tools (Photran)"/>
-   </feature>
-   <feature url="features/org.eclipse.rephraserengine_2.0.0.@timeStamp@.jar" id="org.eclipse.rephraserengine" version="2.0.0.@timeStamp@">
-      <category name="Fortran Development Tools (Photran)"/>
-   </feature>
-   <category-def name="Parallel Tools Platform" label="Parallel Tools Platform"/>
-   <category-def name="Remote Development Tools" label="Remote Development Tools"/>
-   <category-def name="Fortran Development Tools (Photran)" label="Fortran Development Tools (Photran)"/>
-</site>
diff --git a/releng/org.eclipse.ptp.releng/index.html b/releng/org.eclipse.ptp.releng/index.html
deleted file mode 100644
index b402e6c..0000000
--- a/releng/org.eclipse.ptp.releng/index.html
+++ /dev/null
@@ -1,81 +0,0 @@
-<html>
-<head>
-<title>PTP Update Site</title>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<style>@import url("web/site.css");</style>
-<script type="text/javascript">
-    var transformDone = false;
-    var stylesheet, xmlFile;
-
-    function loadXMLDoc(url, callback) {
-        if (window.XMLHttpRequest) {
-            var req = new XMLHttpRequest();
-
-            function processReqChange() {
-                if (req.readyState == 4) {    // only if req shows "loaded"
-                    if (req.status == 200) {  // only if "OK"
-                        callback(req.responseXML);
-                    } else {
-                        alert("There was a problem retrieving the XML data:\n" + req.statusText);
-                    }
-                }
-            }
-
-            req.onreadystatechange = processReqChange;
-            req.open("GET", url, true);
-            req.send(null);
-        }
-    }
-
-    function init() {
-        if (window.ActiveXObject) {
-            xmlFile = new ActiveXObject("msxml2.DOMDocument.3.0");
-            xmlFile.async = false;
-            xmlFile.load("site.xml");
-            stylesheet = new ActiveXObject("msxml2.FreeThreadedDOMDocument.3.0");
-            stylesheet.async = false;
-            stylesheet.load("web/site.xsl");
-            cache = new ActiveXObject("msxml2.XSLTemplate.3.0");
-            cache.stylesheet = stylesheet;
-            transformDataIE();
-        } else {
-            xmlFile = stylesheet = null;
-            transformDone = false;
-	    loadXMLDoc("site.xml",
-                function(result) {
-		    xmlFile = result;
-                    transform();
-                }
-            );
-            loadXMLDoc("web/site.xsl",
-                function(result) {
-                    stylesheet = result;
-                    transform();
-                }
-	    );
-        }
-    }
-    function transform() {
-        if (!transformDone && xmlFile && stylesheet) {
-            var processor = new XSLTProcessor();
-            processor.importStylesheet(stylesheet);
-            var doc = processor.transformToDocument(xmlFile);
-            var dataDivBody = document.getElementById("data");
-//          alert(new XMLSerializer().serializeToString(doc.documentElement.innerHTML));
-            dataDivBody.innerHTML = doc.documentElement.innerHTML;
-            transformDone = true;
-        }
-    }
-    function transformDataIE() { // separate transformation function for IE 6.0+
-        var processor = cache.createProcessor();
-        processor.input = xmlFile;
-	processor.transform();
-	data.innerHTML = processor.output;
-    }
-</script>
-</head>
-<body onload="init();">
-<!--[insert static HTML here]-->
-<div id="data"><!-- this is where the transformed data goes --></div>
-</body>
-</html>
diff --git a/releng/org.eclipse.ptp.releng/maps/photran.map b/releng/org.eclipse.ptp.releng/maps/photran.map
deleted file mode 100644
index 4b962b9..0000000
--- a/releng/org.eclipse.ptp.releng/maps/photran.map
+++ /dev/null
@@ -1,36 +0,0 @@
-! Master feature
-!feature@org.eclipse.photran.master=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.photran.master
-
-! Photran features
-feature@org.eclipse.rephraserengine=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.rephraserengine-feature
-feature@org.eclipse.photran=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.photran-feature
-feature@org.eclipse.photran.xlf=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.photran.xlf-feature
-feature@org.eclipse.photran.intel=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.photran.intel-feature
-
-! Plugins
-plugin@org.eclipse.rephraserengine.core=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.rephraserengine.core
-plugin@org.eclipse.rephraserengine.core.refactoring=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.rephraserengine.core.refactoring
-plugin@org.eclipse.rephraserengine.core.vpg=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.rephraserengine.core.vpg
-plugin@org.eclipse.rephraserengine.doc.isv=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.rephraserengine.doc.isv
-plugin@org.eclipse.rephraserengine.ui=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.rephraserengine.ui
-plugin@org.eclipse.rephraserengine.ui.refactoring=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.rephraserengine.ui.refactoring
-plugin@org.eclipse.rephraserengine.ui.vpg=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.rephraserengine.ui.vpg
-plugin@org.eclipse.photran.core=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.photran.core
-plugin@org.eclipse.photran.managedbuilder.core=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.photran.managedbuilder.core
-plugin@org.eclipse.photran.managedbuilder.ui=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.photran.managedbuilder.ui
-plugin@org.eclipse.photran.cdtinterface=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.photran.cdtinterface
-plugin@org.eclipse.photran.ui=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.photran.ui
-plugin@org.eclipse.photran.managedbuilder.gnu.ui=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.photran.managedbuilder.gnu.ui
-plugin@org.eclipse.photran.cdtinterface.vpg=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.photran.cdtinterface.vpg
-plugin@org.eclipse.photran.core.vpg=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.photran.core.vpg
-plugin@org.eclipse.photran.ui.vpg=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.photran.ui.vpg
-plugin@org.eclipse.photran.core.vpg.preprocessor.c=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.photran.core.vpg.preprocessor.c
-plugin@org.eclipse.photran.ui.vpg.preprocessor.c=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.photran.ui.vpg.preprocessor.c
-plugin@org.eclipse.photran.managedbuilder.intel.ui=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.photran.managedbuilder.intel.ui
-plugin@org.eclipse.photran.core.intel=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.photran.core.intel
-plugin@org.eclipse.photran.errorparsers.xlf=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.photran.errorparsers.xlf
-plugin@org.eclipse.photran.managedbuilder.xlf.ui=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.photran.managedbuilder.xlf.ui
-plugin@org.eclipse.photran.doc.user=@photranTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/photran/org.eclipse.photran.doc.user
-
-! Tests
-
diff --git a/releng/org.eclipse.ptp.releng/maps/ptp.map b/releng/org.eclipse.ptp.releng/maps/ptp.map
deleted file mode 100644
index cbbf2bb..0000000
--- a/releng/org.eclipse.ptp.releng/maps/ptp.map
+++ /dev/null
@@ -1,146 +0,0 @@
-! The master
-feature@org.eclipse.ptp.master=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.master
-
-! PTP features
-feature@org.eclipse.ptp=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp-feature
-feature@org.eclipse.ptp.utils=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.utils-feature
-feature@org.eclipse.ptp.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.core-feature
-feature@org.eclipse.ptp.remote=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.remote-feature
-feature@org.eclipse.ptp.remote.remotetools=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.remote.remotetools-feature
-feature@org.eclipse.ptp.remote.rse=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.remote.rse-feature
-feature@org.eclipse.ptp.remotetools=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.remotetools-feature
-feature@org.eclipse.ptp.rm.ibm.ll=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.rm.ibm.ll-feature
-feature@org.eclipse.ptp.rm.ibm.pe=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.rm.ibm.pe-feature
-feature@org.eclipse.ptp.rm.mpich2=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.rm.mpich2-feature
-feature@org.eclipse.ptp.rm.openmpi=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.rm.openmpi-feature
-feature@org.eclipse.ptp.rm.pbs=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.rm.pbs-feature
-feature@org.eclipse.ptp.rm.slurm=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.rm.slurm-feature
-feature@org.eclipse.ptp.external=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.external-feature
-feature@org.eclipse.ptp.debug.sdm=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.sdm-feature
-feature@org.eclipse.ptp.services=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.services-feature
-feature@org.eclipse.ptp.isp=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.isp-feature
-
-! PLDT features
-feature@org.eclipse.ptp.pldt=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.pldt-feature
-feature@org.eclipse.ptp.pldt.lapi=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.pldt.lapi-feature
-feature@org.eclipse.ptp.pldt.upc=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.pldt.upc-feature
-
-! ETFw (formerly PERF) features
-feature@org.eclipse.ptp.etfw=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.etfw-feature
-feature@org.eclipse.ptp.etfw.tau=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.etfw.tau-feature
-feature@org.eclipse.ptp.etfw.tau.fortran=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.etfw.tau.fortran-feature
-
-! RDT features
-feature@org.eclipse.ptp.rdt=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.rdt-feature
-feature@org.eclipse.ptp.rdt.xlc=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.rdt.xlc-feature
-feature@org.eclipse.ptp.rdt.remotetools=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.rdt.remotetools-feature
-feature@org.eclipse.ptp.rdt.remotejars=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.rdt.remotejars-feature
-
-! PTP Plugins
-plugin@org.eclipse.ptp=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp
-plugin@org.eclipse.ptp.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/core/org.eclipse.ptp.core
-plugin@org.eclipse.ptp.utils.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/core/org.eclipse.ptp.utils.core
-plugin@org.eclipse.ptp.utils.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/core/org.eclipse.ptp.utils.ui
-plugin@org.eclipse.ptp.proxy.protocol=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/core/org.eclipse.ptp.proxy.protocol
-plugin@org.eclipse.ptp.remote.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/core/org.eclipse.ptp.remote.core
-plugin@org.eclipse.ptp.remote.remotetools.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/core/org.eclipse.ptp.remote.remotetools.core
-plugin@org.eclipse.ptp.remote.remotetools.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/core/org.eclipse.ptp.remote.remotetools.ui
-plugin@org.eclipse.ptp.remote.rse.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/core/org.eclipse.ptp.remote.rse.core
-plugin@org.eclipse.ptp.remote.rse.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/core/org.eclipse.ptp.remote.rse.ui
-plugin@org.eclipse.ptp.remote.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/core/org.eclipse.ptp.remote.ui
-plugin@org.eclipse.ptp.rm.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.core
-plugin@org.eclipse.ptp.rm.ibm.ll.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.ibm.ll.core
-plugin@org.eclipse.ptp.rm.ibm.ll.help=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.ibm.ll.help
-plugin@org.eclipse.ptp.rm.ibm.ll.proxy=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.ibm.ll.proxy
-plugin@org.eclipse.ptp.rm.ibm.ll.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.ibm.ll.ui
-plugin@org.eclipse.ptp.rm.ibm.pe.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.ibm.pe.core
-plugin@org.eclipse.ptp.rm.ibm.pe.help=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.ibm.pe.help
-plugin@org.eclipse.ptp.rm.ibm.pe.proxy=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.ibm.pe.proxy
-plugin@org.eclipse.ptp.rm.ibm.pe.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.ibm.pe.ui
-plugin@org.eclipse.ptp.rm.mpi.mpich2.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.mpi.mpich2.core
-plugin@org.eclipse.ptp.rm.mpi.mpich2.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.mpi.mpich2.ui
-plugin@org.eclipse.ptp.rm.mpi.openmpi.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.mpi.openmpi.core
-plugin@org.eclipse.ptp.rm.mpi.openmpi.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.mpi.openmpi.ui
-plugin@org.eclipse.ptp.rm.pbs.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.pbs.core
-plugin@org.eclipse.ptp.rm.pbs.jproxy=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.pbs.jproxy
-plugin@org.eclipse.ptp.rm.pbs.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.pbs.ui
-plugin@org.eclipse.ptp.rm.proxy.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.proxy.core
-plugin@org.eclipse.ptp.rm.slurm.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.slurm.core
-plugin@org.eclipse.ptp.rm.slurm.proxy=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.slurm.proxy
-plugin@org.eclipse.ptp.rm.slurm.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.slurm.ui
-plugin@org.eclipse.ptp.rm.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.ui
-plugin@org.eclipse.ptp.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/core/org.eclipse.ptp.ui
-plugin@org.eclipse.ptp.debug.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/debug/org.eclipse.ptp.debug.core
-plugin@org.eclipse.ptp.debug.sdm=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/debug/org.eclipse.ptp.debug.sdm
-plugin@org.eclipse.ptp.debug.sdm.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/debug/org.eclipse.ptp.debug.sdm.core
-plugin@org.eclipse.ptp.debug.sdm.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/debug/org.eclipse.ptp.debug.sdm.ui
-plugin@org.eclipse.ptp.debug.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/debug/org.eclipse.ptp.debug.ui
-plugin@org.eclipse.ptp.debug.sdm=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/debug/org.eclipse.ptp.debug.sdm
-plugin@org.eclipse.ptp.proxy=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/core/org.eclipse.ptp.proxy
-plugin@org.eclipse.ptp.utils=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/core/org.eclipse.ptp.utils
-plugin@org.eclipse.ptp.launch=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/core/org.eclipse.ptp.launch
-plugin@org.eclipse.ptp.help=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/doc/org.eclipse.ptp.help
-
-! Services Plugins
-plugin@org.eclipse.ptp.services.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/core/org.eclipse.ptp.services.core
-plugin@org.eclipse.ptp.services.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/core/org.eclipse.ptp.services.ui
-
-! Remote Tools Plugins
-plugin@org.eclipse.ptp.remotetools.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.remotetools.core
-plugin@org.eclipse.ptp.remotetools.environment.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.remotetools.environment.core
-plugin@org.eclipse.ptp.remotetools.environment.generichost=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.remotetools.environment.generichost
-plugin@org.eclipse.ptp.remotetools.environment.launcher=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.remotetools.environment.launcher
-plugin@org.eclipse.ptp.remotetools.environment.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.remotetools.environment.ui
-plugin@org.eclipse.ptp.remotetools.preferences=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.remotetools.preferences
-plugin@org.eclipse.ptp.remotetools.utils=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.remotetools.utils
-
-! PLDT Plugins
-plugin@org.eclipse.ptp.pldt.common=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.pldt.common
-plugin@org.eclipse.ptp.pldt.help=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.pldt.help
-plugin@org.eclipse.ptp.pldt.lapi=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.pldt.lapi
-plugin@org.eclipse.ptp.pldt.mpi.analysis=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.pldt.mpi.analysis
-plugin@org.eclipse.ptp.pldt.mpi.analysis.cdt=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.pldt.mpi.analysis.cdt
-plugin@org.eclipse.ptp.pldt.mpi.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.pldt.mpi.core
-plugin@org.eclipse.ptp.pldt.openmp.analysis=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.pldt.openmp.analysis
-plugin@org.eclipse.ptp.pldt.openmp.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.pldt.openmp.core
-plugin@org.eclipse.ptp.pldt.openmp.ui.pv=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.pldt.openmp.ui.pv
-plugin@org.eclipse.ptp.pldt.upc=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.pldt.upc
-plugin@org.eclipse.ptp.pldt.wizards=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/org.eclipse.ptp.pldt.wizards
-
-! ETF Plugins
-plugin@org.eclipse.ptp.etfw=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw
-plugin@org.eclipse.ptp.etfw.tau=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.tau
-plugin@org.eclipse.ptp.etfw.tau.papiselect=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.tau.papiselect
-plugin@org.eclipse.ptp.etfw.tau.perfdmf=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.tau.perfdmf
-plugin@org.eclipse.ptp.etfw.tau.selinst=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.tau.selinst
-plugin@org.eclipse.ptp.etfw.tau.selinstfort=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.tau.selinstfort
-plugin@org.eclipse.ptp.etfw.toolopts=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.toolopts
-plugin@org.eclipse.ptp.etfw.feedback=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.feedback
-
-! RDT Plugins
-plugin@org.eclipse.ptp.rdt.core=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.core
-plugin@org.eclipse.ptp.rdt.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.ui
-plugin@org.eclipse.ptp.rdt.doc.user=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.doc.user
-plugin@org.eclipse.ptp.rdt.managedbuilder.xlc.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.managedbuilder.xlc.ui
-plugin@org.eclipse.ptp.rdt.xlc=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.xlc
-plugin@org.eclipse.ptp.rdt.make.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.make.ui
-plugin@org.eclipse.ptp.rdt.core.remotejars=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.core.remotejars
-plugin@org.eclipse.ptp.rdt.core.stubs=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.core.stubs
-plugin@org.eclipse.ptp.rdt.server.dstore=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.server.dstore
-
-! ISP Plugins
-plugin@org.eclipse.ptp.isp=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/isp/org.eclipse.ptp.isp
-plugin@org.eclipse.ptp.isp.help=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/isp/org.eclipse.ptp.isp.help
-
-! Fragments
-fragment@org.eclipse.ptp.aix.ppc=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.aix.ppc
-fragment@org.eclipse.ptp.linux.ppc=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.linux.ppc
-fragment@org.eclipse.ptp.linux.x86=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.linux.x86
-fragment@org.eclipse.ptp.linux.x86_64=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.linux.x86_64
-fragment@org.eclipse.ptp.macosx.ppc=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.macosx.ppc
-fragment@org.eclipse.ptp.macosx.x86=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.macosx.x86
-fragment@org.eclipse.ptp.etfw.parallel=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/etfw/org.eclipse.ptp.etfw.parallel
-
-! Tests
-plugin@org.eclipse.ptp.rdt.core.tests=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.core.tests
-
diff --git a/releng/org.eclipse.ptp.releng/master/build.properties b/releng/org.eclipse.ptp.releng/master/build.properties
deleted file mode 100644
index 7bcd2e6..0000000
--- a/releng/org.eclipse.ptp.releng/master/build.properties
+++ /dev/null
@@ -1,100 +0,0 @@
-###############################################################################
-# Copyright (c) 2005, 2007 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
-###############################################################################
-#####################
-# Parameters describing how and where to execute the build.
-# Typical users need only update the following properties:
-#    baseLocation - where things you are building against are installed
-#    bootclasspath - The base jars to compile against (typicaly rt.jar)
-#    configs - the list of {os, ws, arch} configurations to build.  
-#
-# Of course any of the settings here can be overridden by spec'ing 
-# them on the command line (e.g., -DbaseLocation=d:/eclipse
-
-############# CVS CONTROL ################
-# The CVS tag to use when fetching the map files from the repository
-mapVersionTag=HEAD
-
-# The CVS tag to use when fetching elements to build.  By default the
-# builder will use whatever is in the maps.  Use this value to override
-# for example, when doing a nightly build out of HEAD
-# fetchTag=HEAD
-
-ptpTag=HEAD
-photranTag=HEAD
-
-############## BUILD / GENERATION CONTROL ################
-# The directory into which the build elements will be fetched and where
-# the build will take place.  buildDirectory and install should be the same
-# value.
-buildDirectory=build
-
-# Type of build.  Used in naming the build output.  Typically this value is
-# one of I, N, M, S, ...
-buildType=I
-
-# ID of the build.  Used in naming the build output.
-buildId=TestBuild
-
-# Label for the build.  Used in naming the build output
-buildLabel=${buildType}.${buildId}
-
-# Timestamp for the build.  Used in naming the build output
-timestamp=007
-
-# Base location for anything the build needs to compile against.  For example,
-# when building GEF, the baseLocation should be the location of a previously
-# installed Eclipse against which the GEF code will be compiled.
-baseLocation=
-
-#Os/Ws/Arch/nl of the eclipse specified by baseLocation
-#baseos
-#basews
-#basearch
-#basenl
-
-# The location underwhich all of the build output will be collected.  This will be
-# the root path in the resultant zip file.
-collPlace=eclipse
-
-# The directory  in which to execute zip of the ${collPlace} directory
-collBase=.
-
-# The list of {os, ws, arch} configurations to build.  This 
-# value is a '&' separated list of ',' separate triples.  For example, 
-#     configs=win32,win32,x86 & linux,motif,x86
-# By default the value is *,*,*
-configs= \
-	  aix,motif,ppc \
-    & linux,gtk,x86 \
-    & linux,gtk,x86_64 \
-    & linux,gtk,ppc \
-    & macosx,carbon,ppc \
-    & win32,win32,x86
-
-outputUpdateJars=true
-groupConfigurations=true
-
-#Arguments to send to the zip executable
-zipargs=
-
-############# JAVA COMPILER OPTIONS ##############
-# The location of the Java jars to compile against.  Typically the rt.jar for your JDK/JRE
-#bootclasspath=d:/ibm1.3.1/jre/lib/rt.jar
-
-javacDebugInfo=on
-javacVerbose=true
-javacFailOnError=false
-
-# The version of the source code
-javacSource=1.5
-
-# The version of the byte code targeted
-javacTarget=1.5
diff --git a/releng/org.eclipse.ptp.releng/master/customTargets.xml b/releng/org.eclipse.ptp.releng/master/customTargets.xml
deleted file mode 100644
index 77666e2..0000000
--- a/releng/org.eclipse.ptp.releng/master/customTargets.xml
+++ /dev/null
@@ -1,195 +0,0 @@
-<project name="Build specific targets and properties" default="noDefault" >
-
-<!-- ===================================================================== -->
-<!-- Run a given ${target} on all elements being built -->
-<!-- Add on <ant> task for each top level element being built. -->
-<!-- ===================================================================== -->
-<target name="allElements">
-	<ant antfile="${genericTargets}" target="${target}">
-		<property name="type" value="feature"/>
-		<property name="id" value="org.eclipse.ptp.master"/>
-	</ant>
-</target>
-
-<!-- ===================================================================== -->
-<!-- Targets to assemble the built elements for particular configurations  -->
-<!-- These generally call the generated assemble scripts (named in -->
-<!-- ${assembleScriptName}) but may also add pre and post processing -->
-<!-- Add one target for each root element and each configuration -->
-<!-- ===================================================================== -->
-
-<target name="assemble.org.eclipse.ptp.master.group.group.group">
-	<ant antfile="${assembleScriptName}" dir="${buildDirectory}">
-		<property name="archiveName" value="ptp-master-${ptpBranchVersion}-${buildId}.zip"/>
-	</ant>
-</target>
-	
-<!-- ===================================================================== -->
-<!-- Check out map files from correct repository -->
-<!-- Replace values for cvsRoot, package and mapVersionTag as desired. -->
-<!-- ===================================================================== -->
-<target name="getMapFiles">
-	<copy file="${builder}/../maps/ptp.map" todir="${buildDirectory}/maps"/>
-	<replace file="${buildDirectory}/maps/ptp.map">
-		<replacefilter token="@ptpTag@" value="${ptpTag}"/>
-	</replace>
-	<copy file="${builder}/../maps/photran.map" todir="${buildDirectory}/maps"/>
-	<replace file="${buildDirectory}/maps/photran.map">
-		<replacefilter token="@photranTag@" value="${photranTag}"/>
-	</replace>
-</target>
-
-<!-- ===================================================================== -->
-<!-- Steps to do before setup -->
-<!-- ===================================================================== -->
-<target name="preSetup">
-</target>
-
-<!-- ===================================================================== -->
-<!-- Steps to do after setup but before starting the build proper -->
-<!-- ===================================================================== -->
-<target name="postSetup">
-</target>
-
-<!-- ===================================================================== -->
-<!-- Steps to do before fetching the build elements -->
-<!-- ===================================================================== -->
-<target name="preFetch">
-</target>
-
-<!-- ===================================================================== -->
-<!-- Steps to do after fetching the build elements -->
-<!-- ===================================================================== -->
-<target name="postFetch">
-	<condition property="patchesAvailable">
-		<available file="${builder}/patch.xml"/>
-	</condition>
-	<antcall target="applyPatches"/>
-</target>
-
-<target name="applyPatches" if="patchesAvailable">
-	<ant antfile="${builder}/patch.xml"/>
-</target>
-
-<!-- ===================================================================== -->
-<!-- Steps to do before generating the build scripts. -->
-<!-- ===================================================================== -->
-<target name="preGenerate">
-</target>
-
-<!-- ===================================================================== -->
-<!-- Steps to do after generating the build scripts. -->
-<!-- ===================================================================== -->
-<target name="postGenerate">
-</target>
-
-
-<!-- ===================================================================== -->
-<!-- Steps to do before running the build.xmls for the elements being built. -->
-<!-- ===================================================================== -->
-<target name="preProcess">
-	<replace dir="${buildDirectory}/plugins" value="${timestamp}" token="@build@">
-		<include name="**/about.mappings" />
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.aix.ppc/BUILD">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.linux.ppc/BUILD">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.linux.x86/BUILD">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.linux.x86_64/BUILD">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.macosx.ppc/BUILD">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.macosx.x86/BUILD">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.debug.sdm/configure">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.debug.sdm/configure.in">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.proxy/configure">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.proxy/configure.in">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.utils/configure">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.utils/configure.in">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.rm.ibm.ll.proxy/configure">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.rm.ibm.ll.proxy/configure.in">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.rm.ibm.pe.proxy/configure">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.rm.ibm.pe.proxy/configure.in">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.rm.slurm.proxy/configure">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-	<replace file="${buildDirectory}/plugins/org.eclipse.ptp.rm.slurm.proxy/configure.in">
-		<replacefilter token="@buildVersion@" value="${ptpBranchVersion}.${timestamp}"/>
-	</replace>
-
-</target>
-
-<!-- ===================================================================== -->
-<!-- Steps to do after running the build.xmls for the elements being built. -->
-<!-- ===================================================================== -->
-<target name="postProcess">
-</target>
-
-
-<!-- ===================================================================== -->
-<!-- Steps to do before running assemble. -->
-<!-- ===================================================================== -->
-<target name="preAssemble">
-</target>
-
-<!-- ===================================================================== -->
-<!-- Steps to do after  running assemble. -->
-<!-- ===================================================================== -->
-<target name="postAssemble">
-</target>
-
-<!-- ===================================================================== -->
-<!-- Steps to do after the build is done. -->
-<!-- ===================================================================== -->
-<target name="postBuild">
-</target>
-
-<!-- ===================================================================== -->
-<!-- Steps to do to test the build results -->
-<!-- ===================================================================== -->
-<target name="test">
-</target>
-
-<!-- ===================================================================== -->
-<!-- Steps to do to publish the build results -->
-<!-- ===================================================================== -->
-<target name="publish">
-</target>
-
-<!-- ===================================================================== -->
-<!-- Default target                                                        -->
-<!-- ===================================================================== -->
-<target name="noDefault">
-	<echo message="You must specify a target when invoking this file" />
-</target>
-
-</project>
diff --git a/releng/org.eclipse.ptp.releng/pack.properties b/releng/org.eclipse.ptp.releng/pack.properties
deleted file mode 100644
index 1cb5a5e..0000000
--- a/releng/org.eclipse.ptp.releng/pack.properties
+++ /dev/null
@@ -1 +0,0 @@
-pack200.default.args=-E4
diff --git a/releng/org.eclipse.ptp.releng/ptpbuild b/releng/org.eclipse.ptp.releng/ptpbuild
deleted file mode 100644
index 6749953..0000000
--- a/releng/org.eclipse.ptp.releng/ptpbuild
+++ /dev/null
@@ -1,88 +0,0 @@
-#!/bin/sh
-#
-# ptpbuild wrapper script
-#
-# Usage: ptpbuild [-t tag] [-d build_dir] [build_args]
-#
-# where
-#
-# tag is the CVS tag used to check out the releng project (default HEAD)
-# build_dir is the location that the build will take place
-# build_args are any arguments you want to pass to the build script
-#
-# set up anything environment specific that needs to be done before
-# launching the build script in the releng project
-
-LANG=en_US
-TAG=HEAD
-CDT_TAG=HEAD
-
-# main staging directory
-BUILD_DIR=/opt/public/download-staging.priv/tools/ptp/releng
-
-args=`getopt c:d:t: $*`
-
-if [ $? != 0 ]; then
-	echo "usage: ptpbuild [-t tag] [-c cdt_tag] [-d build_dir] [build_args]"
-	exit 1
-fi
-
-set -- $args
-for i
-do
-	case "$i"
-	in
-	-c) CDT_TAG="$2"; shift; shift;;
-	-d) BUILD_DIR="$2"; shift; shift;;
-	-t) TAG="$2"; shift; shift;;
-	--) shift; break;;
-	esac
-done
-
-BUILD_LOG=$BUILD_DIR/ptpbuild_${TAG}_`date +%Y%m%d%H%M`.log
-
-touch $BUILD_LOG
-chmod a+r $BUILD_LOG
-
-{
-# create the releng staging directory and go there
-mkdir -p $BUILD_DIR && cd $BUILD_DIR
-
-# remove the old build
-rm -fr org.eclipse.ptp_${TAG}
-
-# Check out the releng project
-export CVSROOT=:pserver:anonymous@dev.eclipse.org:/cvsroot/tools
-cvs co -r $TAG -d org.eclipse.ptp_${TAG} org.eclipse.ptp/releng/org.eclipse.ptp.releng
-
-# run the main script
-cd org.eclipse.ptp_${TAG}
-sh build.sh $*
-
-# Build RDT server packages
-#cd results/plugins
-
-# Check out rdt.core.remotejars, rdt.core.stubs, cdt.core, cdt.core.lrparser, cdt.core.lrparser.xlc for source
-#export CVSROOT=:pserver:anonymous@dev.eclipse.org:/cvsroot/tools
-#cvs co -r $TAG -d org.eclipse.ptp.rdt.core.remotejars org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.core.remotejars
-#cvs co -r $TAG -d org.eclipse.ptp.rdt.core.stubs org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.core.stubs
-#cvs co -r $CDT_TAG -d org.eclipse.cdt.core org.eclipse.cdt/all/org.eclipse.cdt.core
-#cvs co -r $CDT_TAG -d org.eclipse.cdt.core.lrparser org.eclipse.cdt/lrparser/org.eclipse.cdt.core.lrparser
-#cvs co -r $CDT_TAG -d org.eclipse.cdt.core.lrparser.xlc org.eclipse.cdt/xlc/org.eclipse.cdt.core.lrparser.xlc
-#cvs co -r $CDT_TAG -d org.eclipse.cdt.core.parser.upc org.eclipse.cdt/upc/org.eclipse.cdt.core.parser.upc
-
-#cd org.eclipse.ptp.rdt.core.remotejars
-
-# run the script in remotejars
-#export PATH=/opt/public/common/ibm-java2-ppc-50/bin:$PATH
-#echo `java -version`
-#java -jar ../../../tools/org.eclipse.releng.basebuilder/plugins/org.eclipse.equinox.launcher.jar \
-#	-ws gtk -arch ppc -os linux -application org.eclipse.ant.core.antRunner
-
-} >$BUILD_LOG 2>&1
-
-if grep -q 'BUILD FAILED' $BUILD_LOG; then
-	echo "BUILD FAILED. See $BUILD_LOG for details."
-fi
-
-exit 0
diff --git a/releng/org.eclipse.ptp.releng/update_versions b/releng/org.eclipse.ptp.releng/update_versions
deleted file mode 100644
index 7caf35a..0000000
--- a/releng/org.eclipse.ptp.releng/update_versions
+++ /dev/null
@@ -1,123 +0,0 @@
-#!/bin/sh
-#
-# script to update PTP versions
-#
-# Usage: update_versions ptp_version photran_version
-#
-# ptp_version - new version string for PTP (e.g. "3.0.1")
-# photran_version - new version string for Photran (e.g. "5.0.1")
-#
-# Note: a "qualifier" suffix will automatically be added to the version where appropriate
-#
-
-TMP_DIR=/tmp
-
-if [ $# -lt 2 ]; then
-	echo "usage: update_versions ptp_version photran_version"
-	exit 1
-fi
-
-ptp_version=$1
-photran_version=$2
-
-PTP_FEATURES="\
-	org.eclipse.ptp-feature \
-	org.eclipse.ptp.core-feature \
-	org.eclipse.ptp.external-feature \
-	org.eclipse.ptp.master \
-	org.eclipse.ptp.etfw-feature \
-	org.eclipse.ptp.etfw.tau-feature \
-	org.eclipse.ptp.etfw.tau.fortran-feature \
-	org.eclipse.ptp.isp-feature \
-	org.eclipse.ptp.pldt-feature \
-	org.eclipse.ptp.pldt.lapi-feature \
-	org.eclipse.ptp.pldt.upc-feature \
-	org.eclipse.ptp.rdt-feature \
-	org.eclipse.ptp.rdt.xlc-feature \
-	org.eclipse.ptp.remote-feature \
-	org.eclipse.ptp.remote.remotetools-feature \
-	org.eclipse.ptp.remote.rse-feature \
-	org.eclipse.ptp.remotetools-feature \
-	org.eclipse.ptp.rm.ibm.ll-feature \
-	org.eclipse.ptp.rm.ibm.pe-feature \
-	org.eclipse.ptp.rm.mpich2-feature \
-	org.eclipse.ptp.rm.openmpi-feature \
-	org.eclipse.ptp.rm.slurm-feature \
-	org.eclipse.ptp.rm.pbs-feature \
-	org.eclipse.ptp.sdm-feature \
-	org.eclipse.ptp.services-feature \
-	org.eclipse.ptp.utils-feature"
-	
-PHOTRAN_FEATURES="\
-	org.eclipse.photran-feature \
-	org.eclipse.photran.intel-feature \
-	org.eclipse.photran.xlf-feature \
-	org.eclipse.rephraserengine-feature"
-
-PTP_PLUGINS="\
-	org.eclipse.ptp.aix.ppc \
-	org.eclipse.ptp.linux.ppc \
-	org.eclipse.ptp.linux.x86 \
-	org.eclipse.ptp.linux.x86_64 \
-	org.eclipse.ptp.macosx.ppc \
-	org.eclipse.ptp.macosx.x86 \
-	org.eclipse.ptp"
-	
-PTP_C_PROJECTS="\
-	org.eclipse.ptp.debug.sdm \
-	org.eclipse.ptp.proxy \
-	org.eclipse.ptp.rm.ibm.pe.proxy \
-	org.eclipse.ptp.rm.ibm.ll.proxy \
-	org.eclipse.ptp.rm.pbs.proxy \
-	org.eclipse.ptp.rm.slurm.proxy \
-	org.eclipse.ptp.utils"
-	
-update_feature() {
-	sed -e "s/version=\"[0-9]\.[0-9]\.[0-9]\.qualifier\"/version=\"$2\.qualifier\"/" < $1/feature.xml > $TMP_DIR/${1}_feature.xml
-	mv $TMP_DIR/${1}_feature.xml $1/feature.xml
-}
-
-update_manifest() {
-	sed -e "s/Bundle-Version: *[0-9]\.[0-9]\.[0-9]\.qualifier/Bundle-Version: $2.qualifier/" < $1/META-INF/MANIFEST.MF > $TMP_DIR/${1}_MANIFEST.MF
-	mv $TMP_DIR/${1}_MANIFEST.MF $1/META-INF/MANIFEST.MF
-}
-
-update_configure() {
-	sed -e "s/AC_INIT(\[*\([^],]*\)\]*, *\[*[0-9]\.[0-9]\.[0-9]\]*)/AC_INIT([\1], [$2])/" < $1/configure.in > $TMP_DIR/${1}_configure.in
-	mv $TMP_DIR/${1}_configure.in $1/configure.in
-	(cd $1; autoconf)
-}
-
-for feature in $PTP_FEATURES; do
-	echo "Updating $feature..."
-	update_feature $feature $ptp_version
-done
-
-for plugin in $PTP_PLUGINS; do
-	echo "Updating $plugin..."
-	update_manifest $plugin $ptp_version
-done
-
-for project in $PTP_C_PROJECTS; do
-	echo "Updating $project..."
-	update_manifest $project $ptp_version
-	update_configure $project $ptp_version
-done
-
-for feature in $PHOTRAN_FEATURES; do
-	echo "Updating $feature..."
-	update_feature $feature $photran_version
-done
-
-echo "Updating org.eclipse.ptp.releng..."
-sed -e "s/<property name=\"ptpBranchVersion\" value=\"[0-9]\.[0-9]\.[0-9]\"\/>/<property name=\"ptpBranchVersion\" value=\"$ptp_version\"\/>/" \
-	-e "s/<property name=\"photranBranchVersion\" value=\"[0-9]\.[0-9]\.[0-9]\"\/>/<property name=\"photranBranchVersion\" value=\"$photran_version\"\/>/" \
-	< org.eclipse.ptp.releng/build.xml > $TMP_DIR/org.eclipse.ptp.releng_build.xml
-mv $TMP_DIR/org.eclipse.ptp.releng_build.xml org.eclipse.ptp.releng/build.xml
-
-echo "Updating org.eclipse.ptp.rdt.core.remotejars.."
-sed -e "s/<property name=\"serverVersion\" value=\"[0-9]\.[0-9]\.[0-9]\"\/>/<property name=\"serverVersion\" value=\"$ptp_version\"\/>/" \
-	< org.eclipse.ptp.rdt.core.remotejars/build.xml > $TMP_DIR/org.eclipse.ptp.rdt.core.remotejars_build.xml
-mv $TMP_DIR/org.eclipse.ptp.rdt.core.remotejars_build.xml org.eclipse.ptp.rdt.core.remotejars/build.xml
-
-exit 0
diff --git a/releng/org.eclipse.ptp.releng/web/site.css b/releng/org.eclipse.ptp.releng/web/site.css
deleted file mode 100644
index 62c6f9f..0000000
--- a/releng/org.eclipse.ptp.releng/web/site.css
+++ /dev/null
@@ -1,12 +0,0 @@
-<STYLE type="text/css">
-td.spacer {padding-bottom: 10px; padding-top: 10px;}
-.title { font-family: sans-serif; color: #99AACC;}
-.bodyText { font-family: sans-serif; font-size: 9pt; color:#000000;  }
-.sub-header { font-family: sans-serif; font-style: normal; font-weight: bold; font-size: 9pt; color: white;}
-.log-text {font-family: sans-serif; font-style: normal; font-weight: lighter; font-size: 8pt; color:black;}
-.big-header { font-family: sans-serif; font-style: normal; font-weight: bold; font-size: 9pt; color: white; border-top:10px solid white;}
-.light-row {background:#FFFFFF}
-.dark-row {background:#EEEEFF}
-.header {background:#99AADD}
-#indent {word-wrap : break-word;width :300px;text-indent:10px;}
-</STYLE>
diff --git a/releng/org.eclipse.ptp.releng/web/site.xsl b/releng/org.eclipse.ptp.releng/web/site.xsl
deleted file mode 100644
index 574006f..0000000
--- a/releng/org.eclipse.ptp.releng/web/site.xsl
+++ /dev/null
@@ -1,214 +0,0 @@
-<xsl:stylesheet version = '1.0' xmlns:xsl='http://www.w3.org/1999/XSL/Transform' xmlns:msxsl="urn:schemas-microsoft-com:xslt">
-<xsl:output method="html" encoding="UTF-8"/>
-<xsl:key name="cat" match="category" use="@name"/>
-<xsl:template match="/">
-<xsl:for-each select="site">
-	<html>
-	<head>
-	<title>PTP Update Site</title>
-	<style>@import url("web/site.css");</style>
-	</head>
-	<body>
-	<h1 class="title">PTP Update Site</h1>
-	<p class="bodyText"><xsl:value-of select="description"/></p>
-	<table width="100%" border="0" cellspacing="1" cellpadding="2">
-	<xsl:for-each select="category-def">
-		<xsl:sort select="@label" order="ascending" case-order="upper-first"/>
-		<xsl:sort select="@name" order="ascending" case-order="upper-first"/>
-	<xsl:if test="count(key('cat',@name)) != 0">
-			<tr class="header">
-				<td class="sub-header" width="30%">
-					<xsl:value-of select="@name"/>
-				</td>
-				<td class="sub-header" width="70%">
-					<xsl:value-of select="@label"/>
-				</td>
-			</tr>
-			<xsl:for-each select="key('cat',@name)">
-			<xsl:sort select="ancestor::feature//@version" order="ascending"/>
-			<xsl:sort select="ancestor::feature//@id" order="ascending" case-order="upper-first"/>
-			<tr>
-				<xsl:choose>
-				<xsl:when test="(position() mod 2 = 1)">
-					<xsl:attribute name="class">dark-row</xsl:attribute>
-				</xsl:when>
-				<xsl:otherwise>
-					<xsl:attribute name="class">light-row</xsl:attribute>
-				</xsl:otherwise>
-				</xsl:choose>
-				<td class="log-text" id="indent">
-						<xsl:choose>
-						<xsl:when test="ancestor::feature//@label">
-							<a href="{ancestor::feature//@url}"><xsl:value-of select="ancestor::feature//@label"/></a>
-							<br/>
-							<div id="indent">
-							(<xsl:value-of select="ancestor::feature//@id"/> - <xsl:value-of select="ancestor::feature//@version"/>)
-							</div>
-						</xsl:when>
-						<xsl:otherwise>
-						<a href="{ancestor::feature//@url}"><xsl:value-of select="ancestor::feature//@id"/> - <xsl:value-of select="ancestor::feature//@version"/></a>
-						</xsl:otherwise>
-						</xsl:choose>
-						<br />
-				</td>
-				<td>
-					<table>
-						<xsl:if test="ancestor::feature//@os">
-							<tr><td class="log-text" id="indent">Operating Systems:</td>
-							<td class="log-text" id="indent"><xsl:value-of select="ancestor::feature//@os"/></td>
-							</tr>
-						</xsl:if>
-						<xsl:if test="ancestor::feature//@ws">
-							<tr><td class="log-text" id="indent">Windows Systems:</td>
-							<td class="log-text" id="indent"><xsl:value-of select="ancestor::feature//@ws"/></td>
-							</tr>
-						</xsl:if>
-						<xsl:if test="ancestor::feature//@nl">
-							<tr><td class="log-text" id="indent">Languages:</td>
-							<td class="log-text" id="indent"><xsl:value-of select="ancestor::feature//@nl"/></td>
-							</tr>
-						</xsl:if>
-						<xsl:if test="ancestor::feature//@arch">
-							<tr><td class="log-text" id="indent">Architecture:</td>
-							<td class="log-text" id="indent"><xsl:value-of select="ancestor::feature//@arch"/></td>
-							</tr>
-						</xsl:if>
-					</table>
-				</td>
-			</tr>
-			</xsl:for-each>
-			<tr><td class="spacer"><br/></td><td class="spacer"><br/></td></tr>
-		</xsl:if>
-	</xsl:for-each>
-	<xsl:if test="count(feature)  &gt; count(feature/category)">
-	<tr class="header">
-		<td class="sub-header" colspan="2">
-		Uncategorized
-		</td>
-	</tr>
-	</xsl:if>
-	<xsl:choose>
-	<xsl:when test="function-available('msxsl:node-set')">
-	   <xsl:variable name="rtf-nodes">
-		<xsl:for-each select="feature[not(category)]">
-			<xsl:sort select="@id" order="ascending" case-order="upper-first"/>
-			<xsl:sort select="@version" order="ascending" />
-			<xsl:value-of select="."/>
-			<xsl:copy-of select="." />
-		</xsl:for-each>
-	   </xsl:variable>
-	   <xsl:variable name="myNodeSet" select="msxsl:node-set($rtf-nodes)/*"/>
-	<xsl:for-each select="$myNodeSet">
-	<tr>
-		<xsl:choose>
-		<xsl:when test="position() mod 2 = 1">
-		<xsl:attribute name="class">dark-row</xsl:attribute>
-		</xsl:when>
-		<xsl:otherwise>
-		<xsl:attribute name="class">light-row</xsl:attribute>
-		</xsl:otherwise>
-		</xsl:choose>
-		<td class="log-text" id="indent">
-			<xsl:choose>
-			<xsl:when test="@label">
-				<a href="{@url}"><xsl:value-of select="@label"/></a>
-				<br />
-				<div id="indent">
-				(<xsl:value-of select="@id"/> - <xsl:value-of select="@version"/>)
-				</div>
-			</xsl:when>
-			<xsl:otherwise>
-				<a href="{@url}"><xsl:value-of select="@id"/> - <xsl:value-of select="@version"/></a>
-			</xsl:otherwise>
-			</xsl:choose>
-			<br /><br />
-		</td>
-		<td>
-			<table>
-				<xsl:if test="@os">
-					<tr><td class="log-text" id="indent">Operating Systems:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@os"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@ws">
-					<tr><td class="log-text" id="indent">Windows Systems:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@ws"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@nl">
-					<tr><td class="log-text" id="indent">Languages:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@nl"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@arch">
-					<tr><td class="log-text" id="indent">Architecture:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@arch"/></td>
-					</tr>
-				</xsl:if>
-			</table>
-		</td>
-	</tr>
-	</xsl:for-each>
-	</xsl:when>
-	<xsl:otherwise>
-	<xsl:for-each select="feature[not(category)]">
-	<xsl:sort select="@id" order="ascending" case-order="upper-first"/>
-	<xsl:sort select="@version" order="ascending" />
-	<tr>
-		<xsl:choose>
-		<xsl:when test="count(preceding-sibling::feature[not(category)]) mod 2 = 1">
-		<xsl:attribute name="class">dark-row</xsl:attribute>
-		</xsl:when>
-		<xsl:otherwise>
-		<xsl:attribute name="class">light-row</xsl:attribute>
-		</xsl:otherwise>
-		</xsl:choose>
-		<td class="log-text" id="indent">
-			<xsl:choose>
-			<xsl:when test="@label">
-				<a href="{@url}"><xsl:value-of select="@label"/></a>
-				<br />
-				<div id="indent">
-				(<xsl:value-of select="@id"/> - <xsl:value-of select="@version"/>)
-				</div>
-			</xsl:when>
-			<xsl:otherwise>
-				<a href="{@url}"><xsl:value-of select="@id"/> - <xsl:value-of select="@version"/></a>
-			</xsl:otherwise>
-			</xsl:choose>
-			<br /><br />
-		</td>
-		<td>
-			<table>
-				<xsl:if test="@os">
-					<tr><td class="log-text" id="indent">Operating Systems:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@os"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@ws">
-					<tr><td class="log-text" id="indent">Windows Systems:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@ws"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@nl">
-					<tr><td class="log-text" id="indent">Languages:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@nl"/></td>
-					</tr>
-				</xsl:if>
-				<xsl:if test="@arch">
-					<tr><td class="log-text" id="indent">Architecture:</td>
-					<td class="log-text" id="indent"><xsl:value-of select="@arch"/></td>
-					</tr>
-				</xsl:if>
-			</table>
-		</td>
-	</tr>
-	</xsl:for-each>
-	</xsl:otherwise>
-	</xsl:choose>
-	</table>
-	</body>
-	</html>
-</xsl:for-each>
-</xsl:template>
-</xsl:stylesheet>
diff --git a/releng/org.eclipse.ptp.rm.ibm.bluegene-feature/.project b/releng/org.eclipse.ptp.rm.ibm.bluegene-feature/.project
deleted file mode 100644
index 861eb7b..0000000
--- a/releng/org.eclipse.ptp.rm.ibm.bluegene-feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.rm.ibm.bluegene-feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/releng/org.eclipse.ptp.rm.ibm.bluegene-feature/build.properties b/releng/org.eclipse.ptp.rm.ibm.bluegene-feature/build.properties
deleted file mode 100644
index 279df8f..0000000
--- a/releng/org.eclipse.ptp.rm.ibm.bluegene-feature/build.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-bin.includes = feature.xml,\
-               license.html,\
-               feature.properties,\
-               epl-v10.html
diff --git a/releng/org.eclipse.ptp.rm.ibm.bluegene-feature/epl-v10.html b/releng/org.eclipse.ptp.rm.ibm.bluegene-feature/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/releng/org.eclipse.ptp.rm.ibm.bluegene-feature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
-WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/releng/org.eclipse.ptp.rm.ibm.bluegene-feature/feature.properties b/releng/org.eclipse.ptp.rm.ibm.bluegene-feature/feature.properties
deleted file mode 100644
index 95b0993..0000000
--- a/releng/org.eclipse.ptp.rm.ibm.bluegene-feature/feature.properties
+++ /dev/null
@@ -1,148 +0,0 @@
-#################################################################################
-# Copyright (c) 2005 The Regents of the University of California. 
-# This material was produced under U.S. Government contract W-7405-ENG-36 
-# for Los Alamos National Laboratory, which is operated by the University 
-# of California for the U.S. Department of Energy. The U.S. Government has 
-# rights to use, reproduce, and distribute this software. NEITHER THE 
-# GOVERNMENT NOR THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR 
-# ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified 
-# to produce derivative works, such modified software should be clearly marked, 
-# so as not to confuse it with the version available from LANL.
-# 
-# Additionally, 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
-# 
-# LA-CC 04-115
-#
-#################################################################################
-
-
-# "featureName" property - name of the feature
-featureName=PTP Support For Blue Gene
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
-
-# "updateSiteName" property - label for the update site
-updateSiteName=Eclipse PTP Update Site
-
-# "description" property - description of the feature
-description=Adds support for the Blue Gene system
-
-# copyright
-copyright=\
-Copyright (c) 2007 IBM Corporation and others.\n\
-All rights reserved. This program and the accompanying materials\n\
-are made available under the terms of the Eclipse Public License v1.0\n\
-which accompanies this distribution, and is available at\n\
-http://www.eclipse.org/legal/epl-v10.html\n\
-\n\
-Contributors:\n\
-IBM Corporation - Initial API and implementation\n
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-ECLIPSE FOUNDATION SOFTWARE USER AGREEMENT\n\
-March 17, 2005\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the Eclipse Foundation\n\
-is provided to you under the terms and conditions of the Eclipse Public\n\
-License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
-Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse.org CVS\n\
-repository ("Repository") in CVS modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-   - Content may be structured and packaged into modules to facilitate delivering,\n\
-     extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-     plug-in fragments ("Fragments"), and features ("Features").\n\
-   - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java? ARchive)\n\
-     in a directory named "plugins".\n\
-   - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-     Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-     Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-     numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-   - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-     named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-Features may also include other Features ("Included Features"). Files named\n\
-"feature.xml" may contain a list of the names and version numbers of\n\
-Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-   - The top-level (root) directory\n\
-   - Plug-in and Fragment directories\n\
-   - Inside Plug-ins and Fragments packaged as JARs\n\
-   - Sub-directories of the directory named "src" of certain Plug-ins\n\
-   - Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Eclipse Update Manager, you must agree to a license ("Feature Update\n\
-License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties". Such Abouts,\n\
-Feature Licenses and Feature Update Licenses contain the terms and\n\
-conditions (or references to such terms and conditions) that govern your\n\
-use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-    - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-    - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-    - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-    - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
-    - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-    - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use,\n\
-and re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/releng/org.eclipse.ptp.rm.ibm.bluegene-feature/feature.xml b/releng/org.eclipse.ptp.rm.ibm.bluegene-feature/feature.xml
deleted file mode 100644
index 5806959..0000000
--- a/releng/org.eclipse.ptp.rm.ibm.bluegene-feature/feature.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.ptp.rm.ibm.bluegene"
-      label="%featureName"
-      version="2.0.0.qualifier"
-      provider-name="%providerName"
-      image="eclipse_update_120.jpg">
-
-   <description url="http://eclipse.org/ptp">
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="%licenseURL">
-      %license
-   </license>
-
-   <requires>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.search"/>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.debug.core"/>
-      <import plugin="org.eclipse.ptp.proxy.protocol"/>
-      <import plugin="org.eclipse.ptp.core"/>
-      <import plugin="org.eclipse.ptp.remote"/>
-      <import plugin="org.eclipse.ptp.ui"/>
-      <import plugin="org.eclipse.ptp.launch"/>
-   </requires>
-
-   <plugin
-         id="org.eclipse.ptp.rm.ibm.bluegene.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ptp.rm.ibm.bluegene.proxy"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ptp.rm.ibm.bluegene.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
diff --git a/releng/org.eclipse.ptp.rm.ibm.bluegene-feature/license.html b/releng/org.eclipse.ptp.rm.ibm.bluegene-feature/license.html
deleted file mode 100644
index c6af966..0000000
--- a/releng/org.eclipse.ptp.rm.ibm.bluegene-feature/license.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<title>Eclipse.org Software User Agreement</title>
-</head>
-
-<body lang="EN-US" link=blue vlink=purple>
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>March 17, 2005</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-   
-<h3>Applicable Licenses</h3>   
-   
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-   
-<ul>
-	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>   
- 
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Inside Plug-ins and Fragments packaged as JARs</li>
-	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
-</ul>
-		
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
-	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-   
-<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
-</body>
-</html>
diff --git a/releng/org.eclipse.ptp.rm.lsf-feature/.project b/releng/org.eclipse.ptp.rm.lsf-feature/.project
deleted file mode 100644
index 4e56dff..0000000
--- a/releng/org.eclipse.ptp.rm.lsf-feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.rm.lsf-feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/releng/org.eclipse.ptp.rm.lsf-feature/build.properties b/releng/org.eclipse.ptp.rm.lsf-feature/build.properties
deleted file mode 100644
index 279df8f..0000000
--- a/releng/org.eclipse.ptp.rm.lsf-feature/build.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-bin.includes = feature.xml,\
-               license.html,\
-               feature.properties,\
-               epl-v10.html
diff --git a/releng/org.eclipse.ptp.rm.lsf-feature/epl-v10.html b/releng/org.eclipse.ptp.rm.lsf-feature/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/releng/org.eclipse.ptp.rm.lsf-feature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
-WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/releng/org.eclipse.ptp.rm.lsf-feature/feature.properties b/releng/org.eclipse.ptp.rm.lsf-feature/feature.properties
deleted file mode 100644
index 05b6267..0000000
--- a/releng/org.eclipse.ptp.rm.lsf-feature/feature.properties
+++ /dev/null
@@ -1,156 +0,0 @@
-#################################################################################
-# Copyright (c) 2005 The Regents of the University of California. 
-# This material was produced under U.S. Government contract W-7405-ENG-36 
-# for Los Alamos National Laboratory, which is operated by the University 
-# of California for the U.S. Department of Energy. The U.S. Government has 
-# rights to use, reproduce, and distribute this software. NEITHER THE 
-# GOVERNMENT NOR THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR 
-# ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified 
-# to produce derivative works, such modified software should be clearly marked, 
-# so as not to confuse it with the version available from LANL.
-# 
-# Additionally, 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
-# 
-# LA-CC 04-115
-#
-#################################################################################
-
-
-# "featureName" property - name of the feature
-featureName=PTP Support For LSF
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
-
-# "updateSiteName" property - label for the update site
-updateSiteName=Eclipse PTP Update Site
-
-# "description" property - description of the feature
-description=Adds support for the LSF job scheduler
-
-# copyright
-copyright=\
-Copyright (c) 2005 The Regents of the University of California.\n\
-This material was produced under U.S. Government contract W-7405-ENG-36\n\
-for Los Alamos National Laboratory, which is operated by the University\n\
-of California for the U.S. Department of Energy. The U.S. Government has\n\
-rights to use, reproduce, and distribute this software. NEITHER THE\n\
-GOVERNMENT NOR THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR\n\
-ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified\n\
-to produce derivative works, such modified software should be clearly marked,\n\
-so as not to confuse it with the version available from LANL.\n\
-\n\
-Additionally, this program and the accompanying materials\n\
-are made available under the terms of the Eclipse Public License v1.0\n\
-which accompanies this distribution, and is available at\n\
-http://www.eclipse.org/legal/epl-v10.html\n\
-\n\
-LA-CC 04-115\n
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-ECLIPSE FOUNDATION SOFTWARE USER AGREEMENT\n\
-March 17, 2005\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the Eclipse Foundation\n\
-is provided to you under the terms and conditions of the Eclipse Public\n\
-License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
-Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse.org CVS\n\
-repository ("Repository") in CVS modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-   - Content may be structured and packaged into modules to facilitate delivering,\n\
-     extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-     plug-in fragments ("Fragments"), and features ("Features").\n\
-   - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java? ARchive)\n\
-     in a directory named "plugins".\n\
-   - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-     Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-     Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-     numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-   - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-     named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-Features may also include other Features ("Included Features"). Files named\n\
-"feature.xml" may contain a list of the names and version numbers of\n\
-Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-   - The top-level (root) directory\n\
-   - Plug-in and Fragment directories\n\
-   - Inside Plug-ins and Fragments packaged as JARs\n\
-   - Sub-directories of the directory named "src" of certain Plug-ins\n\
-   - Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Eclipse Update Manager, you must agree to a license ("Feature Update\n\
-License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties". Such Abouts,\n\
-Feature Licenses and Feature Update Licenses contain the terms and\n\
-conditions (or references to such terms and conditions) that govern your\n\
-use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-    - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-    - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-    - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-    - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
-    - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-    - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use,\n\
-and re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/releng/org.eclipse.ptp.rm.lsf-feature/feature.xml b/releng/org.eclipse.ptp.rm.lsf-feature/feature.xml
deleted file mode 100644
index 8b8551f..0000000
--- a/releng/org.eclipse.ptp.rm.lsf-feature/feature.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.ptp.rm.lsf"
-      label="%featureName"
-      version="2.0.0.qualifier"
-      provider-name="%providerName"
-      image="eclipse_update_120.jpg">
-
-   <description url="http://eclipse.org/ptp">
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="%licenseURL">
-      %license
-   </license>
-
-   <requires>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.ptp.core"/>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.search"/>
-      <import plugin="org.eclipse.debug.core"/>
-      <import plugin="org.eclipse.ptp.remote"/>
-      <import plugin="org.eclipse.ptp.proxy.protocol"/>
-      <import plugin="org.eclipse.debug.ui"/>
-      <import plugin="org.eclipse.ptp.ui"/>
-      <import plugin="org.eclipse.ptp.launch"/>
-   </requires>
-
-   <plugin
-         id="org.eclipse.ptp.rm.lsf.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ptp.rm.lsf.proxy"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-   <plugin
-         id="org.eclipse.ptp.rm.lsf.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
diff --git a/releng/org.eclipse.ptp.rm.lsf-feature/license.html b/releng/org.eclipse.ptp.rm.lsf-feature/license.html
deleted file mode 100644
index c6af966..0000000
--- a/releng/org.eclipse.ptp.rm.lsf-feature/license.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<title>Eclipse.org Software User Agreement</title>
-</head>
-
-<body lang="EN-US" link=blue vlink=purple>
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>March 17, 2005</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-   
-<h3>Applicable Licenses</h3>   
-   
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-   
-<ul>
-	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>   
- 
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Inside Plug-ins and Fragments packaged as JARs</li>
-	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
-</ul>
-		
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
-	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-   
-<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
-</body>
-</html>
diff --git a/releng/org.eclipse.ptp.rm.orte-feature/.project b/releng/org.eclipse.ptp.rm.orte-feature/.project
deleted file mode 100644
index 5884ded..0000000
--- a/releng/org.eclipse.ptp.rm.orte-feature/.project
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.rm.orte-feature</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.pde.FeatureBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.FeatureNature</nature>
-	</natures>
-</projectDescription>
diff --git a/releng/org.eclipse.ptp.rm.orte-feature/build.properties b/releng/org.eclipse.ptp.rm.orte-feature/build.properties
deleted file mode 100644
index 279df8f..0000000
--- a/releng/org.eclipse.ptp.rm.orte-feature/build.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-bin.includes = feature.xml,\
-               license.html,\
-               feature.properties,\
-               epl-v10.html
diff --git a/releng/org.eclipse.ptp.rm.orte-feature/epl-v10.html b/releng/org.eclipse.ptp.rm.orte-feature/epl-v10.html
deleted file mode 100644
index ed4b196..0000000
--- a/releng/org.eclipse.ptp.rm.orte-feature/epl-v10.html
+++ /dev/null
@@ -1,328 +0,0 @@
-<html xmlns:o="urn:schemas-microsoft-com:office:office"
-xmlns:w="urn:schemas-microsoft-com:office:word"
-xmlns="http://www.w3.org/TR/REC-html40">
-
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=windows-1252">
-<meta name=ProgId content=Word.Document>
-<meta name=Generator content="Microsoft Word 9">
-<meta name=Originator content="Microsoft Word 9">
-<link rel=File-List
-href="./Eclipse%20EPL%202003_11_10%20Final_files/filelist.xml">
-<title>Eclipse Public License - Version 1.0</title>
-<!--[if gte mso 9]><xml>
- <o:DocumentProperties>
-  <o:Revision>2</o:Revision>
-  <o:TotalTime>3</o:TotalTime>
-  <o:Created>2004-03-05T23:03:00Z</o:Created>
-  <o:LastSaved>2004-03-05T23:03:00Z</o:LastSaved>
-  <o:Pages>4</o:Pages>
-  <o:Words>1626</o:Words>
-  <o:Characters>9270</o:Characters>
-   <o:Lines>77</o:Lines>
-  <o:Paragraphs>18</o:Paragraphs>
-  <o:CharactersWithSpaces>11384</o:CharactersWithSpaces>
-  <o:Version>9.4402</o:Version>
- </o:DocumentProperties>
-</xml><![endif]--><!--[if gte mso 9]><xml>
- <w:WordDocument>
-  <w:TrackRevisions/>
- </w:WordDocument>
-</xml><![endif]-->
-<style>
-<!--
- /* Font Definitions */
-@font-face
-	{font-family:Tahoma;
-	panose-1:2 11 6 4 3 5 4 4 2 4;
-	mso-font-charset:0;
-	mso-generic-font-family:swiss;
-	mso-font-pitch:variable;
-	mso-font-signature:553679495 -2147483648 8 0 66047 0;}
- /* Style Definitions */
-p.MsoNormal, li.MsoNormal, div.MsoNormal
-	{mso-style-parent:"";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p
-	{margin-right:0in;
-	mso-margin-top-alt:auto;
-	mso-margin-bottom-alt:auto;
-	margin-left:0in;
-	mso-pagination:widow-orphan;
-	font-size:12.0pt;
-	font-family:"Times New Roman";
-	mso-fareast-font-family:"Times New Roman";}
-p.BalloonText, li.BalloonText, div.BalloonText
-	{mso-style-name:"Balloon Text";
-	margin:0in;
-	margin-bottom:.0001pt;
-	mso-pagination:widow-orphan;
-	font-size:8.0pt;
-	font-family:Tahoma;
-	mso-fareast-font-family:"Times New Roman";}
-@page Section1
-	{size:8.5in 11.0in;
-	margin:1.0in 1.25in 1.0in 1.25in;
-	mso-header-margin:.5in;
-	mso-footer-margin:.5in;
-	mso-paper-source:0;}
-div.Section1
-	{page:Section1;}
--->
-</style>
-</head>
-
-<body lang=EN-US style='tab-interval:.5in'>
-
-<div class=Section1>
-
-<p align=center style='text-align:center'><b>Eclipse Public License - v 1.0</b>
-</p>
-
-<p><span style='font-size:10.0pt'>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER
-THE TERMS OF THIS ECLIPSE PUBLIC LICENSE (&quot;AGREEMENT&quot;). ANY USE,
-REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE
-OF THIS AGREEMENT.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>1. DEFINITIONS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Contribution&quot; means:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-in the case of the initial Contributor, the initial code and documentation
-distributed under this Agreement, and<br clear=left>
-b) in the case of each subsequent Contributor:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-changes to the Program, and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-additions to the Program;</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>where
-such changes and/or additions to the Program originate from and are distributed
-by that particular Contributor. A Contribution 'originates' from a Contributor
-if it was added to the Program by such Contributor itself or anyone acting on
-such Contributor's behalf. Contributions do not include additions to the
-Program which: (i) are separate modules of software distributed in conjunction
-with the Program under their own license agreement, and (ii) are not derivative
-works of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Contributor&quot; means any person or
-entity that distributes the Program.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Licensed Patents &quot; mean patent
-claims licensable by a Contributor which are necessarily infringed by the use
-or sale of its Contribution alone or when combined with the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>&quot;Program&quot; means the Contributions
-distributed in accordance with this Agreement.</span> </p>
-
-<p><span style='font-size:10.0pt'>&quot;Recipient&quot; means anyone who
-receives the Program under this Agreement, including all Contributors.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>2. GRANT OF RIGHTS</span></b> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-Subject to the terms of this Agreement, each Contributor hereby grants Recipient
-a non-exclusive, worldwide, royalty-free copyright license to<span
-style='color:red'> </span>reproduce, prepare derivative works of, publicly
-display, publicly perform, distribute and sublicense the Contribution of such
-Contributor, if any, and such derivative works, in source code and object code
-form.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-Subject to the terms of this Agreement, each Contributor hereby grants
-Recipient a non-exclusive, worldwide,<span style='color:green'> </span>royalty-free
-patent license under Licensed Patents to make, use, sell, offer to sell, import
-and otherwise transfer the Contribution of such Contributor, if any, in source
-code and object code form. This patent license shall apply to the combination
-of the Contribution and the Program if, at the time the Contribution is added
-by the Contributor, such addition of the Contribution causes such combination
-to be covered by the Licensed Patents. The patent license shall not apply to
-any other combinations which include the Contribution. No hardware per se is
-licensed hereunder. </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>c)
-Recipient understands that although each Contributor grants the licenses to its
-Contributions set forth herein, no assurances are provided by any Contributor
-that the Program does not infringe the patent or other intellectual property
-rights of any other entity. Each Contributor disclaims any liability to Recipient
-for claims brought by any other entity based on infringement of intellectual
-property rights or otherwise. As a condition to exercising the rights and
-licenses granted hereunder, each Recipient hereby assumes sole responsibility
-to secure any other intellectual property rights needed, if any. For example,
-if a third party patent license is required to allow Recipient to distribute
-the Program, it is Recipient's responsibility to acquire that license before
-distributing the Program.</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>d)
-Each Contributor represents that to its knowledge it has sufficient copyright
-rights in its Contribution, if any, to grant the copyright license set forth in
-this Agreement. </span></p>
-
-<p><b><span style='font-size:10.0pt'>3. REQUIREMENTS</span></b> </p>
-
-<p><span style='font-size:10.0pt'>A Contributor may choose to distribute the
-Program in object code form under its own license agreement, provided that:</span>
-</p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it complies with the terms and conditions of this Agreement; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b)
-its license agreement:</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>i)
-effectively disclaims on behalf of all Contributors all warranties and
-conditions, express and implied, including warranties or conditions of title
-and non-infringement, and implied warranties or conditions of merchantability
-and fitness for a particular purpose; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>ii)
-effectively excludes on behalf of all Contributors all liability for damages,
-including direct, indirect, special, incidental and consequential damages, such
-as lost profits; </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iii)
-states that any provisions which differ from this Agreement are offered by that
-Contributor alone and not by any other party; and</span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>iv)
-states that source code for the Program is available from such Contributor, and
-informs licensees how to obtain it in a reasonable manner on or through a
-medium customarily used for software exchange.<span style='color:blue'> </span></span></p>
-
-<p><span style='font-size:10.0pt'>When the Program is made available in source
-code form:</span> </p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>a)
-it must be made available under this Agreement; and </span></p>
-
-<p class=MsoNormal style='margin-left:.5in'><span style='font-size:10.0pt'>b) a
-copy of this Agreement must be included with each copy of the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Contributors may not remove or alter any
-copyright notices contained within the Program. </span></p>
-
-<p><span style='font-size:10.0pt'>Each Contributor must identify itself as the
-originator of its Contribution, if any, in a manner that reasonably allows
-subsequent Recipients to identify the originator of the Contribution. </span></p>
-
-<p><b><span style='font-size:10.0pt'>4. COMMERCIAL DISTRIBUTION</span></b> </p>
-
-<p><span style='font-size:10.0pt'>Commercial distributors of software may
-accept certain responsibilities with respect to end users, business partners
-and the like. While this license is intended to facilitate the commercial use
-of the Program, the Contributor who includes the Program in a commercial
-product offering should do so in a manner which does not create potential
-liability for other Contributors. Therefore, if a Contributor includes the
-Program in a commercial product offering, such Contributor (&quot;Commercial
-Contributor&quot;) hereby agrees to defend and indemnify every other
-Contributor (&quot;Indemnified Contributor&quot;) against any losses, damages and
-costs (collectively &quot;Losses&quot;) arising from claims, lawsuits and other
-legal actions brought by a third party against the Indemnified Contributor to
-the extent caused by the acts or omissions of such Commercial Contributor in
-connection with its distribution of the Program in a commercial product
-offering. The obligations in this section do not apply to any claims or Losses
-relating to any actual or alleged intellectual property infringement. In order
-to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
-Contributor in writing of such claim, and b) allow the Commercial Contributor
-to control, and cooperate with the Commercial Contributor in, the defense and
-any related settlement negotiations. The Indemnified Contributor may participate
-in any such claim at its own expense.</span> </p>
-
-<p><span style='font-size:10.0pt'>For example, a Contributor might include the
-Program in a commercial product offering, Product X. That Contributor is then a
-Commercial Contributor. If that Commercial Contributor then makes performance
-claims, or offers warranties related to Product X, those performance claims and
-warranties are such Commercial Contributor's responsibility alone. Under this
-section, the Commercial Contributor would have to defend claims against the
-other Contributors related to those performance claims and warranties, and if a
-court requires any other Contributor to pay any damages as a result, the
-Commercial Contributor must pay those damages.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>5. NO WARRANTY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, THE PROGRAM IS PROVIDED ON AN &quot;AS IS&quot; BASIS, WITHOUT
-WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
-WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
-MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
-responsible for determining the appropriateness of using and distributing the
-Program and assumes all risks associated with its exercise of rights under this
-Agreement , including but not limited to the risks and costs of program errors,
-compliance with applicable laws, damage to or loss of data, programs or
-equipment, and unavailability or interruption of operations. </span></p>
-
-<p><b><span style='font-size:10.0pt'>6. DISCLAIMER OF LIABILITY</span></b> </p>
-
-<p><span style='font-size:10.0pt'>EXCEPT AS EXPRESSLY SET FORTH IN THIS
-AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR
-ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-(INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF
-THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF
-THE POSSIBILITY OF SUCH DAMAGES.</span> </p>
-
-<p><b><span style='font-size:10.0pt'>7. GENERAL</span></b> </p>
-
-<p><span style='font-size:10.0pt'>If any provision of this Agreement is invalid
-or unenforceable under applicable law, it shall not affect the validity or
-enforceability of the remainder of the terms of this Agreement, and without
-further action by the parties hereto, such provision shall be reformed to the
-minimum extent necessary to make such provision valid and enforceable.</span> </p>
-
-<p><span style='font-size:10.0pt'>If Recipient institutes patent litigation
-against any entity (including a cross-claim or counterclaim in a lawsuit)
-alleging that the Program itself (excluding combinations of the Program with
-other software or hardware) infringes such Recipient's patent(s), then such
-Recipient's rights granted under Section 2(b) shall terminate as of the date
-such litigation is filed. </span></p>
-
-<p><span style='font-size:10.0pt'>All Recipient's rights under this Agreement
-shall terminate if it fails to comply with any of the material terms or
-conditions of this Agreement and does not cure such failure in a reasonable
-period of time after becoming aware of such noncompliance. If all Recipient's
-rights under this Agreement terminate, Recipient agrees to cease use and
-distribution of the Program as soon as reasonably practicable. However,
-Recipient's obligations under this Agreement and any licenses granted by
-Recipient relating to the Program shall continue and survive. </span></p>
-
-<p><span style='font-size:10.0pt'>Everyone is permitted to copy and distribute
-copies of this Agreement, but in order to avoid inconsistency the Agreement is
-copyrighted and may only be modified in the following manner. The Agreement
-Steward reserves the right to publish new versions (including revisions) of
-this Agreement from time to time. No one other than the Agreement Steward has
-the right to modify this Agreement. The Eclipse Foundation is the initial
-Agreement Steward. The Eclipse Foundation may assign the responsibility to
-serve as the Agreement Steward to a suitable separate entity. Each new version
-of the Agreement will be given a distinguishing version number. The Program
-(including Contributions) may always be distributed subject to the version of
-the Agreement under which it was received. In addition, after a new version of
-the Agreement is published, Contributor may elect to distribute the Program
-(including its Contributions) under the new version. Except as expressly stated
-in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to
-the intellectual property of any Contributor under this Agreement, whether
-expressly, by implication, estoppel or otherwise. All rights in the Program not
-expressly granted under this Agreement are reserved.</span> </p>
-
-<p><span style='font-size:10.0pt'>This Agreement is governed by the laws of the
-State of New York and the intellectual property laws of the United States of
-America. No party to this Agreement will bring a legal action under this
-Agreement more than one year after the cause of action arose. Each party waives
-its rights to a jury trial in any resulting litigation.</span> </p>
-
-<p class=MsoNormal><![if !supportEmptyParas]>&nbsp;<![endif]><o:p></o:p></p>
-
-</div>
-
-</body>
-
-</html>
\ No newline at end of file
diff --git a/releng/org.eclipse.ptp.rm.orte-feature/feature.properties b/releng/org.eclipse.ptp.rm.orte-feature/feature.properties
deleted file mode 100644
index 48c887f..0000000
--- a/releng/org.eclipse.ptp.rm.orte-feature/feature.properties
+++ /dev/null
@@ -1,156 +0,0 @@
-#################################################################################
-# Copyright (c) 2005 The Regents of the University of California. 
-# This material was produced under U.S. Government contract W-7405-ENG-36 
-# for Los Alamos National Laboratory, which is operated by the University 
-# of California for the U.S. Department of Energy. The U.S. Government has 
-# rights to use, reproduce, and distribute this software. NEITHER THE 
-# GOVERNMENT NOR THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR 
-# ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified 
-# to produce derivative works, such modified software should be clearly marked, 
-# so as not to confuse it with the version available from LANL.
-# 
-# Additionally, 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
-# 
-# LA-CC 04-115
-#
-#################################################################################
-
-
-# "featureName" property - name of the feature
-featureName=PTP Support For Open MPI
-
-# "providerName" property - name of the company that provides the feature
-providerName=Eclipse.org
-
-# "updateSiteName" property - label for the update site
-updateSiteName=Eclipse PTP Update Site
-
-# "description" property - description of the feature
-description=Adds support for Open MPI
-
-# copyright
-copyright=\
-Copyright (c) 2005 The Regents of the University of California.\n\
-This material was produced under U.S. Government contract W-7405-ENG-36\n\
-for Los Alamos National Laboratory, which is operated by the University\n\
-of California for the U.S. Department of Energy. The U.S. Government has\n\
-rights to use, reproduce, and distribute this software. NEITHER THE\n\
-GOVERNMENT NOR THE UNIVERSITY MAKES ANY WARRANTY, EXPRESS OR IMPLIED, OR\n\
-ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE. If software is modified\n\
-to produce derivative works, such modified software should be clearly marked,\n\
-so as not to confuse it with the version available from LANL.\n\
-\n\
-Additionally, this program and the accompanying materials\n\
-are made available under the terms of the Eclipse Public License v1.0\n\
-which accompanies this distribution, and is available at\n\
-http://www.eclipse.org/legal/epl-v10.html\n\
-\n\
-LA-CC 04-115\n
-
-# "licenseURL" property - URL of the "Feature License"
-# do not translate value - just change to point to a locale-specific HTML page
-licenseURL=license.html
-
-# "license" property - text of the "Feature Update License"
-# should be plain text version of license agreement pointed to be "licenseURL"
-license=\
-ECLIPSE FOUNDATION SOFTWARE USER AGREEMENT\n\
-March 17, 2005\n\
-\n\
-Usage Of Content\n\
-\n\
-THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR\n\
-OTHER MATERIALS FOR OPEN SOURCE PROJECTS (COLLECTIVELY "CONTENT").\n\
-USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS\n\
-AGREEMENT AND/OR THE TERMS AND CONDITIONS OF LICENSE AGREEMENTS OR\n\
-NOTICES INDICATED OR REFERENCED BELOW. BY USING THE CONTENT, YOU\n\
-AGREE THAT YOUR USE OF THE CONTENT IS GOVERNED BY THIS AGREEMENT\n\
-AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS\n\
-OR NOTICES INDICATED OR REFERENCED BELOW. IF YOU DO NOT AGREE TO THE\n\
-TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND CONDITIONS\n\
-OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED\n\
-BELOW, THEN YOU MAY NOT USE THE CONTENT.\n\
-\n\
-Applicable Licenses\n\
-\n\
-Unless otherwise indicated, all Content made available by the Eclipse Foundation\n\
-is provided to you under the terms and conditions of the Eclipse Public\n\
-License Version 1.0 ("EPL"). A copy of the EPL is provided with this\n\
-Content and is also available at http://www.eclipse.org/legal/epl-v10.html.\n\
-For purposes of the EPL, "Program" will mean the Content.\n\
-\n\
-Content includes, but is not limited to, source code, object code,\n\
-documentation and other files maintained in the Eclipse.org CVS\n\
-repository ("Repository") in CVS modules ("Modules") and made available\n\
-as downloadable archives ("Downloads").\n\
-\n\
-   - Content may be structured and packaged into modules to facilitate delivering,\n\
-     extending, and upgrading the Content. Typical modules may include plug-ins ("Plug-ins"),\n\
-     plug-in fragments ("Fragments"), and features ("Features").\n\
-   - Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java? ARchive)\n\
-     in a directory named "plugins".\n\
-   - A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.\n\
-     Each Feature may be packaged as a sub-directory in a directory named "features".\n\
-     Within a Feature, files named "feature.xml" may contain a list of the names and version\n\
-     numbers of the Plug-ins and/or Fragments associated with that Feature.\n\
-   - Features may also include other Features ("Included Features"). Within a Feature, files\n\
-     named "feature.xml" may contain a list of the names and version numbers of Included Features.\n\
-\n\
-Features may also include other Features ("Included Features"). Files named\n\
-"feature.xml" may contain a list of the names and version numbers of\n\
-Included Features.\n\
-\n\
-The terms and conditions governing Plug-ins and Fragments should be\n\
-contained in files named "about.html" ("Abouts"). The terms and\n\
-conditions governing Features and Included Features should be contained\n\
-in files named "license.html" ("Feature Licenses"). Abouts and Feature\n\
-Licenses may be located in any directory of a Download or Module\n\
-including, but not limited to the following locations:\n\
-\n\
-   - The top-level (root) directory\n\
-   - Plug-in and Fragment directories\n\
-   - Inside Plug-ins and Fragments packaged as JARs\n\
-   - Sub-directories of the directory named "src" of certain Plug-ins\n\
-   - Feature directories\n\
-\n\
-Note: if a Feature made available by the Eclipse Foundation is installed using the\n\
-Eclipse Update Manager, you must agree to a license ("Feature Update\n\
-License") during the installation process. If the Feature contains\n\
-Included Features, the Feature Update License should either provide you\n\
-with the terms and conditions governing the Included Features or inform\n\
-you where you can locate them. Feature Update Licenses may be found in\n\
-the "license" property of files named "feature.properties". Such Abouts,\n\
-Feature Licenses and Feature Update Licenses contain the terms and\n\
-conditions (or references to such terms and conditions) that govern your\n\
-use of the associated Content in that directory.\n\
-\n\
-THE ABOUTS, FEATURE LICENSES AND FEATURE UPDATE LICENSES MAY REFER\n\
-TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.\n\
-SOME OF THESE OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):\n\
-\n\
-    - Common Public License Version 1.0 (available at http://www.eclipse.org/legal/cpl-v10.html)\n\
-    - Apache Software License 1.1 (available at http://www.apache.org/licenses/LICENSE)\n\
-    - Apache Software License 2.0 (available at http://www.apache.org/licenses/LICENSE-2.0)\n\
-    - IBM Public License 1.0 (available at http://oss.software.ibm.com/developerworks/opensource/license10.html)\n\
-    - Metro Link Public License 1.00 (available at http://www.opengroup.org/openmotif/supporters/metrolink/license.html)\n\
-    - Mozilla Public License Version 1.1 (available at http://www.mozilla.org/MPL/MPL-1.1.html)\n\
-\n\
-IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR\n\
-TO USE OF THE CONTENT. If no About, Feature License or Feature Update License\n\
-is provided, please contact the Eclipse Foundation to determine what terms and conditions\n\
-govern that particular Content.\n\
-\n\
-Cryptography\n\
-\n\
-Content may contain encryption software. The country in which you are\n\
-currently may have restrictions on the import, possession, and use,\n\
-and/or re-export to another country, of encryption software. BEFORE\n\
-using any encryption software, please check the country's laws,\n\
-regulations and policies concerning the import, possession, or use,\n\
-and re-export of encryption software, to see if this is permitted.\n\
-\n\
-Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.\n
-########### end of license property ##########################################
diff --git a/releng/org.eclipse.ptp.rm.orte-feature/feature.xml b/releng/org.eclipse.ptp.rm.orte-feature/feature.xml
deleted file mode 100644
index 89b2532..0000000
--- a/releng/org.eclipse.ptp.rm.orte-feature/feature.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.ptp.rm.orte"
-      label="%featureName"
-      version="2.0.1.qualifier"
-      provider-name="%providerName"
-      image="eclipse_update_120.jpg">
-
-   <description url="http://eclipse.org/ptp">
-      %description
-   </description>
-
-   <copyright>
-      %copyright
-   </copyright>
-
-   <license url="%licenseURL">
-      %license
-   </license>
-
-   <requires>
-      <import plugin="org.eclipse.core.runtime"/>
-      <import plugin="org.eclipse.search"/>
-      <import plugin="org.eclipse.ui"/>
-      <import plugin="org.eclipse.debug.core"/>
-      <import plugin="org.eclipse.ptp.proxy.protocol"/>
-      <import plugin="org.eclipse.ptp.core"/>
-      <import plugin="org.eclipse.ptp.rm.remote"/>
-      <import plugin="org.eclipse.ptp.utils"/>
-      <import plugin="org.eclipse.ptp.proxy"/>
-      <import plugin="org.eclipse.ptp.ui"/>
-      <import plugin="org.eclipse.ptp.launch"/>
-      <import plugin="org.eclipse.ptp.remote.core"/>
-      <import plugin="org.eclipse.ptp.remote.ui"/>
-      <import plugin="org.eclipse.ptp.utils.ui"/>
-   </requires>
-
-   <plugin
-         id="org.eclipse.ptp.rm.orte.core"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-   <plugin
-         id="org.eclipse.ptp.rm.orte.proxy"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"/>
-
-   <plugin
-         id="org.eclipse.ptp.rm.orte.ui"
-         download-size="0"
-         install-size="0"
-         version="0.0.0"
-         unpack="false"/>
-
-</feature>
diff --git a/releng/org.eclipse.ptp.rm.orte-feature/license.html b/releng/org.eclipse.ptp.rm.orte-feature/license.html
deleted file mode 100644
index c6af966..0000000
--- a/releng/org.eclipse.ptp.rm.orte-feature/license.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<html>
-<head>
-<meta http-equiv=Content-Type content="text/html; charset=iso-8859-1">
-<title>Eclipse.org Software User Agreement</title>
-</head>
-
-<body lang="EN-US" link=blue vlink=purple>
-<h2>Eclipse Foundation Software User Agreement</h2>
-<p>March 17, 2005</p>
-
-<h3>Usage Of Content</h3>
-
-<p>THE ECLIPSE FOUNDATION MAKES AVAILABLE SOFTWARE, DOCUMENTATION, INFORMATION AND/OR OTHER MATERIALS FOR OPEN SOURCE PROJECTS
-   (COLLECTIVELY &quot;CONTENT&quot;).  USE OF THE CONTENT IS GOVERNED BY THE TERMS AND CONDITIONS OF THIS AGREEMENT AND/OR THE TERMS AND
-   CONDITIONS OF LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW.  BY USING THE CONTENT, YOU AGREE THAT YOUR USE
-   OF THE CONTENT IS GOVERNED BY THIS AGREEMENT AND/OR THE TERMS AND CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR
-   NOTICES INDICATED OR REFERENCED BELOW.  IF YOU DO NOT AGREE TO THE TERMS AND CONDITIONS OF THIS AGREEMENT AND THE TERMS AND
-   CONDITIONS OF ANY APPLICABLE LICENSE AGREEMENTS OR NOTICES INDICATED OR REFERENCED BELOW, THEN YOU MAY NOT USE THE CONTENT.</p>
-   
-<h3>Applicable Licenses</h3>   
-   
-<p>Unless otherwise indicated, all Content made available by the Eclipse Foundation is provided to you under the terms and conditions of the Eclipse Public License Version 1.0
-   (&quot;EPL&quot;).  A copy of the EPL is provided with this Content and is also available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-   For purposes of the EPL, &quot;Program&quot; will mean the Content.</p>
-
-<p>Content includes, but is not limited to, source code, object code, documentation and other files maintained in the Eclipse.org CVS repository (&quot;Repository&quot;) in CVS
-   modules (&quot;Modules&quot;) and made available as downloadable archives (&quot;Downloads&quot;).</p>
-   
-<ul>
-	<li>Content may be structured and packaged into modules to facilitate delivering, extending, and upgrading the Content.  Typical modules may include plug-ins (&quot;Plug-ins&quot;), plug-in fragments (&quot;Fragments&quot;), and features (&quot;Features&quot;).</li>
-	<li>Each Plug-in or Fragment may be packaged as a sub-directory or JAR (Java&trade; ARchive) in a directory named &quot;plugins&quot;.</li>
-	<li>A Feature is a bundle of one or more Plug-ins and/or Fragments and associated material.  Each Feature may be packaged as a sub-directory in a directory named &quot;features&quot;.  Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of the Plug-ins
-      and/or Fragments associated with that Feature.</li>
-	<li>Features may also include other Features (&quot;Included Features&quot;). Within a Feature, files named &quot;feature.xml&quot; may contain a list of the names and version numbers of Included Features.</li>
-</ul>   
- 
-<p>The terms and conditions governing Plug-ins and Fragments should be contained in files named &quot;about.html&quot; (&quot;Abouts&quot;). The terms and conditions governing Features and
-Included Features should be contained in files named &quot;license.html&quot; (&quot;Feature Licenses&quot;).  Abouts and Feature Licenses may be located in any directory of a Download or Module
-including, but not limited to the following locations:</p>
-
-<ul>
-	<li>The top-level (root) directory</li>
-	<li>Plug-in and Fragment directories</li>
-	<li>Inside Plug-ins and Fragments packaged as JARs</li>
-	<li>Sub-directories of the directory named &quot;src&quot; of certain Plug-ins</li>
-	<li>Feature directories</li>
-</ul>
-		
-<p>Note: if a Feature made available by the Eclipse Foundation is installed using the Eclipse Update Manager, you must agree to a license (&quot;Feature Update License&quot;) during the
-installation process.  If the Feature contains Included Features, the Feature Update License should either provide you with the terms and conditions governing the Included Features or
-inform you where you can locate them.  Feature Update Licenses may be found in the &quot;license&quot; property of files named &quot;feature.properties&quot; found within a Feature.
-Such Abouts, Feature Licenses, and Feature Update Licenses contain the terms and conditions (or references to such terms and conditions) that govern your use of the associated Content in
-that directory.</p>
-
-<p>THE ABOUTS, FEATURE LICENSES, AND FEATURE UPDATE LICENSES MAY REFER TO THE EPL OR OTHER LICENSE AGREEMENTS, NOTICES OR TERMS AND CONDITIONS.  SOME OF THESE
-OTHER LICENSE AGREEMENTS MAY INCLUDE (BUT ARE NOT LIMITED TO):</p>
-
-<ul>
-	<li>Common Public License Version 1.0 (available at <a href="http://www.eclipse.org/legal/cpl-v10.html">http://www.eclipse.org/legal/cpl-v10.html</a>)</li>
-	<li>Apache Software License 1.1 (available at <a href="http://www.apache.org/licenses/LICENSE">http://www.apache.org/licenses/LICENSE</a>)</li>
-	<li>Apache Software License 2.0 (available at <a href="http://www.apache.org/licenses/LICENSE-2.0">http://www.apache.org/licenses/LICENSE-2.0</a>)</li>
-	<li>IBM Public License 1.0 (available at <a href="http://oss.software.ibm.com/developerworks/opensource/license10.html">http://oss.software.ibm.com/developerworks/opensource/license10.html</a>)</li>	
-	<li>Metro Link Public License 1.00 (available at <a href="http://www.opengroup.org/openmotif/supporters/metrolink/license.html">http://www.opengroup.org/openmotif/supporters/metrolink/license.html</a>)</li>
-	<li>Mozilla Public License Version 1.1 (available at <a href="http://www.mozilla.org/MPL/MPL-1.1.html">http://www.mozilla.org/MPL/MPL-1.1.html</a>)</li>
-</ul>
-
-<p>IT IS YOUR OBLIGATION TO READ AND ACCEPT ALL SUCH TERMS AND CONDITIONS PRIOR TO USE OF THE CONTENT.  If no About, Feature License, or Feature Update License is provided, please
-contact the Eclipse Foundation to determine what terms and conditions govern that particular Content.</p>
-
-<h3>Cryptography</h3>
-
-<p>Content may contain encryption software. The country in which you are currently may have restrictions on the import, possession, and use, and/or re-export to
-   another country, of encryption software. BEFORE using any encryption software, please check the country's laws, regulations and policies concerning the import,
-   possession, or use, and re-export of encryption software, to see if this is permitted.</p>
-   
-<small>Java and all Java-based trademarks are trademarks of Sun Microsystems, Inc. in the United States, other countries, or both.</small>   
-</body>
-</html>
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/.cproject b/rms/org.eclipse.ptp.rm.pbs.proxy/.cproject
deleted file mode 100644
index 841b658..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/.cproject
+++ /dev/null
@@ -1,209 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?fileVersion 4.0.0?>
-
-<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
-<storageModule moduleId="org.eclipse.cdt.core.settings">
-<cconfiguration id="0.1451097999">
-<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.1451097999" moduleId="org.eclipse.cdt.core.settings" name="Default">
-<externalSettings/>
-<extensions>
-<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-<extension id="org.eclipse.cdt.core.MakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-</extensions>
-</storageModule>
-<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-<configuration artifactName="org.eclipse.ptp.rm.slurm.proxy" buildProperties="" description="" id="0.1451097999" name="Default" parent="org.eclipse.cdt.build.core.prefbase.cfg">
-<folderInfo id="0.1451097999." name="/" resourcePath="">
-<toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.1939665555" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
-<targetPlatform id="org.eclipse.cdt.build.core.prefbase.toolchain.1939665555.1415213314" name=""/>
-<builder id="org.eclipse.cdt.build.core.settings.default.builder.379503967" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
-<tool id="org.eclipse.cdt.build.core.settings.holder.libs.1835313480" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
-<tool id="org.eclipse.cdt.build.core.settings.holder.354226561" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
-<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.909176780" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
-</tool>
-<tool id="org.eclipse.cdt.build.core.settings.holder.419413029" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
-<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1301739134" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
-</tool>
-<tool id="org.eclipse.cdt.build.core.settings.holder.1246471449" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
-<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.2135229327" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
-</tool>
-</toolChain>
-</folderInfo>
-</configuration>
-</storageModule>
-<storageModule moduleId="scannerConfiguration">
-<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
-<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="makefileGenerator">
-<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<scannerConfigBuildInfo instanceId="0.1451097999">
-<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile"/>
-<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="makefileGenerator">
-<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
-<buildOutputProvider>
-<openAction enabled="true" filePath=""/>
-<parser enabled="true"/>
-</buildOutputProvider>
-<scannerInfoProvider id="specsFile">
-<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
-<parser enabled="true"/>
-</scannerInfoProvider>
-</profile>
-</scannerConfigBuildInfo>
-</storageModule>
-<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
-</cconfiguration>
-</storageModule>
-<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-<project id="org.eclipse.ptp.rm.slurm.proxy.null.1647747885" name="org.eclipse.ptp.rm.slurm.proxy"/>
-</storageModule>
-</cproject>
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/.cvsignore b/rms/org.eclipse.ptp.rm.pbs.proxy/.cvsignore
deleted file mode 100644
index 3870dfd..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-autom4te.cache
-a.out.dSYM
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/.project b/rms/org.eclipse.ptp.rm.pbs.proxy/.project
deleted file mode 100644
index eb70ac2..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/.project
+++ /dev/null
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.rm.pbs.proxy</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
-			<triggers>clean,full,incremental,</triggers>
-			<arguments>
-				<dictionary>
-					<key>?name?</key>
-					<value></value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.append_environment</key>
-					<value>true</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
-					<value>all</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.buildArguments</key>
-					<value></value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.buildCommand</key>
-					<value>make</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
-					<value>clean</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.contents</key>
-					<value>org.eclipse.cdt.make.core.activeConfigSettings</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
-					<value>false</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
-					<value>true</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
-					<value>true</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
-					<value>all</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.stopOnError</key>
-					<value>true</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
-					<value>true</value>
-				</dictionary>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.cdt.core.cnature</nature>
-		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
-		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
-	</natures>
-</projectDescription>
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/AUTHORS b/rms/org.eclipse.ptp.rm.pbs.proxy/AUTHORS
deleted file mode 100644
index e69de29..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/AUTHORS
+++ /dev/null
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/COPYING b/rms/org.eclipse.ptp.rm.pbs.proxy/COPYING
deleted file mode 100644
index d75058f..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/COPYING
+++ /dev/null
@@ -1,7 +0,0 @@
-Copyright (c) 2009 School of Computer, National University of Defense Technology, P.R.China 
-
-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
- 
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/ChangeLog b/rms/org.eclipse.ptp.rm.pbs.proxy/ChangeLog
deleted file mode 100644
index e69de29..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/ChangeLog
+++ /dev/null
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/INSTALL b/rms/org.eclipse.ptp.rm.pbs.proxy/INSTALL
deleted file mode 100644
index 5c0c42f..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/INSTALL
+++ /dev/null
@@ -1 +0,0 @@
-See README for build/install instructions.
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/META-INF/MANIFEST.MF b/rms/org.eclipse.ptp.rm.pbs.proxy/META-INF/MANIFEST.MF
deleted file mode 100644
index db63451..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,8 +0,0 @@
-Manifest-Version: 1.0
-Bundle-SymbolicName: org.eclipse.ptp.rm.pbs.proxy
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-Version: 4.0.0.qualifier
-Bundle-Vendor: %providerName
-Bundle-Localization: plugin
-Require-Bundle: org.eclipse.ptp.utils,org.eclipse.ptp.proxy
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/META-INF/eclipse.inf b/rms/org.eclipse.ptp.rm.pbs.proxy/META-INF/eclipse.inf
deleted file mode 100644
index 92ffed2..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/META-INF/eclipse.inf
+++ /dev/null
@@ -1,2 +0,0 @@
-#Processed using Jarprocessor
-pack200.conditioned = true
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/Makefile.am b/rms/org.eclipse.ptp.rm.pbs.proxy/Makefile.am
deleted file mode 100644
index c6beafb..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/Makefile.am
+++ /dev/null
@@ -1,5 +0,0 @@
-
-bin_PROGRAMS =	ptp_pbs_proxy
-
-ptp_pbs_proxy_SOURCES =	src/ptp_pbs_proxy.c 
-ptp_pbs_proxy_CFLAGS =	-g $(AM_CFLAGS)
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/Makefile.in b/rms/org.eclipse.ptp.rm.pbs.proxy/Makefile.in
deleted file mode 100644
index 0a275e2..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/Makefile.in
+++ /dev/null
@@ -1,586 +0,0 @@
-# Makefile.in generated by automake 1.10 from Makefile.am.
-# @configure_input@
-
-# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
-# 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
-# This Makefile.in is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-@SET_MAKE@
-
-VPATH = @srcdir@
-pkgdatadir = $(datadir)/@PACKAGE@
-pkglibdir = $(libdir)/@PACKAGE@
-pkgincludedir = $(includedir)/@PACKAGE@
-am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
-install_sh_DATA = $(install_sh) -c -m 644
-install_sh_PROGRAM = $(install_sh) -c
-install_sh_SCRIPT = $(install_sh) -c
-INSTALL_HEADER = $(INSTALL_DATA)
-transform = $(program_transform_name)
-NORMAL_INSTALL = :
-PRE_INSTALL = :
-POST_INSTALL = :
-NORMAL_UNINSTALL = :
-PRE_UNINSTALL = :
-POST_UNINSTALL = :
-build_triplet = @build@
-bin_PROGRAMS = ptp_pbs_proxy$(EXEEXT)
-subdir = .
-DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
-	$(srcdir)/Makefile.in $(srcdir)/config.h.in \
-	$(top_srcdir)/configure AUTHORS COPYING ChangeLog INSTALL NEWS \
-	compile config.guess config.sub depcomp install-sh missing
-ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
-am__aclocal_m4_deps = $(top_srcdir)/configure.in
-am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
-	$(ACLOCAL_M4)
-am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
- configure.lineno config.status.lineno
-mkinstalldirs = $(install_sh) -d
-CONFIG_HEADER = config.h
-CONFIG_CLEAN_FILES =
-am__installdirs = "$(DESTDIR)$(bindir)"
-binPROGRAMS_INSTALL = $(INSTALL_PROGRAM)
-PROGRAMS = $(bin_PROGRAMS)
-am__dirstamp = $(am__leading_dot)dirstamp
-am_ptp_pbs_proxy_OBJECTS = src/ptp_pbs_proxy-ptp_pbs_proxy.$(OBJEXT)
-ptp_pbs_proxy_OBJECTS = $(am_ptp_pbs_proxy_OBJECTS)
-ptp_pbs_proxy_LDADD = $(LDADD)
-ptp_pbs_proxy_LINK = $(CCLD) $(ptp_pbs_proxy_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-DEFAULT_INCLUDES = -I.@am__isrc@
-depcomp = $(SHELL) $(top_srcdir)/depcomp
-am__depfiles_maybe = depfiles
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-CCLD = $(CC)
-LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
-SOURCES = $(ptp_pbs_proxy_SOURCES)
-DIST_SOURCES = $(ptp_pbs_proxy_SOURCES)
-ETAGS = etags
-CTAGS = ctags
-DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
-distdir = $(PACKAGE)-$(VERSION)
-top_distdir = $(distdir)
-am__remove_distdir = \
-  { test ! -d $(distdir) \
-    || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
-         && rm -fr $(distdir); }; }
-DIST_ARCHIVES = $(distdir).tar.gz
-GZIP_ENV = --best
-distuninstallcheck_listfiles = find . -type f -print
-distcleancheck_listfiles = find . -type f -print
-ACLOCAL = @ACLOCAL@
-AMTAR = @AMTAR@
-AUTOCONF = @AUTOCONF@
-AUTOHEADER = @AUTOHEADER@
-AUTOMAKE = @AUTOMAKE@
-AWK = @AWK@
-CC = @CC@
-CCDEPMODE = @CCDEPMODE@
-CFLAGS = @CFLAGS@
-CPP = @CPP@
-CPPFLAGS = @CPPFLAGS@
-CYGPATH_W = @CYGPATH_W@
-DEFS = @DEFS@
-DEPDIR = @DEPDIR@
-ECHO_C = @ECHO_C@
-ECHO_N = @ECHO_N@
-ECHO_T = @ECHO_T@
-EGREP = @EGREP@
-EXEEXT = @EXEEXT@
-GREP = @GREP@
-INSTALL = @INSTALL@
-INSTALL_DATA = @INSTALL_DATA@
-INSTALL_PROGRAM = @INSTALL_PROGRAM@
-INSTALL_SCRIPT = @INSTALL_SCRIPT@
-INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-LDFLAGS = @LDFLAGS@
-LIBOBJS = @LIBOBJS@
-LIBS = @LIBS@
-LTLIBOBJS = @LTLIBOBJS@
-MAKEINFO = @MAKEINFO@
-MKDIR_P = @MKDIR_P@
-OBJEXT = @OBJEXT@
-PACKAGE = @PACKAGE@
-PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
-PACKAGE_NAME = @PACKAGE_NAME@
-PACKAGE_STRING = @PACKAGE_STRING@
-PACKAGE_TARNAME = @PACKAGE_TARNAME@
-PACKAGE_VERSION = @PACKAGE_VERSION@
-PATH_SEPARATOR = @PATH_SEPARATOR@
-PBSDIR = @PBSDIR@
-RANLIB = @RANLIB@
-SET_MAKE = @SET_MAKE@
-SHELL = @SHELL@
-STRIP = @STRIP@
-VERSION = @VERSION@
-abs_builddir = @abs_builddir@
-abs_srcdir = @abs_srcdir@
-abs_top_builddir = @abs_top_builddir@
-abs_top_srcdir = @abs_top_srcdir@
-ac_ct_CC = @ac_ct_CC@
-am__include = @am__include@
-am__leading_dot = @am__leading_dot@
-am__quote = @am__quote@
-am__tar = @am__tar@
-am__untar = @am__untar@
-bindir = @bindir@
-build = @build@
-build_alias = @build_alias@
-build_cpu = @build_cpu@
-build_os = @build_os@
-build_vendor = @build_vendor@
-builddir = @builddir@
-datadir = @datadir@
-datarootdir = @datarootdir@
-docdir = @docdir@
-dvidir = @dvidir@
-exec_prefix = @exec_prefix@
-host_alias = @host_alias@
-htmldir = @htmldir@
-includedir = @includedir@
-infodir = @infodir@
-install_sh = @install_sh@
-libdir = @libdir@
-libexecdir = @libexecdir@
-localedir = @localedir@
-localstatedir = @localstatedir@
-mandir = @mandir@
-mkdir_p = @mkdir_p@
-oldincludedir = @oldincludedir@
-pdfdir = @pdfdir@
-prefix = @prefix@
-program_transform_name = @program_transform_name@
-psdir = @psdir@
-sbindir = @sbindir@
-sharedstatedir = @sharedstatedir@
-srcdir = @srcdir@
-sysconfdir = @sysconfdir@
-target_alias = @target_alias@
-top_builddir = @top_builddir@
-top_srcdir = @top_srcdir@
-ptp_pbs_proxy_SOURCES = src/ptp_pbs_proxy.c 
-ptp_pbs_proxy_CFLAGS = -g $(AM_CFLAGS)
-all: config.h
-	$(MAKE) $(AM_MAKEFLAGS) all-am
-
-.SUFFIXES:
-.SUFFIXES: .c .o .obj
-am--refresh:
-	@:
-$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)
-	@for dep in $?; do \
-	  case '$(am__configure_deps)' in \
-	    *$$dep*) \
-	      echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \
-	      cd $(srcdir) && $(AUTOMAKE) --gnu  \
-		&& exit 0; \
-	      exit 1;; \
-	  esac; \
-	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu  Makefile'; \
-	cd $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu  Makefile
-.PRECIOUS: Makefile
-Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
-	@case '$?' in \
-	  *config.status*) \
-	    echo ' $(SHELL) ./config.status'; \
-	    $(SHELL) ./config.status;; \
-	  *) \
-	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
-	    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
-	esac;
-
-$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
-	$(SHELL) ./config.status --recheck
-
-$(top_srcdir)/configure:  $(am__configure_deps)
-	cd $(srcdir) && $(AUTOCONF)
-$(ACLOCAL_M4):  $(am__aclocal_m4_deps)
-	cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
-
-config.h: stamp-h1
-	@if test ! -f $@; then \
-	  rm -f stamp-h1; \
-	  $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \
-	else :; fi
-
-stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status
-	@rm -f stamp-h1
-	cd $(top_builddir) && $(SHELL) ./config.status config.h
-$(srcdir)/config.h.in:  $(am__configure_deps) 
-	cd $(top_srcdir) && $(AUTOHEADER)
-	rm -f stamp-h1
-	touch $@
-
-distclean-hdr:
-	-rm -f config.h stamp-h1
-install-binPROGRAMS: $(bin_PROGRAMS)
-	@$(NORMAL_INSTALL)
-	test -z "$(bindir)" || $(MKDIR_P) "$(DESTDIR)$(bindir)"
-	@list='$(bin_PROGRAMS)'; for p in $$list; do \
-	  p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
-	  if test -f $$p \
-	  ; then \
-	    f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \
-	   echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \
-	   $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \
-	  else :; fi; \
-	done
-
-uninstall-binPROGRAMS:
-	@$(NORMAL_UNINSTALL)
-	@list='$(bin_PROGRAMS)'; for p in $$list; do \
-	  f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \
-	  echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \
-	  rm -f "$(DESTDIR)$(bindir)/$$f"; \
-	done
-
-clean-binPROGRAMS:
-	-test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS)
-src/$(am__dirstamp):
-	@$(MKDIR_P) src
-	@: > src/$(am__dirstamp)
-src/$(DEPDIR)/$(am__dirstamp):
-	@$(MKDIR_P) src/$(DEPDIR)
-	@: > src/$(DEPDIR)/$(am__dirstamp)
-src/ptp_pbs_proxy-ptp_pbs_proxy.$(OBJEXT): src/$(am__dirstamp) \
-	src/$(DEPDIR)/$(am__dirstamp)
-ptp_pbs_proxy$(EXEEXT): $(ptp_pbs_proxy_OBJECTS) $(ptp_pbs_proxy_DEPENDENCIES) 
-	@rm -f ptp_pbs_proxy$(EXEEXT)
-	$(ptp_pbs_proxy_LINK) $(ptp_pbs_proxy_OBJECTS) $(ptp_pbs_proxy_LDADD) $(LIBS)
-
-mostlyclean-compile:
-	-rm -f *.$(OBJEXT)
-	-rm -f src/ptp_pbs_proxy-ptp_pbs_proxy.$(OBJEXT)
-
-distclean-compile:
-	-rm -f *.tab.c
-
-@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/ptp_pbs_proxy-ptp_pbs_proxy.Po@am__quote@
-
-.c.o:
-@am__fastdepCC_TRUE@	depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
-@am__fastdepCC_TRUE@	mv -f $$depbase.Tpo $$depbase.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c -o $@ $<
-
-.c.obj:
-@am__fastdepCC_TRUE@	depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
-@am__fastdepCC_TRUE@	mv -f $$depbase.Tpo $$depbase.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-src/ptp_pbs_proxy-ptp_pbs_proxy.o: src/ptp_pbs_proxy.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ptp_pbs_proxy_CFLAGS) $(CFLAGS) -MT src/ptp_pbs_proxy-ptp_pbs_proxy.o -MD -MP -MF src/$(DEPDIR)/ptp_pbs_proxy-ptp_pbs_proxy.Tpo -c -o src/ptp_pbs_proxy-ptp_pbs_proxy.o `test -f 'src/ptp_pbs_proxy.c' || echo '$(srcdir)/'`src/ptp_pbs_proxy.c
-@am__fastdepCC_TRUE@	mv -f src/$(DEPDIR)/ptp_pbs_proxy-ptp_pbs_proxy.Tpo src/$(DEPDIR)/ptp_pbs_proxy-ptp_pbs_proxy.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='src/ptp_pbs_proxy.c' object='src/ptp_pbs_proxy-ptp_pbs_proxy.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ptp_pbs_proxy_CFLAGS) $(CFLAGS) -c -o src/ptp_pbs_proxy-ptp_pbs_proxy.o `test -f 'src/ptp_pbs_proxy.c' || echo '$(srcdir)/'`src/ptp_pbs_proxy.c
-
-src/ptp_pbs_proxy-ptp_pbs_proxy.obj: src/ptp_pbs_proxy.c
-@am__fastdepCC_TRUE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ptp_pbs_proxy_CFLAGS) $(CFLAGS) -MT src/ptp_pbs_proxy-ptp_pbs_proxy.obj -MD -MP -MF src/$(DEPDIR)/ptp_pbs_proxy-ptp_pbs_proxy.Tpo -c -o src/ptp_pbs_proxy-ptp_pbs_proxy.obj `if test -f 'src/ptp_pbs_proxy.c'; then $(CYGPATH_W) 'src/ptp_pbs_proxy.c'; else $(CYGPATH_W) '$(srcdir)/src/ptp_pbs_proxy.c'; fi`
-@am__fastdepCC_TRUE@	mv -f src/$(DEPDIR)/ptp_pbs_proxy-ptp_pbs_proxy.Tpo src/$(DEPDIR)/ptp_pbs_proxy-ptp_pbs_proxy.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	source='src/ptp_pbs_proxy.c' object='src/ptp_pbs_proxy-ptp_pbs_proxy.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ptp_pbs_proxy_CFLAGS) $(CFLAGS) -c -o src/ptp_pbs_proxy-ptp_pbs_proxy.obj `if test -f 'src/ptp_pbs_proxy.c'; then $(CYGPATH_W) 'src/ptp_pbs_proxy.c'; else $(CYGPATH_W) '$(srcdir)/src/ptp_pbs_proxy.c'; fi`
-
-ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
-	list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	mkid -fID $$unique
-tags: TAGS
-
-TAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
-	  test -n "$$unique" || unique=$$empty_fix; \
-	  $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
-	    $$tags $$unique; \
-	fi
-ctags: CTAGS
-CTAGS:  $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \
-		$(TAGS_FILES) $(LISP)
-	tags=; \
-	here=`pwd`; \
-	list='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \
-	unique=`for i in $$list; do \
-	    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
-	  done | \
-	  $(AWK) '    { files[$$0] = 1; } \
-	       END { for (i in files) print i; }'`; \
-	test -z "$(CTAGS_ARGS)$$tags$$unique" \
-	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
-	     $$tags $$unique
-
-GTAGS:
-	here=`$(am__cd) $(top_builddir) && pwd` \
-	  && cd $(top_srcdir) \
-	  && gtags -i $(GTAGS_ARGS) $$here
-
-distclean-tags:
-	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
-
-distdir: $(DISTFILES)
-	$(am__remove_distdir)
-	test -d $(distdir) || mkdir $(distdir)
-	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
-	list='$(DISTFILES)'; \
-	  dist_files=`for file in $$list; do echo $$file; done | \
-	  sed -e "s|^$$srcdirstrip/||;t" \
-	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
-	case $$dist_files in \
-	  */*) $(MKDIR_P) `echo "$$dist_files" | \
-			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
-			   sort -u` ;; \
-	esac; \
-	for file in $$dist_files; do \
-	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
-	  if test -d $$d/$$file; then \
-	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
-	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
-	      cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
-	    fi; \
-	    cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
-	  else \
-	    test -f $(distdir)/$$file \
-	    || cp -p $$d/$$file $(distdir)/$$file \
-	    || exit 1; \
-	  fi; \
-	done
-	-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
-	  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -400 -exec chmod a+r {} \; -o \
-	  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \
-	|| chmod -R a+r $(distdir)
-dist-gzip: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__remove_distdir)
-
-dist-bzip2: distdir
-	tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
-	$(am__remove_distdir)
-
-dist-tarZ: distdir
-	tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
-	$(am__remove_distdir)
-
-dist-shar: distdir
-	shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
-	$(am__remove_distdir)
-
-dist-zip: distdir
-	-rm -f $(distdir).zip
-	zip -rq $(distdir).zip $(distdir)
-	$(am__remove_distdir)
-
-dist dist-all: distdir
-	tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
-	$(am__remove_distdir)
-
-# This target untars the dist file and tries a VPATH configuration.  Then
-# it guarantees that the distribution is self-contained by making another
-# tarfile.
-distcheck: dist
-	case '$(DIST_ARCHIVES)' in \
-	*.tar.gz*) \
-	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
-	*.tar.bz2*) \
-	  bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
-	*.tar.Z*) \
-	  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
-	*.shar.gz*) \
-	  GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
-	*.zip*) \
-	  unzip $(distdir).zip ;;\
-	esac
-	chmod -R a-w $(distdir); chmod a+w $(distdir)
-	mkdir $(distdir)/_build
-	mkdir $(distdir)/_inst
-	chmod a-w $(distdir)
-	dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
-	  && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
-	  && cd $(distdir)/_build \
-	  && ../configure --srcdir=.. --prefix="$$dc_install_base" \
-	    $(DISTCHECK_CONFIGURE_FLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) \
-	  && $(MAKE) $(AM_MAKEFLAGS) dvi \
-	  && $(MAKE) $(AM_MAKEFLAGS) check \
-	  && $(MAKE) $(AM_MAKEFLAGS) install \
-	  && $(MAKE) $(AM_MAKEFLAGS) installcheck \
-	  && $(MAKE) $(AM_MAKEFLAGS) uninstall \
-	  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
-	        distuninstallcheck \
-	  && chmod -R a-w "$$dc_install_base" \
-	  && ({ \
-	       (cd ../.. && umask 077 && mkdir "$$dc_destdir") \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
-	       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
-	            distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
-	      } || { rm -rf "$$dc_destdir"; exit 1; }) \
-	  && rm -rf "$$dc_destdir" \
-	  && $(MAKE) $(AM_MAKEFLAGS) dist \
-	  && rm -rf $(DIST_ARCHIVES) \
-	  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck
-	$(am__remove_distdir)
-	@(echo "$(distdir) archives ready for distribution: "; \
-	  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
-	  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'
-distuninstallcheck:
-	@cd $(distuninstallcheck_dir) \
-	&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
-	   || { echo "ERROR: files left after uninstall:" ; \
-	        if test -n "$(DESTDIR)"; then \
-	          echo "  (check DESTDIR support)"; \
-	        fi ; \
-	        $(distuninstallcheck_listfiles) ; \
-	        exit 1; } >&2
-distcleancheck: distclean
-	@if test '$(srcdir)' = . ; then \
-	  echo "ERROR: distcleancheck can only run from a VPATH build" ; \
-	  exit 1 ; \
-	fi
-	@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
-	  || { echo "ERROR: files left in build directory after distclean:" ; \
-	       $(distcleancheck_listfiles) ; \
-	       exit 1; } >&2
-check-am: all-am
-check: check-am
-all-am: Makefile $(PROGRAMS) config.h
-installdirs:
-	for dir in "$(DESTDIR)$(bindir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
-install: install-am
-install-exec: install-exec-am
-install-data: install-data-am
-uninstall: uninstall-am
-
-install-am: all-am
-	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
-
-installcheck: installcheck-am
-install-strip:
-	$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
-	  install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
-	  `test -z '$(STRIP)' || \
-	    echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
-mostlyclean-generic:
-
-clean-generic:
-
-distclean-generic:
-	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-	-rm -f src/$(DEPDIR)/$(am__dirstamp)
-	-rm -f src/$(am__dirstamp)
-
-maintainer-clean-generic:
-	@echo "This command is intended for maintainers to use"
-	@echo "it deletes files that may require special tools to rebuild."
-clean: clean-am
-
-clean-am: clean-binPROGRAMS clean-generic mostlyclean-am
-
-distclean: distclean-am
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf src/$(DEPDIR)
-	-rm -f Makefile
-distclean-am: clean-am distclean-compile distclean-generic \
-	distclean-hdr distclean-tags
-
-dvi: dvi-am
-
-dvi-am:
-
-html: html-am
-
-info: info-am
-
-info-am:
-
-install-data-am:
-
-install-dvi: install-dvi-am
-
-install-exec-am: install-binPROGRAMS
-
-install-html: install-html-am
-
-install-info: install-info-am
-
-install-man:
-
-install-pdf: install-pdf-am
-
-install-ps: install-ps-am
-
-installcheck-am:
-
-maintainer-clean: maintainer-clean-am
-	-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-	-rm -rf $(top_srcdir)/autom4te.cache
-	-rm -rf src/$(DEPDIR)
-	-rm -f Makefile
-maintainer-clean-am: distclean-am maintainer-clean-generic
-
-mostlyclean: mostlyclean-am
-
-mostlyclean-am: mostlyclean-compile mostlyclean-generic
-
-pdf: pdf-am
-
-pdf-am:
-
-ps: ps-am
-
-ps-am:
-
-uninstall-am: uninstall-binPROGRAMS
-
-.MAKE: install-am install-strip
-
-.PHONY: CTAGS GTAGS all all-am am--refresh check check-am clean \
-	clean-binPROGRAMS clean-generic ctags dist dist-all dist-bzip2 \
-	dist-gzip dist-shar dist-tarZ dist-zip distcheck distclean \
-	distclean-compile distclean-generic distclean-hdr \
-	distclean-tags distcleancheck distdir distuninstallcheck dvi \
-	dvi-am html html-am info info-am install install-am \
-	install-binPROGRAMS install-data install-data-am install-dvi \
-	install-dvi-am install-exec install-exec-am install-html \
-	install-html-am install-info install-info-am install-man \
-	install-pdf install-pdf-am install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \
-	tags uninstall uninstall-am uninstall-binPROGRAMS
-
-# Tell versions [3.59,3.63) of GNU make to not export all variables.
-# Otherwise a system limit (for SysV at least) may be exceeded.
-.NOEXPORT:
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/NEWS b/rms/org.eclipse.ptp.rm.pbs.proxy/NEWS
deleted file mode 100644
index e69de29..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/NEWS
+++ /dev/null
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/README b/rms/org.eclipse.ptp.rm.pbs.proxy/README
deleted file mode 100644
index e69de29..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/README
+++ /dev/null
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/about.html b/rms/org.eclipse.ptp.rm.pbs.proxy/about.html
deleted file mode 100644
index 3f81093..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/about.html
+++ /dev/null
@@ -1,22 +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">
-<h2>About This Content</h2>
- 
-<p>May 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; 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 (&quot;Redistributor&quot;) 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.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/aclocal.m4 b/rms/org.eclipse.ptp.rm.pbs.proxy/aclocal.m4
deleted file mode 100644
index d898164..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/aclocal.m4
+++ /dev/null
@@ -1,908 +0,0 @@
-# generated automatically by aclocal 1.10 -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006  Free Software Foundation, Inc.
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
-# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
-# PARTICULAR PURPOSE.
-
-m4_if(m4_PACKAGE_VERSION, [2.61],,
-[m4_fatal([this file was generated for autoconf 2.61.
-You have another version of autoconf.  If you want to use that,
-you should regenerate the build system entirely.], [63])])
-
-# Copyright (C) 2002, 2003, 2005, 2006  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_AUTOMAKE_VERSION(VERSION)
-# ----------------------------
-# Automake X.Y traces this macro to ensure aclocal.m4 has been
-# generated from the m4 files accompanying Automake X.Y.
-# (This private macro should not be called outside this file.)
-AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.10'
-dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
-dnl require some minimum version.  Point them to the right macro.
-m4_if([$1], [1.10], [],
-      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
-])
-
-# _AM_AUTOCONF_VERSION(VERSION)
-# -----------------------------
-# aclocal traces this macro to find the Autoconf version.
-# This is a private macro too.  Using m4_define simplifies
-# the logic in aclocal, which can simply ignore this definition.
-m4_define([_AM_AUTOCONF_VERSION], [])
-
-# AM_SET_CURRENT_AUTOMAKE_VERSION
-# -------------------------------
-# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
-# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
-AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.10])dnl
-_AM_AUTOCONF_VERSION(m4_PACKAGE_VERSION)])
-
-# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
-# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to
-# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
-#
-# Of course, Automake must honor this variable whenever it calls a
-# tool from the auxiliary directory.  The problem is that $srcdir (and
-# therefore $ac_aux_dir as well) can be either absolute or relative,
-# depending on how configure is run.  This is pretty annoying, since
-# it makes $ac_aux_dir quite unusable in subdirectories: in the top
-# source directory, any form will work fine, but in subdirectories a
-# relative path needs to be adjusted first.
-#
-# $ac_aux_dir/missing
-#    fails when called from a subdirectory if $ac_aux_dir is relative
-# $top_srcdir/$ac_aux_dir/missing
-#    fails if $ac_aux_dir is absolute,
-#    fails when called from a subdirectory in a VPATH build with
-#          a relative $ac_aux_dir
-#
-# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
-# are both prefixed by $srcdir.  In an in-source build this is usually
-# harmless because $srcdir is `.', but things will broke when you
-# start a VPATH build or use an absolute $srcdir.
-#
-# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
-# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:
-#   am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
-# and then we would define $MISSING as
-#   MISSING="\${SHELL} $am_aux_dir/missing"
-# This will work as long as MISSING is not called from configure, because
-# unfortunately $(top_srcdir) has no meaning in configure.
-# However there are other variables, like CC, which are often used in
-# configure, and could therefore not use this "fixed" $ac_aux_dir.
-#
-# Another solution, used here, is to always expand $ac_aux_dir to an
-# absolute PATH.  The drawback is that using absolute paths prevent a
-# configured tree to be moved without reconfiguration.
-
-AC_DEFUN([AM_AUX_DIR_EXPAND],
-[dnl Rely on autoconf to set up CDPATH properly.
-AC_PREREQ([2.50])dnl
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-])
-
-# AM_CONDITIONAL                                            -*- Autoconf -*-
-
-# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 8
-
-# AM_CONDITIONAL(NAME, SHELL-CONDITION)
-# -------------------------------------
-# Define a conditional.
-AC_DEFUN([AM_CONDITIONAL],
-[AC_PREREQ(2.52)dnl
- ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],
-	[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
-AC_SUBST([$1_TRUE])dnl
-AC_SUBST([$1_FALSE])dnl
-_AM_SUBST_NOTMAKE([$1_TRUE])dnl
-_AM_SUBST_NOTMAKE([$1_FALSE])dnl
-if $2; then
-  $1_TRUE=
-  $1_FALSE='#'
-else
-  $1_TRUE='#'
-  $1_FALSE=
-fi
-AC_CONFIG_COMMANDS_PRE(
-[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
-  AC_MSG_ERROR([[conditional "$1" was never defined.
-Usually this means the macro was only invoked conditionally.]])
-fi])])
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 9
-
-# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
-# written in clear, in which case automake, when reading aclocal.m4,
-# will think it sees a *use*, and therefore will trigger all it's
-# C support machinery.  Also note that it means that autoscan, seeing
-# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
-
-
-# _AM_DEPENDENCIES(NAME)
-# ----------------------
-# See how the compiler implements dependency checking.
-# NAME is "CC", "CXX", "GCJ", or "OBJC".
-# We try a few techniques and use that to set a single cache variable.
-#
-# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
-# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
-# dependency, and given that the user is not expected to run this macro,
-# just rely on AC_PROG_CC.
-AC_DEFUN([_AM_DEPENDENCIES],
-[AC_REQUIRE([AM_SET_DEPDIR])dnl
-AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
-AC_REQUIRE([AM_MAKE_INCLUDE])dnl
-AC_REQUIRE([AM_DEP_TRACK])dnl
-
-ifelse([$1], CC,   [depcc="$CC"   am_compiler_list=],
-       [$1], CXX,  [depcc="$CXX"  am_compiler_list=],
-       [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
-       [$1], UPC,  [depcc="$UPC"  am_compiler_list=],
-       [$1], GCJ,  [depcc="$GCJ"  am_compiler_list='gcc3 gcc'],
-                   [depcc="$$1"   am_compiler_list=])
-
-AC_CACHE_CHECK([dependency style of $depcc],
-               [am_cv_$1_dependencies_compiler_type],
-[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_$1_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
-  fi
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    case $depmode in
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    none) break ;;
-    esac
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.
-    if depmode=$depmode \
-       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_$1_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_$1_dependencies_compiler_type=none
-fi
-])
-AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
-AM_CONDITIONAL([am__fastdep$1], [
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
-])
-
-
-# AM_SET_DEPDIR
-# -------------
-# Choose a directory name for dependency files.
-# This macro is AC_REQUIREd in _AM_DEPENDENCIES
-AC_DEFUN([AM_SET_DEPDIR],
-[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
-])
-
-
-# AM_DEP_TRACK
-# ------------
-AC_DEFUN([AM_DEP_TRACK],
-[AC_ARG_ENABLE(dependency-tracking,
-[  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors])
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-fi
-AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
-AC_SUBST([AMDEPBACKSLASH])dnl
-_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl
-])
-
-# Generate code to set up dependency tracking.              -*- Autoconf -*-
-
-# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-#serial 3
-
-# _AM_OUTPUT_DEPENDENCY_COMMANDS
-# ------------------------------
-AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
-[for mf in $CONFIG_FILES; do
-  # Strip MF so we end up with the name of the file.
-  mf=`echo "$mf" | sed -e 's/:.*$//'`
-  # Check whether this is an Automake generated Makefile or not.
-  # We used to match only the files named `Makefile.in', but
-  # some people rename them; so instead we look at the file content.
-  # Grep'ing the first line is not enough: some people post-process
-  # each Makefile.in and add a new line on top of each file to say so.
-  # Grep'ing the whole file is not good either: AIX grep has a line
-  # limit of 2048, but all sed's we know have understand at least 4000.
-  if sed 10q "$mf" | grep '^#.*generated by automake' > /dev/null 2>&1; then
-    dirpart=`AS_DIRNAME("$mf")`
-  else
-    continue
-  fi
-  # Extract the definition of DEPDIR, am__include, and am__quote
-  # from the Makefile without running `make'.
-  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-  test -z "$DEPDIR" && continue
-  am__include=`sed -n 's/^am__include = //p' < "$mf"`
-  test -z "am__include" && continue
-  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-  # When using ansi2knr, U may be empty or an underscore; expand it
-  U=`sed -n 's/^U = //p' < "$mf"`
-  # Find all dependency output files, they are included files with
-  # $(DEPDIR) in their names.  We invoke sed twice because it is the
-  # simplest approach to changing $(DEPDIR) to its actual value in the
-  # expansion.
-  for file in `sed -n "
-    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-    # Make sure the directory exists.
-    test -f "$dirpart/$file" && continue
-    fdir=`AS_DIRNAME(["$file"])`
-    AS_MKDIR_P([$dirpart/$fdir])
-    # echo "creating $dirpart/$file"
-    echo '# dummy' > "$dirpart/$file"
-  done
-done
-])# _AM_OUTPUT_DEPENDENCY_COMMANDS
-
-
-# AM_OUTPUT_DEPENDENCY_COMMANDS
-# -----------------------------
-# This macro should only be invoked once -- use via AC_REQUIRE.
-#
-# This code is only required when automatic dependency tracking
-# is enabled.  FIXME.  This creates each `.P' file that we will
-# need in order to bootstrap the dependency handling code.
-AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
-[AC_CONFIG_COMMANDS([depfiles],
-     [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
-     [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
-])
-
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 8
-
-# AM_CONFIG_HEADER is obsolete.  It has been replaced by AC_CONFIG_HEADERS.
-AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
-
-# Do all the work for Automake.                             -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
-# 2005, 2006 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 12
-
-# This macro actually does too much.  Some checks are only needed if
-# your package does certain things.  But this isn't really a big deal.
-
-# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
-# AM_INIT_AUTOMAKE([OPTIONS])
-# -----------------------------------------------
-# The call with PACKAGE and VERSION arguments is the old style
-# call (pre autoconf-2.50), which is being phased out.  PACKAGE
-# and VERSION should now be passed to AC_INIT and removed from
-# the call to AM_INIT_AUTOMAKE.
-# We support both call styles for the transition.  After
-# the next Automake release, Autoconf can make the AC_INIT
-# arguments mandatory, and then we can depend on a new Autoconf
-# release and drop the old call support.
-AC_DEFUN([AM_INIT_AUTOMAKE],
-[AC_PREREQ([2.60])dnl
-dnl Autoconf wants to disallow AM_ names.  We explicitly allow
-dnl the ones we care about.
-m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
-AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
-AC_REQUIRE([AC_PROG_INSTALL])dnl
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
-  fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-AC_SUBST([CYGPATH_W])
-
-# Define the identity of the package.
-dnl Distinguish between old-style and new-style calls.
-m4_ifval([$2],
-[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
- AC_SUBST([PACKAGE], [$1])dnl
- AC_SUBST([VERSION], [$2])],
-[_AM_SET_OPTIONS([$1])dnl
-dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.
-m4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,
-  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl
- AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
- AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
-
-_AM_IF_OPTION([no-define],,
-[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
- AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
-
-# Some tools Automake needs.
-AC_REQUIRE([AM_SANITY_CHECK])dnl
-AC_REQUIRE([AC_ARG_PROGRAM])dnl
-AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
-AM_MISSING_PROG(AUTOCONF, autoconf)
-AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
-AM_MISSING_PROG(AUTOHEADER, autoheader)
-AM_MISSING_PROG(MAKEINFO, makeinfo)
-AM_PROG_INSTALL_SH
-AM_PROG_INSTALL_STRIP
-AC_REQUIRE([AM_PROG_MKDIR_P])dnl
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-AC_REQUIRE([AC_PROG_AWK])dnl
-AC_REQUIRE([AC_PROG_MAKE_SET])dnl
-AC_REQUIRE([AM_SET_LEADING_DOT])dnl
-_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
-              [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
-	      		     [_AM_PROG_TAR([v7])])])
-_AM_IF_OPTION([no-dependencies],,
-[AC_PROVIDE_IFELSE([AC_PROG_CC],
-                  [_AM_DEPENDENCIES(CC)],
-                  [define([AC_PROG_CC],
-                          defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_CXX],
-                  [_AM_DEPENDENCIES(CXX)],
-                  [define([AC_PROG_CXX],
-                          defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
-AC_PROVIDE_IFELSE([AC_PROG_OBJC],
-                  [_AM_DEPENDENCIES(OBJC)],
-                  [define([AC_PROG_OBJC],
-                          defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl
-])
-])
-
-
-# When config.status generates a header, we must update the stamp-h file.
-# This file resides in the same directory as the config header
-# that is generated.  The stamp files are numbered to have different names.
-
-# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
-# loop where config.status creates the headers, so we can generate
-# our stamp files there.
-AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
-[# Compute $1's index in $config_headers.
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $1 | $1:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_INSTALL_SH
-# ------------------
-# Define $install_sh.
-AC_DEFUN([AM_PROG_INSTALL_SH],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
-AC_SUBST(install_sh)])
-
-# Copyright (C) 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# Check whether the underlying file-system supports filenames
-# with a leading dot.  For instance MS-DOS doesn't.
-AC_DEFUN([AM_SET_LEADING_DOT],
-[rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
-  am__leading_dot=.
-else
-  am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-AC_SUBST([am__leading_dot])])
-
-# Check to see how 'make' treats includes.	            -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 3
-
-# AM_MAKE_INCLUDE()
-# -----------------
-# Check to see how make treats includes.
-AC_DEFUN([AM_MAKE_INCLUDE],
-[am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-	@echo done
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-AC_MSG_CHECKING([for style of include used by $am_make])
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# We grep out `Entering directory' and `Leaving directory'
-# messages which can occur if `w' ends up in MAKEFLAGS.
-# In particular we don't look at `^make:' because GNU make might
-# be invoked under some other name (usually "gmake"), in which
-# case it prints its new name instead of `make'.
-if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
-   am__include=include
-   am__quote=
-   _am_result=GNU
-fi
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
-      am__include=.include
-      am__quote="\""
-      _am_result=BSD
-   fi
-fi
-AC_SUBST([am__include])
-AC_SUBST([am__quote])
-AC_MSG_RESULT([$_am_result])
-rm -f confinc confmf
-])
-
-# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# AM_PROG_CC_C_O
-# --------------
-# Like AC_PROG_CC_C_O, but changed for automake.
-AC_DEFUN([AM_PROG_CC_C_O],
-[AC_REQUIRE([AC_PROG_CC_C_O])dnl
-AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-AC_REQUIRE_AUX_FILE([compile])dnl
-# FIXME: we rely on the cache variable name because
-# there is no other way.
-set dummy $CC
-ac_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']`
-if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" != yes"; then
-   # Losing compiler, so override with the script.
-   # FIXME: It is wrong to rewrite CC.
-   # But if we don't then we get into trouble of one sort or another.
-   # A longer-term fix would be to have automake use am__CC in this case,
-   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
-   CC="$am_aux_dir/compile $CC"
-fi
-dnl Make sure AC_PROG_CC is never called again, or it will override our
-dnl setting of CC.
-m4_define([AC_PROG_CC],
-          [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])])
-])
-
-# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-
-
-# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 5
-
-# AM_MISSING_PROG(NAME, PROGRAM)
-# ------------------------------
-AC_DEFUN([AM_MISSING_PROG],
-[AC_REQUIRE([AM_MISSING_HAS_RUN])
-$1=${$1-"${am_missing_run}$2"}
-AC_SUBST($1)])
-
-
-# AM_MISSING_HAS_RUN
-# ------------------
-# Define MISSING if not defined so far and test if it supports --run.
-# If it does, set am_missing_run to use it, otherwise, to nothing.
-AC_DEFUN([AM_MISSING_HAS_RUN],
-[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-AC_REQUIRE_AUX_FILE([missing])dnl
-test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  AC_MSG_WARN([`missing' script is too old or missing])
-fi
-])
-
-# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_MKDIR_P
-# ---------------
-# Check for `mkdir -p'.
-AC_DEFUN([AM_PROG_MKDIR_P],
-[AC_PREREQ([2.60])dnl
-AC_REQUIRE([AC_PROG_MKDIR_P])dnl
-dnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,
-dnl while keeping a definition of mkdir_p for backward compatibility.
-dnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.
-dnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of
-dnl Makefile.ins that do not define MKDIR_P, so we do our own
-dnl adjustment using top_builddir (which is defined more often than
-dnl MKDIR_P).
-AC_SUBST([mkdir_p], ["$MKDIR_P"])dnl
-case $mkdir_p in
-  [[\\/$]]* | ?:[[\\/]]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-])
-
-# Helper functions for option handling.                     -*- Autoconf -*-
-
-# Copyright (C) 2001, 2002, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 3
-
-# _AM_MANGLE_OPTION(NAME)
-# -----------------------
-AC_DEFUN([_AM_MANGLE_OPTION],
-[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
-
-# _AM_SET_OPTION(NAME)
-# ------------------------------
-# Set option NAME.  Presently that only means defining a flag for this option.
-AC_DEFUN([_AM_SET_OPTION],
-[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
-
-# _AM_SET_OPTIONS(OPTIONS)
-# ----------------------------------
-# OPTIONS is a space-separated list of Automake options.
-AC_DEFUN([_AM_SET_OPTIONS],
-[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
-
-# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
-# -------------------------------------------
-# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
-AC_DEFUN([_AM_IF_OPTION],
-[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
-
-# Check to make sure that the build environment is sane.    -*- Autoconf -*-
-
-# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
-# Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 4
-
-# AM_SANITY_CHECK
-# ---------------
-AC_DEFUN([AM_SANITY_CHECK],
-[AC_MSG_CHECKING([whether build environment is sane])
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
-   if test "$[*]" = "X"; then
-      # -L didn't work.
-      set X `ls -t $srcdir/configure conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$[*]" != "X $srcdir/configure conftest.file" \
-      && test "$[*]" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken
-alias in your environment])
-   fi
-
-   test "$[2]" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   AC_MSG_ERROR([newly created file is older than distributed files!
-Check your system clock])
-fi
-AC_MSG_RESULT(yes)])
-
-# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_INSTALL_STRIP
-# ---------------------
-# One issue with vendor `install' (even GNU) is that you can't
-# specify the program used to strip binaries.  This is especially
-# annoying in cross-compiling environments, where the build's strip
-# is unlikely to handle the host's binaries.
-# Fortunately install-sh will honor a STRIPPROG variable, so we
-# always use install-sh in `make install-strip', and initialize
-# STRIPPROG with the value of the STRIP variable (set by the user).
-AC_DEFUN([AM_PROG_INSTALL_STRIP],
-[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
-if test "$cross_compiling" != no; then
-  AC_CHECK_TOOL([STRIP], [strip], :)
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-AC_SUBST([INSTALL_STRIP_PROGRAM])])
-
-# Copyright (C) 2006  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# _AM_SUBST_NOTMAKE(VARIABLE)
-# ---------------------------
-# Prevent Automake from outputing VARIABLE = @VARIABLE@ in Makefile.in.
-# This macro is traced by Automake.
-AC_DEFUN([_AM_SUBST_NOTMAKE])
-
-# Check how to create a tarball.                            -*- Autoconf -*-
-
-# Copyright (C) 2004, 2005  Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# serial 2
-
-# _AM_PROG_TAR(FORMAT)
-# --------------------
-# Check how to create a tarball in format FORMAT.
-# FORMAT should be one of `v7', `ustar', or `pax'.
-#
-# Substitute a variable $(am__tar) that is a command
-# writing to stdout a FORMAT-tarball containing the directory
-# $tardir.
-#     tardir=directory && $(am__tar) > result.tar
-#
-# Substitute a variable $(am__untar) that extract such
-# a tarball read from stdin.
-#     $(am__untar) < result.tar
-AC_DEFUN([_AM_PROG_TAR],
-[# Always define AMTAR for backward compatibility.
-AM_MISSING_PROG([AMTAR], [tar])
-m4_if([$1], [v7],
-     [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
-     [m4_case([$1], [ustar],, [pax],,
-              [m4_fatal([Unknown tar format])])
-AC_MSG_CHECKING([how to create a $1 tar archive])
-# Loop over all known methods to create a tar archive until one works.
-_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
-_am_tools=${am_cv_prog_tar_$1-$_am_tools}
-# Do not fold the above two line into one, because Tru64 sh and
-# Solaris sh will not grok spaces in the rhs of `-'.
-for _am_tool in $_am_tools
-do
-  case $_am_tool in
-  gnutar)
-    for _am_tar in tar gnutar gtar;
-    do
-      AM_RUN_LOG([$_am_tar --version]) && break
-    done
-    am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
-    am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
-    am__untar="$_am_tar -xf -"
-    ;;
-  plaintar)
-    # Must skip GNU tar: if it does not support --format= it doesn't create
-    # ustar tarball either.
-    (tar --version) >/dev/null 2>&1 && continue
-    am__tar='tar chf - "$$tardir"'
-    am__tar_='tar chf - "$tardir"'
-    am__untar='tar xf -'
-    ;;
-  pax)
-    am__tar='pax -L -x $1 -w "$$tardir"'
-    am__tar_='pax -L -x $1 -w "$tardir"'
-    am__untar='pax -r'
-    ;;
-  cpio)
-    am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
-    am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
-    am__untar='cpio -i -H $1 -d'
-    ;;
-  none)
-    am__tar=false
-    am__tar_=false
-    am__untar=false
-    ;;
-  esac
-
-  # If the value was cached, stop now.  We just wanted to have am__tar
-  # and am__untar set.
-  test -n "${am_cv_prog_tar_$1}" && break
-
-  # tar/untar a dummy directory, and stop if the command works
-  rm -rf conftest.dir
-  mkdir conftest.dir
-  echo GrepMe > conftest.dir/file
-  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
-  rm -rf conftest.dir
-  if test -s conftest.tar; then
-    AM_RUN_LOG([$am__untar <conftest.tar])
-    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
-  fi
-done
-rm -rf conftest.dir
-
-AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
-AC_MSG_RESULT([$am_cv_prog_tar_$1])])
-AC_SUBST([am__tar])
-AC_SUBST([am__untar])
-]) # _AM_PROG_TAR
-
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/build.properties b/rms/org.eclipse.ptp.rm.pbs.proxy/build.properties
deleted file mode 100644
index d4b1fdf..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/build.properties
+++ /dev/null
@@ -1,24 +0,0 @@
-bin.includes = AUTHORS,\
-               COPYING,\
-               ChangeLog,\
-               INSTALL,\
-               Makefile.am,\
-               Makefile.in,\
-               NEWS,\
-               README,\
-               aclocal.m4,\
-               compile,\
-               config.guess,\
-               config.h.in,\
-               config.status,\
-               config.sub,\
-               configure,\
-               configure.in,\
-               depcomp,\
-               install-sh,\
-               missing,\
-               src/,\
-               META-INF/,\
-               plugin.properties,\
-               about.html,\
-               include/
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/compile b/rms/org.eclipse.ptp.rm.pbs.proxy/compile
deleted file mode 100755
index 1b1d232..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/compile
+++ /dev/null
@@ -1,142 +0,0 @@
-#! /bin/sh
-# Wrapper for compilers which do not understand `-c -o'.
-
-scriptversion=2005-05-14.22
-
-# Copyright (C) 1999, 2000, 2003, 2004, 2005 Free Software Foundation, Inc.
-# Written by Tom Tromey <tromey@cygnus.com>.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# This file is maintained in Automake, please report
-# bugs to <bug-automake@gnu.org> or send patches to
-# <automake-patches@gnu.org>.
-
-case $1 in
-  '')
-     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
-     exit 1;
-     ;;
-  -h | --h*)
-    cat <<\EOF
-Usage: compile [--help] [--version] PROGRAM [ARGS]
-
-Wrapper for compilers which do not understand `-c -o'.
-Remove `-o dest.o' from ARGS, run PROGRAM with the remaining
-arguments, and rename the output as expected.
-
-If you are trying to build a whole package this is not the
-right script to run: please start by reading the file `INSTALL'.
-
-Report bugs to <bug-automake@gnu.org>.
-EOF
-    exit $?
-    ;;
-  -v | --v*)
-    echo "compile $scriptversion"
-    exit $?
-    ;;
-esac
-
-ofile=
-cfile=
-eat=
-
-for arg
-do
-  if test -n "$eat"; then
-    eat=
-  else
-    case $1 in
-      -o)
-	# configure might choose to run compile as `compile cc -o foo foo.c'.
-	# So we strip `-o arg' only if arg is an object.
-	eat=1
-	case $2 in
-	  *.o | *.obj)
-	    ofile=$2
-	    ;;
-	  *)
-	    set x "$@" -o "$2"
-	    shift
-	    ;;
-	esac
-	;;
-      *.c)
-	cfile=$1
-	set x "$@" "$1"
-	shift
-	;;
-      *)
-	set x "$@" "$1"
-	shift
-	;;
-    esac
-  fi
-  shift
-done
-
-if test -z "$ofile" || test -z "$cfile"; then
-  # If no `-o' option was seen then we might have been invoked from a
-  # pattern rule where we don't need one.  That is ok -- this is a
-  # normal compilation that the losing compiler can handle.  If no
-  # `.c' file was seen then we are probably linking.  That is also
-  # ok.
-  exec "$@"
-fi
-
-# Name of file we expect compiler to create.
-cofile=`echo "$cfile" | sed -e 's|^.*/||' -e 's/\.c$/.o/'`
-
-# Create the lock directory.
-# Note: use `[/.-]' here to ensure that we don't use the same name
-# that we are using for the .o file.  Also, base the name on the expected
-# object file name, since that is what matters with a parallel build.
-lockdir=`echo "$cofile" | sed -e 's|[/.-]|_|g'`.d
-while true; do
-  if mkdir "$lockdir" >/dev/null 2>&1; then
-    break
-  fi
-  sleep 1
-done
-# FIXME: race condition here if user kills between mkdir and trap.
-trap "rmdir '$lockdir'; exit 1" 1 2 15
-
-# Run the compile.
-"$@"
-ret=$?
-
-if test -f "$cofile"; then
-  mv "$cofile" "$ofile"
-elif test -f "${cofile}bj"; then
-  mv "${cofile}bj" "$ofile"
-fi
-
-rmdir "$lockdir"
-exit $ret
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
-# End:
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/config.guess b/rms/org.eclipse.ptp.rm.pbs.proxy/config.guess
deleted file mode 100755
index 396482d..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/config.guess
+++ /dev/null
@@ -1,1500 +0,0 @@
-#! /bin/sh
-# Attempt to guess a canonical system name.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
-#   Inc.
-
-timestamp='2006-07-02'
-
-# This file is free software; you can redistribute it and/or modify it
-# under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful, but
-# WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-# General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Originally written by Per Bothner <per@bothner.com>.
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted ChangeLog entry.
-#
-# This script attempts to guess a canonical system name similar to
-# config.sub.  If it succeeds, it prints the system name on stdout, and
-# exits with 0.  Otherwise, it exits with 1.
-#
-# The plan is that this can be called by configure scripts if you
-# don't specify an explicit build system type.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION]
-
-Output the configuration name of the system \`$me' is run on.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.guess ($timestamp)
-
-Originally written by Per Bothner.
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help" >&2
-       exit 1 ;;
-    * )
-       break ;;
-  esac
-done
-
-if test $# != 0; then
-  echo "$me: too many arguments$help" >&2
-  exit 1
-fi
-
-trap 'exit 1' 1 2 15
-
-# CC_FOR_BUILD -- compiler used by this script. Note that the use of a
-# compiler to aid in system detection is discouraged as it requires
-# temporary files to be created and, as you can see below, it is a
-# headache to deal with in a portable fashion.
-
-# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still
-# use `HOST_CC' if defined, but it is deprecated.
-
-# Portable tmp directory creation inspired by the Autoconf team.
-
-set_cc_for_build='
-trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ;
-trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ;
-: ${TMPDIR=/tmp} ;
- { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } ||
- { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||
- { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } ||
- { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ;
-dummy=$tmp/dummy ;
-tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ;
-case $CC_FOR_BUILD,$HOST_CC,$CC in
- ,,)    echo "int x;" > $dummy.c ;
-	for c in cc gcc c89 c99 ; do
-	  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then
-	     CC_FOR_BUILD="$c"; break ;
-	  fi ;
-	done ;
-	if test x"$CC_FOR_BUILD" = x ; then
-	  CC_FOR_BUILD=no_compiler_found ;
-	fi
-	;;
- ,,*)   CC_FOR_BUILD=$CC ;;
- ,*,*)  CC_FOR_BUILD=$HOST_CC ;;
-esac ; set_cc_for_build= ;'
-
-# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
-# (ghazi@noc.rutgers.edu 1994-08-24)
-if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
-	PATH=$PATH:/.attbin ; export PATH
-fi
-
-UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
-UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
-UNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown
-UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
-
-# Note: order is significant - the case branches are not exclusive.
-
-case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
-    *:NetBSD:*:*)
-	# NetBSD (nbsd) targets should (where applicable) match one or
-	# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
-	# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently
-	# switched to ELF, *-*-netbsd* would select the old
-	# object file format.  This provides both forward
-	# compatibility and a consistent mechanism for selecting the
-	# object file format.
-	#
-	# Note: NetBSD doesn't particularly care about the vendor
-	# portion of the name.  We always set it to "unknown".
-	sysctl="sysctl -n hw.machine_arch"
-	UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
-	    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
-	case "${UNAME_MACHINE_ARCH}" in
-	    armeb) machine=armeb-unknown ;;
-	    arm*) machine=arm-unknown ;;
-	    sh3el) machine=shl-unknown ;;
-	    sh3eb) machine=sh-unknown ;;
-	    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;
-	esac
-	# The Operating System including object format, if it has switched
-	# to ELF recently, or will in the future.
-	case "${UNAME_MACHINE_ARCH}" in
-	    arm*|i386|m68k|ns32k|sh3*|sparc|vax)
-		eval $set_cc_for_build
-		if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
-			| grep __ELF__ >/dev/null
-		then
-		    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
-		    # Return netbsd for either.  FIX?
-		    os=netbsd
-		else
-		    os=netbsdelf
-		fi
-		;;
-	    *)
-	        os=netbsd
-		;;
-	esac
-	# The OS release
-	# Debian GNU/NetBSD machines have a different userland, and
-	# thus, need a distinct triplet. However, they do not need
-	# kernel version information, so it can be replaced with a
-	# suitable tag, in the style of linux-gnu.
-	case "${UNAME_VERSION}" in
-	    Debian*)
-		release='-gnu'
-		;;
-	    *)
-		release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
-		;;
-	esac
-	# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
-	# contains redundant information, the shorter form:
-	# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
-	echo "${machine}-${os}${release}"
-	exit ;;
-    *:OpenBSD:*:*)
-	UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
-	echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
-	exit ;;
-    *:ekkoBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}
-	exit ;;
-    *:SolidBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}
-	exit ;;
-    macppc:MirBSD:*:*)
-	echo powerpc-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    *:MirBSD:*:*)
-	echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
-	exit ;;
-    alpha:OSF1:*:*)
-	case $UNAME_RELEASE in
-	*4.0)
-		UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
-		;;
-	*5.*)
-	        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
-		;;
-	esac
-	# According to Compaq, /usr/sbin/psrinfo has been available on
-	# OSF/1 and Tru64 systems produced since 1995.  I hope that
-	# covers most systems running today.  This code pipes the CPU
-	# types through head -n 1, so we only detect the type of CPU 0.
-	ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \(.*\) processor.*$/\1/p' | head -n 1`
-	case "$ALPHA_CPU_TYPE" in
-	    "EV4 (21064)")
-		UNAME_MACHINE="alpha" ;;
-	    "EV4.5 (21064)")
-		UNAME_MACHINE="alpha" ;;
-	    "LCA4 (21066/21068)")
-		UNAME_MACHINE="alpha" ;;
-	    "EV5 (21164)")
-		UNAME_MACHINE="alphaev5" ;;
-	    "EV5.6 (21164A)")
-		UNAME_MACHINE="alphaev56" ;;
-	    "EV5.6 (21164PC)")
-		UNAME_MACHINE="alphapca56" ;;
-	    "EV5.7 (21164PC)")
-		UNAME_MACHINE="alphapca57" ;;
-	    "EV6 (21264)")
-		UNAME_MACHINE="alphaev6" ;;
-	    "EV6.7 (21264A)")
-		UNAME_MACHINE="alphaev67" ;;
-	    "EV6.8CB (21264C)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8AL (21264B)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.8CX (21264D)")
-		UNAME_MACHINE="alphaev68" ;;
-	    "EV6.9A (21264/EV69A)")
-		UNAME_MACHINE="alphaev69" ;;
-	    "EV7 (21364)")
-		UNAME_MACHINE="alphaev7" ;;
-	    "EV7.9 (21364A)")
-		UNAME_MACHINE="alphaev79" ;;
-	esac
-	# A Pn.n version is a patched version.
-	# A Vn.n version is a released version.
-	# A Tn.n version is a released field test version.
-	# A Xn.n version is an unreleased experimental baselevel.
-	# 1.2 uses "1.2" for uname -r.
-	echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-	exit ;;
-    Alpha\ *:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# Should we change UNAME_MACHINE based on the output of uname instead
-	# of the specific Alpha model?
-	echo alpha-pc-interix
-	exit ;;
-    21064:Windows_NT:50:3)
-	echo alpha-dec-winnt3.5
-	exit ;;
-    Amiga*:UNIX_System_V:4.0:*)
-	echo m68k-unknown-sysv4
-	exit ;;
-    *:[Aa]miga[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-amigaos
-	exit ;;
-    *:[Mm]orph[Oo][Ss]:*:*)
-	echo ${UNAME_MACHINE}-unknown-morphos
-	exit ;;
-    *:OS/390:*:*)
-	echo i370-ibm-openedition
-	exit ;;
-    *:z/VM:*:*)
-	echo s390-ibm-zvmoe
-	exit ;;
-    *:OS400:*:*)
-        echo powerpc-ibm-os400
-	exit ;;
-    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
-	echo arm-acorn-riscix${UNAME_RELEASE}
-	exit ;;
-    arm:riscos:*:*|arm:RISCOS:*:*)
-	echo arm-unknown-riscos
-	exit ;;
-    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)
-	echo hppa1.1-hitachi-hiuxmpp
-	exit ;;
-    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)
-	# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
-	if test "`(/bin/universe) 2>/dev/null`" = att ; then
-		echo pyramid-pyramid-sysv3
-	else
-		echo pyramid-pyramid-bsd
-	fi
-	exit ;;
-    NILE*:*:*:dcosx)
-	echo pyramid-pyramid-svr4
-	exit ;;
-    DRS?6000:unix:4.0:6*)
-	echo sparc-icl-nx6
-	exit ;;
-    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)
-	case `/usr/bin/uname -p` in
-	    sparc) echo sparc-icl-nx7; exit ;;
-	esac ;;
-    sun4H:SunOS:5.*:*)
-	echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
-	echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    i86pc:SunOS:5.*:*)
-	echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:6*:*)
-	# According to config.sub, this is the proper way to canonicalize
-	# SunOS6.  Hard to guess exactly what SunOS6 will be like, but
-	# it's likely to be more like Solaris than SunOS4.
-	echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    sun4*:SunOS:*:*)
-	case "`/usr/bin/arch -k`" in
-	    Series*|S4*)
-		UNAME_RELEASE=`uname -v`
-		;;
-	esac
-	# Japanese Language versions have a version number like `4.1.3-JL'.
-	echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
-	exit ;;
-    sun3*:SunOS:*:*)
-	echo m68k-sun-sunos${UNAME_RELEASE}
-	exit ;;
-    sun*:*:4.2BSD:*)
-	UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`
-	test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3
-	case "`/bin/arch`" in
-	    sun3)
-		echo m68k-sun-sunos${UNAME_RELEASE}
-		;;
-	    sun4)
-		echo sparc-sun-sunos${UNAME_RELEASE}
-		;;
-	esac
-	exit ;;
-    aushp:SunOS:*:*)
-	echo sparc-auspex-sunos${UNAME_RELEASE}
-	exit ;;
-    # The situation for MiNT is a little confusing.  The machine name
-    # can be virtually everything (everything which is not
-    # "atarist" or "atariste" at least should have a processor
-    # > m68000).  The system name ranges from "MiNT" over "FreeMiNT"
-    # to the lowercase version "mint" (or "freemint").  Finally
-    # the system name "TOS" denotes a system which is actually not
-    # MiNT.  But MiNT is downward compatible to TOS, so this should
-    # be no problem.
-    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
-	echo m68k-atari-mint${UNAME_RELEASE}
-        exit ;;
-    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
-        echo m68k-atari-mint${UNAME_RELEASE}
-	exit ;;
-    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
-        echo m68k-milan-mint${UNAME_RELEASE}
-        exit ;;
-    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
-        echo m68k-hades-mint${UNAME_RELEASE}
-        exit ;;
-    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
-        echo m68k-unknown-mint${UNAME_RELEASE}
-        exit ;;
-    m68k:machten:*:*)
-	echo m68k-apple-machten${UNAME_RELEASE}
-	exit ;;
-    powerpc:machten:*:*)
-	echo powerpc-apple-machten${UNAME_RELEASE}
-	exit ;;
-    RISC*:Mach:*:*)
-	echo mips-dec-mach_bsd4.3
-	exit ;;
-    RISC*:ULTRIX:*:*)
-	echo mips-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    VAX*:ULTRIX*:*:*)
-	echo vax-dec-ultrix${UNAME_RELEASE}
-	exit ;;
-    2020:CLIX:*:* | 2430:CLIX:*:*)
-	echo clipper-intergraph-clix${UNAME_RELEASE}
-	exit ;;
-    mips:*:*:UMIPS | mips:*:*:RISCos)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-#ifdef __cplusplus
-#include <stdio.h>  /* for printf() prototype */
-	int main (int argc, char *argv[]) {
-#else
-	int main (argc, argv) int argc; char *argv[]; {
-#endif
-	#if defined (host_mips) && defined (MIPSEB)
-	#if defined (SYSTYPE_SYSV)
-	  printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_SVR4)
-	  printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
-	#endif
-	#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
-	  printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
-	#endif
-	#endif
-	  exit (-1);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c &&
-	  dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` &&
-	  SYSTEM_NAME=`$dummy $dummyarg` &&
-	    { echo "$SYSTEM_NAME"; exit; }
-	echo mips-mips-riscos${UNAME_RELEASE}
-	exit ;;
-    Motorola:PowerMAX_OS:*:*)
-	echo powerpc-motorola-powermax
-	exit ;;
-    Motorola:*:4.3:PL8-*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)
-	echo powerpc-harris-powermax
-	exit ;;
-    Night_Hawk:Power_UNIX:*:*)
-	echo powerpc-harris-powerunix
-	exit ;;
-    m88k:CX/UX:7*:*)
-	echo m88k-harris-cxux7
-	exit ;;
-    m88k:*:4*:R4*)
-	echo m88k-motorola-sysv4
-	exit ;;
-    m88k:*:3*:R3*)
-	echo m88k-motorola-sysv3
-	exit ;;
-    AViiON:dgux:*:*)
-        # DG/UX returns AViiON for all architectures
-        UNAME_PROCESSOR=`/usr/bin/uname -p`
-	if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
-	then
-	    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
-	       [ ${TARGET_BINARY_INTERFACE}x = x ]
-	    then
-		echo m88k-dg-dgux${UNAME_RELEASE}
-	    else
-		echo m88k-dg-dguxbcs${UNAME_RELEASE}
-	    fi
-	else
-	    echo i586-dg-dgux${UNAME_RELEASE}
-	fi
- 	exit ;;
-    M88*:DolphinOS:*:*)	# DolphinOS (SVR3)
-	echo m88k-dolphin-sysv3
-	exit ;;
-    M88*:*:R3*:*)
-	# Delta 88k system running SVR3
-	echo m88k-motorola-sysv3
-	exit ;;
-    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
-	echo m88k-tektronix-sysv3
-	exit ;;
-    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
-	echo m68k-tektronix-bsd
-	exit ;;
-    *:IRIX*:*:*)
-	echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
-	exit ;;
-    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
-	echo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id
-	exit ;;               # Note that: echo "'`uname -s`'" gives 'AIX '
-    i*86:AIX:*:*)
-	echo i386-ibm-aix
-	exit ;;
-    ia64:AIX:*:*)
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${UNAME_MACHINE}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:2:3)
-	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
-		eval $set_cc_for_build
-		sed 's/^		//' << EOF >$dummy.c
-		#include <sys/systemcfg.h>
-
-		main()
-			{
-			if (!__power_pc())
-				exit(1);
-			puts("powerpc-ibm-aix3.2.5");
-			exit(0);
-			}
-EOF
-		if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`
-		then
-			echo "$SYSTEM_NAME"
-		else
-			echo rs6000-ibm-aix3.2.5
-		fi
-	elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
-		echo rs6000-ibm-aix3.2.4
-	else
-		echo rs6000-ibm-aix3.2
-	fi
-	exit ;;
-    *:AIX:*:[45])
-	IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
-	if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
-		IBM_ARCH=rs6000
-	else
-		IBM_ARCH=powerpc
-	fi
-	if [ -x /usr/bin/oslevel ] ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
-	fi
-	echo ${IBM_ARCH}-ibm-aix${IBM_REV}
-	exit ;;
-    *:AIX:*:*)
-	echo rs6000-ibm-aix
-	exit ;;
-    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
-	echo romp-ibm-bsd4.4
-	exit ;;
-    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and
-	echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
-	exit ;;                             # report: romp-ibm BSD 4.3
-    *:BOSX:*:*)
-	echo rs6000-bull-bosx
-	exit ;;
-    DPX/2?00:B.O.S.:*:*)
-	echo m68k-bull-sysv3
-	exit ;;
-    9000/[34]??:4.3bsd:1.*:*)
-	echo m68k-hp-bsd
-	exit ;;
-    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
-	echo m68k-hp-bsd4.4
-	exit ;;
-    9000/[34678]??:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	case "${UNAME_MACHINE}" in
-	    9000/31? )            HP_ARCH=m68000 ;;
-	    9000/[34]?? )         HP_ARCH=m68k ;;
-	    9000/[678][0-9][0-9])
-		if [ -x /usr/bin/getconf ]; then
-		    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
-                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
-                    case "${sc_cpu_version}" in
-                      523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
-                      528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
-                      532)                      # CPU_PA_RISC2_0
-                        case "${sc_kernel_bits}" in
-                          32) HP_ARCH="hppa2.0n" ;;
-                          64) HP_ARCH="hppa2.0w" ;;
-			  '') HP_ARCH="hppa2.0" ;;   # HP-UX 10.20
-                        esac ;;
-                    esac
-		fi
-		if [ "${HP_ARCH}" = "" ]; then
-		    eval $set_cc_for_build
-		    sed 's/^              //' << EOF >$dummy.c
-
-              #define _HPUX_SOURCE
-              #include <stdlib.h>
-              #include <unistd.h>
-
-              int main ()
-              {
-              #if defined(_SC_KERNEL_BITS)
-                  long bits = sysconf(_SC_KERNEL_BITS);
-              #endif
-                  long cpu  = sysconf (_SC_CPU_VERSION);
-
-                  switch (cpu)
-              	{
-              	case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
-              	case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
-              	case CPU_PA_RISC2_0:
-              #if defined(_SC_KERNEL_BITS)
-              	    switch (bits)
-              		{
-              		case 64: puts ("hppa2.0w"); break;
-              		case 32: puts ("hppa2.0n"); break;
-              		default: puts ("hppa2.0"); break;
-              		} break;
-              #else  /* !defined(_SC_KERNEL_BITS) */
-              	    puts ("hppa2.0"); break;
-              #endif
-              	default: puts ("hppa1.0"); break;
-              	}
-                  exit (0);
-              }
-EOF
-		    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
-		    test -z "$HP_ARCH" && HP_ARCH=hppa
-		fi ;;
-	esac
-	if [ ${HP_ARCH} = "hppa2.0w" ]
-	then
-	    eval $set_cc_for_build
-
-	    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating
-	    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler
-	    # generating 64-bit code.  GNU and HP use different nomenclature:
-	    #
-	    # $ CC_FOR_BUILD=cc ./config.guess
-	    # => hppa2.0w-hp-hpux11.23
-	    # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess
-	    # => hppa64-hp-hpux11.23
-
-	    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
-		grep __LP64__ >/dev/null
-	    then
-		HP_ARCH="hppa2.0w"
-	    else
-		HP_ARCH="hppa64"
-	    fi
-	fi
-	echo ${HP_ARCH}-hp-hpux${HPUX_REV}
-	exit ;;
-    ia64:HP-UX:*:*)
-	HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
-	echo ia64-hp-hpux${HPUX_REV}
-	exit ;;
-    3050*:HI-UX:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#include <unistd.h>
-	int
-	main ()
-	{
-	  long cpu = sysconf (_SC_CPU_VERSION);
-	  /* The order matters, because CPU_IS_HP_MC68K erroneously returns
-	     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
-	     results, however.  */
-	  if (CPU_IS_PA_RISC (cpu))
-	    {
-	      switch (cpu)
-		{
-		  case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
-		  case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
-		  default: puts ("hppa-hitachi-hiuxwe2"); break;
-		}
-	    }
-	  else if (CPU_IS_HP_MC68K (cpu))
-	    puts ("m68k-hitachi-hiuxwe2");
-	  else puts ("unknown-hitachi-hiuxwe2");
-	  exit (0);
-	}
-EOF
-	$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&
-		{ echo "$SYSTEM_NAME"; exit; }
-	echo unknown-hitachi-hiuxwe2
-	exit ;;
-    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
-	echo hppa1.1-hp-bsd
-	exit ;;
-    9000/8??:4.3bsd:*:*)
-	echo hppa1.0-hp-bsd
-	exit ;;
-    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)
-	echo hppa1.0-hp-mpeix
-	exit ;;
-    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
-	echo hppa1.1-hp-osf
-	exit ;;
-    hp8??:OSF1:*:*)
-	echo hppa1.0-hp-osf
-	exit ;;
-    i*86:OSF1:*:*)
-	if [ -x /usr/sbin/sysversion ] ; then
-	    echo ${UNAME_MACHINE}-unknown-osf1mk
-	else
-	    echo ${UNAME_MACHINE}-unknown-osf1
-	fi
-	exit ;;
-    parisc*:Lites*:*:*)
-	echo hppa1.1-hp-lites
-	exit ;;
-    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
-	echo c1-convex-bsd
-        exit ;;
-    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-        exit ;;
-    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
-	echo c34-convex-bsd
-        exit ;;
-    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
-	echo c38-convex-bsd
-        exit ;;
-    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
-	echo c4-convex-bsd
-        exit ;;
-    CRAY*Y-MP:*:*:*)
-	echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*[A-Z]90:*:*:*)
-	echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
-	| sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
-	      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \
-	      -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*TS:*:*:*)
-	echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*T3E:*:*:*)
-	echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    CRAY*SV1:*:*:*)
-	echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    *:UNICOS/mp:*:*)
-	echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
-	exit ;;
-    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
-	FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
-        echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-        exit ;;
-    5000:UNIX_System_V:4.*:*)
-        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
-        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
-        echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
-	exit ;;
-    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
-	echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
-	exit ;;
-    sparc*:BSD/OS:*:*)
-	echo sparc-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:BSD/OS:*:*)
-	echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
-	exit ;;
-    *:FreeBSD:*:*)
-	case ${UNAME_MACHINE} in
-	    pc98)
-		echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	    amd64)
-		echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	    *)
-		echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
-	esac
-	exit ;;
-    i*:CYGWIN*:*)
-	echo ${UNAME_MACHINE}-pc-cygwin
-	exit ;;
-    i*:MINGW*:*)
-	echo ${UNAME_MACHINE}-pc-mingw32
-	exit ;;
-    i*:windows32*:*)
-    	# uname -m includes "-pc" on this system.
-    	echo ${UNAME_MACHINE}-mingw32
-	exit ;;
-    i*:PW*:*)
-	echo ${UNAME_MACHINE}-pc-pw32
-	exit ;;
-    x86:Interix*:[3456]*)
-	echo i586-pc-interix${UNAME_RELEASE}
-	exit ;;
-    EM64T:Interix*:[3456]*)
-	echo x86_64-unknown-interix${UNAME_RELEASE}
-	exit ;;
-    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
-	echo i${UNAME_MACHINE}-pc-mks
-	exit ;;
-    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
-	# How do we know it's Interix rather than the generic POSIX subsystem?
-	# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
-	# UNAME_MACHINE based on the output of uname instead of i386?
-	echo i586-pc-interix
-	exit ;;
-    i*:UWIN*:*)
-	echo ${UNAME_MACHINE}-pc-uwin
-	exit ;;
-    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)
-	echo x86_64-unknown-cygwin
-	exit ;;
-    p*:CYGWIN*:*)
-	echo powerpcle-unknown-cygwin
-	exit ;;
-    prep*:SunOS:5.*:*)
-	echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
-	exit ;;
-    *:GNU:*:*)
-	# the GNU system
-	echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
-	exit ;;
-    *:GNU/*:*:*)
-	# other systems with GNU libc and userland
-	echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu
-	exit ;;
-    i*86:Minix:*:*)
-	echo ${UNAME_MACHINE}-pc-minix
-	exit ;;
-    arm*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    avr32*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    cris:Linux:*:*)
-	echo cris-axis-linux-gnu
-	exit ;;
-    crisv32:Linux:*:*)
-	echo crisv32-axis-linux-gnu
-	exit ;;
-    frv:Linux:*:*)
-    	echo frv-unknown-linux-gnu
-	exit ;;
-    ia64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m32r*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    m68*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    mips:Linux:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#undef CPU
-	#undef mips
-	#undef mipsel
-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	CPU=mipsel
-	#else
-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	CPU=mips
-	#else
-	CPU=
-	#endif
-	#endif
-EOF
-	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
-	    /^CPU/{
-		s: ::g
-		p
-	    }'`"
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
-	;;
-    mips64:Linux:*:*)
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#undef CPU
-	#undef mips64
-	#undef mips64el
-	#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
-	CPU=mips64el
-	#else
-	#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
-	CPU=mips64
-	#else
-	CPU=
-	#endif
-	#endif
-EOF
-	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
-	    /^CPU/{
-		s: ::g
-		p
-	    }'`"
-	test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
-	;;
-    or32:Linux:*:*)
-	echo or32-unknown-linux-gnu
-	exit ;;
-    ppc:Linux:*:*)
-	echo powerpc-unknown-linux-gnu
-	exit ;;
-    ppc64:Linux:*:*)
-	echo powerpc64-unknown-linux-gnu
-	exit ;;
-    alpha:Linux:*:*)
-	case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
-	  EV5)   UNAME_MACHINE=alphaev5 ;;
-	  EV56)  UNAME_MACHINE=alphaev56 ;;
-	  PCA56) UNAME_MACHINE=alphapca56 ;;
-	  PCA57) UNAME_MACHINE=alphapca56 ;;
-	  EV6)   UNAME_MACHINE=alphaev6 ;;
-	  EV67)  UNAME_MACHINE=alphaev67 ;;
-	  EV68*) UNAME_MACHINE=alphaev68 ;;
-        esac
-	objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
-	if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
-	echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
-	exit ;;
-    parisc:Linux:*:* | hppa:Linux:*:*)
-	# Look for CPU level
-	case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
-	  PA7*) echo hppa1.1-unknown-linux-gnu ;;
-	  PA8*) echo hppa2.0-unknown-linux-gnu ;;
-	  *)    echo hppa-unknown-linux-gnu ;;
-	esac
-	exit ;;
-    parisc64:Linux:*:* | hppa64:Linux:*:*)
-	echo hppa64-unknown-linux-gnu
-	exit ;;
-    s390:Linux:*:* | s390x:Linux:*:*)
-	echo ${UNAME_MACHINE}-ibm-linux
-	exit ;;
-    sh64*:Linux:*:*)
-    	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sh*:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    sparc:Linux:*:* | sparc64:Linux:*:*)
-	echo ${UNAME_MACHINE}-unknown-linux-gnu
-	exit ;;
-    vax:Linux:*:*)
-	echo ${UNAME_MACHINE}-dec-linux-gnu
-	exit ;;
-    x86_64:Linux:*:*)
-	echo x86_64-unknown-linux-gnu
-	exit ;;
-    i*86:Linux:*:*)
-	# The BFD linker knows what the default object file format is, so
-	# first see if it will tell us. cd to the root directory to prevent
-	# problems with other programs or directories called `ld' in the path.
-	# Set LC_ALL=C to ensure ld outputs messages in English.
-	ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
-			 | sed -ne '/supported targets:/!d
-				    s/[ 	][ 	]*/ /g
-				    s/.*supported targets: *//
-				    s/ .*//
-				    p'`
-        case "$ld_supported_targets" in
-	  elf32-i386)
-		TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
-		;;
-	  a.out-i386-linux)
-		echo "${UNAME_MACHINE}-pc-linux-gnuaout"
-		exit ;;
-	  coff-i386)
-		echo "${UNAME_MACHINE}-pc-linux-gnucoff"
-		exit ;;
-	  "")
-		# Either a pre-BFD a.out linker (linux-gnuoldld) or
-		# one that does not give us useful --help.
-		echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
-		exit ;;
-	esac
-	# Determine whether the default compiler is a.out or elf
-	eval $set_cc_for_build
-	sed 's/^	//' << EOF >$dummy.c
-	#include <features.h>
-	#ifdef __ELF__
-	# ifdef __GLIBC__
-	#  if __GLIBC__ >= 2
-	LIBC=gnu
-	#  else
-	LIBC=gnulibc1
-	#  endif
-	# else
-	LIBC=gnulibc1
-	# endif
-	#else
-	#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
-	LIBC=gnu
-	#else
-	LIBC=gnuaout
-	#endif
-	#endif
-	#ifdef __dietlibc__
-	LIBC=dietlibc
-	#endif
-EOF
-	eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
-	    /^LIBC/{
-		s: ::g
-		p
-	    }'`"
-	test x"${LIBC}" != x && {
-		echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
-		exit
-	}
-	test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
-	;;
-    i*86:DYNIX/ptx:4*:*)
-	# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
-	# earlier versions are messed up and put the nodename in both
-	# sysname and nodename.
-	echo i386-sequent-sysv4
-	exit ;;
-    i*86:UNIX_SV:4.2MP:2.*)
-        # Unixware is an offshoot of SVR4, but it has its own version
-        # number series starting with 2...
-        # I am not positive that other SVR4 systems won't match this,
-	# I just have to hope.  -- rms.
-        # Use sysv4.2uw... so that sysv4* matches it.
-	echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
-	exit ;;
-    i*86:OS/2:*:*)
-	# If we were able to find `uname', then EMX Unix compatibility
-	# is probably installed.
-	echo ${UNAME_MACHINE}-pc-os2-emx
-	exit ;;
-    i*86:XTS-300:*:STOP)
-	echo ${UNAME_MACHINE}-unknown-stop
-	exit ;;
-    i*86:atheos:*:*)
-	echo ${UNAME_MACHINE}-unknown-atheos
-	exit ;;
-    i*86:syllable:*:*)
-	echo ${UNAME_MACHINE}-pc-syllable
-	exit ;;
-    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
-	echo i386-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    i*86:*DOS:*:*)
-	echo ${UNAME_MACHINE}-pc-msdosdjgpp
-	exit ;;
-    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)
-	UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'`
-	if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
-		echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}
-	else
-		echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}
-	fi
-	exit ;;
-    i*86:*:5:[678]*)
-    	# UnixWare 7.x, OpenUNIX and OpenServer 6.
-	case `/bin/uname -X | grep "^Machine"` in
-	    *486*)	     UNAME_MACHINE=i486 ;;
-	    *Pentium)	     UNAME_MACHINE=i586 ;;
-	    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;
-	esac
-	echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}
-	exit ;;
-    i*86:*:3.2:*)
-	if test -f /usr/options/cb.name; then
-		UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
-		echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
-	elif /bin/uname -X 2>/dev/null >/dev/null ; then
-		UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`
-		(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486
-		(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \
-			&& UNAME_MACHINE=i586
-		(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \
-			&& UNAME_MACHINE=i686
-		echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
-	else
-		echo ${UNAME_MACHINE}-pc-sysv32
-	fi
-	exit ;;
-    pc:*:*:*)
-	# Left here for compatibility:
-        # uname -m prints for DJGPP always 'pc', but it prints nothing about
-        # the processor, so we play safe by assuming i386.
-	echo i386-pc-msdosdjgpp
-        exit ;;
-    Intel:Mach:3*:*)
-	echo i386-pc-mach3
-	exit ;;
-    paragon:*:*:*)
-	echo i860-intel-osf1
-	exit ;;
-    i860:*:4.*:*) # i860-SVR4
-	if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
-	  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
-	else # Add other i860-SVR4 vendors below as they are discovered.
-	  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
-	fi
-	exit ;;
-    mini*:CTIX:SYS*5:*)
-	# "miniframe"
-	echo m68010-convergent-sysv
-	exit ;;
-    mc68k:UNIX:SYSTEM5:3.51m)
-	echo m68k-convergent-sysv
-	exit ;;
-    M680?0:D-NIX:5.3:*)
-	echo m68k-diab-dnix
-	exit ;;
-    M68*:*:R3V[5678]*:*)
-	test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;
-    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)
-	OS_REL=''
-	test -r /etc/.relid \
-	&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
-	/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-	  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }
-	/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
-	  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
-    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
-        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
-          && { echo i486-ncr-sysv4; exit; } ;;
-    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
-	echo m68k-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    mc68030:UNIX_System_V:4.*:*)
-	echo m68k-atari-sysv4
-	exit ;;
-    TSUNAMI:LynxOS:2.*:*)
-	echo sparc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    rs6000:LynxOS:2.*:*)
-	echo rs6000-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
-	echo powerpc-unknown-lynxos${UNAME_RELEASE}
-	exit ;;
-    SM[BE]S:UNIX_SV:*:*)
-	echo mips-dde-sysv${UNAME_RELEASE}
-	exit ;;
-    RM*:ReliantUNIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    RM*:SINIX-*:*:*)
-	echo mips-sni-sysv4
-	exit ;;
-    *:SINIX-*:*:*)
-	if uname -p 2>/dev/null >/dev/null ; then
-		UNAME_MACHINE=`(uname -p) 2>/dev/null`
-		echo ${UNAME_MACHINE}-sni-sysv4
-	else
-		echo ns32k-sni-sysv
-	fi
-	exit ;;
-    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
-                      # says <Richard.M.Bartel@ccMail.Census.GOV>
-        echo i586-unisys-sysv4
-        exit ;;
-    *:UNIX_System_V:4*:FTX*)
-	# From Gerald Hewes <hewes@openmarket.com>.
-	# How about differentiating between stratus architectures? -djm
-	echo hppa1.1-stratus-sysv4
-	exit ;;
-    *:*:*:FTX*)
-	# From seanf@swdc.stratus.com.
-	echo i860-stratus-sysv4
-	exit ;;
-    i*86:VOS:*:*)
-	# From Paul.Green@stratus.com.
-	echo ${UNAME_MACHINE}-stratus-vos
-	exit ;;
-    *:VOS:*:*)
-	# From Paul.Green@stratus.com.
-	echo hppa1.1-stratus-vos
-	exit ;;
-    mc68*:A/UX:*:*)
-	echo m68k-apple-aux${UNAME_RELEASE}
-	exit ;;
-    news*:NEWS-OS:6*:*)
-	echo mips-sony-newsos6
-	exit ;;
-    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
-	if [ -d /usr/nec ]; then
-	        echo mips-nec-sysv${UNAME_RELEASE}
-	else
-	        echo mips-unknown-sysv${UNAME_RELEASE}
-	fi
-        exit ;;
-    BeBox:BeOS:*:*)	# BeOS running on hardware made by Be, PPC only.
-	echo powerpc-be-beos
-	exit ;;
-    BeMac:BeOS:*:*)	# BeOS running on Mac or Mac clone, PPC only.
-	echo powerpc-apple-beos
-	exit ;;
-    BePC:BeOS:*:*)	# BeOS running on Intel PC compatible.
-	echo i586-pc-beos
-	exit ;;
-    SX-4:SUPER-UX:*:*)
-	echo sx4-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-5:SUPER-UX:*:*)
-	echo sx5-nec-superux${UNAME_RELEASE}
-	exit ;;
-    SX-6:SUPER-UX:*:*)
-	echo sx6-nec-superux${UNAME_RELEASE}
-	exit ;;
-    Power*:Rhapsody:*:*)
-	echo powerpc-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Rhapsody:*:*)
-	echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}
-	exit ;;
-    *:Darwin:*:*)
-	UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
-	case $UNAME_PROCESSOR in
-	    unknown) UNAME_PROCESSOR=powerpc ;;
-	esac
-	echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
-	exit ;;
-    *:procnto*:*:* | *:QNX:[0123456789]*:*)
-	UNAME_PROCESSOR=`uname -p`
-	if test "$UNAME_PROCESSOR" = "x86"; then
-		UNAME_PROCESSOR=i386
-		UNAME_MACHINE=pc
-	fi
-	echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}
-	exit ;;
-    *:QNX:*:4*)
-	echo i386-pc-qnx
-	exit ;;
-    NSE-?:NONSTOP_KERNEL:*:*)
-	echo nse-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    NSR-?:NONSTOP_KERNEL:*:*)
-	echo nsr-tandem-nsk${UNAME_RELEASE}
-	exit ;;
-    *:NonStop-UX:*:*)
-	echo mips-compaq-nonstopux
-	exit ;;
-    BS2000:POSIX*:*:*)
-	echo bs2000-siemens-sysv
-	exit ;;
-    DS/*:UNIX_System_V:*:*)
-	echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}
-	exit ;;
-    *:Plan9:*:*)
-	# "uname -m" is not consistent, so use $cputype instead. 386
-	# is converted to i386 for consistency with other x86
-	# operating systems.
-	if test "$cputype" = "386"; then
-	    UNAME_MACHINE=i386
-	else
-	    UNAME_MACHINE="$cputype"
-	fi
-	echo ${UNAME_MACHINE}-unknown-plan9
-	exit ;;
-    *:TOPS-10:*:*)
-	echo pdp10-unknown-tops10
-	exit ;;
-    *:TENEX:*:*)
-	echo pdp10-unknown-tenex
-	exit ;;
-    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)
-	echo pdp10-dec-tops20
-	exit ;;
-    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)
-	echo pdp10-xkl-tops20
-	exit ;;
-    *:TOPS-20:*:*)
-	echo pdp10-unknown-tops20
-	exit ;;
-    *:ITS:*:*)
-	echo pdp10-unknown-its
-	exit ;;
-    SEI:*:*:SEIUX)
-        echo mips-sei-seiux${UNAME_RELEASE}
-	exit ;;
-    *:DragonFly:*:*)
-	echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
-	exit ;;
-    *:*VMS:*:*)
-    	UNAME_MACHINE=`(uname -p) 2>/dev/null`
-	case "${UNAME_MACHINE}" in
-	    A*) echo alpha-dec-vms ; exit ;;
-	    I*) echo ia64-dec-vms ; exit ;;
-	    V*) echo vax-dec-vms ; exit ;;
-	esac ;;
-    *:XENIX:*:SysV)
-	echo i386-pc-xenix
-	exit ;;
-    i*86:skyos:*:*)
-	echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'
-	exit ;;
-    i*86:rdos:*:*)
-	echo ${UNAME_MACHINE}-pc-rdos
-	exit ;;
-esac
-
-#echo '(No uname command or uname output not recognized.)' 1>&2
-#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
-
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
-  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
-     I don't know....  */
-  printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
-  printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
-          "4"
-#else
-	  ""
-#endif
-         ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
-  printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
-  printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
-  int version;
-  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
-  if (version < 4)
-    printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
-  else
-    printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
-  exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
-  printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
-  printf ("ns32k-encore-mach\n"); exit (0);
-#else
-  printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
-  printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
-  printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
-  printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
-    struct utsname un;
-
-    uname(&un);
-
-    if (strncmp(un.version, "V2", 2) == 0) {
-	printf ("i386-sequent-ptx2\n"); exit (0);
-    }
-    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
-	printf ("i386-sequent-ptx1\n"); exit (0);
-    }
-    printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-#  include <sys/param.h>
-#  if defined (BSD)
-#   if BSD == 43
-      printf ("vax-dec-bsd4.3\n"); exit (0);
-#   else
-#    if BSD == 199006
-      printf ("vax-dec-bsd4.3reno\n"); exit (0);
-#    else
-      printf ("vax-dec-bsd\n"); exit (0);
-#    endif
-#   endif
-#  else
-    printf ("vax-dec-bsd\n"); exit (0);
-#  endif
-# else
-    printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
-  printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
-  exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
-	{ echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
-    case `getsysinfo -f cpu_type` in
-    c1*)
-	echo c1-convex-bsd
-	exit ;;
-    c2*)
-	if getsysinfo -f scalar_acc
-	then echo c32-convex-bsd
-	else echo c2-convex-bsd
-	fi
-	exit ;;
-    c34*)
-	echo c34-convex-bsd
-	exit ;;
-    c38*)
-	echo c38-convex-bsd
-	exit ;;
-    c4*)
-	echo c4-convex-bsd
-	exit ;;
-    esac
-fi
-
-cat >&2 <<EOF
-$0: unable to guess system type
-
-This script, last modified $timestamp, has failed to recognize
-the operating system you are using. It is advised that you
-download the most up to date version of the config scripts from
-
-  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.guess
-and
-  http://savannah.gnu.org/cgi-bin/viewcvs/*checkout*/config/config/config.sub
-
-If the version you run ($0) is already up to date, please
-send the following data and any information you think might be
-pertinent to <config-patches@gnu.org> in order to provide the needed
-information to handle your system.
-
-config.guess timestamp = $timestamp
-
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`
-
-hostinfo               = `(hostinfo) 2>/dev/null`
-/bin/universe          = `(/bin/universe) 2>/dev/null`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`
-/bin/arch              = `(/bin/arch) 2>/dev/null`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`
-
-UNAME_MACHINE = ${UNAME_MACHINE}
-UNAME_RELEASE = ${UNAME_RELEASE}
-UNAME_SYSTEM  = ${UNAME_SYSTEM}
-UNAME_VERSION = ${UNAME_VERSION}
-EOF
-
-exit 1
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/config.h.in b/rms/org.eclipse.ptp.rm.pbs.proxy/config.h.in
deleted file mode 100644
index e414213..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/config.h.in
+++ /dev/null
@@ -1,61 +0,0 @@
-/* config.h.in.  Generated from configure.in by autoheader.  */
-
-/* Define to 1 if you have the <inttypes.h> header file. */
-#undef HAVE_INTTYPES_H
-
-/* Define to 1 if you have the `proxysvr' library (-lproxysvr). */
-#undef HAVE_LIBPROXYSVR
-
-/* Define to 1 if you have the `torque' library (-ltorque). */
-#undef HAVE_LIBTORQUE
-
-/* Define to 1 if you have the `utils' library (-lutils). */
-#undef HAVE_LIBUTILS
-
-/* Define to 1 if you have the <memory.h> header file. */
-#undef HAVE_MEMORY_H
-
-/* Define to 1 if you have the <pbs_ilf.h> header file. */
-#undef HAVE_PBS_ILF_H
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#undef HAVE_STDINT_H
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#undef HAVE_STDLIB_H
-
-/* Define to 1 if you have the <strings.h> header file. */
-#undef HAVE_STRINGS_H
-
-/* Define to 1 if you have the <string.h> header file. */
-#undef HAVE_STRING_H
-
-/* Define to 1 if you have the <sys/stat.h> header file. */
-#undef HAVE_SYS_STAT_H
-
-/* Define to 1 if you have the <sys/types.h> header file. */
-#undef HAVE_SYS_TYPES_H
-
-/* Define to 1 if you have the <unistd.h> header file. */
-#undef HAVE_UNISTD_H
-
-/* Define to the address where bug reports for this package should be sent. */
-#undef PACKAGE_BUGREPORT
-
-/* Define to the full name of this package. */
-#undef PACKAGE_NAME
-
-/* Define to the full name and version of this package. */
-#undef PACKAGE_STRING
-
-/* Define to the one symbol short name of this package. */
-#undef PACKAGE_TARNAME
-
-/* Define to the version of this package. */
-#undef PACKAGE_VERSION
-
-/* Define as the return type of signal handlers (`int' or `void'). */
-#undef RETSIGTYPE
-
-/* Define to 1 if you have the ANSI C header files. */
-#undef STDC_HEADERS
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/config.sub b/rms/org.eclipse.ptp.rm.pbs.proxy/config.sub
deleted file mode 100755
index fab0aa3..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/config.sub
+++ /dev/null
@@ -1,1616 +0,0 @@
-#! /bin/sh
-# Configuration validation subroutine script.
-#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
-#   2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation,
-#   Inc.
-
-timestamp='2006-09-20'
-
-# This file is (in principle) common to ALL GNU software.
-# The presence of a machine in this file suggests that SOME GNU software
-# can handle that machine.  It does not imply ALL GNU software can.
-#
-# This file is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
-# 02110-1301, USA.
-#
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-
-# Please send patches to <config-patches@gnu.org>.  Submit a context
-# diff and a properly formatted ChangeLog entry.
-#
-# Configuration subroutine to validate and canonicalize a configuration type.
-# Supply the specified configuration type as an argument.
-# If it is invalid, we print an error message on stderr and exit with code 1.
-# Otherwise, we print the canonical config type on stdout and succeed.
-
-# This file is supposed to be the same for all GNU packages
-# and recognize all the CPU types, system types and aliases
-# that are meaningful with *any* GNU software.
-# Each package is responsible for reporting which valid configurations
-# it does not support.  The user should be able to distinguish
-# a failure to support a valid configuration from a meaningless
-# configuration.
-
-# The goal of this file is to map all the various variations of a given
-# machine specification into a single specification in the form:
-#	CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
-# or in some cases, the newer four-part form:
-#	CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
-# It is wrong to echo any other type of specification.
-
-me=`echo "$0" | sed -e 's,.*/,,'`
-
-usage="\
-Usage: $0 [OPTION] CPU-MFR-OPSYS
-       $0 [OPTION] ALIAS
-
-Canonicalize a configuration name.
-
-Operation modes:
-  -h, --help         print this help, then exit
-  -t, --time-stamp   print date of last modification, then exit
-  -v, --version      print version number, then exit
-
-Report bugs and patches to <config-patches@gnu.org>."
-
-version="\
-GNU config.sub ($timestamp)
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
-Free Software Foundation, Inc.
-
-This is free software; see the source for copying conditions.  There is NO
-warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
-
-help="
-Try \`$me --help' for more information."
-
-# Parse command line
-while test $# -gt 0 ; do
-  case $1 in
-    --time-stamp | --time* | -t )
-       echo "$timestamp" ; exit ;;
-    --version | -v )
-       echo "$version" ; exit ;;
-    --help | --h* | -h )
-       echo "$usage"; exit ;;
-    -- )     # Stop option processing
-       shift; break ;;
-    - )	# Use stdin as input.
-       break ;;
-    -* )
-       echo "$me: invalid option $1$help"
-       exit 1 ;;
-
-    *local*)
-       # First pass through any local machine types.
-       echo $1
-       exit ;;
-
-    * )
-       break ;;
-  esac
-done
-
-case $# in
- 0) echo "$me: missing argument$help" >&2
-    exit 1;;
- 1) ;;
- *) echo "$me: too many arguments$help" >&2
-    exit 1;;
-esac
-
-# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
-# Here we must recognize all the valid KERNEL-OS combinations.
-maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
-case $maybe_os in
-  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
-  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
-  storm-chaos* | os2-emx* | rtmk-nova*)
-    os=-$maybe_os
-    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
-    ;;
-  *)
-    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
-    if [ $basic_machine != $1 ]
-    then os=`echo $1 | sed 's/.*-/-/'`
-    else os=; fi
-    ;;
-esac
-
-### Let's recognize common machines as not being operating systems so
-### that things like config.sub decstation-3100 work.  We also
-### recognize some manufacturers as not being operating systems, so we
-### can provide default operating systems below.
-case $os in
-	-sun*os*)
-		# Prevent following clause from handling this invalid input.
-		;;
-	-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
-	-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
-	-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
-	-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
-	-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
-	-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
-	-apple | -axis | -knuth | -cray)
-		os=
-		basic_machine=$1
-		;;
-	-sim | -cisco | -oki | -wec | -winbond)
-		os=
-		basic_machine=$1
-		;;
-	-scout)
-		;;
-	-wrs)
-		os=-vxworks
-		basic_machine=$1
-		;;
-	-chorusos*)
-		os=-chorusos
-		basic_machine=$1
-		;;
- 	-chorusrdb)
- 		os=-chorusrdb
-		basic_machine=$1
- 		;;
-	-hiux*)
-		os=-hiuxwe2
-		;;
-	-sco6)
-		os=-sco5v6
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5)
-		os=-sco3.2v5
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco4)
-		os=-sco3.2v4
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2.[4-9]*)
-		os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco3.2v[4-9]*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco5v6*)
-		# Don't forget version if it is 3.2v4 or newer.
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-sco*)
-		os=-sco3.2v2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-udk*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-isc)
-		os=-isc2.2
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-clix*)
-		basic_machine=clipper-intergraph
-		;;
-	-isc*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
-		;;
-	-lynx*)
-		os=-lynxos
-		;;
-	-ptx*)
-		basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
-		;;
-	-windowsnt*)
-		os=`echo $os | sed -e 's/windowsnt/winnt/'`
-		;;
-	-psos*)
-		os=-psos
-		;;
-	-mint | -mint[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-esac
-
-# Decode aliases for certain CPU-COMPANY combinations.
-case $basic_machine in
-	# Recognize the basic CPU types without company name.
-	# Some are omitted here because they have special meanings below.
-	1750a | 580 \
-	| a29k \
-	| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
-	| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
-	| am33_2.0 \
-	| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
-	| bfin \
-	| c4x | clipper \
-	| d10v | d30v | dlx | dsp16xx \
-	| fr30 | frv \
-	| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
-	| i370 | i860 | i960 | ia64 \
-	| ip2k | iq2000 \
-	| m32c | m32r | m32rle | m68000 | m68k | m88k \
-	| maxq | mb | microblaze | mcore \
-	| mips | mipsbe | mipseb | mipsel | mipsle \
-	| mips16 \
-	| mips64 | mips64el \
-	| mips64vr | mips64vrel \
-	| mips64orion | mips64orionel \
-	| mips64vr4100 | mips64vr4100el \
-	| mips64vr4300 | mips64vr4300el \
-	| mips64vr5000 | mips64vr5000el \
-	| mips64vr5900 | mips64vr5900el \
-	| mipsisa32 | mipsisa32el \
-	| mipsisa32r2 | mipsisa32r2el \
-	| mipsisa64 | mipsisa64el \
-	| mipsisa64r2 | mipsisa64r2el \
-	| mipsisa64sb1 | mipsisa64sb1el \
-	| mipsisa64sr71k | mipsisa64sr71kel \
-	| mipstx39 | mipstx39el \
-	| mn10200 | mn10300 \
-	| mt \
-	| msp430 \
-	| nios | nios2 \
-	| ns16k | ns32k \
-	| or32 \
-	| pdp10 | pdp11 | pj | pjl \
-	| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
-	| pyramid \
-	| score \
-	| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
-	| sh64 | sh64le \
-	| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
-	| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
-	| spu | strongarm \
-	| tahoe | thumb | tic4x | tic80 | tron \
-	| v850 | v850e \
-	| we32k \
-	| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
-	| z8k)
-		basic_machine=$basic_machine-unknown
-		;;
-	m6811 | m68hc11 | m6812 | m68hc12)
-		# Motorola 68HC11/12.
-		basic_machine=$basic_machine-unknown
-		os=-none
-		;;
-	m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)
-		;;
-	ms1)
-		basic_machine=mt-unknown
-		;;
-
-	# We use `pc' rather than `unknown'
-	# because (1) that's what they normally are, and
-	# (2) the word "unknown" tends to confuse beginning users.
-	i*86 | x86_64)
-	  basic_machine=$basic_machine-pc
-	  ;;
-	# Object if more than one company name word.
-	*-*-*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-	# Recognize the basic CPU types with company name.
-	580-* \
-	| a29k-* \
-	| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
-	| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
-	| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
-	| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \
-	| avr-* | avr32-* \
-	| bfin-* | bs2000-* \
-	| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
-	| clipper-* | craynv-* | cydra-* \
-	| d10v-* | d30v-* | dlx-* \
-	| elxsi-* \
-	| f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \
-	| h8300-* | h8500-* \
-	| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
-	| i*86-* | i860-* | i960-* | ia64-* \
-	| ip2k-* | iq2000-* \
-	| m32c-* | m32r-* | m32rle-* \
-	| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
-	| m88110-* | m88k-* | maxq-* | mcore-* \
-	| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
-	| mips16-* \
-	| mips64-* | mips64el-* \
-	| mips64vr-* | mips64vrel-* \
-	| mips64orion-* | mips64orionel-* \
-	| mips64vr4100-* | mips64vr4100el-* \
-	| mips64vr4300-* | mips64vr4300el-* \
-	| mips64vr5000-* | mips64vr5000el-* \
-	| mips64vr5900-* | mips64vr5900el-* \
-	| mipsisa32-* | mipsisa32el-* \
-	| mipsisa32r2-* | mipsisa32r2el-* \
-	| mipsisa64-* | mipsisa64el-* \
-	| mipsisa64r2-* | mipsisa64r2el-* \
-	| mipsisa64sb1-* | mipsisa64sb1el-* \
-	| mipsisa64sr71k-* | mipsisa64sr71kel-* \
-	| mipstx39-* | mipstx39el-* \
-	| mmix-* \
-	| mt-* \
-	| msp430-* \
-	| nios-* | nios2-* \
-	| none-* | np1-* | ns16k-* | ns32k-* \
-	| orion-* \
-	| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
-	| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
-	| pyramid-* \
-	| romp-* | rs6000-* \
-	| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
-	| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
-	| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
-	| sparclite-* \
-	| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
-	| tahoe-* | thumb-* \
-	| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
-	| tron-* \
-	| v850-* | v850e-* | vax-* \
-	| we32k-* \
-	| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
-	| xstormy16-* | xtensa-* \
-	| ymp-* \
-	| z8k-*)
-		;;
-	# Recognize the various machine names and aliases which stand
-	# for a CPU type and a company and sometimes even an OS.
-	386bsd)
-		basic_machine=i386-unknown
-		os=-bsd
-		;;
-	3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
-		basic_machine=m68000-att
-		;;
-	3b*)
-		basic_machine=we32k-att
-		;;
-	a29khif)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-    	abacus)
-		basic_machine=abacus-unknown
-		;;
-	adobe68k)
-		basic_machine=m68010-adobe
-		os=-scout
-		;;
-	alliant | fx80)
-		basic_machine=fx80-alliant
-		;;
-	altos | altos3068)
-		basic_machine=m68k-altos
-		;;
-	am29k)
-		basic_machine=a29k-none
-		os=-bsd
-		;;
-	amd64)
-		basic_machine=x86_64-pc
-		;;
-	amd64-*)
-		basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	amdahl)
-		basic_machine=580-amdahl
-		os=-sysv
-		;;
-	amiga | amiga-*)
-		basic_machine=m68k-unknown
-		;;
-	amigaos | amigados)
-		basic_machine=m68k-unknown
-		os=-amigaos
-		;;
-	amigaunix | amix)
-		basic_machine=m68k-unknown
-		os=-sysv4
-		;;
-	apollo68)
-		basic_machine=m68k-apollo
-		os=-sysv
-		;;
-	apollo68bsd)
-		basic_machine=m68k-apollo
-		os=-bsd
-		;;
-	aux)
-		basic_machine=m68k-apple
-		os=-aux
-		;;
-	balance)
-		basic_machine=ns32k-sequent
-		os=-dynix
-		;;
-	c90)
-		basic_machine=c90-cray
-		os=-unicos
-		;;
-	convex-c1)
-		basic_machine=c1-convex
-		os=-bsd
-		;;
-	convex-c2)
-		basic_machine=c2-convex
-		os=-bsd
-		;;
-	convex-c32)
-		basic_machine=c32-convex
-		os=-bsd
-		;;
-	convex-c34)
-		basic_machine=c34-convex
-		os=-bsd
-		;;
-	convex-c38)
-		basic_machine=c38-convex
-		os=-bsd
-		;;
-	cray | j90)
-		basic_machine=j90-cray
-		os=-unicos
-		;;
-	craynv)
-		basic_machine=craynv-cray
-		os=-unicosmp
-		;;
-	cr16c)
-		basic_machine=cr16c-unknown
-		os=-elf
-		;;
-	crds | unos)
-		basic_machine=m68k-crds
-		;;
-	crisv32 | crisv32-* | etraxfs*)
-		basic_machine=crisv32-axis
-		;;
-	cris | cris-* | etrax*)
-		basic_machine=cris-axis
-		;;
-	crx)
-		basic_machine=crx-unknown
-		os=-elf
-		;;
-	da30 | da30-*)
-		basic_machine=m68k-da30
-		;;
-	decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
-		basic_machine=mips-dec
-		;;
-	decsystem10* | dec10*)
-		basic_machine=pdp10-dec
-		os=-tops10
-		;;
-	decsystem20* | dec20*)
-		basic_machine=pdp10-dec
-		os=-tops20
-		;;
-	delta | 3300 | motorola-3300 | motorola-delta \
-	      | 3300-motorola | delta-motorola)
-		basic_machine=m68k-motorola
-		;;
-	delta88)
-		basic_machine=m88k-motorola
-		os=-sysv3
-		;;
-	djgpp)
-		basic_machine=i586-pc
-		os=-msdosdjgpp
-		;;
-	dpx20 | dpx20-*)
-		basic_machine=rs6000-bull
-		os=-bosx
-		;;
-	dpx2* | dpx2*-bull)
-		basic_machine=m68k-bull
-		os=-sysv3
-		;;
-	ebmon29k)
-		basic_machine=a29k-amd
-		os=-ebmon
-		;;
-	elxsi)
-		basic_machine=elxsi-elxsi
-		os=-bsd
-		;;
-	encore | umax | mmax)
-		basic_machine=ns32k-encore
-		;;
-	es1800 | OSE68k | ose68k | ose | OSE)
-		basic_machine=m68k-ericsson
-		os=-ose
-		;;
-	fx2800)
-		basic_machine=i860-alliant
-		;;
-	genix)
-		basic_machine=ns32k-ns
-		;;
-	gmicro)
-		basic_machine=tron-gmicro
-		os=-sysv
-		;;
-	go32)
-		basic_machine=i386-pc
-		os=-go32
-		;;
-	h3050r* | hiux*)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	h8300hms)
-		basic_machine=h8300-hitachi
-		os=-hms
-		;;
-	h8300xray)
-		basic_machine=h8300-hitachi
-		os=-xray
-		;;
-	h8500hms)
-		basic_machine=h8500-hitachi
-		os=-hms
-		;;
-	harris)
-		basic_machine=m88k-harris
-		os=-sysv3
-		;;
-	hp300-*)
-		basic_machine=m68k-hp
-		;;
-	hp300bsd)
-		basic_machine=m68k-hp
-		os=-bsd
-		;;
-	hp300hpux)
-		basic_machine=m68k-hp
-		os=-hpux
-		;;
-	hp3k9[0-9][0-9] | hp9[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k2[0-9][0-9] | hp9k31[0-9])
-		basic_machine=m68000-hp
-		;;
-	hp9k3[2-9][0-9])
-		basic_machine=m68k-hp
-		;;
-	hp9k6[0-9][0-9] | hp6[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hp9k7[0-79][0-9] | hp7[0-79][0-9])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k78[0-9] | hp78[0-9])
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)
-		# FIXME: really hppa2.0-hp
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][13679] | hp8[0-9][13679])
-		basic_machine=hppa1.1-hp
-		;;
-	hp9k8[0-9][0-9] | hp8[0-9][0-9])
-		basic_machine=hppa1.0-hp
-		;;
-	hppa-next)
-		os=-nextstep3
-		;;
-	hppaosf)
-		basic_machine=hppa1.1-hp
-		os=-osf
-		;;
-	hppro)
-		basic_machine=hppa1.1-hp
-		os=-proelf
-		;;
-	i370-ibm* | ibm*)
-		basic_machine=i370-ibm
-		;;
-# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
-	i*86v32)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv32
-		;;
-	i*86v4*)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv4
-		;;
-	i*86v)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-sysv
-		;;
-	i*86sol2)
-		basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
-		os=-solaris2
-		;;
-	i386mach)
-		basic_machine=i386-mach
-		os=-mach
-		;;
-	i386-vsta | vsta)
-		basic_machine=i386-unknown
-		os=-vsta
-		;;
-	iris | iris4d)
-		basic_machine=mips-sgi
-		case $os in
-		    -irix*)
-			;;
-		    *)
-			os=-irix4
-			;;
-		esac
-		;;
-	isi68 | isi)
-		basic_machine=m68k-isi
-		os=-sysv
-		;;
-	m88k-omron*)
-		basic_machine=m88k-omron
-		;;
-	magnum | m3230)
-		basic_machine=mips-mips
-		os=-sysv
-		;;
-	merlin)
-		basic_machine=ns32k-utek
-		os=-sysv
-		;;
-	mingw32)
-		basic_machine=i386-pc
-		os=-mingw32
-		;;
-	miniframe)
-		basic_machine=m68000-convergent
-		;;
-	*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)
-		basic_machine=m68k-atari
-		os=-mint
-		;;
-	mips3*-*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
-		;;
-	mips3*)
-		basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
-		;;
-	monitor)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	morphos)
-		basic_machine=powerpc-unknown
-		os=-morphos
-		;;
-	msdos)
-		basic_machine=i386-pc
-		os=-msdos
-		;;
-	ms1-*)
-		basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
-		;;
-	mvs)
-		basic_machine=i370-ibm
-		os=-mvs
-		;;
-	ncr3000)
-		basic_machine=i486-ncr
-		os=-sysv4
-		;;
-	netbsd386)
-		basic_machine=i386-unknown
-		os=-netbsd
-		;;
-	netwinder)
-		basic_machine=armv4l-rebel
-		os=-linux
-		;;
-	news | news700 | news800 | news900)
-		basic_machine=m68k-sony
-		os=-newsos
-		;;
-	news1000)
-		basic_machine=m68030-sony
-		os=-newsos
-		;;
-	news-3600 | risc-news)
-		basic_machine=mips-sony
-		os=-newsos
-		;;
-	necv70)
-		basic_machine=v70-nec
-		os=-sysv
-		;;
-	next | m*-next )
-		basic_machine=m68k-next
-		case $os in
-		    -nextstep* )
-			;;
-		    -ns2*)
-		      os=-nextstep2
-			;;
-		    *)
-		      os=-nextstep3
-			;;
-		esac
-		;;
-	nh3000)
-		basic_machine=m68k-harris
-		os=-cxux
-		;;
-	nh[45]000)
-		basic_machine=m88k-harris
-		os=-cxux
-		;;
-	nindy960)
-		basic_machine=i960-intel
-		os=-nindy
-		;;
-	mon960)
-		basic_machine=i960-intel
-		os=-mon960
-		;;
-	nonstopux)
-		basic_machine=mips-compaq
-		os=-nonstopux
-		;;
-	np1)
-		basic_machine=np1-gould
-		;;
-	nsr-tandem)
-		basic_machine=nsr-tandem
-		;;
-	op50n-* | op60c-*)
-		basic_machine=hppa1.1-oki
-		os=-proelf
-		;;
-	openrisc | openrisc-*)
-		basic_machine=or32-unknown
-		;;
-	os400)
-		basic_machine=powerpc-ibm
-		os=-os400
-		;;
-	OSE68000 | ose68000)
-		basic_machine=m68000-ericsson
-		os=-ose
-		;;
-	os68k)
-		basic_machine=m68k-none
-		os=-os68k
-		;;
-	pa-hitachi)
-		basic_machine=hppa1.1-hitachi
-		os=-hiuxwe2
-		;;
-	paragon)
-		basic_machine=i860-intel
-		os=-osf
-		;;
-	pbd)
-		basic_machine=sparc-tti
-		;;
-	pbb)
-		basic_machine=m68k-tti
-		;;
-	pc532 | pc532-*)
-		basic_machine=ns32k-pc532
-		;;
-	pc98)
-		basic_machine=i386-pc
-		;;
-	pc98-*)
-		basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium | p5 | k5 | k6 | nexgen | viac3)
-		basic_machine=i586-pc
-		;;
-	pentiumpro | p6 | 6x86 | athlon | athlon_*)
-		basic_machine=i686-pc
-		;;
-	pentiumii | pentium2 | pentiumiii | pentium3)
-		basic_machine=i686-pc
-		;;
-	pentium4)
-		basic_machine=i786-pc
-		;;
-	pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)
-		basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumpro-* | p6-* | 6x86-* | athlon-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)
-		basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pentium4-*)
-		basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	pn)
-		basic_machine=pn-gould
-		;;
-	power)	basic_machine=power-ibm
-		;;
-	ppc)	basic_machine=powerpc-unknown
-		;;
-	ppc-*)	basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppcle | powerpclittle | ppc-le | powerpc-little)
-		basic_machine=powerpcle-unknown
-		;;
-	ppcle-* | powerpclittle-*)
-		basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64)	basic_machine=powerpc64-unknown
-		;;
-	ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ppc64le | powerpc64little | ppc64-le | powerpc64-little)
-		basic_machine=powerpc64le-unknown
-		;;
-	ppc64le-* | powerpc64little-*)
-		basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`
-		;;
-	ps2)
-		basic_machine=i386-ibm
-		;;
-	pw32)
-		basic_machine=i586-unknown
-		os=-pw32
-		;;
-	rdos)
-		basic_machine=i386-pc
-		os=-rdos
-		;;
-	rom68k)
-		basic_machine=m68k-rom68k
-		os=-coff
-		;;
-	rm[46]00)
-		basic_machine=mips-siemens
-		;;
-	rtpc | rtpc-*)
-		basic_machine=romp-ibm
-		;;
-	s390 | s390-*)
-		basic_machine=s390-ibm
-		;;
-	s390x | s390x-*)
-		basic_machine=s390x-ibm
-		;;
-	sa29200)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	sb1)
-		basic_machine=mipsisa64sb1-unknown
-		;;
-	sb1el)
-		basic_machine=mipsisa64sb1el-unknown
-		;;
-	sde)
-		basic_machine=mipsisa32-sde
-		os=-elf
-		;;
-	sei)
-		basic_machine=mips-sei
-		os=-seiux
-		;;
-	sequent)
-		basic_machine=i386-sequent
-		;;
-	sh)
-		basic_machine=sh-hitachi
-		os=-hms
-		;;
-	sh64)
-		basic_machine=sh64-unknown
-		;;
-	sparclite-wrs | simso-wrs)
-		basic_machine=sparclite-wrs
-		os=-vxworks
-		;;
-	sps7)
-		basic_machine=m68k-bull
-		os=-sysv2
-		;;
-	spur)
-		basic_machine=spur-unknown
-		;;
-	st2000)
-		basic_machine=m68k-tandem
-		;;
-	stratus)
-		basic_machine=i860-stratus
-		os=-sysv4
-		;;
-	sun2)
-		basic_machine=m68000-sun
-		;;
-	sun2os3)
-		basic_machine=m68000-sun
-		os=-sunos3
-		;;
-	sun2os4)
-		basic_machine=m68000-sun
-		os=-sunos4
-		;;
-	sun3os3)
-		basic_machine=m68k-sun
-		os=-sunos3
-		;;
-	sun3os4)
-		basic_machine=m68k-sun
-		os=-sunos4
-		;;
-	sun4os3)
-		basic_machine=sparc-sun
-		os=-sunos3
-		;;
-	sun4os4)
-		basic_machine=sparc-sun
-		os=-sunos4
-		;;
-	sun4sol2)
-		basic_machine=sparc-sun
-		os=-solaris2
-		;;
-	sun3 | sun3-*)
-		basic_machine=m68k-sun
-		;;
-	sun4)
-		basic_machine=sparc-sun
-		;;
-	sun386 | sun386i | roadrunner)
-		basic_machine=i386-sun
-		;;
-	sv1)
-		basic_machine=sv1-cray
-		os=-unicos
-		;;
-	symmetry)
-		basic_machine=i386-sequent
-		os=-dynix
-		;;
-	t3e)
-		basic_machine=alphaev5-cray
-		os=-unicos
-		;;
-	t90)
-		basic_machine=t90-cray
-		os=-unicos
-		;;
-	tic54x | c54x*)
-		basic_machine=tic54x-unknown
-		os=-coff
-		;;
-	tic55x | c55x*)
-		basic_machine=tic55x-unknown
-		os=-coff
-		;;
-	tic6x | c6x*)
-		basic_machine=tic6x-unknown
-		os=-coff
-		;;
-	tx39)
-		basic_machine=mipstx39-unknown
-		;;
-	tx39el)
-		basic_machine=mipstx39el-unknown
-		;;
-	toad1)
-		basic_machine=pdp10-xkl
-		os=-tops20
-		;;
-	tower | tower-32)
-		basic_machine=m68k-ncr
-		;;
-	tpf)
-		basic_machine=s390x-ibm
-		os=-tpf
-		;;
-	udi29k)
-		basic_machine=a29k-amd
-		os=-udi
-		;;
-	ultra3)
-		basic_machine=a29k-nyu
-		os=-sym1
-		;;
-	v810 | necv810)
-		basic_machine=v810-nec
-		os=-none
-		;;
-	vaxv)
-		basic_machine=vax-dec
-		os=-sysv
-		;;
-	vms)
-		basic_machine=vax-dec
-		os=-vms
-		;;
-	vpp*|vx|vx-*)
-		basic_machine=f301-fujitsu
-		;;
-	vxworks960)
-		basic_machine=i960-wrs
-		os=-vxworks
-		;;
-	vxworks68)
-		basic_machine=m68k-wrs
-		os=-vxworks
-		;;
-	vxworks29k)
-		basic_machine=a29k-wrs
-		os=-vxworks
-		;;
-	w65*)
-		basic_machine=w65-wdc
-		os=-none
-		;;
-	w89k-*)
-		basic_machine=hppa1.1-winbond
-		os=-proelf
-		;;
-	xbox)
-		basic_machine=i686-pc
-		os=-mingw32
-		;;
-	xps | xps100)
-		basic_machine=xps100-honeywell
-		;;
-	ymp)
-		basic_machine=ymp-cray
-		os=-unicos
-		;;
-	z8k-*-coff)
-		basic_machine=z8k-unknown
-		os=-sim
-		;;
-	none)
-		basic_machine=none-none
-		os=-none
-		;;
-
-# Here we handle the default manufacturer of certain CPU types.  It is in
-# some cases the only manufacturer, in others, it is the most popular.
-	w89k)
-		basic_machine=hppa1.1-winbond
-		;;
-	op50n)
-		basic_machine=hppa1.1-oki
-		;;
-	op60c)
-		basic_machine=hppa1.1-oki
-		;;
-	romp)
-		basic_machine=romp-ibm
-		;;
-	mmix)
-		basic_machine=mmix-knuth
-		;;
-	rs6000)
-		basic_machine=rs6000-ibm
-		;;
-	vax)
-		basic_machine=vax-dec
-		;;
-	pdp10)
-		# there are many clones, so DEC is not a safe bet
-		basic_machine=pdp10-unknown
-		;;
-	pdp11)
-		basic_machine=pdp11-dec
-		;;
-	we32k)
-		basic_machine=we32k-att
-		;;
-	sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
-		basic_machine=sh-unknown
-		;;
-	sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
-		basic_machine=sparc-sun
-		;;
-	cydra)
-		basic_machine=cydra-cydrome
-		;;
-	orion)
-		basic_machine=orion-highlevel
-		;;
-	orion105)
-		basic_machine=clipper-highlevel
-		;;
-	mac | mpw | mac-mpw)
-		basic_machine=m68k-apple
-		;;
-	pmac | pmac-mpw)
-		basic_machine=powerpc-apple
-		;;
-	*-unknown)
-		# Make sure to match an already-canonicalized machine name.
-		;;
-	*)
-		echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
-		exit 1
-		;;
-esac
-
-# Here we canonicalize certain aliases for manufacturers.
-case $basic_machine in
-	*-digital*)
-		basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
-		;;
-	*-commodore*)
-		basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
-		;;
-	*)
-		;;
-esac
-
-# Decode manufacturer-specific aliases for certain operating systems.
-
-if [ x"$os" != x"" ]
-then
-case $os in
-        # First match some system type aliases
-        # that might get confused with valid system types.
-	# -solaris* is a basic system type, with this one exception.
-	-solaris1 | -solaris1.*)
-		os=`echo $os | sed -e 's|solaris1|sunos4|'`
-		;;
-	-solaris)
-		os=-solaris2
-		;;
-	-svr4*)
-		os=-sysv4
-		;;
-	-unixware*)
-		os=-sysv4.2uw
-		;;
-	-gnu/linux*)
-		os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
-		;;
-	# First accept the basic system types.
-	# The portable systems comes first.
-	# Each alternative MUST END IN A *, to match a version number.
-	# -sysv* is not here because it comes later, after sysvr4.
-	-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
-	      | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
-	      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
-	      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
-	      | -aos* \
-	      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
-	      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
-	      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
-	      | -openbsd* | -solidbsd* \
-	      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
-	      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
-	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
-	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
-	      | -chorusos* | -chorusrdb* \
-	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
-	      | -uxpv* | -beos* | -mpeix* | -udk* \
-	      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
-	      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
-	      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
-	      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
-	      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
-	      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
-	      | -skyos* | -haiku* | -rdos* | -toppers*)
-	# Remember, each alternative MUST END IN *, to match a version number.
-		;;
-	-qnx*)
-		case $basic_machine in
-		    x86-* | i*86-*)
-			;;
-		    *)
-			os=-nto$os
-			;;
-		esac
-		;;
-	-nto-qnx*)
-		;;
-	-nto*)
-		os=`echo $os | sed -e 's|nto|nto-qnx|'`
-		;;
-	-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \
-	      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \
-	      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)
-		;;
-	-mac*)
-		os=`echo $os | sed -e 's|mac|macos|'`
-		;;
-	-linux-dietlibc)
-		os=-linux-dietlibc
-		;;
-	-linux*)
-		os=`echo $os | sed -e 's|linux|linux-gnu|'`
-		;;
-	-sunos5*)
-		os=`echo $os | sed -e 's|sunos5|solaris2|'`
-		;;
-	-sunos6*)
-		os=`echo $os | sed -e 's|sunos6|solaris3|'`
-		;;
-	-opened*)
-		os=-openedition
-		;;
-        -os400*)
-		os=-os400
-		;;
-	-wince*)
-		os=-wince
-		;;
-	-osfrose*)
-		os=-osfrose
-		;;
-	-osf*)
-		os=-osf
-		;;
-	-utek*)
-		os=-bsd
-		;;
-	-dynix*)
-		os=-bsd
-		;;
-	-acis*)
-		os=-aos
-		;;
-	-atheos*)
-		os=-atheos
-		;;
-	-syllable*)
-		os=-syllable
-		;;
-	-386bsd)
-		os=-bsd
-		;;
-	-ctix* | -uts*)
-		os=-sysv
-		;;
-	-nova*)
-		os=-rtmk-nova
-		;;
-	-ns2 )
-		os=-nextstep2
-		;;
-	-nsk*)
-		os=-nsk
-		;;
-	# Preserve the version number of sinix5.
-	-sinix5.*)
-		os=`echo $os | sed -e 's|sinix|sysv|'`
-		;;
-	-sinix*)
-		os=-sysv4
-		;;
-        -tpf*)
-		os=-tpf
-		;;
-	-triton*)
-		os=-sysv3
-		;;
-	-oss*)
-		os=-sysv3
-		;;
-	-svr4)
-		os=-sysv4
-		;;
-	-svr3)
-		os=-sysv3
-		;;
-	-sysvr4)
-		os=-sysv4
-		;;
-	# This must come after -sysvr4.
-	-sysv*)
-		;;
-	-ose*)
-		os=-ose
-		;;
-	-es1800*)
-		os=-ose
-		;;
-	-xenix)
-		os=-xenix
-		;;
-	-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-		os=-mint
-		;;
-	-aros*)
-		os=-aros
-		;;
-	-kaos*)
-		os=-kaos
-		;;
-	-zvmoe)
-		os=-zvmoe
-		;;
-	-none)
-		;;
-	*)
-		# Get rid of the `-' at the beginning of $os.
-		os=`echo $os | sed 's/[^-]*-//'`
-		echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
-		exit 1
-		;;
-esac
-else
-
-# Here we handle the default operating systems that come with various machines.
-# The value should be what the vendor currently ships out the door with their
-# machine or put another way, the most popular os provided with the machine.
-
-# Note that if you're going to try to match "-MANUFACTURER" here (say,
-# "-sun"), then you have to tell the case statement up towards the top
-# that MANUFACTURER isn't an operating system.  Otherwise, code above
-# will signal an error saying that MANUFACTURER isn't an operating
-# system, and we'll never get to this point.
-
-case $basic_machine in
-        score-*)
-		os=-elf
-		;;
-        spu-*)
-		os=-elf
-		;;
-	*-acorn)
-		os=-riscix1.2
-		;;
-	arm*-rebel)
-		os=-linux
-		;;
-	arm*-semi)
-		os=-aout
-		;;
-        c4x-* | tic4x-*)
-        	os=-coff
-		;;
-	# This must come before the *-dec entry.
-	pdp10-*)
-		os=-tops20
-		;;
-	pdp11-*)
-		os=-none
-		;;
-	*-dec | vax-*)
-		os=-ultrix4.2
-		;;
-	m68*-apollo)
-		os=-domain
-		;;
-	i386-sun)
-		os=-sunos4.0.2
-		;;
-	m68000-sun)
-		os=-sunos3
-		# This also exists in the configure program, but was not the
-		# default.
-		# os=-sunos4
-		;;
-	m68*-cisco)
-		os=-aout
-		;;
-	mips*-cisco)
-		os=-elf
-		;;
-	mips*-*)
-		os=-elf
-		;;
-	or32-*)
-		os=-coff
-		;;
-	*-tti)	# must be before sparc entry or we get the wrong os.
-		os=-sysv3
-		;;
-	sparc-* | *-sun)
-		os=-sunos4.1.1
-		;;
-	*-be)
-		os=-beos
-		;;
-	*-haiku)
-		os=-haiku
-		;;
-	*-ibm)
-		os=-aix
-		;;
-    	*-knuth)
-		os=-mmixware
-		;;
-	*-wec)
-		os=-proelf
-		;;
-	*-winbond)
-		os=-proelf
-		;;
-	*-oki)
-		os=-proelf
-		;;
-	*-hp)
-		os=-hpux
-		;;
-	*-hitachi)
-		os=-hiux
-		;;
-	i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
-		os=-sysv
-		;;
-	*-cbm)
-		os=-amigaos
-		;;
-	*-dg)
-		os=-dgux
-		;;
-	*-dolphin)
-		os=-sysv3
-		;;
-	m68k-ccur)
-		os=-rtu
-		;;
-	m88k-omron*)
-		os=-luna
-		;;
-	*-next )
-		os=-nextstep
-		;;
-	*-sequent)
-		os=-ptx
-		;;
-	*-crds)
-		os=-unos
-		;;
-	*-ns)
-		os=-genix
-		;;
-	i370-*)
-		os=-mvs
-		;;
-	*-next)
-		os=-nextstep3
-		;;
-	*-gould)
-		os=-sysv
-		;;
-	*-highlevel)
-		os=-bsd
-		;;
-	*-encore)
-		os=-bsd
-		;;
-	*-sgi)
-		os=-irix
-		;;
-	*-siemens)
-		os=-sysv4
-		;;
-	*-masscomp)
-		os=-rtu
-		;;
-	f30[01]-fujitsu | f700-fujitsu)
-		os=-uxpv
-		;;
-	*-rom68k)
-		os=-coff
-		;;
-	*-*bug)
-		os=-coff
-		;;
-	*-apple)
-		os=-macos
-		;;
-	*-atari*)
-		os=-mint
-		;;
-	*)
-		os=-none
-		;;
-esac
-fi
-
-# Here we handle the case where we know the os, and the CPU type, but not the
-# manufacturer.  We pick the logical manufacturer.
-vendor=unknown
-case $basic_machine in
-	*-unknown)
-		case $os in
-			-riscix*)
-				vendor=acorn
-				;;
-			-sunos*)
-				vendor=sun
-				;;
-			-aix*)
-				vendor=ibm
-				;;
-			-beos*)
-				vendor=be
-				;;
-			-hpux*)
-				vendor=hp
-				;;
-			-mpeix*)
-				vendor=hp
-				;;
-			-hiux*)
-				vendor=hitachi
-				;;
-			-unos*)
-				vendor=crds
-				;;
-			-dgux*)
-				vendor=dg
-				;;
-			-luna*)
-				vendor=omron
-				;;
-			-genix*)
-				vendor=ns
-				;;
-			-mvs* | -opened*)
-				vendor=ibm
-				;;
-			-os400*)
-				vendor=ibm
-				;;
-			-ptx*)
-				vendor=sequent
-				;;
-			-tpf*)
-				vendor=ibm
-				;;
-			-vxsim* | -vxworks* | -windiss*)
-				vendor=wrs
-				;;
-			-aux*)
-				vendor=apple
-				;;
-			-hms*)
-				vendor=hitachi
-				;;
-			-mpw* | -macos*)
-				vendor=apple
-				;;
-			-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)
-				vendor=atari
-				;;
-			-vos*)
-				vendor=stratus
-				;;
-		esac
-		basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
-		;;
-esac
-
-echo $basic_machine$os
-exit
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "timestamp='"
-# time-stamp-format: "%:y-%02m-%02d"
-# time-stamp-end: "'"
-# End:
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/configure b/rms/org.eclipse.ptp.rm.pbs.proxy/configure
deleted file mode 100755
index 6845b96..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/configure
+++ /dev/null
@@ -1,6122 +0,0 @@
-#! /bin/sh
-# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.61 for org.eclipse.ptp.pbs 4.0.0.
-#
-# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-# 2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
-# This configure script is free software; the Free Software Foundation
-# gives unlimited permission to copy, distribute and modify it.
-## --------------------- ##
-## M4sh Initialization.  ##
-## --------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in
-  *posix*) set -o posix ;;
-esac
-
-fi
-
-
-
-
-# PATH needs CR
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  echo "#! /bin/sh" >conf$$.sh
-  echo  "exit 0"   >>conf$$.sh
-  chmod +x conf$$.sh
-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
-    PATH_SEPARATOR=';'
-  else
-    PATH_SEPARATOR=:
-  fi
-  rm -f conf$$.sh
-fi
-
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
-else
-  as_unset=false
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-as_nl='
-'
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-case $0 in
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  { (exit 1); exit 1; }
-fi
-
-# Work around bugs in pre-3.0 UWIN ksh.
-for as_var in ENV MAIL MAILPATH
-do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
-  fi
-done
-
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-
-# Name of the executable.
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# CDPATH.
-$as_unset CDPATH
-
-
-if test "x$CONFIG_SHELL" = x; then
-  if (eval ":") 2>/dev/null; then
-  as_have_required=yes
-else
-  as_have_required=no
-fi
-
-  if test $as_have_required = yes && 	 (eval ":
-(as_func_return () {
-  (exit \$1)
-}
-as_func_success () {
-  as_func_return 0
-}
-as_func_failure () {
-  as_func_return 1
-}
-as_func_ret_success () {
-  return 0
-}
-as_func_ret_failure () {
-  return 1
-}
-
-exitcode=0
-if as_func_success; then
-  :
-else
-  exitcode=1
-  echo as_func_success failed.
-fi
-
-if as_func_failure; then
-  exitcode=1
-  echo as_func_failure succeeded.
-fi
-
-if as_func_ret_success; then
-  :
-else
-  exitcode=1
-  echo as_func_ret_success failed.
-fi
-
-if as_func_ret_failure; then
-  exitcode=1
-  echo as_func_ret_failure succeeded.
-fi
-
-if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
-  :
-else
-  exitcode=1
-  echo positional parameters were not saved.
-fi
-
-test \$exitcode = 0) || { (exit 1); exit 1; }
-
-(
-  as_lineno_1=\$LINENO
-  as_lineno_2=\$LINENO
-  test \"x\$as_lineno_1\" != \"x\$as_lineno_2\" &&
-  test \"x\`expr \$as_lineno_1 + 1\`\" = \"x\$as_lineno_2\") || { (exit 1); exit 1; }
-") 2> /dev/null; then
-  :
-else
-  as_candidate_shells=
-    as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  case $as_dir in
-	 /*)
-	   for as_base in sh bash ksh sh5; do
-	     as_candidate_shells="$as_candidate_shells $as_dir/$as_base"
-	   done;;
-       esac
-done
-IFS=$as_save_IFS
-
-
-      for as_shell in $as_candidate_shells $SHELL; do
-	 # Try only shells that exist, to save several forks.
-	 if { test -f "$as_shell" || test -f "$as_shell.exe"; } &&
-		{ ("$as_shell") 2> /dev/null <<\_ASEOF
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in
-  *posix*) set -o posix ;;
-esac
-
-fi
-
-
-:
-_ASEOF
-}; then
-  CONFIG_SHELL=$as_shell
-	       as_have_required=yes
-	       if { "$as_shell" 2> /dev/null <<\_ASEOF
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in
-  *posix*) set -o posix ;;
-esac
-
-fi
-
-
-:
-(as_func_return () {
-  (exit $1)
-}
-as_func_success () {
-  as_func_return 0
-}
-as_func_failure () {
-  as_func_return 1
-}
-as_func_ret_success () {
-  return 0
-}
-as_func_ret_failure () {
-  return 1
-}
-
-exitcode=0
-if as_func_success; then
-  :
-else
-  exitcode=1
-  echo as_func_success failed.
-fi
-
-if as_func_failure; then
-  exitcode=1
-  echo as_func_failure succeeded.
-fi
-
-if as_func_ret_success; then
-  :
-else
-  exitcode=1
-  echo as_func_ret_success failed.
-fi
-
-if as_func_ret_failure; then
-  exitcode=1
-  echo as_func_ret_failure succeeded.
-fi
-
-if ( set x; as_func_ret_success y && test x = "$1" ); then
-  :
-else
-  exitcode=1
-  echo positional parameters were not saved.
-fi
-
-test $exitcode = 0) || { (exit 1); exit 1; }
-
-(
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2") || { (exit 1); exit 1; }
-
-_ASEOF
-}; then
-  break
-fi
-
-fi
-
-      done
-
-      if test "x$CONFIG_SHELL" != x; then
-  for as_var in BASH_ENV ENV
-        do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
-        done
-        export CONFIG_SHELL
-        exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"}
-fi
-
-
-    if test $as_have_required = no; then
-  echo This script requires a shell more modern than all the
-      echo shells that I found on your system.  Please install a
-      echo modern shell, or manually run the script under such a
-      echo shell if you do have one.
-      { (exit 1); exit 1; }
-fi
-
-
-fi
-
-fi
-
-
-
-(eval "as_func_return () {
-  (exit \$1)
-}
-as_func_success () {
-  as_func_return 0
-}
-as_func_failure () {
-  as_func_return 1
-}
-as_func_ret_success () {
-  return 0
-}
-as_func_ret_failure () {
-  return 1
-}
-
-exitcode=0
-if as_func_success; then
-  :
-else
-  exitcode=1
-  echo as_func_success failed.
-fi
-
-if as_func_failure; then
-  exitcode=1
-  echo as_func_failure succeeded.
-fi
-
-if as_func_ret_success; then
-  :
-else
-  exitcode=1
-  echo as_func_ret_success failed.
-fi
-
-if as_func_ret_failure; then
-  exitcode=1
-  echo as_func_ret_failure succeeded.
-fi
-
-if ( set x; as_func_ret_success y && test x = \"\$1\" ); then
-  :
-else
-  exitcode=1
-  echo positional parameters were not saved.
-fi
-
-test \$exitcode = 0") || {
-  echo No shell found that supports shell functions.
-  echo Please tell autoconf@gnu.org about your system,
-  echo including any error possibly output before this
-  echo message
-}
-
-
-
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
-
-  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
-  # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line after each line using $LINENO; the second 'sed'
-  # does the real work.  The second script uses 'N' to pair each
-  # line-number line with the line containing $LINENO, and appends
-  # trailing '-' during substitution so that $LINENO is not a special
-  # case at line end.
-  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # scripts with optimization help from Paolo Bonzini.  Blame Lee
-  # E. McMahon (1931-1989) for sed's syntax.  :-)
-  sed -n '
-    p
-    /[$]LINENO/=
-  ' <$as_myself |
-    sed '
-      s/[$]LINENO.*/&-/
-      t lineno
-      b
-      :lineno
-      N
-      :loop
-      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
-      t loop
-      s/-\n.*//
-    ' >$as_me.lineno &&
-  chmod +x "$as_me.lineno" ||
-    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
-   { (exit 1); exit 1; }; }
-
-  # Don't try to exec as it changes $[0], causing all sort of problems
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensitive to this).
-  . "./$as_me.lineno"
-  # Exit status is that of the last command.
-  exit
-}
-
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in
--n*)
-  case `echo 'x\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  *)   ECHO_C='\c';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir
-fi
-echo >conf$$.file
-if ln -s conf$$.file conf$$ 2>/dev/null; then
-  as_ln_s='ln -s'
-  # ... but there are two gotchas:
-  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-  # In both cases, we have to default to `cp -p'.
-  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-    as_ln_s='cp -p'
-elif ln conf$$.file conf$$ 2>/dev/null; then
-  as_ln_s=ln
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p=:
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-        test -d "$1/.";
-      else
-	case $1 in
-        -*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-
-exec 7<&0 </dev/null 6>&1
-
-# Name of the host.
-# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
-# so uname gets run too.
-ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
-
-#
-# Initializations.
-#
-ac_default_prefix=/usr/local
-ac_clean_files=
-ac_config_libobj_dir=.
-LIBOBJS=
-cross_compiling=no
-subdirs=
-MFLAGS=
-MAKEFLAGS=
-SHELL=${CONFIG_SHELL-/bin/sh}
-
-# Identity of this package.
-PACKAGE_NAME='org.eclipse.ptp.pbs'
-PACKAGE_TARNAME='org-eclipse-ptp-pbs'
-PACKAGE_VERSION='4.0.0'
-PACKAGE_STRING='org.eclipse.ptp.pbs 4.0.0'
-PACKAGE_BUGREPORT=''
-
-ac_unique_file="src/ptp_pbs_proxy.c"
-# Factoring default headers for most tests.
-ac_includes_default="\
-#include <stdio.h>
-#ifdef HAVE_SYS_TYPES_H
-# include <sys/types.h>
-#endif
-#ifdef HAVE_SYS_STAT_H
-# include <sys/stat.h>
-#endif
-#ifdef STDC_HEADERS
-# include <stdlib.h>
-# include <stddef.h>
-#else
-# ifdef HAVE_STDLIB_H
-#  include <stdlib.h>
-# endif
-#endif
-#ifdef HAVE_STRING_H
-# if !defined STDC_HEADERS && defined HAVE_MEMORY_H
-#  include <memory.h>
-# endif
-# include <string.h>
-#endif
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
-#ifdef HAVE_INTTYPES_H
-# include <inttypes.h>
-#endif
-#ifdef HAVE_STDINT_H
-# include <stdint.h>
-#endif
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif"
-
-ac_subst_vars='SHELL
-PATH_SEPARATOR
-PACKAGE_NAME
-PACKAGE_TARNAME
-PACKAGE_VERSION
-PACKAGE_STRING
-PACKAGE_BUGREPORT
-exec_prefix
-prefix
-program_transform_name
-bindir
-sbindir
-libexecdir
-datarootdir
-datadir
-sysconfdir
-sharedstatedir
-localstatedir
-includedir
-oldincludedir
-docdir
-infodir
-htmldir
-dvidir
-pdfdir
-psdir
-libdir
-localedir
-mandir
-DEFS
-ECHO_C
-ECHO_N
-ECHO_T
-LIBS
-build_alias
-host_alias
-target_alias
-INSTALL_PROGRAM
-INSTALL_SCRIPT
-INSTALL_DATA
-am__isrc
-CYGPATH_W
-PACKAGE
-VERSION
-ACLOCAL
-AUTOCONF
-AUTOMAKE
-AUTOHEADER
-MAKEINFO
-install_sh
-STRIP
-INSTALL_STRIP_PROGRAM
-mkdir_p
-AWK
-SET_MAKE
-am__leading_dot
-AMTAR
-am__tar
-am__untar
-build
-build_cpu
-build_vendor
-build_os
-PBSDIR
-CC
-CFLAGS
-LDFLAGS
-CPPFLAGS
-ac_ct_CC
-EXEEXT
-OBJEXT
-DEPDIR
-am__include
-am__quote
-AMDEP_TRUE
-AMDEP_FALSE
-AMDEPBACKSLASH
-CCDEPMODE
-am__fastdepCC_TRUE
-am__fastdepCC_FALSE
-RANLIB
-CPP
-GREP
-EGREP
-LIBOBJS
-LTLIBOBJS'
-ac_subst_files=''
-      ac_precious_vars='build_alias
-host_alias
-target_alias
-CC
-CFLAGS
-LDFLAGS
-LIBS
-CPPFLAGS
-CPP'
-
-
-# Initialize some variables set by options.
-ac_init_help=
-ac_init_version=false
-# The variables have the same names as the options, with
-# dashes changed to underlines.
-cache_file=/dev/null
-exec_prefix=NONE
-no_create=
-no_recursion=
-prefix=NONE
-program_prefix=NONE
-program_suffix=NONE
-program_transform_name=s,x,x,
-silent=
-site=
-srcdir=
-verbose=
-x_includes=NONE
-x_libraries=NONE
-
-# Installation directory options.
-# These are left unexpanded so users can "make install exec_prefix=/foo"
-# and all the variables that are supposed to be based on exec_prefix
-# by default will actually change.
-# Use braces instead of parens because sh, perl, etc. also accept them.
-# (The list follows the same order as the GNU Coding Standards.)
-bindir='${exec_prefix}/bin'
-sbindir='${exec_prefix}/sbin'
-libexecdir='${exec_prefix}/libexec'
-datarootdir='${prefix}/share'
-datadir='${datarootdir}'
-sysconfdir='${prefix}/etc'
-sharedstatedir='${prefix}/com'
-localstatedir='${prefix}/var'
-includedir='${prefix}/include'
-oldincludedir='/usr/include'
-docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
-infodir='${datarootdir}/info'
-htmldir='${docdir}'
-dvidir='${docdir}'
-pdfdir='${docdir}'
-psdir='${docdir}'
-libdir='${exec_prefix}/lib'
-localedir='${datarootdir}/locale'
-mandir='${datarootdir}/man'
-
-ac_prev=
-ac_dashdash=
-for ac_option
-do
-  # If the previous option needs an argument, assign it.
-  if test -n "$ac_prev"; then
-    eval $ac_prev=\$ac_option
-    ac_prev=
-    continue
-  fi
-
-  case $ac_option in
-  *=*)	ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;;
-  *)	ac_optarg=yes ;;
-  esac
-
-  # Accept the important Cygnus configure options, so we can diagnose typos.
-
-  case $ac_dashdash$ac_option in
-  --)
-    ac_dashdash=yes ;;
-
-  -bindir | --bindir | --bindi | --bind | --bin | --bi)
-    ac_prev=bindir ;;
-  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
-    bindir=$ac_optarg ;;
-
-  -build | --build | --buil | --bui | --bu)
-    ac_prev=build_alias ;;
-  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
-    build_alias=$ac_optarg ;;
-
-  -cache-file | --cache-file | --cache-fil | --cache-fi \
-  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
-    ac_prev=cache_file ;;
-  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
-  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
-    cache_file=$ac_optarg ;;
-
-  --config-cache | -C)
-    cache_file=config.cache ;;
-
-  -datadir | --datadir | --datadi | --datad)
-    ac_prev=datadir ;;
-  -datadir=* | --datadir=* | --datadi=* | --datad=*)
-    datadir=$ac_optarg ;;
-
-  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \
-  | --dataroo | --dataro | --datar)
-    ac_prev=datarootdir ;;
-  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \
-  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)
-    datarootdir=$ac_optarg ;;
-
-  -disable-* | --disable-*)
-    ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
-   { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
-    eval enable_$ac_feature=no ;;
-
-  -docdir | --docdir | --docdi | --doc | --do)
-    ac_prev=docdir ;;
-  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)
-    docdir=$ac_optarg ;;
-
-  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)
-    ac_prev=dvidir ;;
-  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)
-    dvidir=$ac_optarg ;;
-
-  -enable-* | --enable-*)
-    ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_feature" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid feature name: $ac_feature" >&2
-   { (exit 1); exit 1; }; }
-    ac_feature=`echo $ac_feature | sed 's/[-.]/_/g'`
-    eval enable_$ac_feature=\$ac_optarg ;;
-
-  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
-  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
-  | --exec | --exe | --ex)
-    ac_prev=exec_prefix ;;
-  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
-  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
-  | --exec=* | --exe=* | --ex=*)
-    exec_prefix=$ac_optarg ;;
-
-  -gas | --gas | --ga | --g)
-    # Obsolete; use --with-gas.
-    with_gas=yes ;;
-
-  -help | --help | --hel | --he | -h)
-    ac_init_help=long ;;
-  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
-    ac_init_help=recursive ;;
-  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
-    ac_init_help=short ;;
-
-  -host | --host | --hos | --ho)
-    ac_prev=host_alias ;;
-  -host=* | --host=* | --hos=* | --ho=*)
-    host_alias=$ac_optarg ;;
-
-  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)
-    ac_prev=htmldir ;;
-  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \
-  | --ht=*)
-    htmldir=$ac_optarg ;;
-
-  -includedir | --includedir | --includedi | --included | --include \
-  | --includ | --inclu | --incl | --inc)
-    ac_prev=includedir ;;
-  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
-  | --includ=* | --inclu=* | --incl=* | --inc=*)
-    includedir=$ac_optarg ;;
-
-  -infodir | --infodir | --infodi | --infod | --info | --inf)
-    ac_prev=infodir ;;
-  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
-    infodir=$ac_optarg ;;
-
-  -libdir | --libdir | --libdi | --libd)
-    ac_prev=libdir ;;
-  -libdir=* | --libdir=* | --libdi=* | --libd=*)
-    libdir=$ac_optarg ;;
-
-  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
-  | --libexe | --libex | --libe)
-    ac_prev=libexecdir ;;
-  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
-  | --libexe=* | --libex=* | --libe=*)
-    libexecdir=$ac_optarg ;;
-
-  -localedir | --localedir | --localedi | --localed | --locale)
-    ac_prev=localedir ;;
-  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)
-    localedir=$ac_optarg ;;
-
-  -localstatedir | --localstatedir | --localstatedi | --localstated \
-  | --localstate | --localstat | --localsta | --localst | --locals)
-    ac_prev=localstatedir ;;
-  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
-  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)
-    localstatedir=$ac_optarg ;;
-
-  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
-    ac_prev=mandir ;;
-  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
-    mandir=$ac_optarg ;;
-
-  -nfp | --nfp | --nf)
-    # Obsolete; use --without-fp.
-    with_fp=no ;;
-
-  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
-  | --no-cr | --no-c | -n)
-    no_create=yes ;;
-
-  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
-  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
-    no_recursion=yes ;;
-
-  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
-  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
-  | --oldin | --oldi | --old | --ol | --o)
-    ac_prev=oldincludedir ;;
-  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
-  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
-  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
-    oldincludedir=$ac_optarg ;;
-
-  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
-    ac_prev=prefix ;;
-  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
-    prefix=$ac_optarg ;;
-
-  -program-prefix | --program-prefix | --program-prefi | --program-pref \
-  | --program-pre | --program-pr | --program-p)
-    ac_prev=program_prefix ;;
-  -program-prefix=* | --program-prefix=* | --program-prefi=* \
-  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
-    program_prefix=$ac_optarg ;;
-
-  -program-suffix | --program-suffix | --program-suffi | --program-suff \
-  | --program-suf | --program-su | --program-s)
-    ac_prev=program_suffix ;;
-  -program-suffix=* | --program-suffix=* | --program-suffi=* \
-  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
-    program_suffix=$ac_optarg ;;
-
-  -program-transform-name | --program-transform-name \
-  | --program-transform-nam | --program-transform-na \
-  | --program-transform-n | --program-transform- \
-  | --program-transform | --program-transfor \
-  | --program-transfo | --program-transf \
-  | --program-trans | --program-tran \
-  | --progr-tra | --program-tr | --program-t)
-    ac_prev=program_transform_name ;;
-  -program-transform-name=* | --program-transform-name=* \
-  | --program-transform-nam=* | --program-transform-na=* \
-  | --program-transform-n=* | --program-transform-=* \
-  | --program-transform=* | --program-transfor=* \
-  | --program-transfo=* | --program-transf=* \
-  | --program-trans=* | --program-tran=* \
-  | --progr-tra=* | --program-tr=* | --program-t=*)
-    program_transform_name=$ac_optarg ;;
-
-  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)
-    ac_prev=pdfdir ;;
-  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)
-    pdfdir=$ac_optarg ;;
-
-  -psdir | --psdir | --psdi | --psd | --ps)
-    ac_prev=psdir ;;
-  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)
-    psdir=$ac_optarg ;;
-
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil)
-    silent=yes ;;
-
-  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
-    ac_prev=sbindir ;;
-  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
-  | --sbi=* | --sb=*)
-    sbindir=$ac_optarg ;;
-
-  -sharedstatedir | --sharedstatedir | --sharedstatedi \
-  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
-  | --sharedst | --shareds | --shared | --share | --shar \
-  | --sha | --sh)
-    ac_prev=sharedstatedir ;;
-  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
-  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
-  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
-  | --sha=* | --sh=*)
-    sharedstatedir=$ac_optarg ;;
-
-  -site | --site | --sit)
-    ac_prev=site ;;
-  -site=* | --site=* | --sit=*)
-    site=$ac_optarg ;;
-
-  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
-    ac_prev=srcdir ;;
-  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
-    srcdir=$ac_optarg ;;
-
-  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
-  | --syscon | --sysco | --sysc | --sys | --sy)
-    ac_prev=sysconfdir ;;
-  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
-  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
-    sysconfdir=$ac_optarg ;;
-
-  -target | --target | --targe | --targ | --tar | --ta | --t)
-    ac_prev=target_alias ;;
-  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
-    target_alias=$ac_optarg ;;
-
-  -v | -verbose | --verbose | --verbos | --verbo | --verb)
-    verbose=yes ;;
-
-  -version | --version | --versio | --versi | --vers | -V)
-    ac_init_version=: ;;
-
-  -with-* | --with-*)
-    ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid package name: $ac_package" >&2
-   { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
-    eval with_$ac_package=\$ac_optarg ;;
-
-  -without-* | --without-*)
-    ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_package" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid package name: $ac_package" >&2
-   { (exit 1); exit 1; }; }
-    ac_package=`echo $ac_package | sed 's/[-.]/_/g'`
-    eval with_$ac_package=no ;;
-
-  --x)
-    # Obsolete; use --with-x.
-    with_x=yes ;;
-
-  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
-  | --x-incl | --x-inc | --x-in | --x-i)
-    ac_prev=x_includes ;;
-  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
-  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
-    x_includes=$ac_optarg ;;
-
-  -x-libraries | --x-libraries | --x-librarie | --x-librari \
-  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
-    ac_prev=x_libraries ;;
-  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
-  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
-    x_libraries=$ac_optarg ;;
-
-  -*) { echo "$as_me: error: unrecognized option: $ac_option
-Try \`$0 --help' for more information." >&2
-   { (exit 1); exit 1; }; }
-    ;;
-
-  *=*)
-    ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
-    # Reject names that are not valid shell variable names.
-    expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
-      { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
-   { (exit 1); exit 1; }; }
-    eval $ac_envvar=\$ac_optarg
-    export $ac_envvar ;;
-
-  *)
-    # FIXME: should be removed in autoconf 3.0.
-    echo "$as_me: WARNING: you should use --build, --host, --target" >&2
-    expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
-      echo "$as_me: WARNING: invalid host type: $ac_option" >&2
-    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
-    ;;
-
-  esac
-done
-
-if test -n "$ac_prev"; then
-  ac_option=--`echo $ac_prev | sed 's/_/-/g'`
-  { echo "$as_me: error: missing argument to $ac_option" >&2
-   { (exit 1); exit 1; }; }
-fi
-
-# Be sure to have absolute directory names.
-for ac_var in	exec_prefix prefix bindir sbindir libexecdir datarootdir \
-		datadir sysconfdir sharedstatedir localstatedir includedir \
-		oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
-		libdir localedir mandir
-do
-  eval ac_val=\$$ac_var
-  case $ac_val in
-    [\\/$]* | ?:[\\/]* )  continue;;
-    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;
-  esac
-  { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2
-   { (exit 1); exit 1; }; }
-done
-
-# There might be people who depend on the old broken behavior: `$host'
-# used to hold the argument of --host etc.
-# FIXME: To remove some day.
-build=$build_alias
-host=$host_alias
-target=$target_alias
-
-# FIXME: To remove some day.
-if test "x$host_alias" != x; then
-  if test "x$build_alias" = x; then
-    cross_compiling=maybe
-    echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
-    If a cross compiler is detected then cross compile mode will be used." >&2
-  elif test "x$build_alias" != "x$host_alias"; then
-    cross_compiling=yes
-  fi
-fi
-
-ac_tool_prefix=
-test -n "$host_alias" && ac_tool_prefix=$host_alias-
-
-test "$silent" = yes && exec 6>/dev/null
-
-
-ac_pwd=`pwd` && test -n "$ac_pwd" &&
-ac_ls_di=`ls -di .` &&
-ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` ||
-  { echo "$as_me: error: Working directory cannot be determined" >&2
-   { (exit 1); exit 1; }; }
-test "X$ac_ls_di" = "X$ac_pwd_ls_di" ||
-  { echo "$as_me: error: pwd does not report name of working directory" >&2
-   { (exit 1); exit 1; }; }
-
-
-# Find the source files, if location was not specified.
-if test -z "$srcdir"; then
-  ac_srcdir_defaulted=yes
-  # Try the directory containing this script, then the parent directory.
-  ac_confdir=`$as_dirname -- "$0" ||
-$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$0" : 'X\(//\)[^/]' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-echo X"$0" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  srcdir=$ac_confdir
-  if test ! -r "$srcdir/$ac_unique_file"; then
-    srcdir=..
-  fi
-else
-  ac_srcdir_defaulted=no
-fi
-if test ! -r "$srcdir/$ac_unique_file"; then
-  test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .."
-  { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2
-   { (exit 1); exit 1; }; }
-fi
-ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work"
-ac_abs_confdir=`(
-	cd "$srcdir" && test -r "./$ac_unique_file" || { echo "$as_me: error: $ac_msg" >&2
-   { (exit 1); exit 1; }; }
-	pwd)`
-# When building in place, set srcdir=.
-if test "$ac_abs_confdir" = "$ac_pwd"; then
-  srcdir=.
-fi
-# Remove unnecessary trailing slashes from srcdir.
-# Double slashes in file names in object file debugging info
-# mess up M-x gdb in Emacs.
-case $srcdir in
-*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;;
-esac
-for ac_var in $ac_precious_vars; do
-  eval ac_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_env_${ac_var}_value=\$${ac_var}
-  eval ac_cv_env_${ac_var}_set=\${${ac_var}+set}
-  eval ac_cv_env_${ac_var}_value=\$${ac_var}
-done
-
-#
-# Report the --help message.
-#
-if test "$ac_init_help" = "long"; then
-  # Omit some internal or obsolete options to make the list less imposing.
-  # This message is too long to be a string in the A/UX 3.1 sh.
-  cat <<_ACEOF
-\`configure' configures org.eclipse.ptp.pbs 4.0.0 to adapt to many kinds of systems.
-
-Usage: $0 [OPTION]... [VAR=VALUE]...
-
-To assign environment variables (e.g., CC, CFLAGS...), specify them as
-VAR=VALUE.  See below for descriptions of some of the useful variables.
-
-Defaults for the options are specified in brackets.
-
-Configuration:
-  -h, --help              display this help and exit
-      --help=short        display options specific to this package
-      --help=recursive    display the short help of all the included packages
-  -V, --version           display version information and exit
-  -q, --quiet, --silent   do not print \`checking...' messages
-      --cache-file=FILE   cache test results in FILE [disabled]
-  -C, --config-cache      alias for \`--cache-file=config.cache'
-  -n, --no-create         do not create output files
-      --srcdir=DIR        find the sources in DIR [configure dir or \`..']
-
-Installation directories:
-  --prefix=PREFIX         install architecture-independent files in PREFIX
-			  [$ac_default_prefix]
-  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
-			  [PREFIX]
-
-By default, \`make install' will install all the files in
-\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc.  You can specify
-an installation prefix other than \`$ac_default_prefix' using \`--prefix',
-for instance \`--prefix=\$HOME'.
-
-For better control, use the options below.
-
-Fine tuning of the installation directories:
-  --bindir=DIR           user executables [EPREFIX/bin]
-  --sbindir=DIR          system admin executables [EPREFIX/sbin]
-  --libexecdir=DIR       program executables [EPREFIX/libexec]
-  --sysconfdir=DIR       read-only single-machine data [PREFIX/etc]
-  --sharedstatedir=DIR   modifiable architecture-independent data [PREFIX/com]
-  --localstatedir=DIR    modifiable single-machine data [PREFIX/var]
-  --libdir=DIR           object code libraries [EPREFIX/lib]
-  --includedir=DIR       C header files [PREFIX/include]
-  --oldincludedir=DIR    C header files for non-gcc [/usr/include]
-  --datarootdir=DIR      read-only arch.-independent data root [PREFIX/share]
-  --datadir=DIR          read-only architecture-independent data [DATAROOTDIR]
-  --infodir=DIR          info documentation [DATAROOTDIR/info]
-  --localedir=DIR        locale-dependent data [DATAROOTDIR/locale]
-  --mandir=DIR           man documentation [DATAROOTDIR/man]
-  --docdir=DIR           documentation root [DATAROOTDIR/doc/org-eclipse-ptp-pbs]
-  --htmldir=DIR          html documentation [DOCDIR]
-  --dvidir=DIR           dvi documentation [DOCDIR]
-  --pdfdir=DIR           pdf documentation [DOCDIR]
-  --psdir=DIR            ps documentation [DOCDIR]
-_ACEOF
-
-  cat <<\_ACEOF
-
-Program names:
-  --program-prefix=PREFIX            prepend PREFIX to installed program names
-  --program-suffix=SUFFIX            append SUFFIX to installed program names
-  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names
-
-System types:
-  --build=BUILD     configure for building on BUILD [guessed]
-_ACEOF
-fi
-
-if test -n "$ac_init_help"; then
-  case $ac_init_help in
-     short | recursive ) echo "Configuration of org.eclipse.ptp.pbs 4.0.0:";;
-   esac
-  cat <<\_ACEOF
-
-Optional Features:
-  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)
-  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]
-  --disable-dependency-tracking  speeds up one-time build
-  --enable-dependency-tracking   do not reject slow dependency extractors
-
-Optional Packages:
-  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
-  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)
-  --with-pbs              Specify the top dir of installed PBS rms.[REQUIRED]
-
-Some influential environment variables:
-  CC          C compiler command
-  CFLAGS      C compiler flags
-  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a
-              nonstandard directory <lib dir>
-  LIBS        libraries to pass to the linker, e.g. -l<library>
-  CPPFLAGS    C/C++/Objective C preprocessor flags, e.g. -I<include dir> if
-              you have headers in a nonstandard directory <include dir>
-  CPP         C preprocessor
-
-Use these variables to override the choices made by `configure' or to help
-it to find libraries and programs with nonstandard names/locations.
-
-_ACEOF
-ac_status=$?
-fi
-
-if test "$ac_init_help" = "recursive"; then
-  # If there are subdirs, report their specific --help.
-  for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue
-    test -d "$ac_dir" || continue
-    ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-    cd "$ac_dir" || { ac_status=$?; continue; }
-    # Check for guested configure.
-    if test -f "$ac_srcdir/configure.gnu"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure.gnu" --help=recursive
-    elif test -f "$ac_srcdir/configure"; then
-      echo &&
-      $SHELL "$ac_srcdir/configure" --help=recursive
-    else
-      echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2
-    fi || ac_status=$?
-    cd "$ac_pwd" || { ac_status=$?; break; }
-  done
-fi
-
-test -n "$ac_init_help" && exit $ac_status
-if $ac_init_version; then
-  cat <<\_ACEOF
-org.eclipse.ptp.pbs configure 4.0.0
-generated by GNU Autoconf 2.61
-
-Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
-2002, 2003, 2004, 2005, 2006 Free Software Foundation, Inc.
-This configure script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it.
-_ACEOF
-  exit
-fi
-cat >config.log <<_ACEOF
-This file contains any messages produced by compilers while
-running configure, to aid debugging if configure makes a mistake.
-
-It was created by org.eclipse.ptp.pbs $as_me 4.0.0, which was
-generated by GNU Autoconf 2.61.  Invocation command line was
-
-  $ $0 $@
-
-_ACEOF
-exec 5>>config.log
-{
-cat <<_ASUNAME
-## --------- ##
-## Platform. ##
-## --------- ##
-
-hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
-uname -m = `(uname -m) 2>/dev/null || echo unknown`
-uname -r = `(uname -r) 2>/dev/null || echo unknown`
-uname -s = `(uname -s) 2>/dev/null || echo unknown`
-uname -v = `(uname -v) 2>/dev/null || echo unknown`
-
-/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
-/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`
-
-/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`
-/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`
-/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
-/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`
-/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`
-/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`
-/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`
-
-_ASUNAME
-
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  echo "PATH: $as_dir"
-done
-IFS=$as_save_IFS
-
-} >&5
-
-cat >&5 <<_ACEOF
-
-
-## ----------- ##
-## Core tests. ##
-## ----------- ##
-
-_ACEOF
-
-
-# Keep a trace of the command line.
-# Strip out --no-create and --no-recursion so they do not pile up.
-# Strip out --silent because we don't want to record it for future runs.
-# Also quote any args containing shell meta-characters.
-# Make two passes to allow for proper duplicate-argument suppression.
-ac_configure_args=
-ac_configure_args0=
-ac_configure_args1=
-ac_must_keep_next=false
-for ac_pass in 1 2
-do
-  for ac_arg
-  do
-    case $ac_arg in
-    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;
-    -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-    | -silent | --silent | --silen | --sile | --sil)
-      continue ;;
-    *\'*)
-      ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;;
-    esac
-    case $ac_pass in
-    1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;;
-    2)
-      ac_configure_args1="$ac_configure_args1 '$ac_arg'"
-      if test $ac_must_keep_next = true; then
-	ac_must_keep_next=false # Got value, back to normal.
-      else
-	case $ac_arg in
-	  *=* | --config-cache | -C | -disable-* | --disable-* \
-	  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \
-	  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \
-	  | -with-* | --with-* | -without-* | --without-* | --x)
-	    case "$ac_configure_args0 " in
-	      "$ac_configure_args1"*" '$ac_arg' "* ) continue ;;
-	    esac
-	    ;;
-	  -* ) ac_must_keep_next=true ;;
-	esac
-      fi
-      ac_configure_args="$ac_configure_args '$ac_arg'"
-      ;;
-    esac
-  done
-done
-$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; }
-$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; }
-
-# When interrupted or exit'd, cleanup temporary files, and complete
-# config.log.  We remove comments because anyway the quotes in there
-# would cause problems or look ugly.
-# WARNING: Use '\'' to represent an apostrophe within the trap.
-# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.
-trap 'exit_status=$?
-  # Save into config.log some information that might help in debugging.
-  {
-    echo
-
-    cat <<\_ASBOX
-## ---------------- ##
-## Cache variables. ##
-## ---------------- ##
-_ASBOX
-    echo
-    # The following way of writing the cache mishandles newlines in values,
-(
-  for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
-echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      *) $as_unset $ac_var ;;
-      esac ;;
-    esac
-  done
-  (set) 2>&1 |
-    case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      sed -n \
-	"s/'\''/'\''\\\\'\'''\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p"
-      ;; #(
-    *)
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-)
-    echo
-
-    cat <<\_ASBOX
-## ----------------- ##
-## Output variables. ##
-## ----------------- ##
-_ASBOX
-    echo
-    for ac_var in $ac_subst_vars
-    do
-      eval ac_val=\$$ac_var
-      case $ac_val in
-      *\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-      esac
-      echo "$ac_var='\''$ac_val'\''"
-    done | sort
-    echo
-
-    if test -n "$ac_subst_files"; then
-      cat <<\_ASBOX
-## ------------------- ##
-## File substitutions. ##
-## ------------------- ##
-_ASBOX
-      echo
-      for ac_var in $ac_subst_files
-      do
-	eval ac_val=\$$ac_var
-	case $ac_val in
-	*\'\''*) ac_val=`echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;;
-	esac
-	echo "$ac_var='\''$ac_val'\''"
-      done | sort
-      echo
-    fi
-
-    if test -s confdefs.h; then
-      cat <<\_ASBOX
-## ----------- ##
-## confdefs.h. ##
-## ----------- ##
-_ASBOX
-      echo
-      cat confdefs.h
-      echo
-    fi
-    test "$ac_signal" != 0 &&
-      echo "$as_me: caught signal $ac_signal"
-    echo "$as_me: exit $exit_status"
-  } >&5
-  rm -f core *.core core.conftest.* &&
-    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&
-    exit $exit_status
-' 0
-for ac_signal in 1 2 13 15; do
-  trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
-done
-ac_signal=0
-
-# confdefs.h avoids OS command line length limits that DEFS can exceed.
-rm -f -r conftest* confdefs.h
-
-# Predefined preprocessor variables.
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_NAME "$PACKAGE_NAME"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_TARNAME "$PACKAGE_TARNAME"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_VERSION "$PACKAGE_VERSION"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_STRING "$PACKAGE_STRING"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT"
-_ACEOF
-
-
-# Let the site file select an alternate cache file if it wants to.
-# Prefer explicitly selected file to automatically selected ones.
-if test -n "$CONFIG_SITE"; then
-  set x "$CONFIG_SITE"
-elif test "x$prefix" != xNONE; then
-  set x "$prefix/share/config.site" "$prefix/etc/config.site"
-else
-  set x "$ac_default_prefix/share/config.site" \
-	"$ac_default_prefix/etc/config.site"
-fi
-shift
-for ac_site_file
-do
-  if test -r "$ac_site_file"; then
-    { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5
-echo "$as_me: loading site script $ac_site_file" >&6;}
-    sed 's/^/| /' "$ac_site_file" >&5
-    . "$ac_site_file"
-  fi
-done
-
-if test -r "$cache_file"; then
-  # Some versions of bash will fail to source /dev/null (special
-  # files actually), so we avoid doing that.
-  if test -f "$cache_file"; then
-    { echo "$as_me:$LINENO: loading cache $cache_file" >&5
-echo "$as_me: loading cache $cache_file" >&6;}
-    case $cache_file in
-      [\\/]* | ?:[\\/]* ) . "$cache_file";;
-      *)                      . "./$cache_file";;
-    esac
-  fi
-else
-  { echo "$as_me:$LINENO: creating cache $cache_file" >&5
-echo "$as_me: creating cache $cache_file" >&6;}
-  >$cache_file
-fi
-
-# Check that the precious variables saved in the cache have kept the same
-# value.
-ac_cache_corrupted=false
-for ac_var in $ac_precious_vars; do
-  eval ac_old_set=\$ac_cv_env_${ac_var}_set
-  eval ac_new_set=\$ac_env_${ac_var}_set
-  eval ac_old_val=\$ac_cv_env_${ac_var}_value
-  eval ac_new_val=\$ac_env_${ac_var}_value
-  case $ac_old_set,$ac_new_set in
-    set,)
-      { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
-echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,set)
-      { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5
-echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
-      ac_cache_corrupted=: ;;
-    ,);;
-    *)
-      if test "x$ac_old_val" != "x$ac_new_val"; then
-	{ echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5
-echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
-	{ echo "$as_me:$LINENO:   former value:  $ac_old_val" >&5
-echo "$as_me:   former value:  $ac_old_val" >&2;}
-	{ echo "$as_me:$LINENO:   current value: $ac_new_val" >&5
-echo "$as_me:   current value: $ac_new_val" >&2;}
-	ac_cache_corrupted=:
-      fi;;
-  esac
-  # Pass precious variables to config.status.
-  if test "$ac_new_set" = set; then
-    case $ac_new_val in
-    *\'*) ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;;
-    *) ac_arg=$ac_var=$ac_new_val ;;
-    esac
-    case " $ac_configure_args " in
-      *" '$ac_arg' "*) ;; # Avoid dups.  Use of quotes ensures accuracy.
-      *) ac_configure_args="$ac_configure_args '$ac_arg'" ;;
-    esac
-  fi
-done
-if $ac_cache_corrupted; then
-  { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5
-echo "$as_me: error: changes in the environment can compromise the build" >&2;}
-  { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
-echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-
-
-am__api_version='1.10'
-
-ac_aux_dir=
-for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
-  if test -f "$ac_dir/install-sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install-sh -c"
-    break
-  elif test -f "$ac_dir/install.sh"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/install.sh -c"
-    break
-  elif test -f "$ac_dir/shtool"; then
-    ac_aux_dir=$ac_dir
-    ac_install_sh="$ac_aux_dir/shtool install -c"
-    break
-  fi
-done
-if test -z "$ac_aux_dir"; then
-  { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&5
-echo "$as_me: error: cannot find install-sh or install.sh in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-# These three variables are undocumented and unsupported,
-# and are intended to be withdrawn in a future Autoconf release.
-# They can cause serious problems if a builder's source tree is in a directory
-# whose full name contains unusual characters.
-ac_config_guess="$SHELL $ac_aux_dir/config.guess"  # Please don't use this var.
-ac_config_sub="$SHELL $ac_aux_dir/config.sub"  # Please don't use this var.
-ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
-
-
-# Find a good install program.  We prefer a C program (faster),
-# so one script is as good as another.  But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AmigaOS /C/install, which installs bootblocks on floppy discs
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# OS/2's system install, which has a completely different semantic
-# ./install, which can be erroneously created by make from ./install.sh.
-{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
-echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
-if test -z "$INSTALL"; then
-if test "${ac_cv_path_install+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in
-  ./ | .// | /cC/* | \
-  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
-  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
-  /usr/ucb/* ) ;;
-  *)
-    # OSF1 and SCO ODT 3.0 have their own names for install.
-    # Don't use installbsd from OSF since it installs stuff as root
-    # by default.
-    for ac_prog in ginstall scoinst install; do
-      for ac_exec_ext in '' $ac_executable_extensions; do
-	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
-	  if test $ac_prog = install &&
-	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # AIX install.  It has an incompatible calling convention.
-	    :
-	  elif test $ac_prog = install &&
-	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # program-specific install script used by HP pwplus--don't use.
-	    :
-	  else
-	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
-	    break 3
-	  fi
-	fi
-      done
-    done
-    ;;
-esac
-done
-IFS=$as_save_IFS
-
-
-fi
-  if test "${ac_cv_path_install+set}" = set; then
-    INSTALL=$ac_cv_path_install
-  else
-    # As a last resort, use the slow shell script.  Don't cache a
-    # value for INSTALL within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the value is a relative name.
-    INSTALL=$ac_install_sh
-  fi
-fi
-{ echo "$as_me:$LINENO: result: $INSTALL" >&5
-echo "${ECHO_T}$INSTALL" >&6; }
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-{ echo "$as_me:$LINENO: checking whether build environment is sane" >&5
-echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6; }
-# Just in case
-sleep 1
-echo timestamp > conftest.file
-# Do `set' in a subshell so we don't clobber the current shell's
-# arguments.  Must try -L first in case configure is actually a
-# symlink; some systems play weird games with the mod time of symlinks
-# (eg FreeBSD returns the mod time of the symlink's containing
-# directory).
-if (
-   set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
-   if test "$*" = "X"; then
-      # -L didn't work.
-      set X `ls -t $srcdir/configure conftest.file`
-   fi
-   rm -f conftest.file
-   if test "$*" != "X $srcdir/configure conftest.file" \
-      && test "$*" != "X conftest.file $srcdir/configure"; then
-
-      # If neither matched, then we have a broken ls.  This can happen
-      # if, for instance, CONFIG_SHELL is bash and it inherits a
-      # broken ls alias from the environment.  This has actually
-      # happened.  Such a system could not be considered "sane".
-      { { echo "$as_me:$LINENO: error: ls -t appears to fail.  Make sure there is not a broken
-alias in your environment" >&5
-echo "$as_me: error: ls -t appears to fail.  Make sure there is not a broken
-alias in your environment" >&2;}
-   { (exit 1); exit 1; }; }
-   fi
-
-   test "$2" = conftest.file
-   )
-then
-   # Ok.
-   :
-else
-   { { echo "$as_me:$LINENO: error: newly created file is older than distributed files!
-Check your system clock" >&5
-echo "$as_me: error: newly created file is older than distributed files!
-Check your system clock" >&2;}
-   { (exit 1); exit 1; }; }
-fi
-{ echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
-test "$program_prefix" != NONE &&
-  program_transform_name="s&^&$program_prefix&;$program_transform_name"
-# Use a double $ so make ignores it.
-test "$program_suffix" != NONE &&
-  program_transform_name="s&\$&$program_suffix&;$program_transform_name"
-# Double any \ or $.  echo might interpret backslashes.
-# By default was `s,x,x', remove it if useless.
-cat <<\_ACEOF >conftest.sed
-s/[\\$]/&&/g;s/;s,x,x,$//
-_ACEOF
-program_transform_name=`echo $program_transform_name | sed -f conftest.sed`
-rm -f conftest.sed
-
-# expand $ac_aux_dir to an absolute path
-am_aux_dir=`cd $ac_aux_dir && pwd`
-
-test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
-# Use eval to expand $SHELL
-if eval "$MISSING --run true"; then
-  am_missing_run="$MISSING --run "
-else
-  am_missing_run=
-  { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5
-echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;}
-fi
-
-{ echo "$as_me:$LINENO: checking for a thread-safe mkdir -p" >&5
-echo $ECHO_N "checking for a thread-safe mkdir -p... $ECHO_C" >&6; }
-if test -z "$MKDIR_P"; then
-  if test "${ac_cv_path_mkdir+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_prog in mkdir gmkdir; do
-	 for ac_exec_ext in '' $ac_executable_extensions; do
-	   { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; } || continue
-	   case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #(
-	     'mkdir (GNU coreutils) '* | \
-	     'mkdir (coreutils) '* | \
-	     'mkdir (fileutils) '4.1*)
-	       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext
-	       break 3;;
-	   esac
-	 done
-       done
-done
-IFS=$as_save_IFS
-
-fi
-
-  if test "${ac_cv_path_mkdir+set}" = set; then
-    MKDIR_P="$ac_cv_path_mkdir -p"
-  else
-    # As a last resort, use the slow shell script.  Don't cache a
-    # value for MKDIR_P within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the value is a relative name.
-    test -d ./--version && rmdir ./--version
-    MKDIR_P="$ac_install_sh -d"
-  fi
-fi
-{ echo "$as_me:$LINENO: result: $MKDIR_P" >&5
-echo "${ECHO_T}$MKDIR_P" >&6; }
-
-mkdir_p="$MKDIR_P"
-case $mkdir_p in
-  [\\/$]* | ?:[\\/]*) ;;
-  */*) mkdir_p="\$(top_builddir)/$mkdir_p" ;;
-esac
-
-for ac_prog in gawk mawk nawk awk
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_AWK+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$AWK"; then
-  ac_cv_prog_AWK="$AWK" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_AWK="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-IFS=$as_save_IFS
-
-fi
-fi
-AWK=$ac_cv_prog_AWK
-if test -n "$AWK"; then
-  { echo "$as_me:$LINENO: result: $AWK" >&5
-echo "${ECHO_T}$AWK" >&6; }
-else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
-fi
-
-
-  test -n "$AWK" && break
-done
-
-{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
-set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.make <<\_ACEOF
-SHELL = /bin/sh
-all:
-	@echo '@@@%%%=$(MAKE)=@@@%%%'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-case `${MAKE-make} -f conftest.make 2>/dev/null` in
-  *@@@%%%=?*=@@@%%%*)
-    eval ac_cv_prog_make_${ac_make}_set=yes;;
-  *)
-    eval ac_cv_prog_make_${ac_make}_set=no;;
-esac
-rm -f conftest.make
-fi
-if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
-  { echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
-  SET_MAKE=
-else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
-  SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-rm -rf .tst 2>/dev/null
-mkdir .tst 2>/dev/null
-if test -d .tst; then
-  am__leading_dot=.
-else
-  am__leading_dot=_
-fi
-rmdir .tst 2>/dev/null
-
-if test "`cd $srcdir && pwd`" != "`pwd`"; then
-  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output
-  # is not polluted with repeated "-I."
-  am__isrc=' -I$(srcdir)'
-  # test to see if srcdir already configured
-  if test -f $srcdir/config.status; then
-    { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5
-echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;}
-   { (exit 1); exit 1; }; }
-  fi
-fi
-
-# test whether we have cygpath
-if test -z "$CYGPATH_W"; then
-  if (cygpath --version) >/dev/null 2>/dev/null; then
-    CYGPATH_W='cygpath -w'
-  else
-    CYGPATH_W=echo
-  fi
-fi
-
-
-# Define the identity of the package.
- PACKAGE='org-eclipse-ptp-pbs'
- VERSION='4.0.0'
-
-
-cat >>confdefs.h <<_ACEOF
-#define PACKAGE "$PACKAGE"
-_ACEOF
-
-
-cat >>confdefs.h <<_ACEOF
-#define VERSION "$VERSION"
-_ACEOF
-
-# Some tools Automake needs.
-
-ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"}
-
-
-AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"}
-
-
-AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"}
-
-
-AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"}
-
-
-MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"}
-
-install_sh=${install_sh-"\$(SHELL) $am_aux_dir/install-sh"}
-
-# Installed binaries are usually stripped using `strip' when the user
-# run `make install-strip'.  However `strip' might not be the right
-# tool to use in cross-compilation environments, therefore Automake
-# will honor the `STRIP' environment variable to overrule this program.
-if test "$cross_compiling" != no; then
-  if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args.
-set dummy ${ac_tool_prefix}strip; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_STRIP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$STRIP"; then
-  ac_cv_prog_STRIP="$STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_STRIP="${ac_tool_prefix}strip"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-IFS=$as_save_IFS
-
-fi
-fi
-STRIP=$ac_cv_prog_STRIP
-if test -n "$STRIP"; then
-  { echo "$as_me:$LINENO: result: $STRIP" >&5
-echo "${ECHO_T}$STRIP" >&6; }
-else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_STRIP"; then
-  ac_ct_STRIP=$STRIP
-  # Extract the first word of "strip", so it can be a program name with args.
-set dummy strip; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_STRIP"; then
-  ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_STRIP="strip"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP
-if test -n "$ac_ct_STRIP"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5
-echo "${ECHO_T}$ac_ct_STRIP" >&6; }
-else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
-fi
-
-  if test "x$ac_ct_STRIP" = x; then
-    STRIP=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf@gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf@gnu.org." >&2;}
-ac_tool_warned=yes ;;
-esac
-    STRIP=$ac_ct_STRIP
-  fi
-else
-  STRIP="$ac_cv_prog_STRIP"
-fi
-
-fi
-INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s"
-
-# We need awk for the "check" target.  The system "awk" is bad on
-# some platforms.
-# Always define AMTAR for backward compatibility.
-
-AMTAR=${AMTAR-"${am_missing_run}tar"}
-
-am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'
-
-
-
-
-
-
-ac_config_headers="$ac_config_headers config.h"
-
-# Make sure we can run config.sub.
-$SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 ||
-  { { echo "$as_me:$LINENO: error: cannot run $SHELL $ac_aux_dir/config.sub" >&5
-echo "$as_me: error: cannot run $SHELL $ac_aux_dir/config.sub" >&2;}
-   { (exit 1); exit 1; }; }
-
-{ echo "$as_me:$LINENO: checking build system type" >&5
-echo $ECHO_N "checking build system type... $ECHO_C" >&6; }
-if test "${ac_cv_build+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_build_alias=$build_alias
-test "x$ac_build_alias" = x &&
-  ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"`
-test "x$ac_build_alias" = x &&
-  { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5
-echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
-   { (exit 1); exit 1; }; }
-ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` ||
-  { { echo "$as_me:$LINENO: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&5
-echo "$as_me: error: $SHELL $ac_aux_dir/config.sub $ac_build_alias failed" >&2;}
-   { (exit 1); exit 1; }; }
-
-fi
-{ echo "$as_me:$LINENO: result: $ac_cv_build" >&5
-echo "${ECHO_T}$ac_cv_build" >&6; }
-case $ac_cv_build in
-*-*-*) ;;
-*) { { echo "$as_me:$LINENO: error: invalid value of canonical build" >&5
-echo "$as_me: error: invalid value of canonical build" >&2;}
-   { (exit 1); exit 1; }; };;
-esac
-build=$ac_cv_build
-ac_save_IFS=$IFS; IFS='-'
-set x $ac_cv_build
-shift
-build_cpu=$1
-build_vendor=$2
-shift; shift
-# Remember, the first character of IFS is used to create $*,
-# except with old shells:
-build_os=$*
-IFS=$ac_save_IFS
-case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac
-
-
-
-
-UTILS="../org.eclipse.ptp.utils"
-if test ! -d $UTILS; then
-	UTILS="`echo ${UTILS}_${PACKAGE_VERSION}.*`"
-	if test ! -d $UTILS; then
-		{ { echo "$as_me:$LINENO: error: utils directory not found" >&5
-echo "$as_me: error: utils directory not found" >&2;}
-   { (exit 1); exit 1; }; }
-	fi
-fi
-
-PROXY="../org.eclipse.ptp.proxy"
-if test ! -d $PROXY; then
-	PROXY="`echo ${PROXY}_${PACKAGE_VERSION}.*`"
-	if test ! -d $PROXY; then
-		{ { echo "$as_me:$LINENO: error: proxy directory not found" >&5
-echo "$as_me: error: proxy directory not found" >&2;}
-   { (exit 1); exit 1; }; }
-	fi
-fi
-
-
-
-# Check whether --with-pbs was given.
-if test "${with_pbs+set}" = set; then
-  withval=$with_pbs;
-else
-  with_pbs=no
-fi
-
-
-PBSDIR=
-if test "x$with_pbs" != xno; then
-  PBSDIR=$with_pbs
-
-else
-  { { echo "$as_me:$LINENO: error: The top installation directory of PBS must be specified via \"--with-pbs=DIR\"." >&5
-echo "$as_me: error: The top installation directory of PBS must be specified via \"--with-pbs=DIR\"." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}gcc; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}gcc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6; }
-else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_CC"; then
-  ac_ct_CC=$CC
-  # Extract the first word of "gcc", so it can be a program name with args.
-set dummy gcc; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="gcc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6; }
-else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
-fi
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf@gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf@gnu.org." >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-else
-  CC="$ac_cv_prog_CC"
-fi
-
-if test -z "$CC"; then
-          if test -n "$ac_tool_prefix"; then
-    # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
-set dummy ${ac_tool_prefix}cc; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="${ac_tool_prefix}cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6; }
-else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
-fi
-
-
-  fi
-fi
-if test -z "$CC"; then
-  # Extract the first word of "cc", so it can be a program name with args.
-set dummy cc; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-  ac_prog_rejected=no
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then
-       ac_prog_rejected=yes
-       continue
-     fi
-    ac_cv_prog_CC="cc"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-IFS=$as_save_IFS
-
-if test $ac_prog_rejected = yes; then
-  # We found a bogon in the path, so make sure we never use it.
-  set dummy $ac_cv_prog_CC
-  shift
-  if test $# != 0; then
-    # We chose a different compiler from the bogus one.
-    # However, it has the same basename, so the bogon will be chosen
-    # first if we set CC to just the basename; use the full file name.
-    shift
-    ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@"
-  fi
-fi
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6; }
-else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
-fi
-
-
-fi
-if test -z "$CC"; then
-  if test -n "$ac_tool_prefix"; then
-  for ac_prog in cl.exe
-  do
-    # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
-set dummy $ac_tool_prefix$ac_prog; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$CC"; then
-  ac_cv_prog_CC="$CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-IFS=$as_save_IFS
-
-fi
-fi
-CC=$ac_cv_prog_CC
-if test -n "$CC"; then
-  { echo "$as_me:$LINENO: result: $CC" >&5
-echo "${ECHO_T}$CC" >&6; }
-else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
-fi
-
-
-    test -n "$CC" && break
-  done
-fi
-if test -z "$CC"; then
-  ac_ct_CC=$CC
-  for ac_prog in cl.exe
-do
-  # Extract the first word of "$ac_prog", so it can be a program name with args.
-set dummy $ac_prog; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_CC"; then
-  ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_CC="$ac_prog"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_CC=$ac_cv_prog_ac_ct_CC
-if test -n "$ac_ct_CC"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_CC" >&5
-echo "${ECHO_T}$ac_ct_CC" >&6; }
-else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
-fi
-
-
-  test -n "$ac_ct_CC" && break
-done
-
-  if test "x$ac_ct_CC" = x; then
-    CC=""
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf@gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf@gnu.org." >&2;}
-ac_tool_warned=yes ;;
-esac
-    CC=$ac_ct_CC
-  fi
-fi
-
-fi
-
-
-test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&5
-echo "$as_me: error: no acceptable C compiler found in \$PATH
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-
-# Provide some information about the compiler.
-echo "$as_me:$LINENO: checking for C compiler version" >&5
-ac_compiler=`set X $ac_compile; echo $2`
-{ (ac_try="$ac_compiler --version >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compiler --version >&5") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (ac_try="$ac_compiler -v >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compiler -v >&5") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-{ (ac_try="$ac_compiler -V >&5"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compiler -V >&5") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }
-
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files a.out a.exe b.out"
-# Try to create an executable without -o first, disregard a.out.
-# It will help us diagnose broken compilers, and finding out an intuition
-# of exeext.
-{ echo "$as_me:$LINENO: checking for C compiler default output file name" >&5
-echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6; }
-ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
-#
-# List of possible output files, starting from the most likely.
-# The algorithm is not robust to junk in `.', hence go to wildcards (a.*)
-# only as a last resort.  b.out is created by i960 compilers.
-ac_files='a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out'
-#
-# The IRIX 6 linker writes into existing files which may not be
-# executable, retaining their permissions.  Remove them first so a
-# subsequent execution test works.
-ac_rmfiles=
-for ac_file in $ac_files
-do
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
-    * ) ac_rmfiles="$ac_rmfiles $ac_file";;
-  esac
-done
-rm -f $ac_rmfiles
-
-if { (ac_try="$ac_link_default"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_link_default") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.
-# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'
-# in a Makefile.  We should not override ac_cv_exeext if it was cached,
-# so that the user can short-circuit this test for compilers unknown to
-# Autoconf.
-for ac_file in $ac_files ''
-do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj )
-	;;
-    [ab].out )
-	# We found the default executable, but exeext='' is most
-	# certainly right.
-	break;;
-    *.* )
-        if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no;
-	then :; else
-	   ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	fi
-	# We set ac_cv_exeext here because the later test for it is not
-	# safe: cross compilers may not add the suffix if given an `-o'
-	# argument, so we may need to know it at that point already.
-	# Even if this section looks crufty: it has the advantage of
-	# actually working.
-	break;;
-    * )
-	break;;
-  esac
-done
-test "$ac_cv_exeext" = no && ac_cv_exeext=
-
-else
-  ac_file=''
-fi
-
-{ echo "$as_me:$LINENO: result: $ac_file" >&5
-echo "${ECHO_T}$ac_file" >&6; }
-if test -z "$ac_file"; then
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { echo "$as_me:$LINENO: error: C compiler cannot create executables
-See \`config.log' for more details." >&5
-echo "$as_me: error: C compiler cannot create executables
-See \`config.log' for more details." >&2;}
-   { (exit 77); exit 77; }; }
-fi
-
-ac_exeext=$ac_cv_exeext
-
-# Check that the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-{ echo "$as_me:$LINENO: checking whether the C compiler works" >&5
-echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6; }
-# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
-# If not cross compiling, check that we can run a simple program.
-if test "$cross_compiling" != yes; then
-  if { ac_try='./$ac_file'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-    cross_compiling=no
-  else
-    if test "$cross_compiling" = maybe; then
-	cross_compiling=yes
-    else
-	{ { echo "$as_me:$LINENO: error: cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot run C compiled programs.
-If you meant to cross compile, use \`--host'.
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-    fi
-  fi
-fi
-{ echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
-
-rm -f a.out a.exe conftest$ac_cv_exeext b.out
-ac_clean_files=$ac_clean_files_save
-# Check that the compiler produces executables we can run.  If not, either
-# the compiler is broken, or we cross compile.
-{ echo "$as_me:$LINENO: checking whether we are cross compiling" >&5
-echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6; }
-{ echo "$as_me:$LINENO: result: $cross_compiling" >&5
-echo "${ECHO_T}$cross_compiling" >&6; }
-
-{ echo "$as_me:$LINENO: checking for suffix of executables" >&5
-echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6; }
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  # If both `conftest.exe' and `conftest' are `present' (well, observable)
-# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will
-# work properly (i.e., refer to `conftest.exe'), while it won't with
-# `rm'.
-for ac_file in conftest.exe conftest conftest.*; do
-  test -f "$ac_file" || continue
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.o | *.obj ) ;;
-    *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
-	  break;;
-    * ) break;;
-  esac
-done
-else
-  { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute suffix of executables: cannot compile and link
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-rm -f conftest$ac_cv_exeext
-{ echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5
-echo "${ECHO_T}$ac_cv_exeext" >&6; }
-
-rm -f conftest.$ac_ext
-EXEEXT=$ac_cv_exeext
-ac_exeext=$EXEEXT
-{ echo "$as_me:$LINENO: checking for suffix of object files" >&5
-echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6; }
-if test "${ac_cv_objext+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.o conftest.obj
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; then
-  for ac_file in conftest.o conftest.obj conftest.*; do
-  test -f "$ac_file" || continue;
-  case $ac_file in
-    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf ) ;;
-    *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
-       break;;
-  esac
-done
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." >&5
-echo "$as_me: error: cannot compute suffix of object files: cannot compile
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-rm -f conftest.$ac_cv_objext conftest.$ac_ext
-fi
-{ echo "$as_me:$LINENO: result: $ac_cv_objext" >&5
-echo "${ECHO_T}$ac_cv_objext" >&6; }
-OBJEXT=$ac_cv_objext
-ac_objext=$OBJEXT
-{ echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5
-echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6; }
-if test "${ac_cv_c_compiler_gnu+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-#ifndef __GNUC__
-       choke me
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_compiler_gnu=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_compiler_gnu=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-ac_cv_c_compiler_gnu=$ac_compiler_gnu
-
-fi
-{ echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5
-echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6; }
-GCC=`test $ac_compiler_gnu = yes && echo yes`
-ac_test_CFLAGS=${CFLAGS+set}
-ac_save_CFLAGS=$CFLAGS
-{ echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5
-echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6; }
-if test "${ac_cv_prog_cc_g+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_save_c_werror_flag=$ac_c_werror_flag
-   ac_c_werror_flag=yes
-   ac_cv_prog_cc_g=no
-   CFLAGS="-g"
-   cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_cv_prog_cc_g=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	CFLAGS=""
-      cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_c_werror_flag=$ac_save_c_werror_flag
-	 CFLAGS="-g"
-	 cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_cv_prog_cc_g=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-   ac_c_werror_flag=$ac_save_c_werror_flag
-fi
-{ echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_g" >&6; }
-if test "$ac_test_CFLAGS" = set; then
-  CFLAGS=$ac_save_CFLAGS
-elif test $ac_cv_prog_cc_g = yes; then
-  if test "$GCC" = yes; then
-    CFLAGS="-g -O2"
-  else
-    CFLAGS="-g"
-  fi
-else
-  if test "$GCC" = yes; then
-    CFLAGS="-O2"
-  else
-    CFLAGS=
-  fi
-fi
-{ echo "$as_me:$LINENO: checking for $CC option to accept ISO C89" >&5
-echo $ECHO_N "checking for $CC option to accept ISO C89... $ECHO_C" >&6; }
-if test "${ac_cv_prog_cc_c89+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_prog_cc_c89=no
-ac_save_CC=$CC
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdarg.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */
-struct buf { int x; };
-FILE * (*rcsopen) (struct buf *, struct stat *, int);
-static char *e (p, i)
-     char **p;
-     int i;
-{
-  return p[i];
-}
-static char *f (char * (*g) (char **, int), char **p, ...)
-{
-  char *s;
-  va_list v;
-  va_start (v,p);
-  s = g (p, va_arg (v,int));
-  va_end (v);
-  return s;
-}
-
-/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has
-   function prototypes and stuff, but not '\xHH' hex character constants.
-   These don't provoke an error unfortunately, instead are silently treated
-   as 'x'.  The following induces an error, until -std is added to get
-   proper ANSI mode.  Curiously '\x00'!='x' always comes out true, for an
-   array size at least.  It's necessary to write '\x00'==0 to get something
-   that's true only with -std.  */
-int osf4_cc_array ['\x00' == 0 ? 1 : -1];
-
-/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters
-   inside strings and character constants.  */
-#define FOO(x) 'x'
-int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];
-
-int test (int i, double x);
-struct s1 {int (*f) (int a);};
-struct s2 {int (*f) (double a);};
-int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
-int argc;
-char **argv;
-int
-main ()
-{
-return f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];
-  ;
-  return 0;
-}
-_ACEOF
-for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \
-	-Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
-do
-  CC="$ac_save_CC $ac_arg"
-  rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_cv_prog_cc_c89=$ac_arg
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-
-fi
-
-rm -f core conftest.err conftest.$ac_objext
-  test "x$ac_cv_prog_cc_c89" != "xno" && break
-done
-rm -f conftest.$ac_ext
-CC=$ac_save_CC
-
-fi
-# AC_CACHE_VAL
-case "x$ac_cv_prog_cc_c89" in
-  x)
-    { echo "$as_me:$LINENO: result: none needed" >&5
-echo "${ECHO_T}none needed" >&6; } ;;
-  xno)
-    { echo "$as_me:$LINENO: result: unsupported" >&5
-echo "${ECHO_T}unsupported" >&6; } ;;
-  *)
-    CC="$CC $ac_cv_prog_cc_c89"
-    { echo "$as_me:$LINENO: result: $ac_cv_prog_cc_c89" >&5
-echo "${ECHO_T}$ac_cv_prog_cc_c89" >&6; } ;;
-esac
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-DEPDIR="${am__leading_dot}deps"
-
-ac_config_commands="$ac_config_commands depfiles"
-
-
-am_make=${MAKE-make}
-cat > confinc << 'END'
-am__doit:
-	@echo done
-.PHONY: am__doit
-END
-# If we don't find an include directive, just comment out the code.
-{ echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5
-echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6; }
-am__include="#"
-am__quote=
-_am_result=none
-# First try GNU make style include.
-echo "include confinc" > confmf
-# We grep out `Entering directory' and `Leaving directory'
-# messages which can occur if `w' ends up in MAKEFLAGS.
-# In particular we don't look at `^make:' because GNU make might
-# be invoked under some other name (usually "gmake"), in which
-# case it prints its new name instead of `make'.
-if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
-   am__include=include
-   am__quote=
-   _am_result=GNU
-fi
-# Now try BSD make style include.
-if test "$am__include" = "#"; then
-   echo '.include "confinc"' > confmf
-   if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
-      am__include=.include
-      am__quote="\""
-      _am_result=BSD
-   fi
-fi
-
-
-{ echo "$as_me:$LINENO: result: $_am_result" >&5
-echo "${ECHO_T}$_am_result" >&6; }
-rm -f confinc confmf
-
-# Check whether --enable-dependency-tracking was given.
-if test "${enable_dependency_tracking+set}" = set; then
-  enableval=$enable_dependency_tracking;
-fi
-
-if test "x$enable_dependency_tracking" != xno; then
-  am_depcomp="$ac_aux_dir/depcomp"
-  AMDEPBACKSLASH='\'
-fi
- if test "x$enable_dependency_tracking" != xno; then
-  AMDEP_TRUE=
-  AMDEP_FALSE='#'
-else
-  AMDEP_TRUE='#'
-  AMDEP_FALSE=
-fi
-
-
-
-depcc="$CC"   am_compiler_list=
-
-{ echo "$as_me:$LINENO: checking dependency style of $depcc" >&5
-echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6; }
-if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
-  # We make a subdir and do the tests there.  Otherwise we can end up
-  # making bogus files that we don't know about and never remove.  For
-  # instance it was reported that on HP-UX the gcc test will end up
-  # making a dummy file named `D' -- because `-MD' means `put the output
-  # in D'.
-  mkdir conftest.dir
-  # Copy depcomp to subdir because otherwise we won't find it if we're
-  # using a relative directory.
-  cp "$am_depcomp" conftest.dir
-  cd conftest.dir
-  # We will build objects and dependencies in a subdirectory because
-  # it helps to detect inapplicable dependency modes.  For instance
-  # both Tru64's cc and ICC support -MD to output dependencies as a
-  # side effect of compilation, but ICC will put the dependencies in
-  # the current directory while Tru64 will put them in the object
-  # directory.
-  mkdir sub
-
-  am_cv_CC_dependencies_compiler_type=none
-  if test "$am_compiler_list" = ""; then
-     am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp`
-  fi
-  for depmode in $am_compiler_list; do
-    # Setup a source with many dependencies, because some compilers
-    # like to wrap large dependency lists on column 80 (with \), and
-    # we should not choose a depcomp mode which is confused by this.
-    #
-    # We need to recreate these files for each test, as the compiler may
-    # overwrite some of them when testing with obscure command lines.
-    # This happens at least with the AIX C compiler.
-    : > sub/conftest.c
-    for i in 1 2 3 4 5 6; do
-      echo '#include "conftst'$i'.h"' >> sub/conftest.c
-      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
-      # Solaris 8's {/usr,}/bin/sh.
-      touch sub/conftst$i.h
-    done
-    echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
-
-    case $depmode in
-    nosideeffect)
-      # after this tag, mechanisms are not by side-effect, so they'll
-      # only be used when explicitly requested
-      if test "x$enable_dependency_tracking" = xyes; then
-	continue
-      else
-	break
-      fi
-      ;;
-    none) break ;;
-    esac
-    # We check with `-c' and `-o' for the sake of the "dashmstdout"
-    # mode.  It turns out that the SunPro C++ compiler does not properly
-    # handle `-M -o', and we need to detect this.
-    if depmode=$depmode \
-       source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
-       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
-       $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
-         >/dev/null 2>conftest.err &&
-       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
-       grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
-       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
-      # icc doesn't choke on unknown options, it will just issue warnings
-      # or remarks (even with -Werror).  So we grep stderr for any message
-      # that says an option was ignored or not supported.
-      # When given -MP, icc 7.0 and 7.1 complain thusly:
-      #   icc: Command line warning: ignoring option '-M'; no argument required
-      # The diagnosis changed in icc 8.0:
-      #   icc: Command line remark: option '-MP' not supported
-      if (grep 'ignoring option' conftest.err ||
-          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
-        am_cv_CC_dependencies_compiler_type=$depmode
-        break
-      fi
-    fi
-  done
-
-  cd ..
-  rm -rf conftest.dir
-else
-  am_cv_CC_dependencies_compiler_type=none
-fi
-
-fi
-{ echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5
-echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6; }
-CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type
-
- if
-  test "x$enable_dependency_tracking" != xno \
-  && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then
-  am__fastdepCC_TRUE=
-  am__fastdepCC_FALSE='#'
-else
-  am__fastdepCC_TRUE='#'
-  am__fastdepCC_FALSE=
-fi
-
-
-if test "x$CC" != xcc; then
-  { echo "$as_me:$LINENO: checking whether $CC and cc understand -c and -o together" >&5
-echo $ECHO_N "checking whether $CC and cc understand -c and -o together... $ECHO_C" >&6; }
-else
-  { echo "$as_me:$LINENO: checking whether cc understands -c and -o together" >&5
-echo $ECHO_N "checking whether cc understands -c and -o together... $ECHO_C" >&6; }
-fi
-set dummy $CC; ac_cc=`echo $2 |
-		      sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
-if { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-# Make sure it works both with $CC and with simple cc.
-# We do the test twice because some compilers refuse to overwrite an
-# existing .o file with -o, though they will create one.
-ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
-rm -f conftest2.*
-if { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-   test -f conftest2.$ac_objext && { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); };
-then
-  eval ac_cv_prog_cc_${ac_cc}_c_o=yes
-  if test "x$CC" != xcc; then
-    # Test first that cc exists at all.
-    if { ac_try='cc -c conftest.$ac_ext >&5'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-      ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
-      rm -f conftest2.*
-      if { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } &&
-	 test -f conftest2.$ac_objext && { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); };
-      then
-	# cc works too.
-	:
-      else
-	# cc exists but doesn't like -o.
-	eval ac_cv_prog_cc_${ac_cc}_c_o=no
-      fi
-    fi
-  fi
-else
-  eval ac_cv_prog_cc_${ac_cc}_c_o=no
-fi
-rm -f -r core conftest*
-
-fi
-if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then
-  { echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
-else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
-
-cat >>confdefs.h <<\_ACEOF
-#define NO_MINUS_C_MINUS_O 1
-_ACEOF
-
-fi
-
-# FIXME: we rely on the cache variable name because
-# there is no other way.
-set dummy $CC
-ac_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
-if eval "test \"`echo '$ac_cv_prog_cc_'${ac_cc}_c_o`\" != yes"; then
-   # Losing compiler, so override with the script.
-   # FIXME: It is wrong to rewrite CC.
-   # But if we don't then we get into trouble of one sort or another.
-   # A longer-term fix would be to have automake use am__CC in this case,
-   # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
-   CC="$am_aux_dir/compile $CC"
-fi
-
-
-# Find a good install program.  We prefer a C program (faster),
-# so one script is as good as another.  But avoid the broken or
-# incompatible versions:
-# SysV /etc/install, /usr/sbin/install
-# SunOS /usr/etc/install
-# IRIX /sbin/install
-# AIX /bin/install
-# AmigaOS /C/install, which installs bootblocks on floppy discs
-# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
-# AFS /usr/afsws/bin/install, which mishandles nonexistent args
-# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
-# OS/2's system install, which has a completely different semantic
-# ./install, which can be erroneously created by make from ./install.sh.
-{ echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5
-echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6; }
-if test -z "$INSTALL"; then
-if test "${ac_cv_path_install+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  # Account for people who put trailing slashes in PATH elements.
-case $as_dir/ in
-  ./ | .// | /cC/* | \
-  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \
-  ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \
-  /usr/ucb/* ) ;;
-  *)
-    # OSF1 and SCO ODT 3.0 have their own names for install.
-    # Don't use installbsd from OSF since it installs stuff as root
-    # by default.
-    for ac_prog in ginstall scoinst install; do
-      for ac_exec_ext in '' $ac_executable_extensions; do
-	if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then
-	  if test $ac_prog = install &&
-	    grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # AIX install.  It has an incompatible calling convention.
-	    :
-	  elif test $ac_prog = install &&
-	    grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then
-	    # program-specific install script used by HP pwplus--don't use.
-	    :
-	  else
-	    ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c"
-	    break 3
-	  fi
-	fi
-      done
-    done
-    ;;
-esac
-done
-IFS=$as_save_IFS
-
-
-fi
-  if test "${ac_cv_path_install+set}" = set; then
-    INSTALL=$ac_cv_path_install
-  else
-    # As a last resort, use the slow shell script.  Don't cache a
-    # value for INSTALL within a source directory, because that will
-    # break other packages using the cache if that directory is
-    # removed, or if the value is a relative name.
-    INSTALL=$ac_install_sh
-  fi
-fi
-{ echo "$as_me:$LINENO: result: $INSTALL" >&5
-echo "${ECHO_T}$INSTALL" >&6; }
-
-# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
-# It thinks the first close brace ends the variable substitution.
-test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
-
-test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
-
-test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
-
-{ echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5
-echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6; }
-set x ${MAKE-make}; ac_make=`echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`
-if { as_var=ac_cv_prog_make_${ac_make}_set; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.make <<\_ACEOF
-SHELL = /bin/sh
-all:
-	@echo '@@@%%%=$(MAKE)=@@@%%%'
-_ACEOF
-# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
-case `${MAKE-make} -f conftest.make 2>/dev/null` in
-  *@@@%%%=?*=@@@%%%*)
-    eval ac_cv_prog_make_${ac_make}_set=yes;;
-  *)
-    eval ac_cv_prog_make_${ac_make}_set=no;;
-esac
-rm -f conftest.make
-fi
-if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then
-  { echo "$as_me:$LINENO: result: yes" >&5
-echo "${ECHO_T}yes" >&6; }
-  SET_MAKE=
-else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
-  SET_MAKE="MAKE=${MAKE-make}"
-fi
-
-if test -n "$ac_tool_prefix"; then
-  # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args.
-set dummy ${ac_tool_prefix}ranlib; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_RANLIB+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$RANLIB"; then
-  ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-IFS=$as_save_IFS
-
-fi
-fi
-RANLIB=$ac_cv_prog_RANLIB
-if test -n "$RANLIB"; then
-  { echo "$as_me:$LINENO: result: $RANLIB" >&5
-echo "${ECHO_T}$RANLIB" >&6; }
-else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
-fi
-
-
-fi
-if test -z "$ac_cv_prog_RANLIB"; then
-  ac_ct_RANLIB=$RANLIB
-  # Extract the first word of "ranlib", so it can be a program name with args.
-set dummy ranlib; ac_word=$2
-{ echo "$as_me:$LINENO: checking for $ac_word" >&5
-echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6; }
-if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if test -n "$ac_ct_RANLIB"; then
-  ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test.
-else
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_exec_ext in '' $ac_executable_extensions; do
-  if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then
-    ac_cv_prog_ac_ct_RANLIB="ranlib"
-    echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5
-    break 2
-  fi
-done
-done
-IFS=$as_save_IFS
-
-fi
-fi
-ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB
-if test -n "$ac_ct_RANLIB"; then
-  { echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5
-echo "${ECHO_T}$ac_ct_RANLIB" >&6; }
-else
-  { echo "$as_me:$LINENO: result: no" >&5
-echo "${ECHO_T}no" >&6; }
-fi
-
-  if test "x$ac_ct_RANLIB" = x; then
-    RANLIB=":"
-  else
-    case $cross_compiling:$ac_tool_warned in
-yes:)
-{ echo "$as_me:$LINENO: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf@gnu.org." >&5
-echo "$as_me: WARNING: In the future, Autoconf will not detect cross-tools
-whose name does not start with the host triplet.  If you think this
-configuration is useful to you, please write to autoconf@gnu.org." >&2;}
-ac_tool_warned=yes ;;
-esac
-    RANLIB=$ac_ct_RANLIB
-  fi
-else
-  RANLIB="$ac_cv_prog_RANLIB"
-fi
-
-
-CFLAGS="$CFLAGS -Wall -I$UTILS/include -I$PROXY/include -I$PBSDIR/include"
-LIBS="$LIBS -L$UTILS -L$PROXY -L$PBSDIR/lib"
-
-
-
-
-{ echo "$as_me:$LINENO: checking for bitset_new in -lutils" >&5
-echo $ECHO_N "checking for bitset_new in -lutils... $ECHO_C" >&6; }
-if test "${ac_cv_lib_utils_bitset_new+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lutils  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char bitset_new ();
-int
-main ()
-{
-return bitset_new ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
-  ac_cv_lib_utils_bitset_new=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lib_utils_bitset_new=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ echo "$as_me:$LINENO: result: $ac_cv_lib_utils_bitset_new" >&5
-echo "${ECHO_T}$ac_cv_lib_utils_bitset_new" >&6; }
-if test $ac_cv_lib_utils_bitset_new = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBUTILS 1
-_ACEOF
-
-  LIBS="-lutils $LIBS"
-
-fi
-
-
-{ echo "$as_me:$LINENO: checking for proxy_svr_init in -lproxysvr" >&5
-echo $ECHO_N "checking for proxy_svr_init in -lproxysvr... $ECHO_C" >&6; }
-if test "${ac_cv_lib_proxysvr_proxy_svr_init+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-lproxysvr  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char proxy_svr_init ();
-int
-main ()
-{
-return proxy_svr_init ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
-  ac_cv_lib_proxysvr_proxy_svr_init=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lib_proxysvr_proxy_svr_init=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ echo "$as_me:$LINENO: result: $ac_cv_lib_proxysvr_proxy_svr_init" >&5
-echo "${ECHO_T}$ac_cv_lib_proxysvr_proxy_svr_init" >&6; }
-if test $ac_cv_lib_proxysvr_proxy_svr_init = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBPROXYSVR 1
-_ACEOF
-
-  LIBS="-lproxysvr $LIBS"
-
-fi
-
-
-{ echo "$as_me:$LINENO: checking for pbs_connect in -ltorque" >&5
-echo $ECHO_N "checking for pbs_connect in -ltorque... $ECHO_C" >&6; }
-if test "${ac_cv_lib_torque_pbs_connect+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_check_lib_save_LIBS=$LIBS
-LIBS="-ltorque  $LIBS"
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-
-/* Override any GCC internal prototype to avoid an error.
-   Use char because int might match the return type of a GCC
-   builtin and then its argument prototype would still apply.  */
-#ifdef __cplusplus
-extern "C"
-#endif
-char pbs_connect ();
-int
-main ()
-{
-return pbs_connect ();
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_link") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest$ac_exeext &&
-       $as_test_x conftest$ac_exeext; then
-  ac_cv_lib_torque_pbs_connect=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_lib_torque_pbs_connect=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
-      conftest$ac_exeext conftest.$ac_ext
-LIBS=$ac_check_lib_save_LIBS
-fi
-{ echo "$as_me:$LINENO: result: $ac_cv_lib_torque_pbs_connect" >&5
-echo "${ECHO_T}$ac_cv_lib_torque_pbs_connect" >&6; }
-if test $ac_cv_lib_torque_pbs_connect = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define HAVE_LIBTORQUE 1
-_ACEOF
-
-  LIBS="-ltorque $LIBS"
-
-else
-  { echo "$as_me:$LINENO: PBS not installed, skipping..." >&5
-echo "$as_me: PBS not installed, skipping..." >&6;}
-	 		 { (exit 1); exit 1; }
-
-fi
-
-
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-{ echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5
-echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6; }
-# On Suns, sometimes $CPP names a directory.
-if test -n "$CPP" && test -d "$CPP"; then
-  CPP=
-fi
-if test -z "$CPP"; then
-  if test "${ac_cv_prog_CPP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-      # Double quotes because CPP needs to be expanded
-    for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
-    do
-      ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if { (ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  # Broken: fails on valid input.
-continue
-fi
-
-rm -f conftest.err conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if { (ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then
-  # Broken: success on invalid input.
-continue
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then
-  break
-fi
-
-    done
-    ac_cv_prog_CPP=$CPP
-
-fi
-  CPP=$ac_cv_prog_CPP
-else
-  ac_cv_prog_CPP=$CPP
-fi
-{ echo "$as_me:$LINENO: result: $CPP" >&5
-echo "${ECHO_T}$CPP" >&6; }
-ac_preproc_ok=false
-for ac_c_preproc_warn_flag in '' yes
-do
-  # Use a header file that comes with gcc, so configuring glibc
-  # with a fresh cross-compiler works.
-  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since
-  # <limits.h> exists even on freestanding compilers.
-  # On the NeXT, cc -E runs the code through the compiler's parser,
-  # not just through cpp. "Syntax error" is here to catch this case.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#ifdef __STDC__
-# include <limits.h>
-#else
-# include <assert.h>
-#endif
-		     Syntax error
-_ACEOF
-if { (ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then
-  :
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  # Broken: fails on valid input.
-continue
-fi
-
-rm -f conftest.err conftest.$ac_ext
-
-  # OK, works on sane cases.  Now check whether nonexistent headers
-  # can be detected and how.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <ac_nonexistent.h>
-_ACEOF
-if { (ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then
-  # Broken: success on invalid input.
-continue
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  # Passes both tests.
-ac_preproc_ok=:
-break
-fi
-
-rm -f conftest.err conftest.$ac_ext
-
-done
-# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
-rm -f conftest.err conftest.$ac_ext
-if $ac_preproc_ok; then
-  :
-else
-  { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details." >&5
-echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check
-See \`config.log' for more details." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-{ echo "$as_me:$LINENO: checking for grep that handles long lines and -e" >&5
-echo $ECHO_N "checking for grep that handles long lines and -e... $ECHO_C" >&6; }
-if test "${ac_cv_path_GREP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  # Extract the first word of "grep ggrep" to use in msg output
-if test -z "$GREP"; then
-set dummy grep ggrep; ac_prog_name=$2
-if test "${ac_cv_path_GREP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_path_GREP_found=false
-# Loop through the user's path and test for each of PROGNAME-LIST
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_prog in grep ggrep; do
-  for ac_exec_ext in '' $ac_executable_extensions; do
-    ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext"
-    { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue
-    # Check for GNU ac_path_GREP and select it if it is found.
-  # Check for GNU $ac_path_GREP
-case `"$ac_path_GREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;;
-*)
-  ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    echo 'GREP' >> "conftest.nl"
-    "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    ac_count=`expr $ac_count + 1`
-    if test $ac_count -gt ${ac_path_GREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_GREP="$ac_path_GREP"
-      ac_path_GREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-
-    $ac_path_GREP_found && break 3
-  done
-done
-
-done
-IFS=$as_save_IFS
-
-
-fi
-
-GREP="$ac_cv_path_GREP"
-if test -z "$GREP"; then
-  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
-echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-else
-  ac_cv_path_GREP=$GREP
-fi
-
-
-fi
-{ echo "$as_me:$LINENO: result: $ac_cv_path_GREP" >&5
-echo "${ECHO_T}$ac_cv_path_GREP" >&6; }
- GREP="$ac_cv_path_GREP"
-
-
-{ echo "$as_me:$LINENO: checking for egrep" >&5
-echo $ECHO_N "checking for egrep... $ECHO_C" >&6; }
-if test "${ac_cv_path_EGREP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1
-   then ac_cv_path_EGREP="$GREP -E"
-   else
-     # Extract the first word of "egrep" to use in msg output
-if test -z "$EGREP"; then
-set dummy egrep; ac_prog_name=$2
-if test "${ac_cv_path_EGREP+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_path_EGREP_found=false
-# Loop through the user's path and test for each of PROGNAME-LIST
-as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  for ac_prog in egrep; do
-  for ac_exec_ext in '' $ac_executable_extensions; do
-    ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext"
-    { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue
-    # Check for GNU ac_path_EGREP and select it if it is found.
-  # Check for GNU $ac_path_EGREP
-case `"$ac_path_EGREP" --version 2>&1` in
-*GNU*)
-  ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;;
-*)
-  ac_count=0
-  echo $ECHO_N "0123456789$ECHO_C" >"conftest.in"
-  while :
-  do
-    cat "conftest.in" "conftest.in" >"conftest.tmp"
-    mv "conftest.tmp" "conftest.in"
-    cp "conftest.in" "conftest.nl"
-    echo 'EGREP' >> "conftest.nl"
-    "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break
-    diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break
-    ac_count=`expr $ac_count + 1`
-    if test $ac_count -gt ${ac_path_EGREP_max-0}; then
-      # Best one so far, save it but keep looking for a better one
-      ac_cv_path_EGREP="$ac_path_EGREP"
-      ac_path_EGREP_max=$ac_count
-    fi
-    # 10*(2^10) chars as input seems more than enough
-    test $ac_count -gt 10 && break
-  done
-  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;
-esac
-
-
-    $ac_path_EGREP_found && break 3
-  done
-done
-
-done
-IFS=$as_save_IFS
-
-
-fi
-
-EGREP="$ac_cv_path_EGREP"
-if test -z "$EGREP"; then
-  { { echo "$as_me:$LINENO: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&5
-echo "$as_me: error: no acceptable $ac_prog_name could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-else
-  ac_cv_path_EGREP=$EGREP
-fi
-
-
-   fi
-fi
-{ echo "$as_me:$LINENO: result: $ac_cv_path_EGREP" >&5
-echo "${ECHO_T}$ac_cv_path_EGREP" >&6; }
- EGREP="$ac_cv_path_EGREP"
-
-
-{ echo "$as_me:$LINENO: checking for ANSI C header files" >&5
-echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6; }
-if test "${ac_cv_header_stdc+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <float.h>
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_cv_header_stdc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_header_stdc=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-
-if test $ac_cv_header_stdc = yes; then
-  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <string.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "memchr" >/dev/null 2>&1; then
-  :
-else
-  ac_cv_header_stdc=no
-fi
-rm -f -r conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <stdlib.h>
-
-_ACEOF
-if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
-  $EGREP "free" >/dev/null 2>&1; then
-  :
-else
-  ac_cv_header_stdc=no
-fi
-rm -f -r conftest*
-
-fi
-
-if test $ac_cv_header_stdc = yes; then
-  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
-  if test "$cross_compiling" = yes; then
-  :
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <ctype.h>
-#include <stdlib.h>
-#if ((' ' & 0x0FF) == 0x020)
-# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
-# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
-#else
-# define ISLOWER(c) \
-		   (('a' <= (c) && (c) <= 'i') \
-		     || ('j' <= (c) && (c) <= 'r') \
-		     || ('s' <= (c) && (c) <= 'z'))
-# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
-#endif
-
-#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
-int
-main ()
-{
-  int i;
-  for (i = 0; i < 256; i++)
-    if (XOR (islower (i), ISLOWER (i))
-	|| toupper (i) != TOUPPER (i))
-      return 2;
-  return 0;
-}
-_ACEOF
-rm -f conftest$ac_exeext
-if { (ac_try="$ac_link"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_link") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
-  { (case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_try") 2>&5
-  ac_status=$?
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); }; }; then
-  :
-else
-  echo "$as_me: program exited with status $ac_status" >&5
-echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-( exit $ac_status )
-ac_cv_header_stdc=no
-fi
-rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
-fi
-
-
-fi
-fi
-{ echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5
-echo "${ECHO_T}$ac_cv_header_stdc" >&6; }
-if test $ac_cv_header_stdc = yes; then
-
-cat >>confdefs.h <<\_ACEOF
-#define STDC_HEADERS 1
-_ACEOF
-
-fi
-
-# On IRIX 5.3, sys/types and inttypes.h are conflicting.
-
-
-
-
-
-
-
-
-
-for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
-		  inttypes.h stdint.h unistd.h
-do
-as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
-{ echo "$as_me:$LINENO: checking for $ac_header" >&5
-echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6; }
-if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-
-#include <$ac_header>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  eval "$as_ac_Header=yes"
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	eval "$as_ac_Header=no"
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-ac_res=`eval echo '${'$as_ac_Header'}'`
-	       { echo "$as_me:$LINENO: result: $ac_res" >&5
-echo "${ECHO_T}$ac_res" >&6; }
-if test `eval echo '${'$as_ac_Header'}'` = yes; then
-  cat >>confdefs.h <<_ACEOF
-#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
-_ACEOF
-
-fi
-
-done
-
-
-if test "${ac_cv_header_pbs_ifl_h+set}" = set; then
-  { echo "$as_me:$LINENO: checking for pbs_ifl.h" >&5
-echo $ECHO_N "checking for pbs_ifl.h... $ECHO_C" >&6; }
-if test "${ac_cv_header_pbs_ifl_h+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-fi
-{ echo "$as_me:$LINENO: result: $ac_cv_header_pbs_ifl_h" >&5
-echo "${ECHO_T}$ac_cv_header_pbs_ifl_h" >&6; }
-else
-  # Is the header compilable?
-{ echo "$as_me:$LINENO: checking pbs_ifl.h usability" >&5
-echo $ECHO_N "checking pbs_ifl.h usability... $ECHO_C" >&6; }
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-$ac_includes_default
-#include <pbs_ifl.h>
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_header_compiler=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_header_compiler=no
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-{ echo "$as_me:$LINENO: result: $ac_header_compiler" >&5
-echo "${ECHO_T}$ac_header_compiler" >&6; }
-
-# Is the header present?
-{ echo "$as_me:$LINENO: checking pbs_ifl.h presence" >&5
-echo $ECHO_N "checking pbs_ifl.h presence... $ECHO_C" >&6; }
-cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <pbs_ifl.h>
-_ACEOF
-if { (ac_try="$ac_cpp conftest.$ac_ext"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_cpp conftest.$ac_ext") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } >/dev/null && {
-	 test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       }; then
-  ac_header_preproc=yes
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-  ac_header_preproc=no
-fi
-
-rm -f conftest.err conftest.$ac_ext
-{ echo "$as_me:$LINENO: result: $ac_header_preproc" >&5
-echo "${ECHO_T}$ac_header_preproc" >&6; }
-
-# So?  What about this header?
-case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in
-  yes:no: )
-    { echo "$as_me:$LINENO: WARNING: pbs_ifl.h: accepted by the compiler, rejected by the preprocessor!" >&5
-echo "$as_me: WARNING: pbs_ifl.h: accepted by the compiler, rejected by the preprocessor!" >&2;}
-    { echo "$as_me:$LINENO: WARNING: pbs_ifl.h: proceeding with the compiler's result" >&5
-echo "$as_me: WARNING: pbs_ifl.h: proceeding with the compiler's result" >&2;}
-    ac_header_preproc=yes
-    ;;
-  no:yes:* )
-    { echo "$as_me:$LINENO: WARNING: pbs_ifl.h: present but cannot be compiled" >&5
-echo "$as_me: WARNING: pbs_ifl.h: present but cannot be compiled" >&2;}
-    { echo "$as_me:$LINENO: WARNING: pbs_ifl.h:     check for missing prerequisite headers?" >&5
-echo "$as_me: WARNING: pbs_ifl.h:     check for missing prerequisite headers?" >&2;}
-    { echo "$as_me:$LINENO: WARNING: pbs_ifl.h: see the Autoconf documentation" >&5
-echo "$as_me: WARNING: pbs_ifl.h: see the Autoconf documentation" >&2;}
-    { echo "$as_me:$LINENO: WARNING: pbs_ifl.h:     section \"Present But Cannot Be Compiled\"" >&5
-echo "$as_me: WARNING: pbs_ifl.h:     section \"Present But Cannot Be Compiled\"" >&2;}
-    { echo "$as_me:$LINENO: WARNING: pbs_ifl.h: proceeding with the preprocessor's result" >&5
-echo "$as_me: WARNING: pbs_ifl.h: proceeding with the preprocessor's result" >&2;}
-    { echo "$as_me:$LINENO: WARNING: pbs_ifl.h: in the future, the compiler will take precedence" >&5
-echo "$as_me: WARNING: pbs_ifl.h: in the future, the compiler will take precedence" >&2;}
-
-    ;;
-esac
-{ echo "$as_me:$LINENO: checking for pbs_ifl.h" >&5
-echo $ECHO_N "checking for pbs_ifl.h... $ECHO_C" >&6; }
-if test "${ac_cv_header_pbs_ifl_h+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  ac_cv_header_pbs_ifl_h=$ac_header_preproc
-fi
-{ echo "$as_me:$LINENO: result: $ac_cv_header_pbs_ifl_h" >&5
-echo "${ECHO_T}$ac_cv_header_pbs_ifl_h" >&6; }
-
-fi
-if test $ac_cv_header_pbs_ifl_h = yes; then
-  :
-else
-  { echo "$as_me:$LINENO: PBS not installed, skipping..." >&5
-echo "$as_me: PBS not installed, skipping..." >&6;}
-	 { (exit 1); exit 1; }
-
-fi
-
-
-{ echo "$as_me:$LINENO: checking return type of signal handlers" >&5
-echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6; }
-if test "${ac_cv_type_signal+set}" = set; then
-  echo $ECHO_N "(cached) $ECHO_C" >&6
-else
-  cat >conftest.$ac_ext <<_ACEOF
-/* confdefs.h.  */
-_ACEOF
-cat confdefs.h >>conftest.$ac_ext
-cat >>conftest.$ac_ext <<_ACEOF
-/* end confdefs.h.  */
-#include <sys/types.h>
-#include <signal.h>
-
-int
-main ()
-{
-return *(signal (0, 0)) (0) == 1;
-  ;
-  return 0;
-}
-_ACEOF
-rm -f conftest.$ac_objext
-if { (ac_try="$ac_compile"
-case "(($ac_try" in
-  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
-  *) ac_try_echo=$ac_try;;
-esac
-eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5
-  (eval "$ac_compile") 2>conftest.er1
-  ac_status=$?
-  grep -v '^ *+' conftest.er1 >conftest.err
-  rm -f conftest.er1
-  cat conftest.err >&5
-  echo "$as_me:$LINENO: \$? = $ac_status" >&5
-  (exit $ac_status); } && {
-	 test -z "$ac_c_werror_flag" ||
-	 test ! -s conftest.err
-       } && test -s conftest.$ac_objext; then
-  ac_cv_type_signal=int
-else
-  echo "$as_me: failed program was:" >&5
-sed 's/^/| /' conftest.$ac_ext >&5
-
-	ac_cv_type_signal=void
-fi
-
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-{ echo "$as_me:$LINENO: result: $ac_cv_type_signal" >&5
-echo "${ECHO_T}$ac_cv_type_signal" >&6; }
-
-cat >>confdefs.h <<_ACEOF
-#define RETSIGTYPE $ac_cv_type_signal
-_ACEOF
-
-
-
-ac_config_files="$ac_config_files Makefile"
-
-cat >confcache <<\_ACEOF
-# This file is a shell script that caches the results of configure
-# tests run on this system so they can be shared between configure
-# scripts and configure runs, see configure's option --config-cache.
-# It is not useful on other systems.  If it contains results you don't
-# want to keep, you may remove or edit it.
-#
-# config.status only pays attention to the cache file if you give it
-# the --recheck option to rerun configure.
-#
-# `ac_cv_env_foo' variables (set or unset) will be overridden when
-# loading this file, other *unset* `ac_cv_foo' will be assigned the
-# following values.
-
-_ACEOF
-
-# The following way of writing the cache mishandles newlines in values,
-# but we know of no workaround that is simple, portable, and efficient.
-# So, we kill variables containing newlines.
-# Ultrix sh set writes to stderr and can't be redirected directly,
-# and sets the high bit in the cache file unless we assign to the vars.
-(
-  for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do
-    eval ac_val=\$$ac_var
-    case $ac_val in #(
-    *${as_nl}*)
-      case $ac_var in #(
-      *_cv_*) { echo "$as_me:$LINENO: WARNING: Cache variable $ac_var contains a newline." >&5
-echo "$as_me: WARNING: Cache variable $ac_var contains a newline." >&2;} ;;
-      esac
-      case $ac_var in #(
-      _ | IFS | as_nl) ;; #(
-      *) $as_unset $ac_var ;;
-      esac ;;
-    esac
-  done
-
-  (set) 2>&1 |
-    case $as_nl`(ac_space=' '; set) 2>&1` in #(
-    *${as_nl}ac_space=\ *)
-      # `set' does not quote correctly, so add quotes (double-quote
-      # substitution turns \\\\ into \\, and sed turns \\ into \).
-      sed -n \
-	"s/'/'\\\\''/g;
-	  s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
-      ;; #(
-    *)
-      # `set' quotes correctly as required by POSIX, so do not add quotes.
-      sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p"
-      ;;
-    esac |
-    sort
-) |
-  sed '
-     /^ac_cv_env_/b end
-     t clear
-     :clear
-     s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
-     t end
-     s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
-     :end' >>confcache
-if diff "$cache_file" confcache >/dev/null 2>&1; then :; else
-  if test -w "$cache_file"; then
-    test "x$cache_file" != "x/dev/null" &&
-      { echo "$as_me:$LINENO: updating cache $cache_file" >&5
-echo "$as_me: updating cache $cache_file" >&6;}
-    cat confcache >$cache_file
-  else
-    { echo "$as_me:$LINENO: not updating unwritable cache $cache_file" >&5
-echo "$as_me: not updating unwritable cache $cache_file" >&6;}
-  fi
-fi
-rm -f confcache
-
-test "x$prefix" = xNONE && prefix=$ac_default_prefix
-# Let make expand exec_prefix.
-test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
-
-DEFS=-DHAVE_CONFIG_H
-
-ac_libobjs=
-ac_ltlibobjs=
-for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue
-  # 1. Remove the extension, and $U if already installed.
-  ac_script='s/\$U\././;s/\.o$//;s/\.obj$//'
-  ac_i=`echo "$ac_i" | sed "$ac_script"`
-  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR
-  #    will be set to the directory where LIBOBJS objects are built.
-  ac_libobjs="$ac_libobjs \${LIBOBJDIR}$ac_i\$U.$ac_objext"
-  ac_ltlibobjs="$ac_ltlibobjs \${LIBOBJDIR}$ac_i"'$U.lo'
-done
-LIBOBJS=$ac_libobjs
-
-LTLIBOBJS=$ac_ltlibobjs
-
-
-if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"AMDEP\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
-  { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." >&5
-echo "$as_me: error: conditional \"am__fastdepCC\" was never defined.
-Usually this means the macro was only invoked conditionally." >&2;}
-   { (exit 1); exit 1; }; }
-fi
-
-: ${CONFIG_STATUS=./config.status}
-ac_clean_files_save=$ac_clean_files
-ac_clean_files="$ac_clean_files $CONFIG_STATUS"
-{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5
-echo "$as_me: creating $CONFIG_STATUS" >&6;}
-cat >$CONFIG_STATUS <<_ACEOF
-#! $SHELL
-# Generated by $as_me.
-# Run this file to recreate the current configuration.
-# Compiler output produced by configure, useful for debugging
-# configure, is in config.log if it exists.
-
-debug=false
-ac_cs_recheck=false
-ac_cs_silent=false
-SHELL=\${CONFIG_SHELL-$SHELL}
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-## --------------------- ##
-## M4sh Initialization.  ##
-## --------------------- ##
-
-# Be more Bourne compatible
-DUALCASE=1; export DUALCASE # for MKS sh
-if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
-  emulate sh
-  NULLCMD=:
-  # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which
-  # is contrary to our usage.  Disable this feature.
-  alias -g '${1+"$@"}'='"$@"'
-  setopt NO_GLOB_SUBST
-else
-  case `(set -o) 2>/dev/null` in
-  *posix*) set -o posix ;;
-esac
-
-fi
-
-
-
-
-# PATH needs CR
-# Avoid depending upon Character Ranges.
-as_cr_letters='abcdefghijklmnopqrstuvwxyz'
-as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
-as_cr_Letters=$as_cr_letters$as_cr_LETTERS
-as_cr_digits='0123456789'
-as_cr_alnum=$as_cr_Letters$as_cr_digits
-
-# The user is always right.
-if test "${PATH_SEPARATOR+set}" != set; then
-  echo "#! /bin/sh" >conf$$.sh
-  echo  "exit 0"   >>conf$$.sh
-  chmod +x conf$$.sh
-  if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then
-    PATH_SEPARATOR=';'
-  else
-    PATH_SEPARATOR=:
-  fi
-  rm -f conf$$.sh
-fi
-
-# Support unset when possible.
-if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
-  as_unset=unset
-else
-  as_unset=false
-fi
-
-
-# IFS
-# We need space, tab and new line, in precisely that order.  Quoting is
-# there to prevent editors from complaining about space-tab.
-# (If _AS_PATH_WALK were called with IFS unset, it would disable word
-# splitting by setting IFS to empty value.)
-as_nl='
-'
-IFS=" ""	$as_nl"
-
-# Find who we are.  Look in the path if we contain no directory separator.
-case $0 in
-  *[\\/]* ) as_myself=$0 ;;
-  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
-for as_dir in $PATH
-do
-  IFS=$as_save_IFS
-  test -z "$as_dir" && as_dir=.
-  test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
-done
-IFS=$as_save_IFS
-
-     ;;
-esac
-# We did not find ourselves, most probably we were run as `sh COMMAND'
-# in which case we are not to be found in the path.
-if test "x$as_myself" = x; then
-  as_myself=$0
-fi
-if test ! -f "$as_myself"; then
-  echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
-  { (exit 1); exit 1; }
-fi
-
-# Work around bugs in pre-3.0 UWIN ksh.
-for as_var in ENV MAIL MAILPATH
-do ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
-done
-PS1='$ '
-PS2='> '
-PS4='+ '
-
-# NLS nuisances.
-for as_var in \
-  LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \
-  LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \
-  LC_TELEPHONE LC_TIME
-do
-  if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then
-    eval $as_var=C; export $as_var
-  else
-    ($as_unset $as_var) >/dev/null 2>&1 && $as_unset $as_var
-  fi
-done
-
-# Required to use basename.
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
-  as_basename=basename
-else
-  as_basename=false
-fi
-
-
-# Name of the executable.
-as_me=`$as_basename -- "$0" ||
-$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
-	 X"$0" : 'X\(//\)$' \| \
-	 X"$0" : 'X\(/\)' \| . 2>/dev/null ||
-echo X/"$0" |
-    sed '/^.*\/\([^/][^/]*\)\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\/\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-
-# CDPATH.
-$as_unset CDPATH
-
-
-
-  as_lineno_1=$LINENO
-  as_lineno_2=$LINENO
-  test "x$as_lineno_1" != "x$as_lineno_2" &&
-  test "x`expr $as_lineno_1 + 1`" = "x$as_lineno_2" || {
-
-  # Create $as_me.lineno as a copy of $as_myself, but with $LINENO
-  # uniformly replaced by the line number.  The first 'sed' inserts a
-  # line-number line after each line using $LINENO; the second 'sed'
-  # does the real work.  The second script uses 'N' to pair each
-  # line-number line with the line containing $LINENO, and appends
-  # trailing '-' during substitution so that $LINENO is not a special
-  # case at line end.
-  # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the
-  # scripts with optimization help from Paolo Bonzini.  Blame Lee
-  # E. McMahon (1931-1989) for sed's syntax.  :-)
-  sed -n '
-    p
-    /[$]LINENO/=
-  ' <$as_myself |
-    sed '
-      s/[$]LINENO.*/&-/
-      t lineno
-      b
-      :lineno
-      N
-      :loop
-      s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
-      t loop
-      s/-\n.*//
-    ' >$as_me.lineno &&
-  chmod +x "$as_me.lineno" ||
-    { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2
-   { (exit 1); exit 1; }; }
-
-  # Don't try to exec as it changes $[0], causing all sort of problems
-  # (the dirname of $[0] is not the place where we might find the
-  # original and so on.  Autoconf is especially sensitive to this).
-  . "./$as_me.lineno"
-  # Exit status is that of the last command.
-  exit
-}
-
-
-if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
-  as_dirname=dirname
-else
-  as_dirname=false
-fi
-
-ECHO_C= ECHO_N= ECHO_T=
-case `echo -n x` in
--n*)
-  case `echo 'x\c'` in
-  *c*) ECHO_T='	';;	# ECHO_T is single tab character.
-  *)   ECHO_C='\c';;
-  esac;;
-*)
-  ECHO_N='-n';;
-esac
-
-if expr a : '\(a\)' >/dev/null 2>&1 &&
-   test "X`expr 00001 : '.*\(...\)'`" = X001; then
-  as_expr=expr
-else
-  as_expr=false
-fi
-
-rm -f conf$$ conf$$.exe conf$$.file
-if test -d conf$$.dir; then
-  rm -f conf$$.dir/conf$$.file
-else
-  rm -f conf$$.dir
-  mkdir conf$$.dir
-fi
-echo >conf$$.file
-if ln -s conf$$.file conf$$ 2>/dev/null; then
-  as_ln_s='ln -s'
-  # ... but there are two gotchas:
-  # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
-  # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
-  # In both cases, we have to default to `cp -p'.
-  ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
-    as_ln_s='cp -p'
-elif ln conf$$.file conf$$ 2>/dev/null; then
-  as_ln_s=ln
-else
-  as_ln_s='cp -p'
-fi
-rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
-rmdir conf$$.dir 2>/dev/null
-
-if mkdir -p . 2>/dev/null; then
-  as_mkdir_p=:
-else
-  test -d ./-p && rmdir ./-p
-  as_mkdir_p=false
-fi
-
-if test -x / >/dev/null 2>&1; then
-  as_test_x='test -x'
-else
-  if ls -dL / >/dev/null 2>&1; then
-    as_ls_L_option=L
-  else
-    as_ls_L_option=
-  fi
-  as_test_x='
-    eval sh -c '\''
-      if test -d "$1"; then
-        test -d "$1/.";
-      else
-	case $1 in
-        -*)set "./$1";;
-	esac;
-	case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in
-	???[sx]*):;;*)false;;esac;fi
-    '\'' sh
-  '
-fi
-as_executable_p=$as_test_x
-
-# Sed expression to map a string onto a valid CPP name.
-as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
-
-# Sed expression to map a string onto a valid variable name.
-as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
-
-
-exec 6>&1
-
-# Save the log message, to keep $[0] and so on meaningful, and to
-# report actual input values of CONFIG_FILES etc. instead of their
-# values after options handling.
-ac_log="
-This file was extended by org.eclipse.ptp.pbs $as_me 4.0.0, which was
-generated by GNU Autoconf 2.61.  Invocation command line was
-
-  CONFIG_FILES    = $CONFIG_FILES
-  CONFIG_HEADERS  = $CONFIG_HEADERS
-  CONFIG_LINKS    = $CONFIG_LINKS
-  CONFIG_COMMANDS = $CONFIG_COMMANDS
-  $ $0 $@
-
-on `(hostname || uname -n) 2>/dev/null | sed 1q`
-"
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<_ACEOF
-# Files that config.status was made for.
-config_files="$ac_config_files"
-config_headers="$ac_config_headers"
-config_commands="$ac_config_commands"
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-ac_cs_usage="\
-\`$as_me' instantiates files from templates according to the
-current configuration.
-
-Usage: $0 [OPTIONS] [FILE]...
-
-  -h, --help       print this help, then exit
-  -V, --version    print version number and configuration settings, then exit
-  -q, --quiet      do not print progress messages
-  -d, --debug      don't remove temporary files
-      --recheck    update $as_me by reconfiguring in the same conditions
-  --file=FILE[:TEMPLATE]
-		   instantiate the configuration file FILE
-  --header=FILE[:TEMPLATE]
-		   instantiate the configuration header FILE
-
-Configuration files:
-$config_files
-
-Configuration headers:
-$config_headers
-
-Configuration commands:
-$config_commands
-
-Report bugs to <bug-autoconf@gnu.org>."
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
-ac_cs_version="\\
-org.eclipse.ptp.pbs config.status 4.0.0
-configured by $0, generated by GNU Autoconf 2.61,
-  with options \\"`echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`\\"
-
-Copyright (C) 2006 Free Software Foundation, Inc.
-This config.status script is free software; the Free Software Foundation
-gives unlimited permission to copy, distribute and modify it."
-
-ac_pwd='$ac_pwd'
-srcdir='$srcdir'
-INSTALL='$INSTALL'
-MKDIR_P='$MKDIR_P'
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-# If no file are specified by the user, then we need to provide default
-# value.  By we need to know if files were specified by the user.
-ac_need_defaults=:
-while test $# != 0
-do
-  case $1 in
-  --*=*)
-    ac_option=`expr "X$1" : 'X\([^=]*\)='`
-    ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
-    ac_shift=:
-    ;;
-  *)
-    ac_option=$1
-    ac_optarg=$2
-    ac_shift=shift
-    ;;
-  esac
-
-  case $ac_option in
-  # Handling of the options.
-  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
-    ac_cs_recheck=: ;;
-  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )
-    echo "$ac_cs_version"; exit ;;
-  --debug | --debu | --deb | --de | --d | -d )
-    debug=: ;;
-  --file | --fil | --fi | --f )
-    $ac_shift
-    CONFIG_FILES="$CONFIG_FILES $ac_optarg"
-    ac_need_defaults=false;;
-  --header | --heade | --head | --hea )
-    $ac_shift
-    CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg"
-    ac_need_defaults=false;;
-  --he | --h)
-    # Conflict between --help and --header
-    { echo "$as_me: error: ambiguous option: $1
-Try \`$0 --help' for more information." >&2
-   { (exit 1); exit 1; }; };;
-  --help | --hel | -h )
-    echo "$ac_cs_usage"; exit ;;
-  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
-  | -silent | --silent | --silen | --sile | --sil | --si | --s)
-    ac_cs_silent=: ;;
-
-  # This is an error.
-  -*) { echo "$as_me: error: unrecognized option: $1
-Try \`$0 --help' for more information." >&2
-   { (exit 1); exit 1; }; } ;;
-
-  *) ac_config_targets="$ac_config_targets $1"
-     ac_need_defaults=false ;;
-
-  esac
-  shift
-done
-
-ac_configure_extra_args=
-
-if $ac_cs_silent; then
-  exec 6>/dev/null
-  ac_configure_extra_args="$ac_configure_extra_args --silent"
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
-if \$ac_cs_recheck; then
-  echo "running CONFIG_SHELL=$SHELL $SHELL $0 "$ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6
-  CONFIG_SHELL=$SHELL
-  export CONFIG_SHELL
-  exec $SHELL "$0"$ac_configure_args \$ac_configure_extra_args --no-create --no-recursion
-fi
-
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-exec 5>>config.log
-{
-  echo
-  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
-## Running $as_me. ##
-_ASBOX
-  echo "$ac_log"
-} >&5
-
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
-#
-# INIT-COMMANDS
-#
-AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"
-
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-
-# Handling of arguments.
-for ac_config_target in $ac_config_targets
-do
-  case $ac_config_target in
-    "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;;
-    "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;;
-    "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
-
-  *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5
-echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
-   { (exit 1); exit 1; }; };;
-  esac
-done
-
-
-# If the user did not use the arguments to specify the items to instantiate,
-# then the envvar interface is used.  Set only those that are not.
-# We use the long form for the default assignment because of an extremely
-# bizarre bug on SunOS 4.1.3.
-if $ac_need_defaults; then
-  test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
-  test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
-  test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
-fi
-
-# Have a temporary directory for convenience.  Make it in the build tree
-# simply because there is no reason against having it here, and in addition,
-# creating and moving files from /tmp can sometimes cause problems.
-# Hook for its removal unless debugging.
-# Note that there is a small window in which the directory will not be cleaned:
-# after its creation but before its name has been assigned to `$tmp'.
-$debug ||
-{
-  tmp=
-  trap 'exit_status=$?
-  { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status
-' 0
-  trap '{ (exit 1); exit 1; }' 1 2 13 15
-}
-# Create a (secure) tmp directory for tmp files.
-
-{
-  tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
-  test -n "$tmp" && test -d "$tmp"
-}  ||
-{
-  tmp=./conf$$-$RANDOM
-  (umask 077 && mkdir "$tmp")
-} ||
-{
-   echo "$me: cannot create a temporary directory in ." >&2
-   { (exit 1); exit 1; }
-}
-
-#
-# Set up the sed scripts for CONFIG_FILES section.
-#
-
-# No need to generate the scripts if there are no CONFIG_FILES.
-# This happens for instance when ./config.status config.h
-if test -n "$CONFIG_FILES"; then
-
-_ACEOF
-
-
-
-ac_delim='%!_!# '
-for ac_last_try in false false false false false :; do
-  cat >conf$$subs.sed <<_ACEOF
-SHELL!$SHELL$ac_delim
-PATH_SEPARATOR!$PATH_SEPARATOR$ac_delim
-PACKAGE_NAME!$PACKAGE_NAME$ac_delim
-PACKAGE_TARNAME!$PACKAGE_TARNAME$ac_delim
-PACKAGE_VERSION!$PACKAGE_VERSION$ac_delim
-PACKAGE_STRING!$PACKAGE_STRING$ac_delim
-PACKAGE_BUGREPORT!$PACKAGE_BUGREPORT$ac_delim
-exec_prefix!$exec_prefix$ac_delim
-prefix!$prefix$ac_delim
-program_transform_name!$program_transform_name$ac_delim
-bindir!$bindir$ac_delim
-sbindir!$sbindir$ac_delim
-libexecdir!$libexecdir$ac_delim
-datarootdir!$datarootdir$ac_delim
-datadir!$datadir$ac_delim
-sysconfdir!$sysconfdir$ac_delim
-sharedstatedir!$sharedstatedir$ac_delim
-localstatedir!$localstatedir$ac_delim
-includedir!$includedir$ac_delim
-oldincludedir!$oldincludedir$ac_delim
-docdir!$docdir$ac_delim
-infodir!$infodir$ac_delim
-htmldir!$htmldir$ac_delim
-dvidir!$dvidir$ac_delim
-pdfdir!$pdfdir$ac_delim
-psdir!$psdir$ac_delim
-libdir!$libdir$ac_delim
-localedir!$localedir$ac_delim
-mandir!$mandir$ac_delim
-DEFS!$DEFS$ac_delim
-ECHO_C!$ECHO_C$ac_delim
-ECHO_N!$ECHO_N$ac_delim
-ECHO_T!$ECHO_T$ac_delim
-LIBS!$LIBS$ac_delim
-build_alias!$build_alias$ac_delim
-host_alias!$host_alias$ac_delim
-target_alias!$target_alias$ac_delim
-INSTALL_PROGRAM!$INSTALL_PROGRAM$ac_delim
-INSTALL_SCRIPT!$INSTALL_SCRIPT$ac_delim
-INSTALL_DATA!$INSTALL_DATA$ac_delim
-am__isrc!$am__isrc$ac_delim
-CYGPATH_W!$CYGPATH_W$ac_delim
-PACKAGE!$PACKAGE$ac_delim
-VERSION!$VERSION$ac_delim
-ACLOCAL!$ACLOCAL$ac_delim
-AUTOCONF!$AUTOCONF$ac_delim
-AUTOMAKE!$AUTOMAKE$ac_delim
-AUTOHEADER!$AUTOHEADER$ac_delim
-MAKEINFO!$MAKEINFO$ac_delim
-install_sh!$install_sh$ac_delim
-STRIP!$STRIP$ac_delim
-INSTALL_STRIP_PROGRAM!$INSTALL_STRIP_PROGRAM$ac_delim
-mkdir_p!$mkdir_p$ac_delim
-AWK!$AWK$ac_delim
-SET_MAKE!$SET_MAKE$ac_delim
-am__leading_dot!$am__leading_dot$ac_delim
-AMTAR!$AMTAR$ac_delim
-am__tar!$am__tar$ac_delim
-am__untar!$am__untar$ac_delim
-build!$build$ac_delim
-build_cpu!$build_cpu$ac_delim
-build_vendor!$build_vendor$ac_delim
-build_os!$build_os$ac_delim
-PBSDIR!$PBSDIR$ac_delim
-CC!$CC$ac_delim
-CFLAGS!$CFLAGS$ac_delim
-LDFLAGS!$LDFLAGS$ac_delim
-CPPFLAGS!$CPPFLAGS$ac_delim
-ac_ct_CC!$ac_ct_CC$ac_delim
-EXEEXT!$EXEEXT$ac_delim
-OBJEXT!$OBJEXT$ac_delim
-DEPDIR!$DEPDIR$ac_delim
-am__include!$am__include$ac_delim
-am__quote!$am__quote$ac_delim
-AMDEP_TRUE!$AMDEP_TRUE$ac_delim
-AMDEP_FALSE!$AMDEP_FALSE$ac_delim
-AMDEPBACKSLASH!$AMDEPBACKSLASH$ac_delim
-CCDEPMODE!$CCDEPMODE$ac_delim
-am__fastdepCC_TRUE!$am__fastdepCC_TRUE$ac_delim
-am__fastdepCC_FALSE!$am__fastdepCC_FALSE$ac_delim
-RANLIB!$RANLIB$ac_delim
-CPP!$CPP$ac_delim
-GREP!$GREP$ac_delim
-EGREP!$EGREP$ac_delim
-LIBOBJS!$LIBOBJS$ac_delim
-LTLIBOBJS!$LTLIBOBJS$ac_delim
-_ACEOF
-
-  if test `sed -n "s/.*$ac_delim\$/X/p" conf$$subs.sed | grep -c X` = 86; then
-    break
-  elif $ac_last_try; then
-    { { echo "$as_me:$LINENO: error: could not make $CONFIG_STATUS" >&5
-echo "$as_me: error: could not make $CONFIG_STATUS" >&2;}
-   { (exit 1); exit 1; }; }
-  else
-    ac_delim="$ac_delim!$ac_delim _$ac_delim!! "
-  fi
-done
-
-ac_eof=`sed -n '/^CEOF[0-9]*$/s/CEOF/0/p' conf$$subs.sed`
-if test -n "$ac_eof"; then
-  ac_eof=`echo "$ac_eof" | sort -nru | sed 1q`
-  ac_eof=`expr $ac_eof + 1`
-fi
-
-cat >>$CONFIG_STATUS <<_ACEOF
-cat >"\$tmp/subs-1.sed" <<\CEOF$ac_eof
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b end
-_ACEOF
-sed '
-s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g
-s/^/s,@/; s/!/@,|#_!!_#|/
-:n
-t n
-s/'"$ac_delim"'$/,g/; t
-s/$/\\/; p
-N; s/^.*\n//; s/[,\\&]/\\&/g; s/@/@|#_!!_#|/g; b n
-' >>$CONFIG_STATUS <conf$$subs.sed
-rm -f conf$$subs.sed
-cat >>$CONFIG_STATUS <<_ACEOF
-:end
-s/|#_!!_#|//g
-CEOF$ac_eof
-_ACEOF
-
-
-# VPATH may cause trouble with some makes, so we remove $(srcdir),
-# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
-# trailing colons and then remove the whole line if VPATH becomes empty
-# (actually we leave an empty line to preserve line numbers).
-if test "x$srcdir" = x.; then
-  ac_vpsub='/^[	 ]*VPATH[	 ]*=/{
-s/:*\$(srcdir):*/:/
-s/:*\${srcdir}:*/:/
-s/:*@srcdir@:*/:/
-s/^\([^=]*=[	 ]*\):*/\1/
-s/:*$//
-s/^[^=]*=[	 ]*$//
-}'
-fi
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-fi # test -n "$CONFIG_FILES"
-
-
-for ac_tag in  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS
-do
-  case $ac_tag in
-  :[FHLC]) ac_mode=$ac_tag; continue;;
-  esac
-  case $ac_mode$ac_tag in
-  :[FHL]*:*);;
-  :L* | :C*:*) { { echo "$as_me:$LINENO: error: Invalid tag $ac_tag." >&5
-echo "$as_me: error: Invalid tag $ac_tag." >&2;}
-   { (exit 1); exit 1; }; };;
-  :[FH]-) ac_tag=-:-;;
-  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
-  esac
-  ac_save_IFS=$IFS
-  IFS=:
-  set x $ac_tag
-  IFS=$ac_save_IFS
-  shift
-  ac_file=$1
-  shift
-
-  case $ac_mode in
-  :L) ac_source=$1;;
-  :[FH])
-    ac_file_inputs=
-    for ac_f
-    do
-      case $ac_f in
-      -) ac_f="$tmp/stdin";;
-      *) # Look for the file first in the build tree, then in the source tree
-	 # (if the path is not absolute).  The absolute path cannot be DOS-style,
-	 # because $ac_f cannot contain `:'.
-	 test -f "$ac_f" ||
-	   case $ac_f in
-	   [\\/$]*) false;;
-	   *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
-	   esac ||
-	   { { echo "$as_me:$LINENO: error: cannot find input file: $ac_f" >&5
-echo "$as_me: error: cannot find input file: $ac_f" >&2;}
-   { (exit 1); exit 1; }; };;
-      esac
-      ac_file_inputs="$ac_file_inputs $ac_f"
-    done
-
-    # Let's still pretend it is `configure' which instantiates (i.e., don't
-    # use $as_me), people would be surprised to read:
-    #    /* config.h.  Generated by config.status.  */
-    configure_input="Generated from "`IFS=:
-	  echo $* | sed 's|^[^:]*/||;s|:[^:]*/|, |g'`" by configure."
-    if test x"$ac_file" != x-; then
-      configure_input="$ac_file.  $configure_input"
-      { echo "$as_me:$LINENO: creating $ac_file" >&5
-echo "$as_me: creating $ac_file" >&6;}
-    fi
-
-    case $ac_tag in
-    *:-:* | *:-) cat >"$tmp/stdin";;
-    esac
-    ;;
-  esac
-
-  ac_dir=`$as_dirname -- "$ac_file" ||
-$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$ac_file" : 'X\(//\)[^/]' \| \
-	 X"$ac_file" : 'X\(//\)$' \| \
-	 X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
-echo X"$ac_file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  { as_dir="$ac_dir"
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
-echo "$as_me: error: cannot create directory $as_dir" >&2;}
-   { (exit 1); exit 1; }; }; }
-  ac_builddir=.
-
-case "$ac_dir" in
-.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
-*)
-  ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'`
-  # A ".." for each directory in $ac_dir_suffix.
-  ac_top_builddir_sub=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,/..,g;s,/,,'`
-  case $ac_top_builddir_sub in
-  "") ac_top_builddir_sub=. ac_top_build_prefix= ;;
-  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;
-  esac ;;
-esac
-ac_abs_top_builddir=$ac_pwd
-ac_abs_builddir=$ac_pwd$ac_dir_suffix
-# for backward compatibility:
-ac_top_builddir=$ac_top_build_prefix
-
-case $srcdir in
-  .)  # We are building in place.
-    ac_srcdir=.
-    ac_top_srcdir=$ac_top_builddir_sub
-    ac_abs_top_srcdir=$ac_pwd ;;
-  [\\/]* | ?:[\\/]* )  # Absolute name.
-    ac_srcdir=$srcdir$ac_dir_suffix;
-    ac_top_srcdir=$srcdir
-    ac_abs_top_srcdir=$srcdir ;;
-  *) # Relative name.
-    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
-    ac_top_srcdir=$ac_top_build_prefix$srcdir
-    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
-esac
-ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
-
-
-  case $ac_mode in
-  :F)
-  #
-  # CONFIG_FILE
-  #
-
-  case $INSTALL in
-  [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
-  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
-  esac
-  ac_MKDIR_P=$MKDIR_P
-  case $MKDIR_P in
-  [\\/$]* | ?:[\\/]* ) ;;
-  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;
-  esac
-_ACEOF
-
-cat >>$CONFIG_STATUS <<\_ACEOF
-# If the template does not know about datarootdir, expand it.
-# FIXME: This hack should be removed a few years after 2.60.
-ac_datarootdir_hack=; ac_datarootdir_seen=
-
-case `sed -n '/datarootdir/ {
-  p
-  q
-}
-/@datadir@/p
-/@docdir@/p
-/@infodir@/p
-/@localedir@/p
-/@mandir@/p
-' $ac_file_inputs` in
-*datarootdir*) ac_datarootdir_seen=yes;;
-*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
-  { echo "$as_me:$LINENO: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
-echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
-_ACEOF
-cat >>$CONFIG_STATUS <<_ACEOF
-  ac_datarootdir_hack='
-  s&@datadir@&$datadir&g
-  s&@docdir@&$docdir&g
-  s&@infodir@&$infodir&g
-  s&@localedir@&$localedir&g
-  s&@mandir@&$mandir&g
-    s&\\\${datarootdir}&$datarootdir&g' ;;
-esac
-_ACEOF
-
-# Neutralize VPATH when `$srcdir' = `.'.
-# Shell code in configure.ac might set extrasub.
-# FIXME: do we really want to maintain this feature?
-cat >>$CONFIG_STATUS <<_ACEOF
-  sed "$ac_vpsub
-$extrasub
-_ACEOF
-cat >>$CONFIG_STATUS <<\_ACEOF
-:t
-/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
-s&@configure_input@&$configure_input&;t t
-s&@top_builddir@&$ac_top_builddir_sub&;t t
-s&@srcdir@&$ac_srcdir&;t t
-s&@abs_srcdir@&$ac_abs_srcdir&;t t
-s&@top_srcdir@&$ac_top_srcdir&;t t
-s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
-s&@builddir@&$ac_builddir&;t t
-s&@abs_builddir@&$ac_abs_builddir&;t t
-s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
-s&@INSTALL@&$ac_INSTALL&;t t
-s&@MKDIR_P@&$ac_MKDIR_P&;t t
-$ac_datarootdir_hack
-" $ac_file_inputs | sed -f "$tmp/subs-1.sed" >$tmp/out
-
-test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
-  { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } &&
-  { ac_out=`sed -n '/^[	 ]*datarootdir[	 ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } &&
-  { echo "$as_me:$LINENO: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined." >&5
-echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
-which seems to be undefined.  Please make sure it is defined." >&2;}
-
-  rm -f "$tmp/stdin"
-  case $ac_file in
-  -) cat "$tmp/out"; rm -f "$tmp/out";;
-  *) rm -f "$ac_file"; mv "$tmp/out" $ac_file;;
-  esac
- ;;
-  :H)
-  #
-  # CONFIG_HEADER
-  #
-_ACEOF
-
-# Transform confdefs.h into a sed script `conftest.defines', that
-# substitutes the proper values into config.h.in to produce config.h.
-rm -f conftest.defines conftest.tail
-# First, append a space to every undef/define line, to ease matching.
-echo 's/$/ /' >conftest.defines
-# Then, protect against being on the right side of a sed subst, or in
-# an unquoted here document, in config.status.  If some macros were
-# called several times there might be several #defines for the same
-# symbol, which is useless.  But do not sort them, since the last
-# AC_DEFINE must be honored.
-ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*
-# These sed commands are passed to sed as "A NAME B PARAMS C VALUE D", where
-# NAME is the cpp macro being defined, VALUE is the value it is being given.
-# PARAMS is the parameter list in the macro definition--in most cases, it's
-# just an empty string.
-ac_dA='s,^\\([	 #]*\\)[^	 ]*\\([	 ]*'
-ac_dB='\\)[	 (].*,\\1define\\2'
-ac_dC=' '
-ac_dD=' ,'
-
-uniq confdefs.h |
-  sed -n '
-	t rset
-	:rset
-	s/^[	 ]*#[	 ]*define[	 ][	 ]*//
-	t ok
-	d
-	:ok
-	s/[\\&,]/\\&/g
-	s/^\('"$ac_word_re"'\)\(([^()]*)\)[	 ]*\(.*\)/ '"$ac_dA"'\1'"$ac_dB"'\2'"${ac_dC}"'\3'"$ac_dD"'/p
-	s/^\('"$ac_word_re"'\)[	 ]*\(.*\)/'"$ac_dA"'\1'"$ac_dB$ac_dC"'\2'"$ac_dD"'/p
-  ' >>conftest.defines
-
-# Remove the space that was appended to ease matching.
-# Then replace #undef with comments.  This is necessary, for
-# example, in the case of _POSIX_SOURCE, which is predefined and required
-# on some systems where configure will not decide to define it.
-# (The regexp can be short, since the line contains either #define or #undef.)
-echo 's/ $//
-s,^[	 #]*u.*,/* & */,' >>conftest.defines
-
-# Break up conftest.defines:
-ac_max_sed_lines=50
-
-# First sed command is:	 sed -f defines.sed $ac_file_inputs >"$tmp/out1"
-# Second one is:	 sed -f defines.sed "$tmp/out1" >"$tmp/out2"
-# Third one will be:	 sed -f defines.sed "$tmp/out2" >"$tmp/out1"
-# et cetera.
-ac_in='$ac_file_inputs'
-ac_out='"$tmp/out1"'
-ac_nxt='"$tmp/out2"'
-
-while :
-do
-  # Write a here document:
-    cat >>$CONFIG_STATUS <<_ACEOF
-    # First, check the format of the line:
-    cat >"\$tmp/defines.sed" <<\\CEOF
-/^[	 ]*#[	 ]*undef[	 ][	 ]*$ac_word_re[	 ]*\$/b def
-/^[	 ]*#[	 ]*define[	 ][	 ]*$ac_word_re[(	 ]/b def
-b
-:def
-_ACEOF
-  sed ${ac_max_sed_lines}q conftest.defines >>$CONFIG_STATUS
-  echo 'CEOF
-    sed -f "$tmp/defines.sed"' "$ac_in >$ac_out" >>$CONFIG_STATUS
-  ac_in=$ac_out; ac_out=$ac_nxt; ac_nxt=$ac_in
-  sed 1,${ac_max_sed_lines}d conftest.defines >conftest.tail
-  grep . conftest.tail >/dev/null || break
-  rm -f conftest.defines
-  mv conftest.tail conftest.defines
-done
-rm -f conftest.defines conftest.tail
-
-echo "ac_result=$ac_in" >>$CONFIG_STATUS
-cat >>$CONFIG_STATUS <<\_ACEOF
-  if test x"$ac_file" != x-; then
-    echo "/* $configure_input  */" >"$tmp/config.h"
-    cat "$ac_result" >>"$tmp/config.h"
-    if diff $ac_file "$tmp/config.h" >/dev/null 2>&1; then
-      { echo "$as_me:$LINENO: $ac_file is unchanged" >&5
-echo "$as_me: $ac_file is unchanged" >&6;}
-    else
-      rm -f $ac_file
-      mv "$tmp/config.h" $ac_file
-    fi
-  else
-    echo "/* $configure_input  */"
-    cat "$ac_result"
-  fi
-  rm -f "$tmp/out12"
-# Compute $ac_file's index in $config_headers.
-_am_stamp_count=1
-for _am_header in $config_headers :; do
-  case $_am_header in
-    $ac_file | $ac_file:* )
-      break ;;
-    * )
-      _am_stamp_count=`expr $_am_stamp_count + 1` ;;
-  esac
-done
-echo "timestamp for $ac_file" >`$as_dirname -- $ac_file ||
-$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X$ac_file : 'X\(//\)[^/]' \| \
-	 X$ac_file : 'X\(//\)$' \| \
-	 X$ac_file : 'X\(/\)' \| . 2>/dev/null ||
-echo X$ac_file |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`/stamp-h$_am_stamp_count
- ;;
-
-  :C)  { echo "$as_me:$LINENO: executing $ac_file commands" >&5
-echo "$as_me: executing $ac_file commands" >&6;}
- ;;
-  esac
-
-
-  case $ac_file$ac_mode in
-    "depfiles":C) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do
-  # Strip MF so we end up with the name of the file.
-  mf=`echo "$mf" | sed -e 's/:.*$//'`
-  # Check whether this is an Automake generated Makefile or not.
-  # We used to match only the files named `Makefile.in', but
-  # some people rename them; so instead we look at the file content.
-  # Grep'ing the first line is not enough: some people post-process
-  # each Makefile.in and add a new line on top of each file to say so.
-  # Grep'ing the whole file is not good either: AIX grep has a line
-  # limit of 2048, but all sed's we know have understand at least 4000.
-  if sed 10q "$mf" | grep '^#.*generated by automake' > /dev/null 2>&1; then
-    dirpart=`$as_dirname -- "$mf" ||
-$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$mf" : 'X\(//\)[^/]' \| \
-	 X"$mf" : 'X\(//\)$' \| \
-	 X"$mf" : 'X\(/\)' \| . 2>/dev/null ||
-echo X"$mf" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-  else
-    continue
-  fi
-  # Extract the definition of DEPDIR, am__include, and am__quote
-  # from the Makefile without running `make'.
-  DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
-  test -z "$DEPDIR" && continue
-  am__include=`sed -n 's/^am__include = //p' < "$mf"`
-  test -z "am__include" && continue
-  am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
-  # When using ansi2knr, U may be empty or an underscore; expand it
-  U=`sed -n 's/^U = //p' < "$mf"`
-  # Find all dependency output files, they are included files with
-  # $(DEPDIR) in their names.  We invoke sed twice because it is the
-  # simplest approach to changing $(DEPDIR) to its actual value in the
-  # expansion.
-  for file in `sed -n "
-    s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
-       sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
-    # Make sure the directory exists.
-    test -f "$dirpart/$file" && continue
-    fdir=`$as_dirname -- "$file" ||
-$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$file" : 'X\(//\)[^/]' \| \
-	 X"$file" : 'X\(//\)$' \| \
-	 X"$file" : 'X\(/\)' \| . 2>/dev/null ||
-echo X"$file" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-    { as_dir=$dirpart/$fdir
-  case $as_dir in #(
-  -*) as_dir=./$as_dir;;
-  esac
-  test -d "$as_dir" || { $as_mkdir_p && mkdir -p "$as_dir"; } || {
-    as_dirs=
-    while :; do
-      case $as_dir in #(
-      *\'*) as_qdir=`echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #(
-      *) as_qdir=$as_dir;;
-      esac
-      as_dirs="'$as_qdir' $as_dirs"
-      as_dir=`$as_dirname -- "$as_dir" ||
-$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	 X"$as_dir" : 'X\(//\)[^/]' \| \
-	 X"$as_dir" : 'X\(//\)$' \| \
-	 X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
-echo X"$as_dir" |
-    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)[^/].*/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\/\)$/{
-	    s//\1/
-	    q
-	  }
-	  /^X\(\/\).*/{
-	    s//\1/
-	    q
-	  }
-	  s/.*/./; q'`
-      test -d "$as_dir" && break
-    done
-    test -z "$as_dirs" || eval "mkdir $as_dirs"
-  } || test -d "$as_dir" || { { echo "$as_me:$LINENO: error: cannot create directory $as_dir" >&5
-echo "$as_me: error: cannot create directory $as_dir" >&2;}
-   { (exit 1); exit 1; }; }; }
-    # echo "creating $dirpart/$file"
-    echo '# dummy' > "$dirpart/$file"
-  done
-done
- ;;
-
-  esac
-done # for ac_tag
-
-
-{ (exit 0); exit 0; }
-_ACEOF
-chmod +x $CONFIG_STATUS
-ac_clean_files=$ac_clean_files_save
-
-
-# configure is writing to config.log, and then calls config.status.
-# config.status does its own redirection, appending to config.log.
-# Unfortunately, on DOS this fails, as config.log is still kept open
-# by configure, so config.status won't be able to write to it; its
-# output is simply discarded.  So we exec the FD to /dev/null,
-# effectively closing config.log, so it can be properly (re)opened and
-# appended to by config.status.  When coming back to configure, we
-# need to make the FD available again.
-if test "$no_create" != yes; then
-  ac_cs_success=:
-  ac_config_status_args=
-  test "$silent" = yes &&
-    ac_config_status_args="$ac_config_status_args --quiet"
-  exec 5>/dev/null
-  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false
-  exec 5>>config.log
-  # Use ||, not &&, to avoid exiting from the if with $? = 1, which
-  # would make configure fail if this is the last instruction.
-  $ac_cs_success || { (exit 1); exit 1; }
-fi
-
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/configure.in b/rms/org.eclipse.ptp.rm.pbs.proxy/configure.in
deleted file mode 100644
index a56f464..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/configure.in
+++ /dev/null
@@ -1,83 +0,0 @@
-dnl
-dnl
-
-AC_PREREQ([2.50])
-
-AC_INIT([org.eclipse.ptp.pbs], [4.0.0])
-AC_CONFIG_SRCDIR([src/ptp_pbs_proxy.c])
-
-AM_INIT_AUTOMAKE([subdir-objects])
-
-AM_CONFIG_HEADER(config.h)
-AC_CANONICAL_BUILD
-
-dnl
-dnl Eclipse adds version number to end of package when deploying via update site
-dnl
-
-UTILS="../org.eclipse.ptp.utils"
-if test ! -d $UTILS; then
-	UTILS="`echo ${UTILS}_${PACKAGE_VERSION}.*`"
-	if test ! -d $UTILS; then
-		AC_MSG_ERROR([utils directory not found])
-	fi
-fi
-
-PROXY="../org.eclipse.ptp.proxy"
-if test ! -d $PROXY; then
-	PROXY="`echo ${PROXY}_${PACKAGE_VERSION}.*`"
-	if test ! -d $PROXY; then
-		AC_MSG_ERROR([proxy directory not found])
-	fi
-fi
-
-dnl PBS
-
-AC_ARG_WITH([pbs], AS_HELP_STRING([--with-pbs],
-	[Specify the top dir of installed PBS rms.@<:@REQUIRED@:>@]),[],[with_pbs=no])
-
-PBSDIR=
-AS_IF([test "x$with_pbs" != xno],[AC_SUBST([PBSDIR],[$with_pbs])],
-       AC_MSG_ERROR([The top installation directory of PBS must be specified via "--with-pbs=DIR".]))
-
-
-dnl
-dnl Check for programs.
-dnl
-
-AC_PROG_CC
-AM_PROG_CC_C_O
-AC_PROG_INSTALL
-AC_PROG_MAKE_SET
-AC_PROG_RANLIB
-
-CFLAGS="$CFLAGS -Wall -I$UTILS/include -I$PROXY/include -I$PBSDIR/include"
-LIBS="$LIBS -L$UTILS -L$PROXY -L$PBSDIR/lib"
-
-dnl
-dnl Check for libraries.
-dnl
-
-AC_CHECK_LIB([utils], [bitset_new])
-AC_CHECK_LIB([proxysvr], [proxy_svr_init])
-AC_CHECK_LIB([torque],[pbs_connect],[],
-			[AC_MSG_NOTICE([PBS not installed, skipping...])
-	 		 AS_EXIT
-			])
-
-dnl
-dnl Check for header files.
-dnl
-
-AC_HEADER_STDC
-AC_CHECK_HEADER([pbs_ifl.h], [], 
-	[AC_MSG_NOTICE([PBS not installed, skipping...])
-	 AS_EXIT
-	])
-dnl
-dnl Check for types
-dnl
-AC_TYPE_SIGNAL
-
-AC_CONFIG_FILES([Makefile])
-AC_OUTPUT
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/depcomp b/rms/org.eclipse.ptp.rm.pbs.proxy/depcomp
deleted file mode 100755
index ca5ea4e..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/depcomp
+++ /dev/null
@@ -1,584 +0,0 @@
-#! /bin/sh
-# depcomp - compile a program generating dependencies as side-effects
-
-scriptversion=2006-10-15.18
-
-# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006 Free Software
-# Foundation, Inc.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301, USA.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
-
-case $1 in
-  '')
-     echo "$0: No command.  Try \`$0 --help' for more information." 1>&2
-     exit 1;
-     ;;
-  -h | --h*)
-    cat <<\EOF
-Usage: depcomp [--help] [--version] PROGRAM [ARGS]
-
-Run PROGRAMS ARGS to compile a file, generating dependencies
-as side-effects.
-
-Environment variables:
-  depmode     Dependency tracking mode.
-  source      Source file read by `PROGRAMS ARGS'.
-  object      Object file output by `PROGRAMS ARGS'.
-  DEPDIR      directory where to store dependencies.
-  depfile     Dependency file to output.
-  tmpdepfile  Temporary file to use when outputing dependencies.
-  libtool     Whether libtool is used (yes/no).
-
-Report bugs to <bug-automake@gnu.org>.
-EOF
-    exit $?
-    ;;
-  -v | --v*)
-    echo "depcomp $scriptversion"
-    exit $?
-    ;;
-esac
-
-if test -z "$depmode" || test -z "$source" || test -z "$object"; then
-  echo "depcomp: Variables source, object and depmode must be set" 1>&2
-  exit 1
-fi
-
-# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
-depfile=${depfile-`echo "$object" |
-  sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
-tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
-
-rm -f "$tmpdepfile"
-
-# Some modes work just like other modes, but use different flags.  We
-# parameterize here, but still list the modes in the big case below,
-# to make depend.m4 easier to write.  Note that we *cannot* use a case
-# here, because this file can only contain one case statement.
-if test "$depmode" = hp; then
-  # HP compiler uses -M and no extra arg.
-  gccflag=-M
-  depmode=gcc
-fi
-
-if test "$depmode" = dashXmstdout; then
-   # This is just like dashmstdout with a different argument.
-   dashmflag=-xM
-   depmode=dashmstdout
-fi
-
-case "$depmode" in
-gcc3)
-## gcc 3 implements dependency tracking that does exactly what
-## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like
-## it if -MD -MP comes after the -MF stuff.  Hmm.
-## Unfortunately, FreeBSD c89 acceptance of flags depends upon
-## the command line argument order; so add the flags where they
-## appear in depend2.am.  Note that the slowdown incurred here
-## affects only configure: in makefiles, %FASTDEP% shortcuts this.
-  for arg
-  do
-    case $arg in
-    -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;;
-    *)  set fnord "$@" "$arg" ;;
-    esac
-    shift # fnord
-    shift # $arg
-  done
-  "$@"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  mv "$tmpdepfile" "$depfile"
-  ;;
-
-gcc)
-## There are various ways to get dependency output from gcc.  Here's
-## why we pick this rather obscure method:
-## - Don't want to use -MD because we'd like the dependencies to end
-##   up in a subdir.  Having to rename by hand is ugly.
-##   (We might end up doing this anyway to support other compilers.)
-## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
-##   -MM, not -M (despite what the docs say).
-## - Using -M directly means running the compiler twice (even worse
-##   than renaming).
-  if test -z "$gccflag"; then
-    gccflag=-MD,
-  fi
-  "$@" -Wp,"$gccflag$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
-## The second -e expression handles DOS-style file names with drive letters.
-  sed -e 's/^[^:]*: / /' \
-      -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
-## This next piece of magic avoids the `deleted header file' problem.
-## The problem is that when a header file which appears in a .P file
-## is deleted, the dependency causes make to die (because there is
-## typically no way to rebuild the header).  We avoid this by adding
-## dummy dependencies for each header file.  Too bad gcc doesn't do
-## this for us directly.
-  tr ' ' '
-' < "$tmpdepfile" |
-## Some versions of gcc put a space before the `:'.  On the theory
-## that the space means something, we add a space to the output as
-## well.
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-hp)
-  # This case exists only to let depend.m4 do its work.  It works by
-  # looking at the text of this script.  This case will never be run,
-  # since it is checked for above.
-  exit 1
-  ;;
-
-sgi)
-  if test "$libtool" = yes; then
-    "$@" "-Wp,-MDupdate,$tmpdepfile"
-  else
-    "$@" -MDupdate "$tmpdepfile"
-  fi
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-
-  if test -f "$tmpdepfile"; then  # yes, the sourcefile depend on other files
-    echo "$object : \\" > "$depfile"
-
-    # Clip off the initial element (the dependent).  Don't try to be
-    # clever and replace this with sed code, as IRIX sed won't handle
-    # lines with more than a fixed number of characters (4096 in
-    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;
-    # the IRIX cc adds comments like `#:fec' to the end of the
-    # dependency line.
-    tr ' ' '
-' < "$tmpdepfile" \
-    | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
-    tr '
-' ' ' >> $depfile
-    echo >> $depfile
-
-    # The second pass generates a dummy entry for each header file.
-    tr ' ' '
-' < "$tmpdepfile" \
-   | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
-   >> $depfile
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile"
-  ;;
-
-aix)
-  # The C for AIX Compiler uses -M and outputs the dependencies
-  # in a .u file.  In older versions, this file always lives in the
-  # current directory.  Also, the AIX compiler puts `$object:' at the
-  # start of each line; $object doesn't have directory information.
-  # Version 6 uses the directory in both cases.
-  stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
-  tmpdepfile="$stripped.u"
-  if test "$libtool" = yes; then
-    "$@" -Wc,-M
-  else
-    "$@" -M
-  fi
-  stat=$?
-
-  if test -f "$tmpdepfile"; then :
-  else
-    stripped=`echo "$stripped" | sed 's,^.*/,,'`
-    tmpdepfile="$stripped.u"
-  fi
-
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-
-  if test -f "$tmpdepfile"; then
-    outname="$stripped.o"
-    # Each line is of the form `foo.o: dependent.h'.
-    # Do two passes, one to just change these to
-    # `$object: dependent.h' and one to simply `dependent.h:'.
-    sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
-    sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
-  else
-    # The sourcefile does not contain any dependencies, so just
-    # store a dummy comment line, to avoid errors with the Makefile
-    # "include basename.Plo" scheme.
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile"
-  ;;
-
-icc)
-  # Intel's C compiler understands `-MD -MF file'.  However on
-  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
-  # ICC 7.0 will fill foo.d with something like
-  #    foo.o: sub/foo.c
-  #    foo.o: sub/foo.h
-  # which is wrong.  We want:
-  #    sub/foo.o: sub/foo.c
-  #    sub/foo.o: sub/foo.h
-  #    sub/foo.c:
-  #    sub/foo.h:
-  # ICC 7.1 will output
-  #    foo.o: sub/foo.c sub/foo.h
-  # and will wrap long lines using \ :
-  #    foo.o: sub/foo.c ... \
-  #     sub/foo.h ... \
-  #     ...
-
-  "$@" -MD -MF "$tmpdepfile"
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-    rm -f "$tmpdepfile"
-    exit $stat
-  fi
-  rm -f "$depfile"
-  # Each line is of the form `foo.o: dependent.h',
-  # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
-  # Do two passes, one to just change these to
-  # `$object: dependent.h' and one to simply `dependent.h:'.
-  sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
-  # Some versions of the HPUX 10.20 sed can't process this invocation
-  # correctly.  Breaking it into two sed invocations is a workaround.
-  sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
-    sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-hp2)
-  # The "hp" stanza above does not work with aCC (C++) and HP's ia64
-  # compilers, which have integrated preprocessors.  The correct option
-  # to use with these is +Maked; it writes dependencies to a file named
-  # 'foo.d', which lands next to the object file, wherever that
-  # happens to be.
-  # Much of this is similar to the tru64 case; see comments there.
-  dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-  test "x$dir" = "x$object" && dir=
-  base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-  if test "$libtool" = yes; then
-    tmpdepfile1=$dir$base.d
-    tmpdepfile2=$dir.libs/$base.d
-    "$@" -Wc,+Maked
-  else
-    tmpdepfile1=$dir$base.d
-    tmpdepfile2=$dir$base.d
-    "$@" +Maked
-  fi
-  stat=$?
-  if test $stat -eq 0; then :
-  else
-     rm -f "$tmpdepfile1" "$tmpdepfile2"
-     exit $stat
-  fi
-
-  for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2"
-  do
-    test -f "$tmpdepfile" && break
-  done
-  if test -f "$tmpdepfile"; then
-    sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile"
-    # Add `dependent.h:' lines.
-    sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile"
-  else
-    echo "#dummy" > "$depfile"
-  fi
-  rm -f "$tmpdepfile" "$tmpdepfile2"
-  ;;
-
-tru64)
-   # The Tru64 compiler uses -MD to generate dependencies as a side
-   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
-   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
-   # dependencies in `foo.d' instead, so we check for that too.
-   # Subdirectories are respected.
-   dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
-   test "x$dir" = "x$object" && dir=
-   base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
-
-   if test "$libtool" = yes; then
-      # With Tru64 cc, shared objects can also be used to make a
-      # static library.  This mechanism is used in libtool 1.4 series to
-      # handle both shared and static libraries in a single compilation.
-      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
-      #
-      # With libtool 1.5 this exception was removed, and libtool now
-      # generates 2 separate objects for the 2 libraries.  These two
-      # compilations output dependencies in $dir.libs/$base.o.d and
-      # in $dir$base.o.d.  We have to check for both files, because
-      # one of the two compilations can be disabled.  We should prefer
-      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is
-      # automatically cleaned when .libs/ is deleted, while ignoring
-      # the former would cause a distcleancheck panic.
-      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4
-      tmpdepfile2=$dir$base.o.d          # libtool 1.5
-      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5
-      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504
-      "$@" -Wc,-MD
-   else
-      tmpdepfile1=$dir$base.o.d
-      tmpdepfile2=$dir$base.d
-      tmpdepfile3=$dir$base.d
-      tmpdepfile4=$dir$base.d
-      "$@" -MD
-   fi
-
-   stat=$?
-   if test $stat -eq 0; then :
-   else
-      rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-      exit $stat
-   fi
-
-   for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
-   do
-     test -f "$tmpdepfile" && break
-   done
-   if test -f "$tmpdepfile"; then
-      sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
-      # That's a tab and a space in the [].
-      sed -e 's,^.*\.[a-z]*:[	 ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
-   else
-      echo "#dummy" > "$depfile"
-   fi
-   rm -f "$tmpdepfile"
-   ;;
-
-#nosideeffect)
-  # This comment above is used by automake to tell side-effect
-  # dependency tracking mechanisms from slower ones.
-
-dashmstdout)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout, regardless of -o.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove `-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  test -z "$dashmflag" && dashmflag=-M
-  # Require at least two characters before searching for `:'
-  # in the target name.  This is to cope with DOS-style filenames:
-  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
-  "$@" $dashmflag |
-    sed 's:^[  ]*[^: ][^:][^:]*\:[    ]*:'"$object"'\: :' > "$tmpdepfile"
-  rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  tr ' ' '
-' < "$tmpdepfile" | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-dashXmstdout)
-  # This case only exists to satisfy depend.m4.  It is never actually
-  # run, as this mode is specially recognized in the preamble.
-  exit 1
-  ;;
-
-makedepend)
-  "$@" || exit $?
-  # Remove any Libtool call
-  if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-  # X makedepend
-  shift
-  cleared=no
-  for arg in "$@"; do
-    case $cleared in
-    no)
-      set ""; shift
-      cleared=yes ;;
-    esac
-    case "$arg" in
-    -D*|-I*)
-      set fnord "$@" "$arg"; shift ;;
-    # Strip any option that makedepend may not understand.  Remove
-    # the object too, otherwise makedepend will parse it as a source file.
-    -*|$object)
-      ;;
-    *)
-      set fnord "$@" "$arg"; shift ;;
-    esac
-  done
-  obj_suffix="`echo $object | sed 's/^.*\././'`"
-  touch "$tmpdepfile"
-  ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
-  rm -f "$depfile"
-  cat < "$tmpdepfile" > "$depfile"
-  sed '1,2d' "$tmpdepfile" | tr ' ' '
-' | \
-## Some versions of the HPUX 10.20 sed can't process this invocation
-## correctly.  Breaking it into two sed invocations is a workaround.
-    sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile" "$tmpdepfile".bak
-  ;;
-
-cpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout.
-  "$@" || exit $?
-
-  # Remove the call to Libtool.
-  if test "$libtool" = yes; then
-    while test $1 != '--mode=compile'; do
-      shift
-    done
-    shift
-  fi
-
-  # Remove `-o $object'.
-  IFS=" "
-  for arg
-  do
-    case $arg in
-    -o)
-      shift
-      ;;
-    $object)
-      shift
-      ;;
-    *)
-      set fnord "$@" "$arg"
-      shift # fnord
-      shift # $arg
-      ;;
-    esac
-  done
-
-  "$@" -E |
-    sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
-       -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
-    sed '$ s: \\$::' > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  cat < "$tmpdepfile" >> "$depfile"
-  sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-msvisualcpp)
-  # Important note: in order to support this mode, a compiler *must*
-  # always write the preprocessed file to stdout, regardless of -o,
-  # because we must use -o when running libtool.
-  "$@" || exit $?
-  IFS=" "
-  for arg
-  do
-    case "$arg" in
-    "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
-	set fnord "$@"
-	shift
-	shift
-	;;
-    *)
-	set fnord "$@" "$arg"
-	shift
-	shift
-	;;
-    esac
-  done
-  "$@" -E |
-  sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
-  rm -f "$depfile"
-  echo "$object : \\" > "$depfile"
-  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::	\1 \\:p' >> "$depfile"
-  echo "	" >> "$depfile"
-  . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
-  rm -f "$tmpdepfile"
-  ;;
-
-none)
-  exec "$@"
-  ;;
-
-*)
-  echo "Unknown depmode $depmode" 1>&2
-  exit 1
-  ;;
-esac
-
-exit 0
-
-# Local Variables:
-# mode: shell-script
-# sh-indentation: 2
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
-# End:
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/include/ptp_pbs_job.h b/rms/org.eclipse.ptp.rm.pbs.proxy/include/ptp_pbs_job.h
deleted file mode 100644
index 16ef13c..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/include/ptp_pbs_job.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 2009 National Center for Supercomputing Applications
- * 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
- */
-#ifndef PTP_PBS_JOB_H_
-#define PTP_PBS_JOB_H_
-
-#include <stdbool.h>
-#include "pbs_ifl.h"
-#include "hash.h"
-
-#define RSRC_arch	"arch"
-#define RSRC_cput	"cput"
-#define RSRC_file	"file"
-#define RSRC_host	"host"
-#define RSRC_mem	"mem"
-#define RSRC_mpiprocs "mpiprocs"
-#define RSRC_ncpus	"ncpus"
-#define RSRC_nice	"nice"
-#define RSRC_nodes	"nodes"
-#define RSRC_nodect	"nodect"
-#define RSRC_ompthreads "ompthreads"
-#define RSRC_pcput	"pcput"
-#define RSRC_pmem	"mem"
-#define RSRC_pvmem	"pvmem"
-#define RSRC_resc	"resc"
-#define RSRC_vmem	"vmem"
-#define RSRC_walltime	"walltime"
-#define RSRC_mppe	"mppe"
-#define RSRC_mppt	"mppt"
-#define RSRC_pf		"pf"
-#define RSRC_pmppt	"pmppt"
-#define RSRC_pncpus	"pncpus"
-#define RSRC_ppf	"ppf"
-#define RSRC_procs	"procs"
-#define RSRC_psds	"psds"
-#define RSRC_sds	"sds"
-
-#define DEFAULT_HASH_SIZE 4091
-
-typedef struct attrl attrl;
-
-struct PbsAttrList
-{
-	Hash* attrTable;
-	Hash* rsrcTable;
-};
-typedef struct PbsAttrList PbsAttrList;
-
-PbsAttrList* create_pbs_attr_list();
-void free_pbs_attr_list(PbsAttrList*);
-char* serialize_pbs_attr_list(PbsAttrList*);
-
-bool is_valid_pbs_attr(char*, PbsAttrList*);
-bool is_valid_pbs_rsrc(char*, PbsAttrList*);
-
-attrl* create_job_attr_entry(char*, attrl*, PbsAttrList*);
-void free_attrl(attrl*);
-void free_attrl_recur(attrl* job_attr);
-bool parse_arg_into_attrl(char*, attrl*, PbsAttrList*);
-void print_attrl(attrl*);
-
-char *copy_string(char *str);
-void HashPut(Hash*, char*, void*);
-
-#endif /* PTP_PBS_JOB_H_ */
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/install-sh b/rms/org.eclipse.ptp.rm.pbs.proxy/install-sh
deleted file mode 100755
index 4fbbae7..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/install-sh
+++ /dev/null
@@ -1,507 +0,0 @@
-#!/bin/sh
-# install - install a program, script, or datafile
-
-scriptversion=2006-10-14.15
-
-# This originates from X11R5 (mit/util/scripts/install.sh), which was
-# later released in X11R6 (xc/config/util/install.sh) with the
-# following copyright and license.
-#
-# Copyright (C) 1994 X Consortium
-#
-# Permission is hereby granted, free of charge, to any person obtaining a copy
-# of this software and associated documentation files (the "Software"), to
-# deal in the Software without restriction, including without limitation the
-# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-# sell copies of the Software, and to permit persons to whom the Software is
-# furnished to do so, subject to the following conditions:
-#
-# The above copyright notice and this permission notice shall be included in
-# all copies or substantial portions of the Software.
-#
-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
-# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
-# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
-# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-#
-# Except as contained in this notice, the name of the X Consortium shall not
-# be used in advertising or otherwise to promote the sale, use or other deal-
-# ings in this Software without prior written authorization from the X Consor-
-# tium.
-#
-#
-# FSF changes to this file are in the public domain.
-#
-# Calling this script install-sh is preferred over install.sh, to prevent
-# `make' implicit rules from creating a file called install from it
-# when there is no Makefile.
-#
-# This script is compatible with the BSD install script, but was written
-# from scratch.
-
-nl='
-'
-IFS=" ""	$nl"
-
-# set DOITPROG to echo to test this script
-
-# Don't use :- since 4.3BSD and earlier shells don't like it.
-doit="${DOITPROG-}"
-if test -z "$doit"; then
-  doit_exec=exec
-else
-  doit_exec=$doit
-fi
-
-# Put in absolute file names if you don't have them in your path;
-# or use environment vars.
-
-mvprog="${MVPROG-mv}"
-cpprog="${CPPROG-cp}"
-chmodprog="${CHMODPROG-chmod}"
-chownprog="${CHOWNPROG-chown}"
-chgrpprog="${CHGRPPROG-chgrp}"
-stripprog="${STRIPPROG-strip}"
-rmprog="${RMPROG-rm}"
-mkdirprog="${MKDIRPROG-mkdir}"
-
-posix_glob=
-posix_mkdir=
-
-# Desired mode of installed file.
-mode=0755
-
-chmodcmd=$chmodprog
-chowncmd=
-chgrpcmd=
-stripcmd=
-rmcmd="$rmprog -f"
-mvcmd="$mvprog"
-src=
-dst=
-dir_arg=
-dstarg=
-no_target_directory=
-
-usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
-   or: $0 [OPTION]... SRCFILES... DIRECTORY
-   or: $0 [OPTION]... -t DIRECTORY SRCFILES...
-   or: $0 [OPTION]... -d DIRECTORIES...
-
-In the 1st form, copy SRCFILE to DSTFILE.
-In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
-In the 4th, create DIRECTORIES.
-
-Options:
--c         (ignored)
--d         create directories instead of installing files.
--g GROUP   $chgrpprog installed files to GROUP.
--m MODE    $chmodprog installed files to MODE.
--o USER    $chownprog installed files to USER.
--s         $stripprog installed files.
--t DIRECTORY  install into DIRECTORY.
--T         report an error if DSTFILE is a directory.
---help     display this help and exit.
---version  display version info and exit.
-
-Environment variables override the default commands:
-  CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
-"
-
-while test $# -ne 0; do
-  case $1 in
-    -c) shift
-        continue;;
-
-    -d) dir_arg=true
-        shift
-        continue;;
-
-    -g) chgrpcmd="$chgrpprog $2"
-        shift
-        shift
-        continue;;
-
-    --help) echo "$usage"; exit $?;;
-
-    -m) mode=$2
-        shift
-        shift
-	case $mode in
-	  *' '* | *'	'* | *'
-'*	  | *'*'* | *'?'* | *'['*)
-	    echo "$0: invalid mode: $mode" >&2
-	    exit 1;;
-	esac
-        continue;;
-
-    -o) chowncmd="$chownprog $2"
-        shift
-        shift
-        continue;;
-
-    -s) stripcmd=$stripprog
-        shift
-        continue;;
-
-    -t) dstarg=$2
-	shift
-	shift
-	continue;;
-
-    -T) no_target_directory=true
-	shift
-	continue;;
-
-    --version) echo "$0 $scriptversion"; exit $?;;
-
-    --)	shift
-	break;;
-
-    -*)	echo "$0: invalid option: $1" >&2
-	exit 1;;
-
-    *)  break;;
-  esac
-done
-
-if test $# -ne 0 && test -z "$dir_arg$dstarg"; then
-  # When -d is used, all remaining arguments are directories to create.
-  # When -t is used, the destination is already specified.
-  # Otherwise, the last argument is the destination.  Remove it from $@.
-  for arg
-  do
-    if test -n "$dstarg"; then
-      # $@ is not empty: it contains at least $arg.
-      set fnord "$@" "$dstarg"
-      shift # fnord
-    fi
-    shift # arg
-    dstarg=$arg
-  done
-fi
-
-if test $# -eq 0; then
-  if test -z "$dir_arg"; then
-    echo "$0: no input file specified." >&2
-    exit 1
-  fi
-  # It's OK to call `install-sh -d' without argument.
-  # This can happen when creating conditional directories.
-  exit 0
-fi
-
-if test -z "$dir_arg"; then
-  trap '(exit $?); exit' 1 2 13 15
-
-  # Set umask so as not to create temps with too-generous modes.
-  # However, 'strip' requires both read and write access to temps.
-  case $mode in
-    # Optimize common cases.
-    *644) cp_umask=133;;
-    *755) cp_umask=22;;
-
-    *[0-7])
-      if test -z "$stripcmd"; then
-	u_plus_rw=
-      else
-	u_plus_rw='% 200'
-      fi
-      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;
-    *)
-      if test -z "$stripcmd"; then
-	u_plus_rw=
-      else
-	u_plus_rw=,u+rw
-      fi
-      cp_umask=$mode$u_plus_rw;;
-  esac
-fi
-
-for src
-do
-  # Protect names starting with `-'.
-  case $src in
-    -*) src=./$src ;;
-  esac
-
-  if test -n "$dir_arg"; then
-    dst=$src
-    dstdir=$dst
-    test -d "$dstdir"
-    dstdir_status=$?
-  else
-
-    # Waiting for this to be detected by the "$cpprog $src $dsttmp" command
-    # might cause directories to be created, which would be especially bad
-    # if $src (and thus $dsttmp) contains '*'.
-    if test ! -f "$src" && test ! -d "$src"; then
-      echo "$0: $src does not exist." >&2
-      exit 1
-    fi
-
-    if test -z "$dstarg"; then
-      echo "$0: no destination specified." >&2
-      exit 1
-    fi
-
-    dst=$dstarg
-    # Protect names starting with `-'.
-    case $dst in
-      -*) dst=./$dst ;;
-    esac
-
-    # If destination is a directory, append the input filename; won't work
-    # if double slashes aren't ignored.
-    if test -d "$dst"; then
-      if test -n "$no_target_directory"; then
-	echo "$0: $dstarg: Is a directory" >&2
-	exit 1
-      fi
-      dstdir=$dst
-      dst=$dstdir/`basename "$src"`
-      dstdir_status=0
-    else
-      # Prefer dirname, but fall back on a substitute if dirname fails.
-      dstdir=`
-	(dirname "$dst") 2>/dev/null ||
-	expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
-	     X"$dst" : 'X\(//\)[^/]' \| \
-	     X"$dst" : 'X\(//\)$' \| \
-	     X"$dst" : 'X\(/\)' \| . 2>/dev/null ||
-	echo X"$dst" |
-	    sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)[^/].*/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\/\)$/{
-		   s//\1/
-		   q
-		 }
-		 /^X\(\/\).*/{
-		   s//\1/
-		   q
-		 }
-		 s/.*/./; q'
-      `
-
-      test -d "$dstdir"
-      dstdir_status=$?
-    fi
-  fi
-
-  obsolete_mkdir_used=false
-
-  if test $dstdir_status != 0; then
-    case $posix_mkdir in
-      '')
-	# Create intermediate dirs using mode 755 as modified by the umask.
-	# This is like FreeBSD 'install' as of 1997-10-28.
-	umask=`umask`
-	case $stripcmd.$umask in
-	  # Optimize common cases.
-	  *[2367][2367]) mkdir_umask=$umask;;
-	  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;
-
-	  *[0-7])
-	    mkdir_umask=`expr $umask + 22 \
-	      - $umask % 100 % 40 + $umask % 20 \
-	      - $umask % 10 % 4 + $umask % 2
-	    `;;
-	  *) mkdir_umask=$umask,go-w;;
-	esac
-
-	# With -d, create the new directory with the user-specified mode.
-	# Otherwise, rely on $mkdir_umask.
-	if test -n "$dir_arg"; then
-	  mkdir_mode=-m$mode
-	else
-	  mkdir_mode=
-	fi
-
-	posix_mkdir=false
-	case $umask in
-	  *[123567][0-7][0-7])
-	    # POSIX mkdir -p sets u+wx bits regardless of umask, which
-	    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.
-	    ;;
-	  *)
-	    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$
-	    trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0
-
-	    if (umask $mkdir_umask &&
-		exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1
-	    then
-	      if test -z "$dir_arg" || {
-		   # Check for POSIX incompatibilities with -m.
-		   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or
-		   # other-writeable bit of parent directory when it shouldn't.
-		   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.
-		   ls_ld_tmpdir=`ls -ld "$tmpdir"`
-		   case $ls_ld_tmpdir in
-		     d????-?r-*) different_mode=700;;
-		     d????-?--*) different_mode=755;;
-		     *) false;;
-		   esac &&
-		   $mkdirprog -m$different_mode -p -- "$tmpdir" && {
-		     ls_ld_tmpdir_1=`ls -ld "$tmpdir"`
-		     test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1"
-		   }
-		 }
-	      then posix_mkdir=:
-	      fi
-	      rmdir "$tmpdir/d" "$tmpdir"
-	    else
-	      # Remove any dirs left behind by ancient mkdir implementations.
-	      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null
-	    fi
-	    trap '' 0;;
-	esac;;
-    esac
-
-    if
-      $posix_mkdir && (
-	umask $mkdir_umask &&
-	$doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir"
-      )
-    then :
-    else
-
-      # The umask is ridiculous, or mkdir does not conform to POSIX,
-      # or it failed possibly due to a race condition.  Create the
-      # directory the slow way, step by step, checking for races as we go.
-
-      case $dstdir in
-	/*) prefix=/ ;;
-	-*) prefix=./ ;;
-	*)  prefix= ;;
-      esac
-
-      case $posix_glob in
-        '')
-	  if (set -f) 2>/dev/null; then
-	    posix_glob=true
-	  else
-	    posix_glob=false
-	  fi ;;
-      esac
-
-      oIFS=$IFS
-      IFS=/
-      $posix_glob && set -f
-      set fnord $dstdir
-      shift
-      $posix_glob && set +f
-      IFS=$oIFS
-
-      prefixes=
-
-      for d
-      do
-	test -z "$d" && continue
-
-	prefix=$prefix$d
-	if test -d "$prefix"; then
-	  prefixes=
-	else
-	  if $posix_mkdir; then
-	    (umask=$mkdir_umask &&
-	     $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break
-	    # Don't fail if two instances are running concurrently.
-	    test -d "$prefix" || exit 1
-	  else
-	    case $prefix in
-	      *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;;
-	      *) qprefix=$prefix;;
-	    esac
-	    prefixes="$prefixes '$qprefix'"
-	  fi
-	fi
-	prefix=$prefix/
-      done
-
-      if test -n "$prefixes"; then
-	# Don't fail if two instances are running concurrently.
-	(umask $mkdir_umask &&
-	 eval "\$doit_exec \$mkdirprog $prefixes") ||
-	  test -d "$dstdir" || exit 1
-	obsolete_mkdir_used=true
-      fi
-    fi
-  fi
-
-  if test -n "$dir_arg"; then
-    { test -z "$chowncmd" || $doit $chowncmd "$dst"; } &&
-    { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } &&
-    { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false ||
-      test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1
-  else
-
-    # Make a couple of temp file names in the proper directory.
-    dsttmp=$dstdir/_inst.$$_
-    rmtmp=$dstdir/_rm.$$_
-
-    # Trap to clean up those temp files at exit.
-    trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
-
-    # Copy the file name to the temp name.
-    (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") &&
-
-    # and set any options; do chmod last to preserve setuid bits.
-    #
-    # If any of these fail, we abort the whole thing.  If we want to
-    # ignore errors from any of these, just make sure not to ignore
-    # errors from the above "$doit $cpprog $src $dsttmp" command.
-    #
-    { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
-      && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
-      && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
-      && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } &&
-
-    # Now rename the file to the real destination.
-    { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \
-      || {
-	   # The rename failed, perhaps because mv can't rename something else
-	   # to itself, or perhaps because mv is so ancient that it does not
-	   # support -f.
-
-	   # Now remove or move aside any old file at destination location.
-	   # We try this two ways since rm can't unlink itself on some
-	   # systems and the destination file might be busy for other
-	   # reasons.  In this case, the final cleanup might fail but the new
-	   # file should still install successfully.
-	   {
-	     if test -f "$dst"; then
-	       $doit $rmcmd -f "$dst" 2>/dev/null \
-	       || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \
-		     && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\
-	       || {
-		 echo "$0: cannot unlink or rename $dst" >&2
-		 (exit 1); exit 1
-	       }
-	     else
-	       :
-	     fi
-	   } &&
-
-	   # Now rename the file to the real destination.
-	   $doit $mvcmd "$dsttmp" "$dst"
-	 }
-    } || exit 1
-
-    trap '' 0
-  fi
-done
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
-# End:
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/missing b/rms/org.eclipse.ptp.rm.pbs.proxy/missing
deleted file mode 100755
index 1c8ff70..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/missing
+++ /dev/null
@@ -1,367 +0,0 @@
-#! /bin/sh
-# Common stub for a few missing GNU programs while installing.
-
-scriptversion=2006-05-10.23
-
-# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006
-#   Free Software Foundation, Inc.
-# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
-
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2, or (at your option)
-# any later version.
-
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-# 02110-1301, USA.
-
-# As a special exception to the GNU General Public License, if you
-# distribute this file as part of a program that contains a
-# configuration script generated by Autoconf, you may include it under
-# the same distribution terms that you use for the rest of that program.
-
-if test $# -eq 0; then
-  echo 1>&2 "Try \`$0 --help' for more information"
-  exit 1
-fi
-
-run=:
-sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p'
-sed_minuso='s/.* -o \([^ ]*\).*/\1/p'
-
-# In the cases where this matters, `missing' is being run in the
-# srcdir already.
-if test -f configure.ac; then
-  configure_ac=configure.ac
-else
-  configure_ac=configure.in
-fi
-
-msg="missing on your system"
-
-case $1 in
---run)
-  # Try to run requested program, and just exit if it succeeds.
-  run=
-  shift
-  "$@" && exit 0
-  # Exit code 63 means version mismatch.  This often happens
-  # when the user try to use an ancient version of a tool on
-  # a file that requires a minimum version.  In this case we
-  # we should proceed has if the program had been absent, or
-  # if --run hadn't been passed.
-  if test $? = 63; then
-    run=:
-    msg="probably too old"
-  fi
-  ;;
-
-  -h|--h|--he|--hel|--help)
-    echo "\
-$0 [OPTION]... PROGRAM [ARGUMENT]...
-
-Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
-error status if there is no known handling for PROGRAM.
-
-Options:
-  -h, --help      display this help and exit
-  -v, --version   output version information and exit
-  --run           try to run the given command, and emulate it if it fails
-
-Supported PROGRAM values:
-  aclocal      touch file \`aclocal.m4'
-  autoconf     touch file \`configure'
-  autoheader   touch file \`config.h.in'
-  autom4te     touch the output file, or create a stub one
-  automake     touch all \`Makefile.in' files
-  bison        create \`y.tab.[ch]', if possible, from existing .[ch]
-  flex         create \`lex.yy.c', if possible, from existing .c
-  help2man     touch the output file
-  lex          create \`lex.yy.c', if possible, from existing .c
-  makeinfo     touch the output file
-  tar          try tar, gnutar, gtar, then tar without non-portable flags
-  yacc         create \`y.tab.[ch]', if possible, from existing .[ch]
-
-Send bug reports to <bug-automake@gnu.org>."
-    exit $?
-    ;;
-
-  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)
-    echo "missing $scriptversion (GNU Automake)"
-    exit $?
-    ;;
-
-  -*)
-    echo 1>&2 "$0: Unknown \`$1' option"
-    echo 1>&2 "Try \`$0 --help' for more information"
-    exit 1
-    ;;
-
-esac
-
-# Now exit if we have it, but it failed.  Also exit now if we
-# don't have it and --version was passed (most likely to detect
-# the program).
-case $1 in
-  lex|yacc)
-    # Not GNU programs, they don't have --version.
-    ;;
-
-  tar)
-    if test -n "$run"; then
-       echo 1>&2 "ERROR: \`tar' requires --run"
-       exit 1
-    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
-       exit 1
-    fi
-    ;;
-
-  *)
-    if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
-       # We have it, but it failed.
-       exit 1
-    elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
-       # Could not run --version or --help.  This is probably someone
-       # running `$TOOL --version' or `$TOOL --help' to check whether
-       # $TOOL exists and not knowing $TOOL uses missing.
-       exit 1
-    fi
-    ;;
-esac
-
-# If it does not exist, or fails to run (possibly an outdated version),
-# try to emulate it.
-case $1 in
-  aclocal*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acinclude.m4' or \`${configure_ac}'.  You might want
-         to install the \`Automake' and \`Perl' packages.  Grab them from
-         any GNU archive site."
-    touch aclocal.m4
-    ;;
-
-  autoconf)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`${configure_ac}'.  You might want to install the
-         \`Autoconf' and \`GNU m4' packages.  Grab them from any GNU
-         archive site."
-    touch configure
-    ;;
-
-  autoheader)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`acconfig.h' or \`${configure_ac}'.  You might want
-         to install the \`Autoconf' and \`GNU m4' packages.  Grab them
-         from any GNU archive site."
-    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
-    test -z "$files" && files="config.h"
-    touch_files=
-    for f in $files; do
-      case $f in
-      *:*) touch_files="$touch_files "`echo "$f" |
-				       sed -e 's/^[^:]*://' -e 's/:.*//'`;;
-      *) touch_files="$touch_files $f.in";;
-      esac
-    done
-    touch $touch_files
-    ;;
-
-  automake*)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
-         You might want to install the \`Automake' and \`Perl' packages.
-         Grab them from any GNU archive site."
-    find . -type f -name Makefile.am -print |
-	   sed 's/\.am$/.in/' |
-	   while read f; do touch "$f"; done
-    ;;
-
-  autom4te)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, but is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.
-         You can get \`$1' as part of \`Autoconf' from any GNU
-         archive site."
-
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -f "$file"; then
-	touch $file
-    else
-	test -z "$file" || exec >$file
-	echo "#! /bin/sh"
-	echo "# Created by GNU Automake missing as a replacement of"
-	echo "#  $ $@"
-	echo "exit 0"
-	chmod +x $file
-	exit 1
-    fi
-    ;;
-
-  bison|yacc)
-    echo 1>&2 "\
-WARNING: \`$1' $msg.  You should only need it if
-         you modified a \`.y' file.  You may need the \`Bison' package
-         in order for those modifications to take effect.  You can get
-         \`Bison' from any GNU archive site."
-    rm -f y.tab.c y.tab.h
-    if test $# -ne 1; then
-        eval LASTARG="\${$#}"
-	case $LASTARG in
-	*.y)
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" y.tab.c
-	    fi
-	    SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" y.tab.h
-	    fi
-	  ;;
-	esac
-    fi
-    if test ! -f y.tab.h; then
-	echo >y.tab.h
-    fi
-    if test ! -f y.tab.c; then
-	echo 'main() { return 0; }' >y.tab.c
-    fi
-    ;;
-
-  lex|flex)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.l' file.  You may need the \`Flex' package
-         in order for those modifications to take effect.  You can get
-         \`Flex' from any GNU archive site."
-    rm -f lex.yy.c
-    if test $# -ne 1; then
-        eval LASTARG="\${$#}"
-	case $LASTARG in
-	*.l)
-	    SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
-	    if test -f "$SRCFILE"; then
-	         cp "$SRCFILE" lex.yy.c
-	    fi
-	  ;;
-	esac
-    fi
-    if test ! -f lex.yy.c; then
-	echo 'main() { return 0; }' >lex.yy.c
-    fi
-    ;;
-
-  help2man)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-	 you modified a dependency of a manual page.  You may need the
-	 \`Help2man' package in order for those modifications to take
-	 effect.  You can get \`Help2man' from any GNU archive site."
-
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -f "$file"; then
-	touch $file
-    else
-	test -z "$file" || exec >$file
-	echo ".ab help2man is required to generate this page"
-	exit 1
-    fi
-    ;;
-
-  makeinfo)
-    echo 1>&2 "\
-WARNING: \`$1' is $msg.  You should only need it if
-         you modified a \`.texi' or \`.texinfo' file, or any other file
-         indirectly affecting the aspect of the manual.  The spurious
-         call might also be the consequence of using a buggy \`make' (AIX,
-         DU, IRIX).  You might want to install the \`Texinfo' package or
-         the \`GNU make' package.  Grab either from any GNU archive site."
-    # The file to touch is that specified with -o ...
-    file=`echo "$*" | sed -n "$sed_output"`
-    test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"`
-    if test -z "$file"; then
-      # ... or it is the one specified with @setfilename ...
-      infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
-      file=`sed -n '
-	/^@setfilename/{
-	  s/.* \([^ ]*\) *$/\1/
-	  p
-	  q
-	}' $infile`
-      # ... or it is derived from the source name (dir/f.texi becomes f.info)
-      test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
-    fi
-    # If the file does not exist, the user really needs makeinfo;
-    # let's fail without touching anything.
-    test -f $file || exit 1
-    touch $file
-    ;;
-
-  tar)
-    shift
-
-    # We have already tried tar in the generic part.
-    # Look for gnutar/gtar before invocation to avoid ugly error
-    # messages.
-    if (gnutar --version > /dev/null 2>&1); then
-       gnutar "$@" && exit 0
-    fi
-    if (gtar --version > /dev/null 2>&1); then
-       gtar "$@" && exit 0
-    fi
-    firstarg="$1"
-    if shift; then
-	case $firstarg in
-	*o*)
-	    firstarg=`echo "$firstarg" | sed s/o//`
-	    tar "$firstarg" "$@" && exit 0
-	    ;;
-	esac
-	case $firstarg in
-	*h*)
-	    firstarg=`echo "$firstarg" | sed s/h//`
-	    tar "$firstarg" "$@" && exit 0
-	    ;;
-	esac
-    fi
-
-    echo 1>&2 "\
-WARNING: I can't seem to be able to run \`tar' with the given arguments.
-         You may want to install GNU tar or Free paxutils, or check the
-         command line arguments."
-    exit 1
-    ;;
-
-  *)
-    echo 1>&2 "\
-WARNING: \`$1' is needed, and is $msg.
-         You might have modified some files without having the
-         proper tools for further handling them.  Check the \`README' file,
-         it often tells you about the needed prerequisites for installing
-         this package.  You may also peek at any GNU archive site, in case
-         some other package would contain this missing \`$1' program."
-    exit 1
-    ;;
-esac
-
-exit 0
-
-# Local variables:
-# eval: (add-hook 'write-file-hooks 'time-stamp)
-# time-stamp-start: "scriptversion="
-# time-stamp-format: "%:y-%02m-%02d.%02H"
-# time-stamp-end: "$"
-# End:
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/plugin.properties b/rms/org.eclipse.ptp.rm.pbs.proxy/plugin.properties
deleted file mode 100644
index 716943f..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/plugin.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-###############################################################################
-# Copyright (c) 2009 IBM Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-###############################################################################
-
-pluginName=PTP PBS Proxy Agent
-pluginProvider=Eclipse.org
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/src/ptp_pbs_job.c b/rms/org.eclipse.ptp.rm.pbs.proxy/src/ptp_pbs_job.c
deleted file mode 100644
index 26965d6..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/src/ptp_pbs_job.c
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Copyright (c) 2009 National Center for Supercomputing Applications
- * 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
- */
-#include <stdlib.h>
-#include <string.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <ptp_pbs_job.h>
-#include "hash.h"
-#include <pbs_ifl.h>
-
-PbsAttrList*
-create_pbs_attr_list()
-{
-	void* element;
-	PbsAttrList* pbs_attr_list = (PbsAttrList*) malloc(sizeof(PbsAttrList));
-	pbs_attr_list->attrTable = HashCreate(DEFAULT_HASH_SIZE);
-	pbs_attr_list->rsrcTable = HashCreate(DEFAULT_HASH_SIZE);
-	HashPut(pbs_attr_list->attrTable, ATTR_a, ATTR_a);
-	HashPut(pbs_attr_list->attrTable, ATTR_c, ATTR_c);
-	HashPut(pbs_attr_list->attrTable, ATTR_e, ATTR_e);
-	HashPut(pbs_attr_list->attrTable, ATTR_g, ATTR_g);
-	HashPut(pbs_attr_list->attrTable, ATTR_h, ATTR_h);
-	HashPut(pbs_attr_list->attrTable, ATTR_j, ATTR_j);
-	HashPut(pbs_attr_list->attrTable, ATTR_J, ATTR_J);
-	HashPut(pbs_attr_list->attrTable, ATTR_k, ATTR_k);
-	HashPut(pbs_attr_list->attrTable, ATTR_l, ATTR_l);
-	HashPut(pbs_attr_list->attrTable, ATTR_m, ATTR_m);
-	HashPut(pbs_attr_list->attrTable, ATTR_o, ATTR_o);
-	HashPut(pbs_attr_list->attrTable, ATTR_p, ATTR_p);
-	HashPut(pbs_attr_list->attrTable, ATTR_q, ATTR_q);
-	HashPut(pbs_attr_list->attrTable, ATTR_r, ATTR_r);
-	HashPut(pbs_attr_list->attrTable, ATTR_u, ATTR_u);
-	HashPut(pbs_attr_list->attrTable, ATTR_v, ATTR_v);
-	HashPut(pbs_attr_list->attrTable, ATTR_A, ATTR_A);
-	HashPut(pbs_attr_list->attrTable, ATTR_M, ATTR_M);
-	HashPut(pbs_attr_list->attrTable, ATTR_N, ATTR_N);
-	HashPut(pbs_attr_list->attrTable, ATTR_S, ATTR_S);
-	HashPut(pbs_attr_list->attrTable, ATTR_depend, ATTR_depend);
-	HashPut(pbs_attr_list->attrTable, ATTR_inter, ATTR_inter);
-	HashPut(pbs_attr_list->attrTable, ATTR_sandbox, ATTR_sandbox);
-	HashPut(pbs_attr_list->attrTable, ATTR_stagein, ATTR_stagein);
-	HashPut(pbs_attr_list->attrTable, ATTR_stageout, ATTR_stageout);
-	HashPut(pbs_attr_list->attrTable, ATTR_resvTag, ATTR_resvTag);
-	HashPut(pbs_attr_list->attrTable, ATTR_resvID, ATTR_resvID);
-	HashPut(pbs_attr_list->attrTable, ATTR_resv_start, ATTR_resv_start);
-	HashPut(pbs_attr_list->attrTable, ATTR_resv_end, ATTR_resv_end);
-	HashPut(pbs_attr_list->attrTable, ATTR_resv_duration, ATTR_resv_duration);
-	HashPut(pbs_attr_list->attrTable, ATTR_auth_u, ATTR_auth_u);
-	HashPut(pbs_attr_list->attrTable, ATTR_auth_g, ATTR_auth_g);
-	HashPut(pbs_attr_list->attrTable, ATTR_auth_h, ATTR_auth_h);
-	HashPut(pbs_attr_list->attrTable, ATTR_pwd, ATTR_pwd);
-	HashPut(pbs_attr_list->attrTable, ATTR_cred, ATTR_cred);
-	HashPut(pbs_attr_list->attrTable, ATTR_nodemux, ATTR_nodemux);
-	HashPut(pbs_attr_list->attrTable, ATTR_umask, ATTR_umask);
-	HashPut(pbs_attr_list->attrTable, ATTR_block, ATTR_block);
-	HashPut(pbs_attr_list->attrTable, ATTR_convert, ATTR_convert);
-	HashPut(pbs_attr_list->attrTable, ATTR_DefaultChunk, ATTR_DefaultChunk);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_arch, RSRC_arch);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_cput, RSRC_cput);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_file, RSRC_file);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_host, RSRC_host);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_mem, RSRC_mem);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_mpiprocs, RSRC_mpiprocs);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_ncpus, RSRC_ncpus);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_nice, RSRC_nice);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_nodes, RSRC_nodes);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_nodect, RSRC_nodect);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_ompthreads, RSRC_ompthreads);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_pcput, RSRC_pcput);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_pmem, RSRC_pmem);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_pvmem, RSRC_pvmem);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_resc, RSRC_resc);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_vmem, RSRC_vmem);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_walltime, RSRC_walltime);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_mppe, RSRC_mppe);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_mppt, RSRC_mppt);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_pf, RSRC_pf);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_pmppt, RSRC_pmppt);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_pncpus, RSRC_pncpus);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_ppf, RSRC_ppf);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_procs, RSRC_procs);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_psds, RSRC_psds);
-	HashPut(pbs_attr_list->rsrcTable, RSRC_sds, RSRC_sds);
-	return pbs_attr_list;
-}
-
-void
-free_pbs_attr_list
-(PbsAttrList* pbs_attr_list)
-{
-	if ( pbs_attr_list != NULL ) {
-		HashDestroy(pbs_attr_list->attrTable, free);
-		HashDestroy(pbs_attr_list->rsrcTable, free);
-		free(pbs_attr_list);
-	}
-}
-
-bool
-is_valid_pbs_attr
-(char* key, PbsAttrList* pbs_attr_list)
-{
-	if ( HashFind(pbs_attr_list->attrTable, key) == NULL ) return false;
-	return true;
-}
-
-bool
-is_valid_pbs_rsrc
-(char* key, PbsAttrList* pbs_attr_list)
-{
-	if ( HashFind(pbs_attr_list->rsrcTable, key) == NULL ) return false;
-	return true;
-}
-
-char*
-serialize_pbs_attr_list
-(PbsAttrList* pbs_attr_list)
-{
-	char buffer[16384];
-	HashEntry *entry;
-	int i = sprintf(&buffer[0], "%s", "<pbs-job-attributes>");
-	HashSet(pbs_attr_list->attrTable);
-	while( (entry = HashGet(pbs_attr_list->attrTable)) != NULL ) {
-		i += sprintf(&buffer[i], "<attr name=\"%s\"/>", (char*)entry->h_data);
-	}
-	HashSet(pbs_attr_list->rsrcTable);
-	while( (entry = HashGet(pbs_attr_list->rsrcTable)) != NULL ) {
-		i += sprintf(&buffer[i], "<rsrc name=\"%s\"/>", (char*)entry->h_data);
-	}
-	sprintf(&buffer[i], "%s", "</pbs-job-attributes>");
-	return copy_string(buffer);
-}
-
-attrl*
-create_job_attr_entry
-( char* arg, attrl* last, PbsAttrList* pbs_attr_lst)
-{
-	attrl* job_attr = (attrl *) malloc(sizeof(attrl));
-	if ( parse_arg_into_attrl(arg, job_attr, pbs_attr_lst) == false ) return NULL;
-	if ( last != NULL ) last->next = job_attr;
-	return job_attr;
-}
-
-bool
-parse_arg_into_attrl
-( char* arg, attrl* job_attr, PbsAttrList* pbs_attr_lst)
-{
-	char *part[3];
-	char* prefix = NULL;
-	part[1] = NULL;
-	part[0] = strtok(arg, "=");
-	part[2] = strtok(NULL, "=");
-	prefix = strstr(part[0], "Resource");
-	if (prefix != NULL) {
-		part[0] = "Resource_List";
-		strtok(prefix, "_");
-		part[1] = strtok(NULL, "-");
-	}
-	if ( is_valid_pbs_attr(part[0], pbs_attr_lst) == false ) {
-		return false;
-	}
-	job_attr->name = copy_string(part[0]);
-	if ( part[1] != NULL && is_valid_pbs_rsrc(part[1], pbs_attr_lst) == false ) {
-		return false;
-	}
-	job_attr->resource = copy_string(part[1]);
-	job_attr->value = copy_string(part[2]);
-	return true;
-}
-
-void
-free_attrl
-(attrl* job_attr)
-{
-	if (job_attr != NULL) {
-		if ( job_attr->name != NULL ) free(job_attr->name);
-		if ( job_attr->resource != NULL ) free(job_attr->resource);
-		if ( job_attr->value != NULL ) free(job_attr->value);
-		job_attr->next = NULL;
-		free(job_attr);
-	}
-}
-
-void
-free_attrl_recur
-(attrl* job_attr)
-{
-	if (job_attr != NULL) {
-		if ( job_attr->name != NULL ) free(job_attr->name);
-		if ( job_attr->resource != NULL ) free(job_attr->resource);
-		if ( job_attr->value != NULL ) free(job_attr->value);
-		if ( job_attr->next != NULL ) free_attrl_recur(job_attr->next);
-		free(job_attr);
-	}
-}
-
-void
-print_attrl
-(attrl* job_attr)
-{
-	if (job_attr != NULL) {
-		printf("<job-attribute");
-		if ( job_attr->name != NULL ) printf(" name=\"%s\"", job_attr->name);
-		if ( job_attr->resource != NULL ) printf(" resource=\"%s\"", job_attr->resource);
-		if ( job_attr->value != NULL ) printf(" value=\"%s\"", job_attr->value);
-		if ( job_attr->next != NULL) {
-			if ( job_attr->next->resource != NULL )
-				printf(" next=\"Resource_List_%s\"", job_attr->next->resource);
-			else
-				printf(" next=\"%s\"", job_attr->next->name);
-		}
-		printf( "/>\n");
-	}
-}
-
-void HashPut
-(Hash* table, char* key, void* value)
-{
-	HashInsert(table, HashCompute(key, strlen(key)), copy_string(value));
-}
-
-char *
-copy_string
-(char *str)
-{
-	if (str != NULL) {
-		int 	len = strlen(str);
-		char *	res = (char *)malloc(len+1);
-		memcpy(res, str, len);
-		*(res+len) = '\0';
-		return res;
-	}
-	return NULL;
-}
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/src/ptp_pbs_job_tests.c b/rms/org.eclipse.ptp.rm.pbs.proxy/src/ptp_pbs_job_tests.c
deleted file mode 100644
index 499b2eb..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/src/ptp_pbs_job_tests.c
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2009 National Center for Supercomputing Applications
- * 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
- */
-#include <stdlib.h>
-#include <string.h>
-#include <stdbool.h>
-#include <stdio.h>
-#include <ptp_pbs_job.h>
-#include "hash.h"
-#include "list.h"
-#include <pbs_ifl.h>
-
-int
-main()
-{
-	int i;
-	int argc = 7;
-	attrl *attributes[7];
-	char argv[7][32];
-	char* serial;
-	PbsAttrList* aList;
-	attrl* last = NULL;
-
-	sprintf( argv[0], "%s", "Job_Name=testPBSjob");
-	sprintf( argv[1], "%s", "Account_Name=fyl");
-	sprintf( argv[2], "%s", "Phoney_argument=foo");
-	sprintf( argv[3], "%s", "Error_Path=/tmp/err.log");
-	sprintf( argv[4], "%s", "Output_Path=/tmp/out.log");
-	sprintf( argv[5], "%s", "Resource_walltime=00:25");
-	sprintf( argv[6], "%s", "Resource_ncpus=256");
-
-	aList = create_pbs_attr_list();
-	serial = serialize_pbs_attr_list(aList);
-	printf( "%s\n", serial);
-	free(serial);
-
-	for (i = 0; i < argc; i++) {
-		attributes[i] = create_job_attr_entry(argv[i], last, aList);
-		if ( attributes[i] == NULL ) {
-			fprintf(stderr, "bad argument %s\n", argv[i]);
-			continue;
-		}
-		last = attributes[i];
-	}
-
-	for (i = 0; i < argc; i++) {
-		print_attrl(attributes[i]);
-	}
-
-	free_attrl_recur(attributes[0]);
-	free_pbs_attr_list(aList);
-	return 0;
-}
diff --git a/rms/org.eclipse.ptp.rm.pbs.proxy/src/ptp_pbs_proxy.c b/rms/org.eclipse.ptp.rm.pbs.proxy/src/ptp_pbs_proxy.c
deleted file mode 100644
index 0513644..0000000
--- a/rms/org.eclipse.ptp.rm.pbs.proxy/src/ptp_pbs_proxy.c
+++ /dev/null
@@ -1,1665 +0,0 @@
-/*
- * Copyright (c) 2009 IBM Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- */
-#ifdef __gnu_linux__
-#define _GNU_SOURCE
-#endif /* __gnu_linux__ */
-
-#include "config.h"
-
-#include <getopt.h>
-#include <unistd.h>
-#include <stdbool.h>
-#include <errno.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdio.h>
-#include <pwd.h>
-#include <regex.h>
-
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <sys/select.h>
-
-#include "proxy.h"
-#include "proxy_tcp.h"
-#include "handler.h"
-#include "list.h"
-#include "hash.h"
-#include "args.h"
-#include "rangeset.h"
-#include "pbs_ifl.h"
-
-#define WIRE_PROTOCOL_VERSION	"2.0"
-
-/*
- * PBS Resources
- *
- * arch			string		System architecture
- * cput			time		Maximum, aggregate CPU time required by all processes
- * file			size		Maximum disk space requirements for any single file to be created
- * host			string		Name of requested host/node
- * mem			size		Maximum amount of physical memory (RAM)
- * mpiprocs		int			Number of MPI processes for this chunk
- * ncpus		int			Number of CPUs (processors)
- * nice			int			Requested job priority
- * nodes		string		Number and/or type of nodes
- * nodect		int			Number of chunks in resource request from selection directive, or number of vnodes requested from node specification
- * ompthreads	int			Number of OpenMP threads for this chunk.
- * pcput		time		Per-process maximum CPU time
- * pmem			size		Per-process maximum amount of physical memory
- * pvmem		size		Per-process maximum amount of virtual memory
- * resc			string		Single-node variable resource specification string
- * vmem			size		Maximum, aggregate amount of virtual memory used by all concurrent processes
- * walltime		time		Maximum amount of real time (wall-clock elapsed time)
- * mppe			int			The number of processing elements used by a single process
- * mppt			time		Maximum wallclock time used on the MPP.
- * pf			size		Maximum number of file system blocks that can be used by all process
- * pmppt		time		Maximum amount of wall clock time used on the MPP by a single process
- * pncpus		int			Maximum number of processors used by any single process
- * ppf			size		Maximum number of file system blocks that can be used by a single process
- * procs		int			Maximum number of processes
- * psds			size		Maximum number of data blocks on the SDS (secondary data storage) for any process
- * sds			size		Maximum number of data blocks on the SDS (secondary data storage)
- *
- * Job Attributes
- *
- * Account_Name
- * Checkpoint
- * depend
- * Error_Path
- * Execution_Time
- * group_list
- * Hold_Types
- * Job_Name
- * Join_Path
- * Keep_Files
- * Mail_Points
- * Mail_Users
- * no_stdio_sockets
- * Output_Path
- * Priority
- * Rerunnable
- * Resource_List[.resource]
- * Shell_Path_List
- * stagein
- * stageout
- * umask
- * User_List
- * Variable_List
- * comment
- *
- * Read-only Job Attributes
- *
- * accounting_id
- * alt_id
- * array
- * array_id
- * array_index
- * array_indices_remaining
- * array_indices_submitted
- * array_state_count
- * ctime
- * etime
- * exec_host
- * egroup
- * euser
- * hashname
- * interactive
- * Job_Owner
- * job_state
- * mtime
- * qtime
- * queue
- * resources_used
- * run_count
- * schedselect
- * server
- * session_id
- *
- * Queue Attributes
- * acl_groups			string	""		The list of groups which may submit jobs to the queue
- * acl_group_enable 	boolean	false	Only allow jobs submitted from groups specified by the acl_groups parameter
- * acl_group_sloppy		boolean	false	acl_groups will be checked against all groups of which the job user is a member
- * acl_hosts			string	""		List of hosts that may submit jobs to the queue
- * acl_host_enable		boolean	false	Only allow jobs submitted from hosts specified by the acl_hosts parameter
- * acl_logic_or			boolean	false	User and group acls are logically OR'd together
- * acl_users			string	""		The list of users who may submit jobs to the queue
- * acl_user_enable		boolean	false	Only allow jobs submitted from users specified by the acl_users parameter
- * disallowed_types		string	""		List of job "types" that are not allowed in this queue
- * enabled				boolean	false 	The queue accepts new job submissions
- * keep_completed		integer	0		The number of seconds jobs should be held in the Completed state after exiting
- * kill_delay			integer	2		The number of seconds between sending a SIGTERM and a SIGKILL to a job being cancelled
- * max_queuable			integer	+INF	The maximum number of jobs allowed in the queue at any given time
- * max_running			integer	+INF	The maximum number of jobs in the queue allowed to run at any given time
- * max_user_queuable	integer	+INF	The maximum number of jobs, per user, allowed in the queue at any given time
- * max_user_run			integer	+INF	The maximum number of jobs, per user, in the queue allowed to run at any given time
- * priority				integer	+INF	The priority value associated with the queue.  DEFAULT: 0	qmgr -c "set queue batch priority=20"
- * queue_type			enum	e	 	The queue type (e=execution, r=route)
- * resources_available	string	""		The cumulative resources available to all jobs running in the queue
- * resources_default	string	""		Default resource requirements for jobs submitted to the queue
- * resources_max		string	""		The maximum resource limits for jobs submitted to the queue
- * resources_min		string	""		The minimum resource limits for jobs submitted to the queue
- * route_destinations	string	""		The potential destination queues for jobs submitted to the associated routing queue
- * started				boolean	false	Jobs in the queue are allowed to execute
- */
-/*
- * Proxy server states. The SHUTTING_DOWN state is used to
- * give the proxy a chance to send any pending events once
- * a QUIT command has been received.
- */
-#define STATE_INIT			0
-#define STATE_RUNNING		1
-#define STATE_SHUTTING_DOWN	2
-#define STATE_SHUTDOWN		3
-
-/*
- * RTEV codes must EXACTLY match org.eclipse.ptp.rtsystem.proxy.event.IProxyRuntimeEvent
- */
-#define RTEV_OFFSET						200
-
-/*
- * RTEV_ERROR codes are used internally in the PBS specific plugin
- */
-#define RTEV_ERROR_INIT			RTEV_OFFSET + 1000
-#define RTEV_ERROR_FINALIZE		RTEV_OFFSET + 1001
-#define RTEV_ERROR_SUBMIT		RTEV_OFFSET + 1002
-#define RTEV_ERROR_JOB			RTEV_OFFSET + 1003
-#define RTEV_ERROR_SERVER		RTEV_OFFSET + 1004
-#define RTEV_ERROR_NATTR		RTEV_OFFSET + 1007
-#define RTEV_ERROR_SIGNAL		RTEV_OFFSET + 1009
-#define RTEV_ERROR_FILTER		RTEV_OFFSET + 1010
-#define RTEV_ERROR_START_EVENTS	RTEV_OFFSET + 1011
-
-#define JOB_NAME_FMT			"job%02d"
-#define PBS_QUEUE_ATTR			"queue"
-#define PBS_POLL_INTERVAL		60000000 /* 60 seconds */
-#define PROXY_TIMEOUT			20000	 /* 20 ms */
-
-#define DEFAULT_HASH_SIZE				8192
-#define DEFAULT_FILTER_HASH_SIZE		32
-#define DEFAULT_FILTER_ATTR_HASH_SIZE	32
-#define DEFAULT_HOST					"localhost"
-#define DEFAULT_PROXY					"tcp"
-
-int PBS_Initialize(int, int, char **);
-int PBS_ModelDef(int, int, char **);
-int PBS_StartEvents(int, int, char **);
-int PBS_StopEvents(int, int, char **);
-int PBS_SubmitJob(int, int, char **);
-int PBS_TerminateJob(int, int, char **);
-int PBS_Quit(int, int, char **);
-int PBS_FilterEvents(int, int, char **);
-
-enum job_state {
-	JOB_CREATED,
-	JOB_NORMAL,
-	JOB_TERMINATING,
-	JOB_TERMINATED
-};
-typedef enum job_state	job_state;
-
-struct ptp_machine {
-	int		id;
-	char *	name;
-	List *	nodes;
-};
-typedef struct ptp_machine	ptp_machine;
-
-struct ptp_node {
-	int	 	id;
-	int		number;
-	char *	name;
-	char *	state;
-	char *	user;
-	char *	group;
-	char *	mode;
-};
-typedef struct ptp_node	ptp_node;
-
-struct ptp_process {
-	int		id;
-	int		node_id;
-	int		task_id;
-	int		pid;
-};
-typedef struct ptp_process	ptp_process;
-
-struct ptp_queue {
-	int		id;
-	char *	name;
-};
-typedef struct ptp_queue ptp_queue;
-
-struct ptp_job {
-	int 			ptp_jobid;		/* job ID as known by PTP */
-	char * 			pbs_jobid;		/* PBS job ID */
-	char *			jobsubid;		/* submission ID of job */
-	ptp_queue *		queue;			/* queue this job is in */
-	int				num_procs;		/* number of procs requested for program (debugger uses num_procs+1) */
-	bool			debug;			/* job is debug job */
-	job_state		state;			/* job state */
-	bool			iof;			/* job has i/o forwarding */
-	ptp_process **	procs;			/* procs for this job */
-	rangeset *		set;			/* range set of proc IDs */
-};
-typedef struct ptp_job ptp_job;
-
-struct ptp_filter {
-	Hash *	hash;		/* attributes to filter */
-	int		num_attrs;	/* number of attributes in hash */
-	bool	children;	/* apply filter to children */
-};
-typedef struct ptp_filter	ptp_filter;
-
-static int			gTransID = 0; /* transaction id for start of event stream, is 0 when events are off */
-static int			gBaseID = -1; /* base ID for event generation */
-static int			gLastID = 1; /* ID generator */
-static int 			proxy_state = STATE_INIT;
-static proxy_svr *	conn;
-static List *		gJobList;
-static Hash *		gJobHash;
-static Hash *		gFilters;
-static List *		gMachineList;
-static List *		gQueueList;
-static int			ptp_signal_exit;
-static int			debug_level = 0; /* 0 is off */
-static RETSIGTYPE	(*saved_signals[NSIG])(int);
-static int			stream;
-static char *		gUserName;
-
-extern char *		pbs_server;
-
-static proxy_svr_helper_funcs helper_funcs = {
-	NULL,					// newconn() - can be used to reject connections
-	NULL					// numservers() - if there are multiple servers, return the number
-};
-
-#define CMD_BASE	0
-
-static proxy_cmd	cmds[] = {
-	PBS_Quit,
-	PBS_Initialize,
-	PBS_ModelDef,
-	PBS_StartEvents,
-	PBS_StopEvents,
-	PBS_SubmitJob,
-	PBS_TerminateJob,
-	PBS_FilterEvents
-};
-
-static proxy_commands command_tab = {
-	CMD_BASE,
-	sizeof(cmds)/sizeof(proxy_cmd),
-	cmds
-};
-
-static struct option longopts[] = {
-	{"proxy",			required_argument,	NULL, 	'P'}, 
-	{"port",			required_argument,	NULL, 	'p'}, 
-	{"host",			required_argument,	NULL, 	'h'}, 
-	{"debug",			required_argument,	NULL, 	'd'}, 
-	{NULL,				0,					NULL,	0}
-};
-
-/*
- * Generate a model element ID
- */
-static int
-generate_id(void)
-{
-	return gBaseID + gLastID++;
-}
-
-/*
- * Create a new machine.
- */
-static ptp_machine *
-new_machine(char *name)
-{
-	ptp_machine *	m = (ptp_machine *)malloc(sizeof(ptp_machine));
-	m->id = generate_id();
-	m->name = strdup(name);
-	m->nodes = NewList();
-    AddToList(gMachineList, (void *)m);
-    return m;
-}
-
-static void
-free_machine(ptp_machine *m)
-{
-	RemoveFromList(gMachineList, (void *)m);
-	free(m->name);
-	free(m);
-}
-
-/*
- * Create a new node.
- */
-static ptp_node *
-new_node(ptp_machine *mach, char *name, char *state, char *user, char *group, char *mode)
-{
-	static int node_number = 0;
-	ptp_node *	n = (ptp_node *)malloc(sizeof(ptp_node));
-	
-	memset((char *)n, 0, sizeof(ptp_node));
-	n->id = generate_id();
-	n->number = node_number++;
-	if (name != NULL)
-		n->name = strdup(name);
-	if (state != NULL)
-		n->state = strdup(state);
-	if (user != NULL)
-		n->user = strdup(user);
-	if (group != NULL)
-		n->group = strdup(group);
-	if (mode != NULL)
-		n->mode = strdup(mode);
-    AddToList(mach->nodes, (void *)n);
-    return n;
-}
-
-/*
- * Very expensive!
- */
-static ptp_node *
-find_node_by_name(char *name)
-{
-	ptp_machine *	m;
-	ptp_node *		n;
-	
-	for (SetList(gMachineList); (m = (ptp_machine *)GetListElement(gMachineList)) != NULL; ) {
-		for (SetList(m->nodes); (n = (ptp_node *)GetListElement(m->nodes)) != NULL; ) {
-			if (strcmp(name, n->name) == 0)
-				return n;
-		}
-	}
-	
-	return NULL;
-}
-
-/*
- * Create a new process.
- */
-static ptp_process *
-new_process(ptp_job *job, int node_id, int task_id, int pid)
-{
-	ptp_process *	p = (ptp_process *)malloc(sizeof(ptp_process));
-	p->id = generate_id();
-	p->node_id = node_id;
-	p->task_id = task_id;
-	p->pid = pid;
-    job->procs[task_id] = p;
-    insert_in_rangeset(job->set, p->id);
-    return p;
-}
-
-static void
-free_process(ptp_process *p)
-{
-	free(p);
-}
-
-static ptp_process *
-find_process(ptp_job *job, int task_id)
-{
-	if (task_id < 0 || task_id >= job->num_procs)
-		return NULL;
-
-	return job->procs[task_id];
-}
-
-static ptp_queue *
-new_queue(char *name) {
-	ptp_queue *	q = (ptp_queue *)malloc(sizeof(ptp_queue));
-	q->id = generate_id();
-	q->name = strdup(name);
-	AddToList(gQueueList, (void *)q);
-	return q;
-}
-
-static void
-free_queue(ptp_queue *q)
-{
-	free(q->name);
-	free(q);
-}
-
-static ptp_queue *
-find_queue_by_id(int id)
-{
-	ptp_queue *	q;
-
-	for (SetList(gQueueList); (q = (ptp_queue *)GetListElement(gQueueList)) != NULL; ) {
-		if (q->id == id) {
-			return q;
-		}
-	}
-	return NULL;
-}
-
-static ptp_queue *
-find_queue_by_name(char *name)
-{
-	ptp_queue *	q;
-
-	for (SetList(gQueueList); (q = (ptp_queue *)GetListElement(gQueueList)) != NULL; ) {
-		if (strcmp(q->name, name) == 0) {
-			return q;
-		}
-	}
-	return NULL;
-}
-
-/*
- * Find the name of the queue from the PBS job attributes
- */
-static char *
-find_pbs_queue_name(struct attrl *attrs)
-{
-	struct attrl *attr;
-
-	for (attr = attrs; attr != NULL; attr = attr->next) {
-		if (strcmp(attr->name, PBS_QUEUE_ATTR) == 0) {
-			return attr->value;
-		}
-	}
-
-	return NULL;
-}
-
-/*
- * Keep a list of the jobs that we have created. If they are
- * debug jobs, keep the debug jobid as well.
- */
-static ptp_job *
-new_job(int num_procs, bool debug, ptp_queue *queue, char *jobsubid, char *pbs_jobid)
-{
-	ptp_job *	j = (ptp_job *)malloc(sizeof(ptp_job));
-	j->queue = queue;
-	j->ptp_jobid = generate_id();
-	j->pbs_jobid = strdup(pbs_jobid);
-	j->jobsubid = NULL;
-	if (jobsubid != NULL) {
-		j->jobsubid = strdup(jobsubid);
-	}
-    j->num_procs = 0;
-    j->procs = NULL;
-    j->debug = debug;
-    j->state = JOB_CREATED;
-    j->iof = false;
-    j->set = new_rangeset();
-    //j->procs = (ptp_process **)malloc(sizeof(ptp_process *) * num_procs);
-    //memset(j->procs, 0, sizeof(ptp_process *) * num_procs);
-    AddToList(gJobList, (void *)j);
-    HashInsert(gJobHash, HashCompute(pbs_jobid, strlen(pbs_jobid)), (void *)j);
-    return j;
-}
-
-static void
-free_job(ptp_job *j)
-{
-	int	i;
-	
-	RemoveFromList(gJobList, (void *)j);
-	HashRemove(gJobHash, HashCompute(j->pbs_jobid, strlen(j->pbs_jobid)));
-	free(j->pbs_jobid);
-	free(j->jobsubid);
-	for (i = 0; i < j->num_procs; i++) {
-		if (j->procs[i] != NULL)
-			free_process(j->procs[i]);
-	}
-	if (j->procs != NULL) {
-		free(j->procs);
-	}
-	free_rangeset(j->set);
-	free(j);
-}
-
-/*
- * Find a job on the list using the PTP job ID
- */
-static ptp_job *
-find_job_by_id(int jobid)
-{
-	ptp_job *	j;
-	
-	for (SetList(gJobList); (j = (ptp_job *)GetListElement(gJobList)) != NULL; ) {
-		if (j->ptp_jobid == jobid) {
-			return j;
-		}
-	}
-	return NULL;
-}
-
-static int
-get_pbs_attr_count(struct attrl *attrs)
-{
-	int 			count = 0;
-	struct attrl *	attr;
-
-	for (attr = attrs; attr != NULL; attr = attr->next) {
-		count++;
-	}
-
-	return count;
-}
-
-static void
-add_pbs_attributes(proxy_msg *m, struct attrl *attrs)
-{
-	struct attrl *attr;
-
-	for (attr = attrs; attr != NULL; attr = attr->next) {
-		proxy_add_string_attribute(m, attr->name, attr->value);
-	}
-}
-
-static void
-shutdown_pbs()
-{
-	pbs_disconnect(stream);
-}
-
-static void
-sendOKEvent(int trans_id)
-{
-	proxy_svr_queue_msg(conn, proxy_ok_event(trans_id));
-}
-
-static void
-sendShutdownEvent(int trans_id)
-{
-	proxy_svr_queue_msg(conn, proxy_shutdown_event(trans_id));
-}
-
-static void
-sendMessageEvent(int trans_id, char *level, int code, char *fmt, ...)
-{
-	va_list		ap;
-
-	va_start(ap, fmt);
-	proxy_svr_queue_msg(conn, proxy_message_event(trans_id, level, code, fmt, ap));
-	va_end(ap);
-}
-
-static void
-sendErrorEvent(int trans_id, int code, char *fmt, ...)
-{
-	va_list		ap;
-
-	va_start(ap, fmt);
-	if (debug_level > 0) {
-		fprintf(stderr, "sendErrorEvent(%d, %d, ", trans_id, code);
-		vfprintf(stderr, fmt, ap);
-		fprintf(stderr, ")\n");
-		fflush(stderr);
-	}
-	proxy_svr_queue_msg(conn, proxy_error_event(trans_id, code, fmt, ap));
-	va_end(ap);
-}
-
-static void
-sendJobSubErrorEvent(int trans_id, char *jobSubId, char *msg)
-{
-	proxy_svr_queue_msg(conn, proxy_submitjob_error_event(trans_id, jobSubId, RTEV_ERROR_SUBMIT, msg));
-}
-
-static void
-sendJobTerminateErrorEvent(int trans_id, int id, char *msg)
-{
-	char *	job_id;
-	
-	asprintf(&job_id, "%d", id);
-	
-	proxy_svr_queue_msg(conn, proxy_terminatejob_error_event(trans_id, job_id, RTEV_ERROR_JOB, msg));
-}
-
-static void
-sendNewMachineEvent(int trans_id, int id, char *name)
-{
-	char *	rm_id;
-	char *	machine_id;
-	
-	asprintf(&rm_id, "%d", gBaseID);	
-	asprintf(&machine_id, "%d", id);	
-	
-	proxy_svr_queue_msg(conn, proxy_new_machine_event(trans_id, rm_id, machine_id, name, PTP_MACHINE_STATE_UP));
-	
-	free(machine_id);
-	free(rm_id);
-}
-
-static void
-sendNewQueueEvent(int trans_id, int id, char *name, struct attrl *attrs)
-{
-	char *		rm_id;
-	char *		queue_id;
-	proxy_msg *	m;
-
-	asprintf(&rm_id, "%d", gBaseID);
-	asprintf(&queue_id, "%d", id);
-
-    m = proxy_new_queue_event(trans_id, rm_id, queue_id, name, get_pbs_attr_count(attrs) + 1);
-    proxy_msg_add_keyval_string(m, PTP_QUEUE_STATE_ATTR, PTP_QUEUE_STATE_NORMAL);
-    add_pbs_attributes(m, attrs);
-	proxy_svr_queue_msg(conn, m);
-
-	free(queue_id);
-	free(rm_id);
-}
-
-static int
-num_node_attrs(ptp_node *node)
-{
-	int	cnt = 0;
-	if (node->number >= 0)
-		cnt++;
-	return cnt;	
-}
-
-/*
- * NOTE: sending a NODE_NUMBER_ATTR will enable the node number ruler in the machines view.
- */
-static void
-add_node_attrs(proxy_msg *m, ptp_node *node)
-{
-	if (node->number >= 0)
-		proxy_add_int_attribute(m, PTP_NODE_NUMBER_ATTR, node->number);
-}
-
-static ptp_filter *
-new_filter()
-{
-	ptp_filter *	f = (ptp_filter *)malloc(sizeof(ptp_filter));
-
-	f->hash = HashCreate(DEFAULT_FILTER_ATTR_HASH_SIZE);
-	f->num_attrs = 0;
-	f->children = false;
-
-	return f;
-}
-
-static void
-add_filter_attribute(ptp_filter *f, char *attr)
-{
-	char *	name = proxy_copy_attribute_name_filter(attr);
-	char *	value = proxy_get_attribute_value_str(attr);
-
-	if (name != NULL && value != NULL) {
-		regex_t *	reg = (regex_t *)malloc(sizeof(regex_t));
-		int idx = HashCompute(name, strlen(name));
-		if (regcomp(reg, value, REG_EXTENDED|REG_NOSUB) == 0) {
-			HashInsert(f->hash, idx, reg);
-			f->num_attrs++;
-		} else {
-			free(reg);
-		}
-		free(name);
-	}
-}
-
-static void
-free_filter(ptp_filter *f)
-{
-	HashDestroy(f->hash, free);
-	free(f);
-}
-
-static bool
-match_filter_str(int id, bool is_child, struct attrl *attrs)
-{
-	struct attrl *	attr;
-	ptp_filter *	f = (ptp_filter *)HashSearch(gFilters, id);
-
-	if (f != NULL && (f->children | !is_child)) {
-		for (attr = attrs; attr != NULL; attr = attr->next) {
-			regex_t	*	reg = (regex_t *)HashFind(f->hash, attr->name);
-			if (reg != NULL && regexec(reg, attr->value, 0, NULL, 0) != 0) {
-				return false;
-			}
-		}
-	}
-
-	return true;
-}
-
-void
-update_filter(int id, ptp_filter *nf)
-{
-	ptp_filter *	f = (ptp_filter *)HashSearch(gFilters, id);
-
-	if (f != NULL) {
-		/*
-		 * If no attributes specified, remove existing filter otherwise
-		 * remove current filter and replace with new
-		 */
-		HashRemove(gFilters, id);
-		free_filter(f);
-
-		if (nf->num_attrs == 0) {
-			free_filter(nf);
-			return;
-		}
-	}
-
-	HashInsert(gFilters, id, (void *)nf);
-}
-
-static void
-sendNewJobEvent(int trans_id, ptp_job *j)
-{
-	char *		job_id;
-	char *		queue_id;
-	proxy_msg *	m;
-
-	asprintf(&job_id, "%d", j->ptp_jobid);
-	asprintf(&queue_id, "%d", j->queue->id);
-
-	m = proxy_new_job_event(trans_id, queue_id, job_id, j->pbs_jobid, PTP_JOB_STATE_STARTING, j->jobsubid);
-	proxy_svr_queue_msg(conn, m);
-
-	free(job_id);
-	free(queue_id);
-}
-
-static void
-sendNewNodeEvent(int trans_id, int machid, ptp_machine *mach)
-{
-	ptp_node *	n;
-	proxy_msg *	m;
-	char *		machine_id;
-	char *		node_id;
-	
-	asprintf(&machine_id, "%d", machid);
-	
-	m = proxy_new_node_event(trans_id, machine_id, SizeOfList(mach->nodes));
-	
-	for (SetList(mach->nodes); (n = (ptp_node *)GetListElement(mach->nodes)) != NULL; ) {
-		asprintf(&node_id, "%d", n->id);
-		proxy_add_node(m, node_id, n->name, n->state, num_node_attrs(n));
-		add_node_attrs(m, n);
-		free(node_id);
-	}
-	
-	proxy_svr_queue_msg(conn, m);
-	
-	free(machine_id);
-}
-
-static void
-sendNewProcessEvent(int trans_id, int jobid, ptp_process *p, char *state)
-{
-	proxy_msg *	m;
-	char *		job_id;
-	char *		proc_id;
-	char *		name;
-	
-	asprintf(&job_id, "%d", jobid);
-	asprintf(&proc_id, "%d", p->id);
-	asprintf(&name, "%d",  p->task_id);
-	
-	m = proxy_new_process_event(trans_id, job_id, 1);
-	proxy_add_process(m, proc_id, name, state, 3);
-	proxy_add_int_attribute(m, PTP_PROC_NODEID_ATTR, p->node_id);
-	proxy_add_int_attribute(m, PTP_PROC_INDEX_ATTR, p->task_id);
-	proxy_add_int_attribute(m, PTP_PROC_PID_ATTR, p->pid);
-	
-	proxy_svr_queue_msg(conn, m);
-	
-	free(job_id);
-	free(proc_id);
-	free(name);
-}
-
-static void
-sendProcessStateChangeEvent(int trans_id, ptp_job *j, char *state)
-{
-	proxy_msg *	m;
-	
-	if (j == NULL || j->num_procs == 0)
-		return;
-		
-	m = proxy_process_change_event(trans_id, rangeset_to_string(j->set), 1);
-	proxy_add_string_attribute(m, PTP_PROC_STATE_ATTR, state);
-	proxy_svr_queue_msg(conn, m);
-}
-
-static void
-sendRMAttributesEvent(int trans_id, struct attrl *attr)
-{
-	proxy_msg *	m;
-	char *rm_id;
-
-	asprintf(&rm_id, "%d", gBaseID);
-
-	m = proxy_rm_change_event(trans_id, rm_id, get_pbs_attr_count(attr));
-	add_pbs_attributes(m, attr);
-	proxy_svr_queue_msg(conn, m);
-
-	free(rm_id);
-}
-	
-static void
-sendJobChangeEvent(int trans_id, ptp_job *j, struct attrl *attrs)
-{
-	char *	job_id;
-	proxy_msg *	m;
-
-	asprintf(&job_id, "%d", j->ptp_jobid);
-	m = proxy_job_change_event(trans_id, job_id, get_pbs_attr_count(attrs));
-	add_pbs_attributes(m, attrs);
-	proxy_svr_queue_msg(conn, m);
-	free(job_id);
-}
-
-static void
-sendJobStateChangeEvent(int trans_id, int jobid, char *state)
-{
-	char *		job_id;
-	proxy_msg *	m;
-	
-	asprintf(&job_id, "%d", jobid);
-
-	m = proxy_job_change_event(trans_id, job_id, 1);
-	proxy_add_string_attribute(m, PTP_JOB_STATE_ATTR, state);
-	proxy_svr_queue_msg(conn, m);
-	
-	free(job_id);
-}
-
-static void
-sendProcessChangeEvent(int trans_id, ptp_process *p, int node_id, int task_id, int pid)
-{
-	int			cnt = 0;
-	char *		proc_id;
-	proxy_msg *	m;
-	
-	if (p->node_id != node_id || p->task_id != task_id || p->pid != pid) {
-		if (p->node_id != node_id) {
-			cnt++;	
-		}
-		if (p->task_id != task_id) {
-			cnt++;	
-		}
-		if (p->pid != pid) {
-			cnt++;	
-		}
-		
-		asprintf(&proc_id, "%d", p->id);
-
-		m = proxy_process_change_event(trans_id, proc_id, cnt);
-		
-		if (p->node_id != node_id) {
-			p->node_id = node_id;
-			proxy_add_int_attribute(m, PTP_ELEMENT_ID_ATTR, node_id);
-		}
-		if (p->task_id != task_id) {
-			p->task_id = task_id;
-			proxy_add_int_attribute(m, PTP_PROC_INDEX_ATTR, task_id);
-		}
-		if (p->pid != pid) {
-			p->pid = pid;
-			proxy_add_int_attribute(m, PTP_PROC_PID_ATTR, pid);
-		}
-		
-		proxy_svr_queue_msg(conn, m);
-		
-		free(proc_id);
-	}
-}
-
-/*
- * TODO: optimize this so that we don't send one event for
- * every process, even if the output is identical.
- */
-static void
-sendProcessOutputEvent(int trans_id, int procid, char *output)
-{
-	char *		proc_id;
-	proxy_msg *	m;
-	
-	asprintf(&proc_id, "%d", procid);
-	
-	m = proxy_process_change_event(trans_id, proc_id, 1);
-	proxy_add_string_attribute(m, PTP_PROC_STDOUT_ATTR, output);
-	proxy_svr_queue_msg(conn, m);
-	
-	free(proc_id);	
-}
-
-/*
- * Set initial filter on queues
- */
-static void
-initialize_queue_filter(ptp_queue *q)
-{
-	char *			attr;
-	ptp_filter *	f = new_filter();
-
-	f->children = true;
-	asprintf(&attr, "Job_OwnerFilter=%s@.*", gUserName);
-	add_filter_attribute(f, attr);
-	update_filter(q->id, f);
-	free(attr);
-}
-
-/******************************
- * START OF DISPATCH ROUTINES *
- ******************************/
-int
-PBS_Initialize(int trans_id, int nargs, char **args)
-{
-	int						i;
-	ptp_machine *			mach;
-	struct batch_status *	s;
-	struct batch_status *	status;
-	
-	if (debug_level > 0) {
-		fprintf(stderr, "PBS_Initialize (%d):\n", trans_id); fflush(stderr);
-	}
-	
-	if (proxy_state != STATE_INIT) {
-		sendErrorEvent(trans_id, RTEV_ERROR_INIT, "already initialized");
-		return PTP_PROXY_RES_OK;
-	}
-	
-	/*
-	 * Process arguments for the init command
-	 */
-	for (i = 0; i < nargs; i++) {
-		if (proxy_test_attribute(PTP_PROTOCOL_VERSION_ATTR, args[i])) {
-			if (strcmp(proxy_get_attribute_value_str(args[i]), WIRE_PROTOCOL_VERSION) != 0) {
-				sendErrorEvent(trans_id, RTEV_ERROR_INIT, "wire protocol version \"%s\" not supported", args[0]);
-				return PTP_PROXY_RES_OK;
-			}
-		} else if (proxy_test_attribute(PTP_BASE_ID_ATTR, args[i])) {
-			gBaseID = proxy_get_attribute_value_int(args[i]);
-		}
-	}
-
-	/*
-	 * It's an error if no base ID was supplied
-	 */
-	if (gBaseID < 0) {
-		sendErrorEvent(trans_id, RTEV_ERROR_INIT, "no base ID supplied");
-		return PTP_PROXY_RES_OK;
-	}
-	
-	stream = pbs_connect(NULL);
-	if (stream < 0) {
-		sendErrorEvent(trans_id, RTEV_ERROR_INIT, "could not connect to PBS daemon");
-		return PTP_PROXY_RES_OK;
-	}
-
-	status = pbs_statserver(stream, NULL, NULL);
-	if (status == NULL) {
-		sendErrorEvent(trans_id, RTEV_ERROR_INIT, pbs_geterrmsg(stream));
-		return PTP_PROXY_RES_OK;
-	}
-
-	/*
-	 * Create the server machine
-	 */
-	mach = new_machine(status->name);
-
-	pbs_statfree(status);
-
-	/*
-	 * Get queues and queue attributes
-	 */
-	status = pbs_statque(stream, NULL, NULL, NULL);
-	if (status == NULL) {
-		sendErrorEvent(trans_id, RTEV_ERROR_INIT, pbs_geterrmsg(stream));
-		return PTP_PROXY_RES_OK;
-	}
-
-	for (s=status; s != NULL; s = s->next) {
-		ptp_queue * q = new_queue(s->name);
-		initialize_queue_filter(q);
-	}
-
-	pbs_statfree(status);
-
-	proxy_state = STATE_RUNNING;
-		
-	sendOKEvent(trans_id);
-		
-	return PTP_PROXY_RES_OK;
-}
-
-/**
- * Initiate the model definition phase
- */
-int
-PBS_ModelDef(int trans_id, int nargs, char **args)
-{
-	if (debug_level > 0) {
-		fprintf(stderr, "PBS_ModelDef (%d):\n", trans_id); fflush(stderr);
-	}
-	
-	/*
-	 * Send attribute definitions
-	 */
-	/*
-	 * Send default filters
-	 */
-	sendOKEvent(trans_id);
-	return PTP_PROXY_RES_OK;
-}
-
-/**
- * Stop polling for LSF change events
- */
- int
-PBS_StopEvents(int trans_id, int nargs, char **args)
-{
-	if (debug_level > 0) {
-		fprintf(stderr, "  PBS_StopEvents (%d):\n", trans_id); fflush(stderr);
-	}
-	/* notification that start events have completed */
-	sendOKEvent(gTransID);
-	gTransID = 0;
-	sendOKEvent(trans_id);
-	return PTP_PROXY_RES_OK;
-}
-
-/**
- * Submit a job with the given executable path and arguments (remote call from a client proxy)
- *
- * TODO - what about queues, should there be a LSF_Submit?
- */
-int
-PBS_SubmitJob(int trans_id, int nargs, char **args)
-{
-	int						i;
-	int						a;
-	int						debug = false;
-	int						num_args = 0;
-	int						num_env = 0;
-	int						debug_argc = 0;
-	char *					jobsubid = NULL;
-	char *					pbs_jobid = NULL;
-	char *					queue_name = NULL;
-	char *					full_path;
-	char *					pgm_name = NULL;
-	char *					cwd = NULL;
-	char *					exec_path = NULL;
-	char *					debug_exec_name = NULL;
-	char *					debug_exec_path = NULL;
-	char *					debug_full_path;
-	char **					debug_args = NULL;
-	char **					env = NULL;
-	ptp_queue *				queue;
-
-	if (debug_level > 0) {
-		fprintf(stderr, "  PBS_SubmitJob (%d):\n", trans_id);
-	}
-
-	for (i = 0; i < nargs; i++) {
-		if (debug_level > 0) {
-			fprintf(stderr, "\t%s\n", args[i]);
-		}
-		if (proxy_test_attribute(PTP_JOB_SUB_ID_ATTR, args[i])) {
-			jobsubid = proxy_get_attribute_value_str(args[i]);
-		} else if (proxy_test_attribute(PTP_QUEUE_ID_ATTR, args[i])) {
-			queue_name = proxy_get_attribute_value_str(args[i]);
-		} else if (proxy_test_attribute(PTP_JOB_EXEC_NAME_ATTR, args[i])) {
-			pgm_name = proxy_get_attribute_value_str(args[i]);
-		} else if (proxy_test_attribute(PTP_JOB_EXEC_PATH_ATTR, args[i])) {
-			exec_path = proxy_get_attribute_value_str(args[i]);
-		} else if (proxy_test_attribute(PTP_JOB_WORKING_DIR_ATTR, args[i])) {
-			cwd = proxy_get_attribute_value_str(args[i]);
-		} else if (proxy_test_attribute(PTP_JOB_PROG_ARGS_ATTR, args[i])) {
-			num_args++;
-		} else if (proxy_test_attribute(PTP_JOB_ENV_ATTR, args[i])) {
-			num_env++;
-		} else if (proxy_test_attribute(PTP_JOB_DEBUG_ARGS_ATTR, args[i])) {
-			debug_argc++;
-		} else if (proxy_test_attribute(PTP_JOB_DEBUG_FLAG_ATTR, args[i])) {
-			debug = proxy_get_attribute_value_bool(args[i]);
-		}
-	}
-
-	if (debug_level > 0) {
-		fflush(stderr);
-	}
-	
-	if (jobsubid == NULL) {
-		sendErrorEvent(trans_id, RTEV_ERROR_SUBMIT, "missing ID on job submission");
-		return PTP_PROXY_RES_OK;
-	}
-	
-	if (proxy_state != STATE_RUNNING) {
-		sendJobSubErrorEvent(trans_id, jobsubid, "must call INIT first");
-		return PTP_PROXY_RES_OK;
-	}
-	
-	if (queue_name == NULL) {
-		sendJobSubErrorEvent(trans_id, jobsubid, "no queue specified");
-		return PTP_PROXY_RES_OK;
-	}
-
-	if ((queue = find_queue_by_name(queue_name)) == NULL) {
-		sendJobSubErrorEvent(trans_id, jobsubid, "unknown queue specified");
-		return PTP_PROXY_RES_OK;
-	}
-
-	if (nargs < 1) {
-		sendJobSubErrorEvent(trans_id, jobsubid, "incorrect arg count");
-		return PTP_PROXY_RES_OK;
-	}
-	
-	/*
-	 * Do some checking first
-	 */
-	 
-	if (pgm_name == NULL) {
-		sendJobSubErrorEvent(trans_id, jobsubid, "Must specify a program name");
-		return PTP_PROXY_RES_OK;
-	}
-	
-	/*
-	 * Get supplied environment. It is used to locate executable if necessary.
-	 */
-	
-	if (num_env > 0) {
-		env = (char **)malloc((num_env + 1) * sizeof(char *));
-		for (i = 0, a = 0; i < nargs; i++) {
-			if (proxy_test_attribute(PTP_JOB_ENV_ATTR, args[i]))
-				env[a++] = strdup(proxy_get_attribute_value_str(args[i]));
-		}
-		env[a] = NULL;
-	}
-		
-	/*
-	 * If no path is specified, then try to locate executable.
-	 */		
-	if (exec_path == NULL) {
-		full_path = pgm_name;
-	} else {
-		asprintf(&full_path, "%s/%s", exec_path, pgm_name);
-	}
-	
-	if (access(full_path, X_OK) < 0) {
-		sendJobSubErrorEvent(trans_id, jobsubid, strerror(errno));
-		return PTP_PROXY_RES_OK;
-	}
-	
-	if (debug) {		
-		debug_argc++;
-		debug_args = (char **)malloc((debug_argc+1) * sizeof(char *));
-		for (i = 0, a = 1; i < nargs; i++) {
-			if (proxy_test_attribute(PTP_JOB_DEBUG_ARGS_ATTR, args[i])) {
-				debug_args[a++] = proxy_get_attribute_value_str(args[i]);
-			} else if (proxy_test_attribute(PTP_JOB_DEBUG_EXEC_NAME_ATTR, args[i])) {
-				debug_exec_name = proxy_get_attribute_value_str(args[i]);
-			} else if (proxy_test_attribute(PTP_JOB_DEBUG_EXEC_PATH_ATTR, args[i])) {
-				debug_exec_path = proxy_get_attribute_value_str(args[i]);
-			}
-		}
-		debug_args[a] = NULL;
-		
-		/*
-		 * If no path is specified, then try to locate executable.
-		 */		
-		if (debug_exec_path == NULL) {
-			debug_full_path = debug_exec_name;
-		} else {
-			asprintf(&debug_full_path, "%s/%s", debug_exec_path, debug_exec_name);
-		}
-		
-		if (access(debug_full_path, X_OK) < 0) {
-			sendJobSubErrorEvent(trans_id, jobsubid, strerror(errno));
-			return PTP_PROXY_RES_OK;
-		}
-
-		debug_args[0] = strdup(debug_full_path);
-	}
-
-	/* app_jobid = pbs_submit(stream, ...); */
-	
-	if (pbs_jobid == NULL) {
-		sendJobSubErrorEvent(trans_id, jobsubid, pbs_geterrmsg(stream));
-		return PTP_PROXY_RES_OK;
-	}
-	
-	new_job(0, false, queue, jobsubid, pbs_jobid);
-
-	/*
-	 * Send ok for job submission.
-	 */	
-	sendOKEvent(trans_id);
-	
-	return PTP_PROXY_RES_OK;
-}
-
-/* 
- * terminate a job, given a jobid 
- */
-int
-PBS_TerminateJob(int trans_id, int nargs, char **args)
-{
-	int			i;
-	int			jobid = -1;
-	ptp_job *	j;
-	
-	if (proxy_state != STATE_RUNNING) {
-		sendErrorEvent(trans_id, RTEV_ERROR_JOB, "Must call INIT first");
-		return PTP_PROXY_RES_OK;
-	}
-	
-	for (i = 0; i < nargs; i++) {
-		if (proxy_test_attribute(PTP_JOB_ID_ATTR, args[i])) {
-			jobid = proxy_get_attribute_value_int(args[i]);
-		}
-	}
-	
-	if (jobid < 0) {
-		sendJobTerminateErrorEvent(trans_id, jobid, "Invalid job ID");
-		return PTP_PROXY_RES_OK;
-	}
-	
-	if ((j = find_job_by_id(jobid)) != NULL) {
-		if (j->state == JOB_TERMINATING) {
-			sendJobTerminateErrorEvent(trans_id, jobid, "Job termination already requested");
-			return PTP_PROXY_RES_OK;
-		}
-		
-		j->state = JOB_TERMINATING;
-
-		/* pbs_terminate(j->pbs_jobid); */
-		
-		sendOKEvent(trans_id);
-	}
-	
-	return PTP_PROXY_RES_OK;
-}
-
-/*
- * Enables sending of events. The first thing that must be sent is a
- * description of the model. This comprises new model element events
- * for each element in the model. Once the model description has been
- * sent, model change events will be sent as detected.
- * 
- */
- int
-PBS_StartEvents(int trans_id, int nargs, char **args)
-{
-	ptp_machine *			mach;
-	struct batch_status *	s;
-	struct batch_status *	status;
-	
-	if (debug_level > 0) {
-		fprintf(stderr, "  PBS_StartEvents (%d):\n", trans_id); fflush(stderr);
-	}
-
-	if (proxy_state != STATE_RUNNING) {
-		sendErrorEvent(trans_id, RTEV_ERROR_START_EVENTS, "must call INIT first");
-		return PTP_PROXY_RES_OK;
-	}
-
-	gTransID = trans_id;
-	
-	/*
-	 * Send the RM attributes
-	 */
-	status = pbs_statserver(stream, NULL, NULL);
-	if (status == NULL) {
-		sendErrorEvent(trans_id, RTEV_ERROR_START_EVENTS, pbs_geterrmsg(stream));
-		return PTP_PROXY_RES_OK;
-	}
-
-	sendRMAttributesEvent(trans_id, status->attribs);
-
-	/*
-	 * Send the machines
-	 */
-	for (SetList(gMachineList); (mach = (ptp_machine *)GetListElement(gMachineList)) != NULL; ) {
-		sendNewMachineEvent(trans_id, mach->id, mach->name);
-	}
-
-	pbs_statfree(status);
-
-	/*
-	 * Send queues and queue attributes
-	 */
-	status = pbs_statque(stream, NULL, NULL, NULL);
-	if (status == NULL) {
-		sendErrorEvent(trans_id, RTEV_ERROR_START_EVENTS, pbs_geterrmsg(stream));
-		return PTP_PROXY_RES_OK;
-	}
-
-	for (s=status; s != NULL; s = s->next) {
-		ptp_queue * q = find_queue_by_name(s->name);
-		if (q != NULL) {
-			sendNewQueueEvent(trans_id, q->id, q->name, s->attribs);
-		}
-	}
-
-	pbs_statfree(status);
-
-	if (debug_level > 0) {
-		fprintf(stderr, "  end PBS_StartEvents (%d):\n", trans_id); fflush(stderr);
-	}
-
-	return PTP_PROXY_RES_OK;
-}
-
-int
-PBS_Quit(int trans_id, int nargs, char **args)
-{
-	int old_state = proxy_state;
-	
-	if (debug_level > 0) {
-		fprintf(stderr, "PBS_Quit called!\n"); fflush(stderr);
-	}
-	
-	proxy_state = STATE_SHUTTING_DOWN;
-
-	if (old_state == STATE_RUNNING) {
-		shutdown_pbs();
-	}
-	
-	sendShutdownEvent(trans_id);
-	
-	return PTP_PROXY_RES_OK;
-}
-
-int
-PBS_FilterEvents(int trans_id, int nargs, char **args)
-{
-	int				i;
-	int				id = 0;
-	bool			filter_children = false;
-	ptp_filter *	f;
-
-	if (debug_level > 0) {
-		fprintf(stderr, "  PBS_FilterEvents (%d):\n", trans_id); fflush(stderr);
-	}
-
-	f = new_filter();
-
-	for (i = 0; i < nargs; i++) {
-		if (proxy_test_attribute(PTP_ELEMENT_ID_ATTR, args[i])) {
-			id = atoi(proxy_get_attribute_value_str(args[i]));
-		} else if (proxy_test_attribute(PTP_FILTER_CHILDREN_ATTR, args[i])) {
-			filter_children = proxy_get_attribute_value_bool(args[i]);
-		} else {
-			add_filter_attribute(f, args[i]);
-		}
-	}
-
-	if (id == 0) {
-		sendErrorEvent(trans_id, RTEV_ERROR_FILTER, "no element ID specified");
-		return PTP_PROXY_RES_OK;
-	}
-
-	f->children = filter_children;
-
-	update_filter(id, f);
-
-	return PTP_PROXY_RES_OK;
-}
-
-static int
-poll_pbs()
-{
-	int						new_jobs = 0;
-	int						changed_jobs = 0;
-	int						removed_jobs = 0;
-	HashEntry *				h;
-	Hash *					tmpJobHash;
-	ptp_job *				j;
-	struct batch_status *	status;
-	struct batch_status *	s;
-
-	status = pbs_statjob(stream, NULL, NULL, NULL);
-	if (status < 0) {
-		if (debug_level > 0) {
-			fprintf(stderr, "pbs_statjob: %s\n", pbs_geterrmsg(stream));
-		}
-		return -1;
-	}
-
-	/*
-	 * Create tmp job hash
-	 * Create tmp job list
-	 * foreach (job in status) {
-	 * 	add job and attributes to tmp job hash
-	 *  if (job not in job hash) {
-	 *  	add to tmp job list
-	 *  }
-	 * }
-	 * foreach (job in job hash) {
-	 * 	if job does not exist in tmp hash, remove job
-	 * }
-	 * foreach (job in tmp job list) {
-	 * 	add to job hash
-	 * }
-	 */
-	tmpJobHash = HashCreate(DEFAULT_HASH_SIZE);
-
-	for (s = status; s != NULL; s = s->next) {
-		int idx = HashCompute(s->name, strlen(s->name));
-		HashInsert(tmpJobHash, idx, (void *)s);
-	}
-
-	for (HashSet(gJobHash); (h = HashGet(gJobHash)) != NULL; ) {
-		j = (ptp_job *)h->h_data;
-		if (HashFind(tmpJobHash, j->pbs_jobid) == NULL) {
-			sendJobStateChangeEvent(gTransID, j->ptp_jobid, PTP_JOB_STATE_COMPLETED);
-			//sendRemoveJobEvent(gTransID, j);
-			removed_jobs++;
-		}
-	}
-
-	for (HashSet(tmpJobHash); (h = HashGet(tmpJobHash)) != NULL; ) {
-		j = (ptp_job *)HashSearch(gJobHash, h->h_hval);
-		s = (struct batch_status *)h->h_data;
-		if (j == NULL) {
-			char * queue_name = NULL;
-			ptp_queue * queue = NULL;
-
-			queue_name = find_pbs_queue_name(s->attribs);
-
-			if (queue_name == NULL || ((queue = find_queue_by_name(queue_name)) == NULL)) {
-				break;
-			}
-
-			/*
-			 * Check for queue filters
-			 */
-			if (match_filter_str(queue->id, true, s->attribs)) {
-				j = new_job(0, false, queue, NULL, s->name);
-
-				if (debug_level > 0) {
-					fprintf(stderr, "creating new job for %s\n", s->name); fflush(stderr);
-				}
-			} else if (debug_level > 0) {
-				fprintf(stderr, "filtered job %s\n", s->name); fflush(stderr);
-			}
-		}
-		if (j->state == JOB_CREATED) {
-			sendNewJobEvent(gTransID, j);
-			j->state = JOB_NORMAL;
-			new_jobs++;
-		}
-		changed_jobs++;
-	}
-
-	if (debug_level > 0) {
-		fprintf(stderr, "poll_pbs: new=%d, changed=%d, removed=%d\n", new_jobs, changed_jobs, removed_jobs); fflush(stderr);
-	}
-
-	HashDestroy(tmpJobHash, NULL);
-
-	return 0;
-}
-
-static void
-initialize()
-{
-	struct passwd *	pw;
-
-	gJobList = NewList();
-	gJobHash = HashCreate(DEFAULT_HASH_SIZE);
-	gMachineList = NewList();
-	gQueueList = NewList();
-	gFilters = HashCreate(DEFAULT_FILTER_HASH_SIZE);
-
-	pw = getpwuid(getuid());
-	if (pw != NULL) {
-		gUserName = strdup(pw->pw_name);
-	}
-}
-
-static int
-server(char *name, char *host, int port)
-{
-	int				rc = 0;
-	int				poll_timeout = 0;
-	struct timeval	timeout = {0, PROXY_TIMEOUT};
-	
-	initialize();
-	
-	if (proxy_svr_init(name, &timeout, &helper_funcs, &command_tab, &conn) != PTP_PROXY_RES_OK) {
-		if (debug_level > 0) {
-			fprintf(stderr, "proxy failed to initialized\n"); fflush(stderr);
-		}
-		return 0;
-	}
-	
-	if (proxy_svr_connect(conn, host, port) == PTP_PROXY_RES_OK) {
-		if (debug_level > 0) {
-			fprintf(stderr, "proxy connected\n"); fflush(stderr);
-		}
-		
-		while (ptp_signal_exit == 0 && proxy_state != STATE_SHUTDOWN) {
-			if (proxy_state == STATE_SHUTTING_DOWN) {
-				proxy_state = STATE_SHUTDOWN;
-			}
-			if (gTransID > 0) {
-				if ((poll_timeout -= PROXY_TIMEOUT) <= 0) {
-					if (poll_pbs() < 0) {
-						break;
-					}
-					poll_timeout = PBS_POLL_INTERVAL;
-				}
-			}
-			if (proxy_svr_progress(conn) != PTP_PROXY_RES_OK) {
-				break;
-			}
-		}
-		
-		if (ptp_signal_exit != 0) {
-			if (ptp_signal_exit != SIGCHLD && proxy_state != STATE_SHUTTING_DOWN
-					&& proxy_state != STATE_SHUTDOWN) {
-				shutdown_pbs();
-			}
-			/* our return code = the signal that fired */
-			rc = ptp_signal_exit;
-		}
-	} else if (debug_level > 0) {
-		fprintf(stderr, "proxy connection failed\n"); fflush(stderr);
-	}
-	
-	proxy_svr_finish(conn);
-	
-	return rc;
-}
-
-RETSIGTYPE
-ptp_signal_handler(int sig)
-{
-		int	ret;
-		if (sig == SIGCHLD)
-			wait(&ret);
-		ptp_signal_exit = sig;
-		if(sig >= 0 && sig < NSIG) {
-			RETSIGTYPE (*saved_signal)(int) = saved_signals[sig];
-			if(saved_signal != SIG_ERR && saved_signal != SIG_IGN && saved_signal != SIG_DFL) {
-				saved_signal(sig);
-			}
-		}
-}
-
-int
-main(int argc, char *argv[])
-{
-	int				ch;
-	int				port = PTP_PROXY_TCP_PORT;
-	char *			host = DEFAULT_HOST;
-	char *			proxy_str = DEFAULT_PROXY;
-	int				rc;
-	
-	while ((ch = getopt_long(argc, argv, "P:p:h:d:", longopts, NULL)) != -1)
-	switch (ch) {
-	case 'P':
-		proxy_str = optarg;
-		break;
-	case 'p':
-		port = (int)strtol(optarg, NULL, 10);
-		break;
-	case 'h':
-		host = optarg;
-		break;
-	case 'd':
-		debug_level = (int)strtol(optarg, NULL, 10);
-		break;
-	default:
-		fprintf(stderr, "%s [--proxy=proxy] [--host=host_name] [--port=port] [--debug=level]\n", argv[0]);
-		return 1;
-	}
-	
-	/* 
-	 * signal can happen any time after handlers are installed, so
-	 * make sure we catch it
-	 */
-	ptp_signal_exit = 0;
-	
-#if 0
-	/* setup our signal handlers */
-	saved_signals[SIGINT] = signal(SIGINT, ptp_signal_handler);
-	saved_signals[SIGHUP] = signal(SIGHUP, ptp_signal_handler);
-	saved_signals[SIGILL] = signal(SIGILL, ptp_signal_handler);
-	saved_signals[SIGSEGV] = signal(SIGSEGV, ptp_signal_handler);
-	saved_signals[SIGTERM] = signal(SIGTERM, ptp_signal_handler);
-	saved_signals[SIGQUIT] = signal(SIGQUIT, ptp_signal_handler);
-	saved_signals[SIGABRT] = signal(SIGABRT, ptp_signal_handler);
-	saved_signals[SIGCHLD] = signal(SIGCHLD, ptp_signal_handler);
-	
-	if(saved_signals[SIGINT] != SIG_ERR && saved_signals[SIGINT] != SIG_IGN && saved_signals[SIGINT] != SIG_DFL) {
-		fprintf(stderr, "  ---> SIGNAL SIGINT was previously already defined.  Shadowing.\n"); fflush(stderr);
-	}
-	if(saved_signals[SIGHUP] != SIG_ERR && saved_signals[SIGHUP] != SIG_IGN && saved_signals[SIGHUP] != SIG_DFL) {
-		fprintf(stderr, "  ---> SIGNAL SIGHUP was previously already defined.  Shadowing.\n"); fflush(stderr);
-	}
-	if(saved_signals[SIGILL] != SIG_ERR && saved_signals[SIGILL] != SIG_IGN && saved_signals[SIGILL] != SIG_DFL) {
-		fprintf(stderr, "  ---> SIGNAL SIGILL was previously already defined.  Shadowing.\n"); fflush(stderr);
-	}
-	if(saved_signals[SIGSEGV] != SIG_ERR && saved_signals[SIGSEGV] != SIG_IGN && saved_signals[SIGSEGV] != SIG_DFL) {
-		fprintf(stderr, "  ---> SIGNAL SIGSEGV was previously already defined.  Shadowing.\n"); fflush(stderr);
-	}	
-	if(saved_signals[SIGTERM] != SIG_ERR && saved_signals[SIGTERM] != SIG_IGN && saved_signals[SIGTERM] != SIG_DFL) {
-		fprintf(stderr, "  ---> SIGNAL SIGTERM was previously already defined.  Shadowing.\n"); fflush(stderr);
-	}
-	if(saved_signals[SIGQUIT] != SIG_ERR && saved_signals[SIGQUIT] != SIG_IGN && saved_signals[SIGQUIT] != SIG_DFL) {
-		fprintf(stderr, "  ---> SIGNAL SIGQUIT was previously already defined.  Shadowing.\n"); fflush(stderr);
-	}
-	if(saved_signals[SIGABRT] != SIG_ERR && saved_signals[SIGABRT] != SIG_IGN && saved_signals[SIGABRT] != SIG_DFL) {
-		fprintf(stderr, "  ---> SIGNAL SIGABRT was previously already defined.  Shadowing.\n"); fflush(stderr);
-	}	
-	if(saved_signals[SIGCHLD] != SIG_ERR && saved_signals[SIGABRT] != SIG_IGN && saved_signals[SIGCHLD] != SIG_DFL) {
-		fprintf(stderr, "  ---> SIGNAL SIGABRT was previously already defined.  Shadowing.\n"); fflush(stderr);
-	}
-#endif
-	rc = server(proxy_str, host, port);
-	
-	return rc;
-}
diff --git a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/.classpath b/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/.classpath
deleted file mode 100644
index 64c5e31..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<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="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/.project b/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/.project
deleted file mode 100644
index 196b388..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.etfw.feedback.sample</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/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/.settings/org.eclipse.jdt.core.prefs b/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index a72f27f..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,8 +0,0 @@
-#Fri Nov 06 09:51:25 EST 2009
-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.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/META-INF/MANIFEST.MF b/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/META-INF/MANIFEST.MF
deleted file mode 100644
index f6603e2..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,12 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Sample
-Bundle-SymbolicName: org.eclipse.ptp.etfw.feedback.sample; singleton:=true
-Bundle-Version: 1.0.0.qualifier
-Bundle-Activator: org.eclipse.ptp.etfw.feedback.sample.Activator
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.ptp.etfw.feedback;bundle-version="1.0.0",
- org.eclipse.core.resources;bundle-version="3.5.1"
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/build.properties b/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/build.properties
deleted file mode 100644
index 0d3d3a7..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = plugin.xml,\
-               META-INF/,\
-               .,\
-               icons/
diff --git a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/data/sample.c b/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/data/sample.c
deleted file mode 100644
index 2632918..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/data/sample.c
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- ============================================================================
- Name        : SampleC.c
- Author      : 
- Version     :
- Copyright   : Your copyright notice
- Description : Hello World in C, Ansi-style
- ============================================================================
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-
-int main(void) {
-	puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */
-	for (int var = 0; var < max; ++var) {
-		puts("loop");
-	}
-	return EXIT_SUCCESS;
-}
diff --git a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/data/sample.xml b/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/data/sample.xml
deleted file mode 100644
index 3198a3b..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/data/sample.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0"?>
-<SampleXMLRoot>
-   <MyItem name="main is here" parent="mysample" file="sample.c" function="main" lineNo="14"  isFunction="true" id="0"/>
-   <MyItem name="loop is here" parent="mysample" file="sample.c" function="main" lineNo="16"  isFunction="true" id="1"/>
-   <MyItem name="this is return" parent="mysample" file="sample.c" function="turkey" lineNo="19"  isFunction="true" id="2"/>
-   <MyItem name="open brace" parent="braces" file="sample.c" function="turkey" lineNo="14"  isFunction="true" id="3"/>
-   <MyItem name="close brace" parent="braces" file="sample.c" function="turkey" lineNo="18"  isFunction="true" id="4"/>
-</SampleXMLRoot>
\ No newline at end of file
diff --git a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/icons/feedback_action.gif b/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/icons/feedback_action.gif
deleted file mode 100644
index 47580d0..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/icons/feedback_action.gif
+++ /dev/null
Binary files differ
diff --git a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/icons/feedback_view.gif b/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/icons/feedback_view.gif
deleted file mode 100644
index 9fa6f8e..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/icons/feedback_view.gif
+++ /dev/null
Binary files differ
diff --git a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/icons/sample.gif b/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/icons/sample.gif
deleted file mode 100644
index 34fb3c9..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/icons/sample.gif
+++ /dev/null
Binary files differ
diff --git a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/plugin.xml b/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/plugin.xml
deleted file mode 100644
index a4fe36b..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/plugin.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-  
-   <extension
-         point="org.eclipse.ui.menus">
-         
-      <menuContribution
-            locationURI="menu:org.eclipse.ui.main.menu?after=additions">
-         <menu
-               label="Feedback"
-               mnemonic="%menu.mnemonic"
-               id="org.eclipse.ptp.etfw.feedback.actions.menus.sampleMenu">
-            <command
-                  commandId="org.eclipse.ptp.etfw.feedback.actions.commands.sampleCommand"
-                  mnemonic="%command.mnemonic"
-                  id="org.eclipse.ptp.etfw.feedback.actions.menus.sampleCommand">
-            </command>
-         </menu>
-      </menuContribution>
-      <menuContribution
-            locationURI="toolbar:org.eclipse.ui.main.toolbar?after=additions">
-         <toolbar
-               id="org.eclipse.ptp.etfw.feedback.actions.toolbars.sampleToolbar">
-            <command
-                  commandId="org.eclipse.ptp.etfw.feedback.actions.commands.sampleCommand"
-                  icon="icons/feedback_view.gif"
-                  tooltip="Show ETFw Feedback view for selected XML file"
-                  id="org.eclipse.ptp.etfw.feedback.actions.toolbars.sampleCommand">
-            </command>
-         </toolbar>
-      </menuContribution>
-   </extension>
-      <extension
-         id="sampleParser"
-         name="Sample PTP Feedback view report items"
-         point="org.eclipse.ptp.etfw.feedback.parser">
-      <feedtype
-            class="org.eclipse.ptp.etfw.feedback.sample.SampleFeedbackParser"
-            id="org.eclipse.ptp.etfw.feedback.sample.parser"
-            name="Sample feedback parser"
-            nodeName="SampleXMLRoot">
-      </feedtype>
-   </extension>
-     <extension
-         point="org.eclipse.ui.views">
-   <!--   <category
-            name="Sample Feedback View"
-            id="org.eclipse.ptp.etfw.feedback">
-      </category>
-      -->
-      <view
-            name="Sample Feedback items"
-            icon="icons/feedback_view.gif"
-            category="org.eclipse.ptp.etfw.feedback"
-            class="org.eclipse.ptp.etfw.feedback.sample.SampleFeedbackView"
-            id="org.eclipse.ptp.etfw.feedback.sample.view">
-      </view>
-   </extension>
-      <extension
-         id="sampleAction"
-         name="Sample Added Action"
-         point="org.eclipse.ptp.etfw.feedback.action">
-      <action
-            class="org.eclipse.ptp.etfw.feedback.sample.actions.SampleFeedbackAction"
-            icon="icons/feedback_action.gif"
-            id="sampleFeedbackAction1"
-            name="Sample Feedback Action"
-            viewID="org.eclipse.ptp.etfw.feedback.sample.view">
-      </action>
-   </extension>
-
-</plugin>
diff --git a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/Activator.java b/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/Activator.java
deleted file mode 100644
index 6bb582f..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/Activator.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2009 IBM Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ptp.etfw.feedback.sample;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class Activator extends AbstractUIPlugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.ptp.etfw.feedback.sample";
-	public static final String MARKER_ID = "org.eclipse.ptp.etfw.feedback.sample.marker";
-	public static final String VIEW_ID = "org.eclipse.ptp.etfw.feedback.sample.view";
-
-	// The shared instance
-	private static Activator plugin;
-
-	/**
-	 * The constructor
-	 */
-	public Activator() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		plugin = this;
-	}
-
-	/*
-	 * (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 Activator getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given
-	 * plug-in relative path
-	 *
-	 * @param path the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		return imageDescriptorFromPlugin(PLUGIN_ID, path);
-	}
-}
diff --git a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleFeedbackItem.java b/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleFeedbackItem.java
deleted file mode 100644
index 98083c5..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleFeedbackItem.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2009 IBM Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ptp.etfw.feedback.sample;
-
-import java.util.List;
-
-import org.eclipse.ptp.etfw.feedback.obj.IFeedbackItem;
-
-/**
- * @author Beth Tibbitts
- *
- */
-public class SampleFeedbackItem implements IFeedbackItem {
-	private String name;
-	private String parentID;
-	private String id;
-	private String description;
-	private String filename;
-	private int lineNo;
-
-	public SampleFeedbackItem(String name, String parentID, String id, String filename, int lineNo, String description) {
-		this.name=name;
-		this.parentID=parentID;
-		this.id=id;
-		this.filename=filename;
-		this.lineNo=lineNo;
-		this.description=description;
-	}
-	/* (non-Javadoc)
-	 * @see org.eclipse.ptp.etfw.feedback.obj.IFeedbackItem#getChildren()
-	 */
-	public List<IFeedbackItem> getChildren() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ptp.etfw.feedback.obj.IFeedbackItem#getDescription()
-	 */
-	public String getDescription() {
-		return description;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ptp.etfw.feedback.obj.IFeedbackItem#getFile()
-	 */
-	public String getFile() {
-		return filename;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ptp.etfw.feedback.obj.IFeedbackItem#getID()
-	 */
-	public String getID() {
-		return id;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ptp.etfw.feedback.obj.IFeedbackItem#getLineNoStart()
-	 */
-	public int getLineNoStart() {
-		return this.lineNo;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ptp.etfw.feedback.obj.IFeedbackItem#getName()
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ptp.etfw.feedback.obj.IFeedbackItem#getParentID()
-	 */
-	public String getParentID() {
-		return parentID;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ptp.etfw.feedback.obj.IFeedbackItem#hasChildren()
-	 */
-	public boolean hasChildren() {
-		// TODO Auto-generated method stub
-		return false;
-	}
-
-}
diff --git a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleFeedbackParser.java b/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleFeedbackParser.java
deleted file mode 100644
index d42585c..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleFeedbackParser.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2009 IBM Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ptp.etfw.feedback.sample;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.xpath.XPath;
-import javax.xml.xpath.XPathConstants;
-import javax.xml.xpath.XPathExpression;
-import javax.xml.xpath.XPathExpressionException;
-import javax.xml.xpath.XPathFactory;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IWorkspace;
-import org.eclipse.core.resources.ResourcesPlugin;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.Path;
-import org.eclipse.ptp.etfw.feedback.AbstractFeedbackParser;
-import org.eclipse.ptp.etfw.feedback.obj.IFeedbackItem;
-import org.w3c.dom.Document;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.SAXException;
-
-/**
- * Sample parser to return items for the ETFw Feedback view
- * @author beth
- *
- */
-public class SampleFeedbackParser extends AbstractFeedbackParser {
-	private boolean traceOn=false;
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ptp.etfw.feedback.obj.IFeedbackParser#getFeedbackItems()
-	 */
-	public IFeedbackItem[] getFeedbackItems() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	public List<IFeedbackItem> getFeedbackItems(IFile file) {
-		if(traceOn)System.out.println("Reading xml file: "+file.getLocation());
-		String xmlfile = file.getLocation().toOSString();
-		List<IFeedbackItem> items=new ArrayList<IFeedbackItem>();
-		try {
-			items=parse(xmlfile);
-		} catch (XPathExpressionException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		} catch (ParserConfigurationException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		} catch (SAXException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		} catch (IOException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		
-		return items;
-	}
-
-	public void setFile(IFile file) {
-		System.out.println("not used!");
-		
-	}
-
-	public List<IFeedbackItem> getFeedbackItems(File file) {		
-		// this is probably twisted around, too much converting back and forth
-		IWorkspace workspace =ResourcesPlugin.getWorkspace();
-		IPath location = Path.fromOSString(file.getAbsolutePath());
-		IFile ifile = workspace.getRoot().getFileForLocation(location);
-		List<IFeedbackItem> items = getFeedbackItems(ifile);
-		return items;
-	}
-
-	public void setFile(File file) {
-		System.out.println("not used!");
-		
-	}
-
-	/**
-	 * Marker ID for markers added by this feedback parser.
-	 * For now they are all the same, using plugin id.
-	 */
-	public String getMarkerID() {
-		return Activator.MARKER_ID;
-	}
-	public String getViewID() {
-		return Activator.VIEW_ID;
-	}
-
-	/**
-	 * Populate objects from the xml file given
-	 * @param xmlfile
-	 * @throws ParserConfigurationException
-	 * @throws SAXException
-	 * @throws IOException
-	 * @throws XPathExpressionException
-	 */
-	public List<IFeedbackItem> parse(String xmlfile)
-	  throws ParserConfigurationException, SAXException, 
-	  IOException, XPathExpressionException {
-	      
-		  DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
-		  domFactory.setNamespaceAware(true); // never forget this!
-	      Document document = null;
-	      DocumentBuilder builder = domFactory.newDocumentBuilder();
-	
-	      File file = new File(xmlfile);
-	      if(!file.exists()) {
-	    	  System.out.println("Cannot find file: "+xmlfile);
-	    	  return null;
-	      }
-	      if(traceOn)System.out.println("Parse XML file: "+file);
-
-	      List<IFeedbackItem> items = new ArrayList<IFeedbackItem>();
-
-	      // look for file in same dir as xml file
-	      IPath p = new Path(xmlfile);
-	      p=p.removeLastSegments(1);
-	      String filepath=p.toPortableString()+IPath.SEPARATOR;//+"mhd.F";  
-
-	      document = builder.parse(file);
-		      
-	      XPathFactory factory = XPathFactory.newInstance();
-	      XPath xpath = factory.newXPath();
-	      
-	      /* get the hotspots */
-	      XPathExpression expr 
-	       = xpath.compile("//*[local-name()='MyItem']");
-	
-	      Object result = expr.evaluate(document, XPathConstants.NODESET);
-	      NodeList nodes = (NodeList) result;
-	      for (int i = 0; i < nodes.getLength(); i++) {
-	          NamedNodeMap attributes = nodes.item(i).getAttributes();
-	          if (attributes == null) continue;
-				try {
-					String name = attributes.getNamedItem("name").getNodeValue();
-
-					String fname = attributes.getNamedItem("file").getNodeValue();
-					fname=filepath+fname; // fully qualify (if needed?)
-					String function = attributes.getNamedItem("function").getNodeValue();
-					String line = attributes.getNamedItem("lineNo").getNodeValue();
-					int lineNo = Integer.parseInt(line);
-					String id = attributes.getNamedItem("id").getNodeValue();
-					Node parentNode=attributes.getNamedItem("parent");
-					String parentID="noParent";
-					if(parentNode!=null) {
-					  parentID=attributes.getNamedItem("parent").getNodeValue();
-					}
-					SampleFeedbackItem item = new SampleFeedbackItem(name, parentID, id, fname, lineNo, function);
-					items.add(item);
-				} catch (Exception e) {
-					System.out.println("SampleFeedbackParser: Exception creating item " + i);
-				}
-	
-	      }//end for
-
-
-	      
-	      return items;
-	}
-
-}
diff --git a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleFeedbackView.java b/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleFeedbackView.java
deleted file mode 100644
index c014148..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleFeedbackView.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2009 IBM Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ptp.etfw.feedback.sample;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.preference.IPreferenceStore;
-import org.eclipse.ptp.etfw.feedback.FeedbackIDs;
-import org.eclipse.ptp.etfw.feedback.preferences.PreferenceConstants;
-import org.eclipse.ptp.etfw.feedback.views.SimpleTreeTableMarkerView;
-
-
-
-/**
- * Expose xlC compiler transformation information in an eclipse view
- * 
- * @author beth 
- * 
- */
-public class SampleFeedbackView extends SimpleTreeTableMarkerView {
-	/**
-	 * Assure that parent nodes will get created as needed: that is,
-	 * we don't have IFeedbackItem objects for the parents. Parent "nodes"
-	 * are created for each unique parentID, thus "categorizing" the items
-	 * automatically
-	 */
-	private static boolean CREATE_PARENT_NODES=true;
-	
-
-	/**
-	 * Attribute names, used to store info in the marker, corresponding to each column in the view.
-	 * Use these constants or values of your own.
-	 * To add/remove a column, modify this: (1)
-	 */
-	private static String[] attrNames=new String[] {
-		FeedbackIDs.FEEDBACK_ATTR_NAME,
-		FeedbackIDs.FEEDBACK_ATTR_FILENAME,
-		FeedbackIDs.FEEDBACK_ATTR_ID,
-		FeedbackIDs.FEEDBACK_ATTR_FUNCTION_CALLEE,
-		IMarker.LINE_NUMBER, // Note: currently column 5 (index=4) must be an int value, presumably line number.
-		                     // This restriction will be lifted and generalized later.
-		/*IMarker.CHAR_START,IMarker.CHAR_END*/
-		FeedbackIDs.FEEDBACK_ATTR_DESC};
-	/** To add/remove a column, modify this: (2)*/
-	private static String[] colNames=new String[] {"Type/Name","File",  "ID", "blank", "LineNo",
-		/*"Char start","Char end"*/ "Description*" };
-	/** To add/remove a column, modify this: (3)*/
-	private static int[] widths = new int[] { 160, 100, 50, 50, 80, 200  };
-	
-	protected IPreferenceStore preferenceStore;
-	protected boolean maintainExpandCollapseState;
-	
-	
-	/**
-	 * Use the ctor that allows an arbitrary number of extra columns.
-	 * This ctor is called (1). FIXME need to generalize the name "Xform" used here?
-	 */
-	public SampleFeedbackView() {
-		super(Activator.getDefault(), "XForm", "XForms", attrNames,colNames,widths,
-				Activator.MARKER_ID, "parent",CREATE_PARENT_NODES);
-		preferenceStore = Activator.getDefault().getPreferenceStore();
-		maintainExpandCollapseState=preferenceStore.getBoolean(PreferenceConstants.P_MAINTAIN_EXPAND_COLLAPSE_STATE);
-
-	}
-
-	/**
-	 * Provide something for the "Info" popup action, based on the marker
-	 * <br>Since we didn't use the Artifact, Artifact Manager, etc in the base class we need something to look useful here.
-	 */
-	@Override
-	public String extractMarkerInfo(IMarker marker) {
-		StringBuffer infoBuffer= new StringBuffer();
-		String filename = marker.getResource().getName();
-		String name=getStrAttr(marker, FeedbackIDs.FEEDBACK_ATTR_NAME);
-		infoBuffer.append("\nThis information provided by SampleFeedbackView.extractMarkerInfo()");
-		infoBuffer.append("\nFile name: ").append(filename);
-		
-		infoBuffer.append("\nLine number: ").append(getStrAttr(marker,IMarker.LINE_NUMBER));
-		infoBuffer.append("\nName: ").append(name);
-		String parent=getStrAttr(marker, FeedbackIDs.FEEDBACK_ATTR_PARENT);
-		infoBuffer.append("\nParent (Item type): ").append(parent);
-		infoBuffer.append("\nDescription: ").append(getStrAttr(marker,FeedbackIDs.FEEDBACK_ATTR_DESC));
-		return infoBuffer.toString();
-	}
-	public String getStrAttr(IMarker marker, String attrName) {
-		try {
-		String str=marker.getAttribute(attrName).toString();
-		
-		return str;
-		}catch(CoreException e) {
-			System.out.println("Exception getting marker attr in CompilerXFormTreeTableView.getStrAttr() "+e.getMessage());  
-			return "*error*";
-		}
-		
-	}
-
-	/**
-	 * 
-	 */
-	@Override
-	protected void maintainExpandCollapseStatus() {
-		// re-query each time, in case prefs have changed
-		maintainExpandCollapseState = preferenceStore.getBoolean(PreferenceConstants.P_MAINTAIN_EXPAND_COLLAPSE_STATE);
-		if (maintainExpandCollapseState) {
-			switch (expandCollapseStatus) {
-			case EXPAND_COLLAPSE_EXPANDALL:
-				expandAllAction.run();
-				break;
-			case EXPAND_COLLAPSE_COLLAPSEALL:
-				collapseAllAction.run();
-				break;
-			case EXPAND_COLLAPSE_NONE:
-				// do nothing: user hasn't done expandAll or collapseAll yet.
-			}
-		}
-	}
-
-}
diff --git a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleShowFeedbackHandler.java b/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleShowFeedbackHandler.java
deleted file mode 100644
index b32824d..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleShowFeedbackHandler.java
+++ /dev/null
@@ -1,24 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2009 IBM Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-
-package org.eclipse.ptp.etfw.feedback.sample;
-
-import org.eclipse.ptp.etfw.feedback.actions.handlers.ShowFeedbackHandler;
-
-/**
- * Handler to handle actions from this plug-in to show its data in the Feedback View
- * 
- * @author beth tibbitts
- *
- */
-public class SampleShowFeedbackHandler extends ShowFeedbackHandler {
-
-}
diff --git a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/actions/SampleFeedbackAction.java b/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/actions/SampleFeedbackAction.java
deleted file mode 100644
index 80d75ff..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/actions/SampleFeedbackAction.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/**********************************************************************
- * Copyright (c) 2010 IBM Corporation.
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.ptp.etfw.feedback.sample.actions;
-
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.ptp.etfw.feedback.AbstractFeedbackAction;
-import org.eclipse.ptp.etfw.feedback.obj.IFeedbackItem;
-import org.eclipse.ptp.etfw.feedback.sample.Activator;
-
-/**
- * A sample action that can be added to the ETFw Feedback view
- * @author beth
- *
- */
-public class SampleFeedbackAction extends AbstractFeedbackAction {
-
-	
-
-	public void run(IMarker marker) {
-		String name="(unknown)";
-		try {
-			name = (String)marker.getAttribute("name");
-		} catch (CoreException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		MessageDialog.openInformation(null, "Sample action", "Do something interesting here with marker: "+name);
-
-	}
-
-	public void run(IFeedbackItem item) {
-		MessageDialog.openInformation(null, "Sample action", "Do something interesting here with IFeedbackItem");
-
-	}
-
-
-	public String getToolTip() {
-		return "SampleFeedbackAction tooltip";
-	}
-
-	@Override
-	public String getText() {
-		return "SampleFeedbackAction text";
-	}
-
-	@Override
-	public String getPluginId() {
-		return Activator.PLUGIN_ID;
-	}
-
-}
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/.classpath b/tools/pldt/org.eclipse.ptp.pldt.tests/.classpath
deleted file mode 100644
index 64c5e31..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<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="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/.project b/tools/pldt/org.eclipse.ptp.pldt.tests/.project
deleted file mode 100644
index edd88d3..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.pldt.tests</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/tools/pldt/org.eclipse.ptp.pldt.tests/.settings/org.eclipse.jdt.core.prefs b/tools/pldt/org.eclipse.ptp.pldt.tests/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 9fda8be..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-#Thu Jun 19 09:17:08 EDT 2008
-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.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/META-INF/MANIFEST.MF b/tools/pldt/org.eclipse.ptp.pldt.tests/META-INF/MANIFEST.MF
deleted file mode 100644
index ecd8004..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,19 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: PLDT Tests Plug-in
-Bundle-SymbolicName: org.eclipse.ptp.pldt.tests
-Bundle-Version: 1.0.0
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.junit;bundle-version="3.8.2",
- org.eclipse.cdt.core.tests,
- org.eclipse.core.resources,
- org.eclipse.cdt.core,
- org.eclipse.ptp.pldt.common,
- org.eclipse.ptp.pldt.mpi.core,
- org.eclipse.ptp.pldt.openmp.core,
- org.eclipse.ptp.pldt.openmp.analysis;bundle-version="4.0.0",
- org.eclipse.ptp.pldt.openmp.ui.pv;bundle-version="4.0.0",
- org.eclipse.ptp.pldt.mpi.analysis;bundle-version="4.0.0"
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/build.properties b/tools/pldt/org.eclipse.ptp.pldt.tests/build.properties
deleted file mode 100644
index 34d2e4d..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/build.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/HelloFortranMPI.f90 b/tools/pldt/org.eclipse.ptp.pldt.tests/resources/HelloFortranMPI.f90
deleted file mode 100644
index 5285547..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/HelloFortranMPI.f90
+++ /dev/null
@@ -1,109 +0,0 @@
-! ============================================================================
-! Name        : HelloFortranMPI.f90
-! Author      : Polly Parallel
-! Version     :
-! Copyright   : Your copyright notice
-! Description : Calculate Pi in MPI
-! ============================================================================
-
-subroutine calc_pi(rank, num_procs)
-    use mpi
-    implicit none
-
-    integer, intent(in) :: rank
-    integer, intent(in) :: num_procs
-
-    integer          :: i
-    integer          :: ierror
-    integer          :: num_intervals
-    double precision :: h
-    double precision :: mypi
-    double precision :: pi
-    double precision :: sum
-    double precision :: x
-
-    ! set number of intervals to calculate
-    if (rank == 0) num_intervals = 100000000
-
-    ! tell other tasks how many intervals
-    call MPI_Bcast(num_intervals, 1, MPI_INTEGER, 0, MPI_COMM_WORLD, ierror)
-
-    ! now everyone does their calculation
-
-    h = 1.0d0 / num_intervals
-    sum = 0.0d0
-
-    do i = rank + 1, num_intervals, num_procs
-        x = h * (i - 0.5d0);
-        sum = sum + (4.0d0 / (1.0d0 + x*x))
-    end do
-
-    mypi = h * sum
-
-    ! combine everyone's calculations
-    call MPI_Reduce(mypi, pi, 1, MPI_DOUBLE_PRECISION, MPI_SUM, 0, &
-        MPI_COMM_WORLD, ierror)
-
-    if (rank == 0) print *, "PI is approximately ", pi
-end subroutine
-
-program mpi_pi_example
-    use mpi
-    implicit none
-
-    integer, parameter :: LEN = 100               ! message length
-
-    integer            :: ierror                  ! error code
-    integer            :: my_rank                 ! rank of process
-    integer            :: num_procs               ! number of processes
-    integer            :: source                  ! rank of sender
-    integer            :: dest                    ! rank of receiver
-    integer            :: tag                     ! tag for messages
-    character(len=LEN) :: message                 ! storage for message
-    integer            :: status(MPI_STATUS_SIZE) ! return status for receive
-
-    dest = 0
-    tag = 0
-
-    ! start up MPI
-
-    call MPI_Init(ierror)
-
-    ! find out process rank
-    call MPI_Comm_rank(MPI_COMM_WORLD, my_rank, ierror)
-
-    ! find out number of processes
-    call MPI_Comm_size(MPI_COMM_WORLD, num_procs, ierror)
-
-
-    if (my_rank .ne. 0) then
-        ! create message
-        write (message, *) "Greetings from process ", my_rank
-        call MPI_Send(message, LEN, MPI_CHARACTER, &
-                dest, tag, MPI_COMM_WORLD, ierror)
-    else
-        print *, "Num processes: ", num_procs
-        do source = 1, num_procs-1
-            call MPI_Recv(message, LEN, MPI_CHARACTER, source, tag, &
-                    MPI_COMM_WORLD, status, ierror)
-            print *, "Process 0 received ", message
-        end do
-
-        ! now return the compliment
-        write (message, *) "Hi, how are you?"
-    end if
-
-    call MPI_Bcast(message, LEN, MPI_CHARACTER, dest, MPI_COMM_WORLD, ierror)
-
-    if (my_rank .ne. 0) then
-        print *, "Process ", my_rank, " received ", message
-    end if
-
-    ! calculate PI
-    call calc_pi(my_rank, num_procs)
-
-    ! shut down MPI
-    call MPI_Finalize(ierror)
-
-    stop
-end program
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/helloMPIcpp.cpp b/tools/pldt/org.eclipse.ptp.pldt.tests/resources/helloMPIcpp.cpp
deleted file mode 100644
index 8b17e76..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/helloMPIcpp.cpp
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- ============================================================================
- Name        : helloMPIcpp.c
- Author      : Polly Parallel
- Version     :
- Copyright   : Your copyright notice
- Description : Compute Pi in MPI C++
- ============================================================================
- */
-#include <math.h>
-#include "mpi.h"
-#include <iostream>
-using namespace std;
-
-int main(int argc, char *argv[])
-{
-    int n, rank, size, i;
-    double PI25DT = 3.141592653589793238462643;
-    double mypi, pi, h, sum, x;
-
-
-    MPI::Init(argc, argv);
-    size = MPI::COMM_WORLD.Get_size();
-    rank = MPI::COMM_WORLD.Get_rank();
-
-    MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);// test of MPI_form
-
-    while (1) {
-	if (rank == 0) {
-
-		 cout << "Enter the number of intervals: (0 quits)"
-				 << endl;
-			    cin >> n;
-
-	}
-
-	MPI::COMM_WORLD.Bcast(&n, 1, MPI::INT, 0);
-	if (n==0)
-	    break;
-	else {
-	    h = 1.0 / (double) n;
-	    sum = 0.0;
-	    for (i = rank + 1; i <= n; i += size) {
-		x = h * ((double)i - 0.5);
-		sum += (4.0 / (1.0 + x*x));
-	    }
-	    mypi = h * sum;
-
-	    MPI::COMM_WORLD.Reduce(&mypi, &pi, 1, MPI::DOUBLE,
-				   MPI::SUM, 0);
-	    if (rank == 0)
-		cout << "pi is approximately " << pi
-		     << ", Error is " << fabs(pi - PI25DT)
-		     << endl;
-	}
-    }
-    MPI::Finalize();
-    return 0;
-}
-
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/helloOpenMP.c b/tools/pldt/org.eclipse.ptp.pldt.tests/resources/helloOpenMP.c
deleted file mode 100644
index 381058e..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/helloOpenMP.c
+++ /dev/null
@@ -1,27 +0,0 @@
-#include <omp.h>
-#include <stdio.h>
-#include <stdlib.h>
-/**
- * Hello OpenMP World prints the number of threads and the current thread id
- */
-int main (int argc, char *argv[]) {
-
-  int numThreads, tid;
-
-  /* This creates a team of threads; each thread has own copy of variables  */
-#pragma omp parallel private(numThreads, tid)
- {
-   tid = omp_get_thread_num();
-   printf("Hello World from thread number %d\n", tid);
-
-   /* The following is executed by the master thread only (tid=0) */
-   if (tid == 0)
-     {
-       numThreads = omp_get_num_threads();
-       printf("Number of threads is %d\n", numThreads);
-     }
- }
- return 0;
-}
-
-
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/helloOpenMPpragmas.c b/tools/pldt/org.eclipse.ptp.pldt.tests/resources/helloOpenMPpragmas.c
deleted file mode 100644
index 726f304..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/helloOpenMPpragmas.c
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- ============================================================================
- Name        : helloOpenMP2.c
- Author      : Polly Parallel
- Version     :
- Copyright   : Your copyright notice
- Description : Hello OpenMP World in C
- ============================================================================
- */
-#include <omp.h>
-#include <stdio.h>
-#include <stdlib.h>
-/**
- * Hello OpenMP World prints the number of threads and the current thread id
- */
-int main (int argc, char *argv[]) {
-
-  int numThreads, tid;
-
-  /* This creates a team of threads; each thread has own copy of variables  */
-#pragma omp parallel private(numThreads, tid)
- {
-   tid = omp_get_thread_num();
-   printf("Hello World from thread number %d\n", tid);
-
-   /* The following is executed by the master thread only (tid=0) */
-   if (tid == 0)
-     {
-       numThreads = omp_get_num_threads();
-       printf("Number of threads is %d\n", numThreads);
-     }
- }
- // more pragmas, testing their region/scope
-#pragma omp parallel shared(n,a,b)
- {
-   #pragma omp for
-   for (int i=0; i<n; i++)
-   {
-       a[i] = i + 1;
-       #pragma omp parallel for /*-- Okay - This is a parallel region --*/
-       for (int j=0; j<n; j++)
-           b[i][j] = a[i];
-   }
- } /*-- End of parallel region --*/
- return 0;
-}
-
-
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/includes/readme.txt b/tools/pldt/org.eclipse.ptp.pldt.tests/resources/includes/readme.txt
deleted file mode 100644
index a2b0fa8..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/includes/readme.txt
+++ /dev/null
@@ -1,16 +0,0 @@
-this test suite assumes various header files are available in order to run the analysis tests.
-
-To run the tests you will need to put header files in this directory.
-
-For example mpi.h,  such as from openmpi.
-
-The header files you need are indicated near the top of each testcase function
-with a method call to import the required header file.
-For example, in Test_MPI.java, the testMPIartifacts() method has this near the top:
-
-     IFile mpiInclude = importFile("resources/includes","mpi.h");
-     
-     
-     Beth Tibbitts
-     April 2010
-     
\ No newline at end of file
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/openMP.f90 b/tools/pldt/org.eclipse.ptp.pldt.tests/resources/openMP.f90
deleted file mode 100644
index b34fb3a..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/openMP.f90
+++ /dev/null
@@ -1,12 +0,0 @@
-! This is a sample OpenMP program  
-program OpenMP                                     
-    integer :: num_threads, id                     
-    !$omp parallel private(num_threads, id)        
-    id = omp_get_thread_num()
-    print *, 'This is thread ', id
-     if (id == 0) then
-      num_threads = omp_get_num_threads()
-      print *, 'Total threads: ', num_threads
-    end if
-    !$omp end parallel
-end program 
\ No newline at end of file
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/testMPI.c b/tools/pldt/org.eclipse.ptp.pldt.tests/resources/testMPI.c
deleted file mode 100644
index efa16ce..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/testMPI.c
+++ /dev/null
@@ -1,47 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include "mpi.h"
-// Sample MPI program
-int main(int argc, char* argv[]){
-	printf("Hello MPI PTP World!\n");	
-	int  my_rank; /* rank of process */
-	int  p;       /* number of processes */
-	int source;   /* rank of sender */
-	int dest;     /* rank of receiver */
-	int tag=0;    /* tag for messages */
-	char message[100];        /* storage for message */
-	MPI_Status status ;   /* return status for receive */
-	
-	/* start up MPI */
-	
-	MPI_Init(&argc, &argv);
-	
-	/* find out process rank */
-	MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); 
-	
-	/* find out number of processes */
-	MPI_Comm_size(MPI_COMM_WORLD, &p); 
-	
-	
-	if (my_rank !=0){
-		/* create message */
-		sprintf(message, "Greetings from process %d!", my_rank);
-		dest = 0;
-		/* use strlen+1 so that '\0' get transmitted */
-		MPI_Send(message, strlen(message)+1, MPI_CHAR,
-		   dest, tag, MPI_COMM_WORLD);
-	}
-	else{
-		printf("From process 0: Num processes: %d\n",p);
-		for (source = 1; source < p; source++) {
-			MPI_Recv(message, 100, MPI_CHAR, source, tag,
-			      MPI_COMM_WORLD, &status);
-			printf("%s\n",message);
-		}
-	}
-	/* shut down MPI */
-	MPI_Finalize(); 
-	
-	
-	return 0;
-}
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/testMPIbarriers.c b/tools/pldt/org.eclipse.ptp.pldt.tests/resources/testMPIbarriers.c
deleted file mode 100644
index 1bd95c4..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/testMPIbarriers.c
+++ /dev/null
@@ -1,49 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include "mpi.h"
-// Sample MPI program
-int main(int argc, char* argv[]){
-	printf("Hello MPI PTP World!\n");	
-	int  my_rank; /* rank of process */
-	int  p;       /* number of processes */
-	int source;   /* rank of sender */
-	int dest;     /* rank of receiver */
-	int tag=0;    /* tag for messages */
-	char message[100];        /* storage for message */
-	MPI_Status status ;   /* return status for receive */
-	
-	/* start up MPI */
-	
-	MPI_Init(&argc, &argv);
-	
-	/* find out process rank */
-	MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); 
-	
-	/* find out number of processes */
-	MPI_Comm_size(MPI_COMM_WORLD, &p); 
-	
-	
-	if (my_rank !=0){
-		/* create message */
-		sprintf(message, "Greetings from process %d!", my_rank);
-		dest = 0;
-		/* use strlen+1 so that '\0' get transmitted */
-		MPI_Send(message, strlen(message)+1, MPI_CHAR,
-		   dest, tag, MPI_COMM_WORLD);
-		MPI_Barrier(MPI_COMM_WORLD);
-	}
-	else{
-		printf("From process 0: Num processes: %d\n",p);
-		for (source = 1; source < p; source++) {
-			MPI_Recv(message, 100, MPI_CHAR, source, tag,
-			      MPI_COMM_WORLD, &status);
-			printf("%s\n",message);
-		}
-		MPI_Barrier(MPI_COMM_WORLD);
-	}
-	/* shut down MPI */
-	MPI_Finalize(); 
-	
-	
-	return 0;
-}
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/testMPIbarriersErr.c b/tools/pldt/org.eclipse.ptp.pldt.tests/resources/testMPIbarriersErr.c
deleted file mode 100644
index 7934a06..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/testMPIbarriersErr.c
+++ /dev/null
@@ -1,49 +0,0 @@
-#include <stdio.h>
-#include <string.h>
-#include "mpi.h"
-// Sample MPI program
-int main(int argc, char* argv[]){
-	printf("Hello MPI PTP World!\n");	
-	int  my_rank; /* rank of process */
-	int  p;       /* number of processes */
-	int source;   /* rank of sender */
-	int dest;     /* rank of receiver */
-	int tag=0;    /* tag for messages */
-	char message[100];        /* storage for message */
-	MPI_Status status ;   /* return status for receive */
-	
-	/* start up MPI */
-	
-	MPI_Init(&argc, &argv);
-	
-	/* find out process rank */
-	MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); 
-	
-	/* find out number of processes */
-	MPI_Comm_size(MPI_COMM_WORLD, &p); 
-	
-	
-	if (my_rank !=0){
-		/* create message */
-		sprintf(message, "Greetings from process %d!", my_rank);
-		dest = 0;
-		/* use strlen+1 so that '\0' get transmitted */
-		MPI_Send(message, strlen(message)+1, MPI_CHAR,
-		   dest, tag, MPI_COMM_WORLD);
-		MPI_Barrier(MPI_COMM_WORLD);
-	}
-	else{
-		printf("From process 0: Num processes: %d\n",p);
-		for (source = 1; source < p; source++) {
-			MPI_Recv(message, 100, MPI_CHAR, source, tag,
-			      MPI_COMM_WORLD, &status);
-			printf("%s\n",message);
-		}
-		//MPI_Barrier(MPI_COMM_WORLD);
-	}
-	/* shut down MPI */
-	MPI_Finalize(); 
-	
-	
-	return 0;
-}
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/testMPIbarriersTiny.c b/tools/pldt/org.eclipse.ptp.pldt.tests/resources/testMPIbarriersTiny.c
deleted file mode 100644
index ab3e244..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/resources/testMPIbarriersTiny.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include "mpi.h"
-int main(int argc, char* argv[]){
-	int  my_rank; /* rank of process */
-	MPI_Init(&argc, &argv);
-	MPI_Comm_rank(MPI_COMM_WORLD, &my_rank); 
-	if (my_rank !=0){
-		MPI_Barrier(MPI_COMM_WORLD);
-	}
-	else{
-		MPI_Barrier(MPI_COMM_WORLD);
-	}
-	MPI_Finalize(); 
-	return 0;
-}
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/PldtBaseTestFramework.java b/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/PldtBaseTestFramework.java
deleted file mode 100644
index dc53e51..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/PldtBaseTestFramework.java
+++ /dev/null
@@ -1,168 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ptp.pldt.tests;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.HashMap;
-
-import org.eclipse.cdt.core.tests.BaseTestFramework;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.ptp.pldt.common.IDs;
-
-/**
- * Basic Test framework for PLDT tests, extends that of CDT
- * @author Beth Tibbitts
- * 
- */
-public abstract class PldtBaseTestFramework extends BaseTestFramework {
-	private static HashMap<String, ArrayList<Integer>> lineMaps = new HashMap<String, ArrayList<Integer>>();
-
-	protected IFile importFile(String srcDir, String filename) throws Exception {
-		// project.getProject().getFile(filename).delete(true, new
-		// NullProgressMonitor());
-		IFile result = super.importFile(filename, readTestFile(srcDir, filename));
-		// project.refreshLocal(IResource.DEPTH_INFINITE, new
-		// NullProgressMonitor());
-		System.out.println("==========Using file: "+result);
-		return result;
-	}
-
-	protected String readTestFile(String srcDir, String filename) throws IOException, URISyntaxException {
-		ArrayList<Integer> lineMap = new ArrayList<Integer>(50);
-		lineMaps.put(filename, lineMap);
-		lineMap.add(0); // Offset of line 1
-		return readStream(lineMap, getClass().getResourceAsStream("/" + srcDir + "/" + filename));
-	}
-
-	protected String readStream(ArrayList<Integer> lineMap, InputStream inputStream) throws IOException {
-		StringBuffer sb = new StringBuffer(4096);
-		BufferedReader in = new BufferedReader(new InputStreamReader(inputStream));
-		for (int offset = 0, ch = in.read(); ch >= 0; ch = in.read()) {
-			sb.append((char) ch);
-			offset++;
-
-			if (ch == '\n' && lineMap != null) {
-				// System.out.println("Line " + (lineMap.size()+1) +
-				// " starts at offset " + offset);
-				lineMap.add(offset);
-			}
-		}
-		in.close();
-		return sb.toString();
-	}
-
-	protected String readStream(InputStream inputStream) throws IOException {
-		return readStream(null, inputStream);
-	}
-
-	protected String readWorkspaceFile(String filename) throws IOException, CoreException {
-		return readStream(project.getFile(filename).getContents());
-	}
-
-	/**
-	 * @param filename
-	 * @param line
-	 *            line number, starting at 1
-	 * @param col
-	 *            column number, starting at 1
-	 */
-	protected int getLineColOffset(String filename, int line, int col) {
-		return lineMaps.get(filename).get(line - 1) + (col - 1);
-	}
-	
-	/**
-	 * Convenience class for sorting artifacts so we compare them in an expected order
-	 * @author beth
-	 *
-	 */
-	public class ArtifactWithLine implements Comparable{
-		public int getLineNo() {
-			return lineNo;
-		}
-		public String getName() {
-			return name;
-		}
-		public IMarker getMarker() {
-			return marker;
-		}
-		private int lineNo;
-		private String name;
-		private IMarker marker;
-		 
-		public ArtifactWithLine(int line, String nam) {
-			lineNo=line;
-			name=nam;
-		}
-
-		public ArtifactWithLine(IMarker marker) {
-			try {
-				String nam = marker.getAttribute(IDs.NAME).toString();
-				String line=getLineNoAttr(marker );
-				Integer ii = Integer.decode(line);
-				int theInt = ii.intValue();
-				this.lineNo = theInt;
-				this.name = nam;
-				this.marker=marker;
-			} catch (Exception e) {
-				e.printStackTrace();
-			}
-		}
-		
-		public boolean equals(ArtifactWithLine other) {
-			boolean a=this.lineNo==other.lineNo;
-			boolean b=this.name.equals(other.name);
-			return a&&b;
-		}
-
-		public String toString() {
-			return lineNo+": "+name;
-		}
-		boolean traceOn=false;
-		public int compareTo(Object o) {
-			int result;
-			String sign="=";
-			ArtifactWithLine other=(ArtifactWithLine)o;
-			if(this.lineNo<other.lineNo) {
-				result=-1;
-				if(traceOn)sign="<";
-			}
-			else if(this.lineNo>other.lineNo) {
-				result=1;
-				if(traceOn)sign=">";
-			}
-			// lineNo's equal, must compare name
-			else {
-				result=this.name.compareTo(other.name);		
-			}
-			//System.out.println("CompareTo: "+this+" -to- "+other+"; result is: "+result);
-			if(traceOn)System.out.println("ArtifactWithLine.compareTo: "+this.lineNo+sign+other.lineNo);
-			return result;
-		}
-	}
-	public String getLineNoAttr(IMarker marker) throws CoreException {
-		return marker.getAttribute(IMarker.LINE_NUMBER).toString();
-	}
-	public String getNameAttr(IMarker marker) throws CoreException {
-		return (String) marker.getAttribute(IDs.NAME);
-	}
-
-	public String getMethodName() {
-		String name = (new Exception().getStackTrace()[1].getMethodName());
-		return name;
-	}
-}
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/TestFortran.java b/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/TestFortran.java
deleted file mode 100644
index d5c4587..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/TestFortran.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ptp.pldt.tests;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.cdt.core.model.CoreModel;
-import org.eclipse.cdt.core.model.ICElement;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.ptp.pldt.common.IDs;
-import org.eclipse.ptp.pldt.mpi.core.MpiIDs;
-import org.eclipse.ptp.pldt.mpi.core.actions.RunAnalyseMPIcommandHandler;
-import org.eclipse.ptp.pldt.openmp.core.OpenMPPlugin;
-import org.eclipse.ptp.pldt.openmp.core.actions.RunAnalyseOpenMPcommandHandler;
-import org.eclipse.ptp.pldt.tests.PldtBaseTestFramework.ArtifactWithLine;
-
-
-
-/**
- * @author Beth Tibbitts
- *
- */
-public class TestFortran extends PldtBaseTestFramework{
-
-	@SuppressWarnings("unused")
-	public void testMPIartifacts_Fortran() throws Exception {
-		System.out.println("\n==> "+getMethodName()+"()...");
-			IFile file = importFile("resources", "HelloFortranMPI.f90");
-			assertNotNull(file);
-			// include file really not needed for Fortran but needed as arg to runResource
-			IFile mpiInclude = importFile("resources/includes","mpi.h");
-			assertNotNull(mpiInclude);
-			String tempPath = mpiInclude.getFullPath().toOSString();//includePath= /RegressionTestProject/mpi.h
-			System.out.println("tempPath="+tempPath);
-			String includePath = mpiInclude.getWorkspace().getRoot().getRawLocation().toOSString()
-				+ mpiInclude.getFullPath().toFile().getAbsolutePath();
-			System.out.println("includePath= "+includePath);
-			 
-			assertTrue(file instanceof IAdaptable);
-	
-			CoreModel.getDefault().getCModel().makeConsistent(new NullProgressMonitor());//jeff
-	
-			assertNotNull(cproject);
-			ICElement ce = cproject.findElement(file.getFullPath());
-	
-			// ICElement covers folders and translationunits
-			//final ICElement ce = (ICElement) ((IAdaptable)file).getAdapter(ICElement.class);
-			assertNotNull(ce);
-			List<String> includes = Arrays.asList(new String[] {includePath});
-			RunAnalyseMPIcommandHandler racm = new RunAnalyseMPIcommandHandler();
-			
-			racm.runResource(new NullProgressMonitor(), ce, 0, includes);
-			
-			IMarker[] markers=file.findMarkers(MpiIDs.MARKER_ID, true, IResource.DEPTH_INFINITE);
-			assertNotNull(markers);
-			System.out.println("numMarkers: "+markers.length);
-			String temp="{";
-			for (int i = 0; i < markers.length; i++) {
-				IMarker marker = markers[i];
-				int lineNo=(Integer) marker.getAttribute(IMarker.LINE_NUMBER);
-				System.out.println(i+ " marker: lineNo "+lineNo+ " name: "+marker.getAttribute(IDs.NAME));
-				temp+="\""+marker.getAttribute(IDs.NAME)+"\",";
-				
-			}
-			temp+="}";
-			System.out.println(temp);
-			
-			assertEquals(23, markers.length);
-			
-			IMarker m = markers[0];
-			String name= m.getAttribute(IDs.NAME).toString();
-			for (int i = 0; i < markers.length; i++) {
-				
-			}
-	
-			 
-			int[] expectedLinenos = {29,29,29,44,44,44,45,63,70,73,73,76,76,82,82,83,87,87,88,96,96,96,106};
-			String[] expectedMpiTypes = { "MPI_BCAST", "MPI_INTEGER",
-					"MPI_COMM_WORLD", "MPI_REDUCE", "MPI_DOUBLE_PRECISION",
-					"MPI_SUM", "MPI_COMM_WORLD", "MPI_STATUS_SIZE", "MPI_INIT",
-					"MPI_COMM_RANK", "MPI_COMM_WORLD", "MPI_COMM_SIZE",
-					"MPI_COMM_WORLD", "MPI_SEND", "MPI_CHARACTER",
-					"MPI_COMM_WORLD", "MPI_RECV", "MPI_CHARACTER",
-					"MPI_COMM_WORLD", "MPI_BCAST", "MPI_CHARACTER",
-					"MPI_COMM_WORLD", "MPI_FINALIZE" };
-
-			ArtifactWithLine[] expectedArts = new ArtifactWithLine[expectedLinenos.length];
-			ArtifactWithLine[] markerArts = new ArtifactWithLine[markers.length];
-			for (int i = 0; i < expectedArts.length; i++) {
-				expectedArts[i]=new ArtifactWithLine(expectedLinenos[i],expectedMpiTypes[i]);		
-			}
-			for (int i = 0; i < markerArts.length; i++) {
-				markerArts[i]=new ArtifactWithLine(markers[i]);
-			}
-			 
-			Arrays.sort(expectedArts);
-			Arrays.sort(markerArts);
-			
-			assertEquals(expectedArts.length, markerArts.length);
- 
-			// Since these tests are in a loop, if one fails, must inspect the Console output to know which ones finished and which one failed.
-			for (int i = 0; i < markers.length; i++) {
-				// Marker should be on the line number we expect
-				System.out.println(i+". "+expectedArts[i].getLineNo()+" = "+markerArts[i].getLineNo());			
-				assertEquals(expectedArts[i].getLineNo(), markerArts[i].getLineNo());
-				
-				// Marker should be of the type name we expect
-				System.out.println("    "+expectedArts[i].getName()+" = "+markerArts[i].getName());			
-				assertEquals(expectedArts[i].getName(), markerArts[i].getName());
-				
-				boolean test=markerArts[i].equals(expectedArts[i]);
-				//the following never works, so we'll be happy enough with the two assertEquals above.
-				//assertEquals(expectedArts[i], markerArts[i]);
-			}
-
-		}
-
-	public void testOpenMPartifacts_Fortran() throws Exception {
-		System.out.println("\n==> "+getMethodName()+"()...");
-			IFile file = importFile("resources", "openMP.f90");
-			assertNotNull(file);
-			// include file really not needed for Fortran but needed as arg to runResource
-			IFile mpiInclude = importFile("resources/includes","mpi.h");
-			assertNotNull(mpiInclude);
-			String tempPath = mpiInclude.getFullPath().toOSString();//includePath= /RegressionTestProject/mpi.h
-			System.out.println("tempPath="+tempPath);
-			String includePath = mpiInclude.getWorkspace().getRoot().getRawLocation().toOSString()
-				+ mpiInclude.getFullPath().toFile().getAbsolutePath();
-			System.out.println("includePath= "+includePath);
-			 
-			assertTrue(file instanceof IAdaptable);
-	
-			CoreModel.getDefault().getCModel().makeConsistent(new NullProgressMonitor());//jeff
-	
-			assertNotNull(cproject);
-			ICElement ce = cproject.findElement(file.getFullPath());
-	
-			// ICElement covers folders and translationunits
-			//final ICElement ce = (ICElement) ((IAdaptable)file).getAdapter(ICElement.class);
-			assertNotNull(ce);
-			List<String> includes = Arrays.asList(new String[] {includePath});
-			RunAnalyseOpenMPcommandHandler racm = new RunAnalyseOpenMPcommandHandler();
-			
-			racm.runResource(new NullProgressMonitor(), ce, 0, includes);
-			
-			IMarker[] markers=file.findMarkers(OpenMPPlugin.MARKER_ID, true, IResource.DEPTH_INFINITE);
-			assertNotNull(markers);
-			System.out.println("numMarkers: "+markers.length);
-			for (int i = 0; i < markers.length; i++) {
-				IMarker marker = markers[i];
-				int lineNo=(Integer) marker.getAttribute(IMarker.LINE_NUMBER);
-				System.out.println(i+ " marker: lineNo "+lineNo+ " name: "+marker.getAttribute(IDs.NAME));
-			}
-			// the only test of "correctness" now is the number of markers it finds
-			int expectedNum=4;
-			System.out.println("found "+markers.length+" markers, expected "+expectedNum);
-			assertEquals(expectedNum, markers.length);
-			
-			// See other tests for ideas on how to test more details in the markers found.
-			
-
-		}
-}
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_MPI.java b/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_MPI.java
deleted file mode 100644
index 8e78fba..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_MPI.java
+++ /dev/null
@@ -1,299 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ptp.pldt.tests;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.cdt.core.dom.IName;
-import org.eclipse.cdt.core.model.CoreModel;
-import org.eclipse.cdt.core.model.ICElement;
-import org.eclipse.cdt.internal.core.model.TranslationUnit;
-import org.eclipse.core.internal.resources.Marker;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.ptp.pldt.common.IDs;
-import org.eclipse.ptp.pldt.mpi.core.MpiIDs;
-import org.eclipse.ptp.pldt.mpi.core.MpiPlugin;
-import org.eclipse.ptp.pldt.mpi.core.actions.RunAnalyseMPIcommandHandler;
-import org.eclipse.ptp.pldt.openmp.core.OpenMPIDs;
-import org.eclipse.ptp.pldt.openmp.core.OpenMPPlugin;
-import org.eclipse.ptp.pldt.openmp.core.actions.RunAnalyseOpenMPcommandHandler;
-
-
-/**
- * @author beth
- *
- */
-public class Test_MPI extends PldtBaseTestFramework{
-	
-	public void testMPIartifacts() throws Exception {
-		System.out.println("\n==> "+getMethodName()+"()...");
-		
-//		ArtifactWithLine a = new ArtifactWithLine(1, "foo");
-//		ArtifactWithLine b = new ArtifactWithLine(1, "bar");
-//		ArtifactWithLine c= new ArtifactWithLine(2,"foo");
-//		ArtifactWithLine aa = new ArtifactWithLine(1,"foo");
-//		a.compareTo(b);
-//		b.compareTo(a);
-//		a.compareTo(c);
-//		c.compareTo(a);
-//		b.compareTo(c);
-//		c.compareTo(b);
-//		a.compareTo(aa);
-//		b.compareTo(b);
-//		c.compareTo(c);
-		
-		
-		IFile file = importFile("resources", "testMPI.c");
-		assertNotNull(file);
-		
-		IFile mpiInclude = importFile("resources/includes","mpi.h");
-		assertNotNull(mpiInclude);
-		String tempPath = mpiInclude.getFullPath().toOSString();//includePath= /RegressionTestProject/mpi.h
-		System.out.println("tempPath="+tempPath);
-		String includePath = mpiInclude.getWorkspace().getRoot().getRawLocation().toOSString()
-			+ mpiInclude.getFullPath().toFile().getAbsolutePath();
-		System.out.println("includePath= "+includePath);
-
-		assertTrue(file instanceof IAdaptable);
-
-		CoreModel.getDefault().getCModel().makeConsistent(new NullProgressMonitor());//jeff
-
-		assertNotNull(cproject);
-		ICElement ce = cproject.findElement(file.getFullPath());
-
-		// ICElement covers folders and translationunits
-		//final ICElement ce = (ICElement) ((IAdaptable)file).getAdapter(ICElement.class);
-		assertNotNull(ce);
-		List<String> includes = Arrays.asList(new String[] {includePath});
-		RunAnalyseMPIcommandHandler racm = new RunAnalyseMPIcommandHandler();
-		
-		racm.runResource(new NullProgressMonitor(), ce, 0, includes);
-		
-		IMarker[] markers=file.findMarkers(MpiIDs.MARKER_ID, true, IResource.DEPTH_INFINITE);
-		assertNotNull(markers);
-		System.out.println("numMarkers: "+markers.length);
-		// need to sort markers, since they are not returned in a pre-determined order??
-		
-		for (int i = 0; i < markers.length; i++) {
-			IMarker marker = markers[i];
-			int lineNo=(Integer) marker.getAttribute(IMarker.LINE_NUMBER);
-			System.out.println(i+ " marker: lineNo "+lineNo+ " name: "+marker.getAttribute(IDs.NAME));
-		}
-
-
-		//When strings don't match, click on the first entry (ComparisonFailure) in the Failure Trace in the JUnit view to get a diff view
-		//assertEquals("This\nis\na\ntest", "This\nwas\na\ntest");
-
-		int[] expectedLinenos = {17,20,23,31,37,43};
-		String[] expectedMpiTypes= {"MPI_Init", "MPI_Comm_rank", "MPI_Comm_size", "MPI_Send", "MPI_Recv", "MPI_Finalize"};
-		ArtifactWithLine[] expectedArts = new ArtifactWithLine[expectedLinenos.length];
-		ArtifactWithLine[] markerArts = new ArtifactWithLine[markers.length];
-		for (int i = 0; i < expectedArts.length; i++) {
-			expectedArts[i]=new ArtifactWithLine(expectedLinenos[i],expectedMpiTypes[i]);		
-		}
-		for (int i = 0; i < markerArts.length; i++) {
-			markerArts[i]=new ArtifactWithLine(markers[i]);
-		}
-		Arrays.sort(expectedArts);
-		Arrays.sort(markerArts);
-		
-		assertEquals(expectedArts.length, markerArts.length);
-		// Since these tests are in a loop, if one fails, must inspect the Console output to know which ones finished and which one failed.
-		for (int i = 0; i < markers.length; i++) {
-			// Marker should be on the line number we expect
-			System.out.println(i+". "+expectedArts[i].getLineNo()+" = "+markerArts[i].getLineNo());			
-			assertEquals(expectedArts[i].getLineNo(), markerArts[i].getLineNo());
-			
-			// Marker should be of the type name we expect
-			System.out.println("    "+expectedArts[i].getName()+" = "+markerArts[i].getName());			
-			assertEquals(expectedArts[i].getName(), markerArts[i].getName());
-			
-			boolean test=markerArts[i].equals(expectedArts[i]);
-			//the following never works, so we'll be happy enough with the two assertEquals above.
-			//assertEquals(expectedArts[i], markerArts[i]);
-
-		}
-
-	}
-
-
-
-	public void testMPI_CPPartifacts() throws Exception {
-		System.out.println("\n==> "+getMethodName()+"()...");
-			IFile file = importFile("resources", "helloMPIcpp.cpp");
-			assertNotNull(file);
-			
-			IFile mpiInclude = importFile("resources/includes","mpi.h");
-			assertNotNull(mpiInclude);
-			String tempPath = mpiInclude.getFullPath().toOSString();//includePath= /RegressionTestProject/mpi.h
-			System.out.println("tempPath="+tempPath);
-			String includePath = mpiInclude.getWorkspace().getRoot().getRawLocation().toOSString()
-				+ mpiInclude.getFullPath().toFile().getAbsolutePath();
-			System.out.println("includePath= "+includePath);
-	
-			assertTrue(file instanceof IAdaptable);
-	
-			CoreModel.getDefault().getCModel().makeConsistent(new NullProgressMonitor());//jeff
-	
-			assertNotNull(cproject);
-			ICElement ce = cproject.findElement(file.getFullPath());
-	
-			// ICElement covers folders and translationunits
-			//final ICElement ce = (ICElement) ((IAdaptable)file).getAdapter(ICElement.class);
-			assertNotNull(ce);
-			List<String> includes = Arrays.asList(new String[] {includePath});
-			RunAnalyseMPIcommandHandler racm = new RunAnalyseMPIcommandHandler();
-			
-			racm.runResource(new NullProgressMonitor(), ce, 0, includes);
-			
-			IMarker[] markers=file.findMarkers(MpiIDs.MARKER_ID, true, IResource.DEPTH_INFINITE);
-			assertNotNull(markers);
-			System.out.println("numMarkers: "+markers.length);
-			int max= markers.length; //Math.min(10, markers.length);
-			for (int i = 0; i < max; i++) {
-				IMarker marker = markers[i];
-				int lineNo=(Integer) marker.getAttribute(IMarker.LINE_NUMBER);
-				System.out.println(i+ " marker: lineNo "+lineNo+ " name: "+marker.getAttribute(IDs.NAME));
-			}
-			int[] expectedLinenos = {22,23,24,26,37,49,57};
-			final String mpiCW="MPI::COMM_WORLD";
-			String[] expectedMpiTypes= {"MPI::Init", mpiCW, mpiCW, "MPI_Comm_rank", mpiCW, mpiCW, "MPI::Finalize"};
-			//////////////////
-			ArtifactWithLine[] expectedArts = new ArtifactWithLine[expectedLinenos.length];
-			ArtifactWithLine[] markerArts = new ArtifactWithLine[markers.length];
-			for (int i = 0; i < expectedArts.length; i++) {
-				expectedArts[i]=new ArtifactWithLine(expectedLinenos[i],expectedMpiTypes[i]);		
-			}
-			for (int i = 0; i < markerArts.length; i++) {
-				markerArts[i]=new ArtifactWithLine(markers[i]);
-			}
-			Arrays.sort(expectedArts);
-			Arrays.sort(markerArts);
-			
-			assertEquals(expectedArts.length, markerArts.length);
- 
-			// Since these tests are in a loop, if one fails, must inspect the Console output to know which ones finished and which one failed.
-			for (int i = 0; i < markers.length; i++) {
-				// Marker should be on the line number we expect
-				System.out.println(i+". "+expectedArts[i].getLineNo()+" = "+markerArts[i].getLineNo());			
-				assertEquals(expectedArts[i].getLineNo(), markerArts[i].getLineNo());
-				
-				// Marker should be of the type name we expect
-				System.out.println("    "+expectedArts[i].getName()+" = "+markerArts[i].getName());			
-				assertEquals(expectedArts[i].getName(), markerArts[i].getName());
-				
-				boolean test=markerArts[i].equals(expectedArts[i]);
-				//the following never works, so we'll be happy enough with the two assertEquals above.
-				//assertEquals(expectedArts[i], markerArts[i]);
-			}
-		}
-
-	public void testMPI_CPPartifacts_wPref() throws Exception {
-		System.out.println("\n==> "+getMethodName()+"()...");
-		testMPI_CPPartifacts_wPref(true);
-		
-		// this doesn't work from test: works ok and finds cpp artifacts ok with live workspace.
-		// why?? In PldtAstVisitor.processFuncName(), line 211: IName[] names = tu.getDeclarations(binding) is an empty array in Junit test.
-		//testMPI_CPPartifacts_wPref(false);
-		
-		// for now, we will consider the workaround (which is the default setting) to be set "recognize artifacts by prefix" to true
-		
-		// do the same for C?
-
-		}
-
-
-
-	public void testMPI_CPPartifacts_wPref(boolean prefValue) throws Exception {
-	System.out.println("\n==> "+getMethodName()+"()...  prefValue="+prefValue);
-		MpiPlugin.getDefault().getPreferenceStore().setValue(MpiIDs.MPI_RECOGNIZE_APIS_BY_PREFIX_ALONE, prefValue);
-		IFile file = importFile("resources", "helloMPIcpp.cpp");
-		assertNotNull(file);
-		
-		IFile mpiInclude = importFile("resources/includes","mpi.h");
-		System.out.println("Recognize APIs by prefix is set to "+prefValue);
-		assertNotNull(mpiInclude);
-		String tempPath = mpiInclude.getFullPath().toOSString();//includePath= /RegressionTestProject/mpi.h
-		System.out.println("tempPath="+tempPath);
-		String includePath = mpiInclude.getWorkspace().getRoot().getRawLocation().toOSString()
-			+ mpiInclude.getFullPath().toFile().getAbsolutePath();
-		System.out.println("includePath= "+includePath);
-	
-		assertTrue(file instanceof IAdaptable);
-	
-		CoreModel.getDefault().getCModel().makeConsistent(new NullProgressMonitor());//jeff
-	
-		assertNotNull(cproject);
-		ICElement ce = cproject.findElement(file.getFullPath());
-	
-		// ICElement covers folders and translationunits
-		//final ICElement ce = (ICElement) ((IAdaptable)file).getAdapter(ICElement.class);
-		assertNotNull(ce);
-		List<String> includes = Arrays.asList(new String[] {includePath});
-		RunAnalyseMPIcommandHandler racm = new RunAnalyseMPIcommandHandler();
-		
-		racm.runResource(new NullProgressMonitor(), ce, 0, includes);
-		
-		IMarker[] markers=file.findMarkers(MpiIDs.MARKER_ID, true, IResource.DEPTH_INFINITE);
-		assertNotNull(markers);
-		System.out.println("numMarkers: "+markers.length);
-		int max= markers.length; //Math.min(10, markers.length);
-		for (int i = 0; i < max; i++) {
-			IMarker marker = markers[i];
-			int lineNo=(Integer) marker.getAttribute(IMarker.LINE_NUMBER);
-			System.out.println(i+ ". marker: lineNo "+lineNo+ " name: "+marker.getAttribute(IDs.NAME));
-		}
-	
-		int[] expectedLinenos = {22,23,24,26,37,49,57};
-		final String mpiCW="MPI::COMM_WORLD";
-		String[] expectedMpiTypes= {"MPI::Init", mpiCW, mpiCW, "MPI_Comm_rank", mpiCW, mpiCW, "MPI::Finalize"};
-	
-		ArtifactWithLine[] expectedArts = new ArtifactWithLine[expectedLinenos.length];
-		ArtifactWithLine[] markerArts = new ArtifactWithLine[markers.length];
-		for (int i = 0; i < expectedArts.length; i++) {
-			expectedArts[i]=new ArtifactWithLine(expectedLinenos[i],expectedMpiTypes[i]);		
-		}
-		for (int i = 0; i < markerArts.length; i++) {
-			markerArts[i]=new ArtifactWithLine(markers[i]);
-		}
-		Arrays.sort(expectedArts);
-		Arrays.sort(markerArts);
-		
-		assertEquals(expectedArts.length, markerArts.length);
-	
-		// Since these tests are in a loop, if one fails, must inspect the Console output to know which ones finished and which one failed.
-		for (int i = 0; i < markers.length; i++) {
-			// Marker should be on the line number we expect
-			System.out.println(i+". "+expectedArts[i].getLineNo()+" = "+markerArts[i].getLineNo());			
-			assertEquals(expectedArts[i].getLineNo(), markerArts[i].getLineNo());
-			
-			// Marker should be of the type name we expect
-			System.out.println("    "+expectedArts[i].getName()+" = "+markerArts[i].getName());			
-			assertEquals(expectedArts[i].getName(), markerArts[i].getName());
-			
-			boolean test=markerArts[i].equals(expectedArts[i]);
-			//the following never works, so we'll be happy enough with the two assertEquals above.
-			//assertEquals(expectedArts[i], markerArts[i]);
-		}
-	
-	}
-
-
-
-
-
-}
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_MPI_barriers.java b/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_MPI_barriers.java
deleted file mode 100644
index 644d935..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_MPI_barriers.java
+++ /dev/null
@@ -1,268 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ptp.pldt.tests;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.eclipse.cdt.core.model.CoreModel;
-import org.eclipse.cdt.core.model.ICElement;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.ptp.pldt.common.IDs;
-import org.eclipse.ptp.pldt.mpi.analysis.actions.RunAnalyseMPIAnalysiscommandHandler;
-
-
-/**
- * 
- * Test MPI Barrier Analysis
- * 
- * Current status of tests: 29 April 2010
- * 
- * testMPI_barriers_tiny(): 
- *       OK, this very trivial test case of two barriers does match, and no error is found
- *       
- * testMPI_barriers_helloBarrier
- *       (not working) Barriers are not found to be in the same set, and a barrier error is found when it should not.
- * 
- * testMPI_barriers_error()
- *       (not working) does not detect an error, when it should.
- *       
- * Most changes are in org.eclipse.ptp.pldt.mpi.analysis.analysis package
- * most significant changes are in MPIMVAnalaysis.java
- * notation of my initials (BRT) accompany most changes made by me, and notes
- * regarding these problems.
- * See also https://bugs.eclipse.org/bugs/show_bug.cgi?id=306064   Barrier Analysis bug
- * @author beth
- *
- */
-public class Test_MPI_barriers extends PldtBaseTestFramework{
-	
-	public void testMPI_barriers_tiny() throws Exception {
-		System.out.println("\n==> "+getMethodName()+"()...");
-		int[] expectedMarkerLocn={7,10};
-		BarrierSetBasics bsb = new BarrierSetBasics(2,2);// 2 sets, 2 members in each
-		barrierBase("testMPIbarriersTiny.c", expectedMarkerLocn, bsb);
-	}
-	public void testMPI_barriers_helloBarrier() throws Exception{
-		System.out.println("\n==> "+getMethodName()+"()...");
-		int[] expectedMarkerLocn={33,42};
-		BarrierSetBasics bsb = new BarrierSetBasics(2,2);
-		barrierBase("testMPIbarriers.c", expectedMarkerLocn, bsb);
-	}
-	public void testMPI_barriers_error() throws Exception{
-		System.out.println("\n==> "+getMethodName()+"()...");
-		int[] expectedMarkerLocn={33,42};
-		BarrierSetBasics bsb = new BarrierSetBasics(2,2,true);
-		barrierBase("testMPIbarriersErr.c", expectedMarkerLocn, bsb);
-	}
-	public void barrierBase(String filename, int[] expectedMarkerLocn, BarrierSetBasics bsb) throws Exception {	
-		
-		IFile file = importFile("resources", filename);
-		assertNotNull(file);
-		
-		IFile mpiInclude = importFile("resources/includes","mpi.h");
-		assertNotNull(mpiInclude);
-		String tempPath = mpiInclude.getFullPath().toOSString();//includePath= /RegressionTestProject/mpi.h
-		System.out.println("tempPath="+tempPath);
-		String includePath = mpiInclude.getWorkspace().getRoot().getRawLocation().toOSString()
-			+ mpiInclude.getFullPath().toFile().getAbsolutePath();
-		System.out.println("includePath= "+includePath);
-	
-		assertTrue(file instanceof IAdaptable);
-	
-		CoreModel.getDefault().getCModel().makeConsistent(new NullProgressMonitor());//jeff
-	
-		assertNotNull(cproject);
-		ICElement ce = cproject.findElement(file.getFullPath());
-	
-		// ICElement covers folders and translationunits
-		//final ICElement ce = (ICElement) ((IAdaptable)file).getAdapter(ICElement.class);
-		assertNotNull(ce);
-		List<String> includes = Arrays.asList(new String[] {includePath});
-		RunAnalyseMPIAnalysiscommandHandler racm = new RunAnalyseMPIAnalysiscommandHandler();
-		
-		//racm.runResource(new NullProgressMonitor(), ce, 0, includes);
-		//=================================
-		IStructuredSelection selection = new StructuredSelection(file);
-		final boolean reportErrors=false;
-		boolean error=racm.analyseBarriers(selection,reportErrors);
-		System.out.println("Barrier error?="+error+"; expected "+bsb.getError());
-		if(bsb.getError()) {
-			assertTrue("Expected to find barrier error in "+filename, error);
-		}
-		else {
-			assertFalse("No barrier errors should be found in "+filename, error);
-		}
-		
-		String barrierMarkerID=org.eclipse.ptp.pldt.mpi.analysis.IDs.barrierMarkerID;
-		
-		
-		//=================================
-		IMarker[] markers=file.findMarkers(barrierMarkerID, true, IResource.DEPTH_INFINITE);
-		int expectedNumber=expectedMarkerLocn.length;
-		assertNotNull(expectedNumber+" Barrier Markers should be found",markers);
-		System.out.println("numMarkers: "+markers.length+"    number expected: "+expectedNumber);
-		assertEquals(expectedNumber+" barrier markers should be found on "+filename,expectedNumber, markers.length);
-	
-		// will these always appear in the same order? may need to sort before testing/comparison
-		for (int i = 0; i < markers.length; i++) {
-			IMarker marker = markers[i];
-			//showMarker(marker);
-			int lineNo=(Integer) marker.getAttribute(IMarker.LINE_NUMBER);
-			System.out.println(i+ " marker: lineNo "+lineNo+ " name: "+marker.getAttribute(IDs.NAME)+"   expectedLocn: "+expectedMarkerLocn[i]);
-			assertEquals("expected barrier marker locn",expectedMarkerLocn[i], lineNo);
-		}
-		
-		barrierSetTest(filename, file, bsb);
-	
-	}
-	public void barrierSetTest(String filename, IFile file, BarrierSetBasics bsb) throws CoreException {
-		IMarker[] markers;
-		//  Barrier Sets
-		final String barrierSetMarkerID=org.eclipse.ptp.pldt.mpi.analysis.IDs.matchingSetMarkerID;
-		final String barrierParentID=org.eclipse.ptp.pldt.mpi.analysis.IDs.parentIDAttr;
-		final String barrierMyID=org.eclipse.ptp.pldt.mpi.analysis.IDs.myIDAttr;
-		
-		markers=file.findMarkers(barrierSetMarkerID, true, IResource.DEPTH_INFINITE);
-		//assertNotNull("2 Barrier Markers should be found",markers);
-		
-		int[] expectedMarkerLocn2= {7,10,7,10,7,10};
-		
-		int expectedLen=expectedMarkerLocn2.length;
-		System.out.println("===============Barrier Sets: numMarkers: "+markers.length+"  expected: "+expectedLen);
-		//assertEquals(expectedLen+" barrier markers should be found on "+filename,expectedLen, markers.length);
-
-		//int expectedRoots=2;
-		// get parent root markers (parentID=0)
-		List<IMarker> setRoots = new ArrayList<IMarker>();
-		for (int i = 0; i < markers.length; i++) {
-			IMarker marker = markers[i];
-			int lineNo=(Integer) marker.getAttribute(IMarker.LINE_NUMBER);
-			
-			int parentID = ((Integer) marker.getAttribute(barrierParentID)).intValue();
-			if(parentID==0) {
-				setRoots.add(marker);
-				System.out.println("found set starting at line "+lineNo);
-			}
-		}
-		System.out.println("num barrier sets found: "+setRoots.size()+"    num expected: "+bsb.getNumSets());
-		assertEquals("Number of barrier sets",bsb.getNumSets(),setRoots.size());
-		
-		//list what's in each set
-		for (Iterator iterator = setRoots.iterator(); iterator.hasNext();) {
-			IMarker iMarker = (IMarker) iterator.next();
-			int setParentID=((Integer) iMarker.getAttribute(barrierMyID)).intValue();
-			int setParentLineNo=((Integer) iMarker.getAttribute(IMarker.LINE_NUMBER)).intValue();
-			System.out.println("set parentID: "+setParentID +" lineNo: "+setParentLineNo);
-			ArrayList<IMarker> barrierSet = new ArrayList<IMarker>();
-			for (int i = 0; i < markers.length; i++) {
-				IMarker setMemberMarker = markers[i];
-				int parentID=((Integer) setMemberMarker.getAttribute(barrierParentID)).intValue();
-				int memberID=((Integer) setMemberMarker.getAttribute(barrierMyID)).intValue();
-				if(parentID==setParentID) {
-					int lineNo=(Integer) setMemberMarker.getAttribute(IMarker.LINE_NUMBER);
-					System.out.println("  set member: lineNo: "+lineNo+"  parentID: "+parentID+" memberMyID: "+memberID);
-					barrierSet.add(setMemberMarker);
-				}
-			}
-			System.out.println("Barrier set with parentID "+setParentID+" expected "+bsb.numInEachSet+ " members and found "+barrierSet.size()+" members.");
-		}
-//		System.out.println("Barrier Sets: expect "+expectedRoots+"; found "+setRoots.size());
-//		assertEquals("Expected "+expectedRoots+" barrier set roots", expectedRoots,setRoots.size());
-//		// for each set, inspect what we expect in the set
-//		for (int i = 0; i < markers.length; i++) {
-//			IMarker marker = markers[i];
-//			int lineNo=(Integer) marker.getAttribute(IMarker.LINE_NUMBER);
-//			
-//			int parentID = ((Integer) marker.getAttribute(barrierParentID)).intValue();
-//			System.out.println(i+ " marker: lineNo "+lineNo+ " name: "+marker.getAttribute(IDs.NAME)
-//					+" parent="+parentID);
-//			
-//			//assertEquals("expected barrier marker locn",expectedMarkerLocn2[i], lineNo);
-//		}
-		System.out.println("end");
-	}
-	
-	String showMarker(IMarker marker) {
-		return showMarker(marker, "");
-	}
-
-	String showMarker(IMarker marker, String title) {
-		StringBuffer buf = new StringBuffer(" ");
-		buf.append("Marker: " + title);
-		Map map = null;
-
-		try {
-			map = marker.getAttributes();
-			Set keyset = map.keySet();
-			System.out.println("Marker has " + keyset.size() + " values");
-			for (Iterator iterator = keyset.iterator(); iterator.hasNext();) {
-				String key = (String) iterator.next();
-				Object obj = marker.getAttribute(key);
-				String value = obj.toString();
-				System.out.println("  " + key + ": " + value);
-			}
-		} catch (Exception e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-		return "";
-	}
-
-	
-	/**
-	 * Holds the basic parameters of what we expect to find in a Barrier Set.
-	 * <br>
-	 * Admittedly lightweight for now
-	 * @author beth
-	 *
-	 */
-	class BarrierSetBasics{
-
-		int numSets;
-		int numInEachSet; // note: all sets don't have to be the same size but in our very simple test cases so far, this is true
-		boolean hasError=false;
-		
-		BarrierSetBasics(int numSets, int numInEachSet){
-			this.numSets=numSets;
-			this.numInEachSet=numInEachSet;
-			
-		}
-		BarrierSetBasics(int numSets, int numInEachSet, boolean hasError){
-			this(numSets,numInEachSet);
-			this.hasError=hasError;
-			
-		}
-		public int getNumSets() {
-			return numSets;
-		}
-		public int getNumInEachSet() {
-			return numInEachSet;
-		}
-		public boolean getError() {
-			return hasError;
-		}
-	}
-
-
-
-}
diff --git a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_OpenMP.java b/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_OpenMP.java
deleted file mode 100644
index 10bec91..0000000
--- a/tools/pldt/org.eclipse.ptp.pldt.tests/src/org/eclipse/ptp/pldt/tests/Test_OpenMP.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2010 IBM Corporation
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * IBM Corporation - Initial API and implementation
- *******************************************************************************/
-package org.eclipse.ptp.pldt.tests;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.eclipse.cdt.core.dom.ast.IASTNode;
-import org.eclipse.cdt.core.model.CoreModel;
-import org.eclipse.cdt.core.model.ICElement;
-import org.eclipse.cdt.internal.core.dom.parser.ASTNode;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.ptp.pldt.common.Artifact;
-import org.eclipse.ptp.pldt.common.ArtifactManager;
-import org.eclipse.ptp.pldt.common.IArtifact;
-import org.eclipse.ptp.pldt.common.IDs;
-import org.eclipse.ptp.pldt.openmp.analysis.PAST.PASTOMPPragma;
-import org.eclipse.ptp.pldt.openmp.core.OpenMPPlugin;
-import org.eclipse.ptp.pldt.openmp.core.actions.RunAnalyseOpenMPcommandHandler;
-
-
-/**
- * @author beth
- *
- */
-public class Test_OpenMP extends PldtBaseTestFramework{
-	
-	public void testOpenMPartifacts() throws Exception {
-		System.out.println("\n==> "+getMethodName()+"()...");
-	
-			IFile file = importFile("resources", "helloOpenMP.c");
-			assertNotNull(file);
-			
-			IFile openmpInclude = importFile("resources/includes","omp.h");
-			assertNotNull(openmpInclude);
-			String tempPath = openmpInclude.getFullPath().toOSString();//includePath= /RegressionTestProject/mpi.h
-			//System.out.println("tempPath="+tempPath);
-			String includePath = openmpInclude.getWorkspace().getRoot().getRawLocation().toOSString()
-				+ openmpInclude.getFullPath().toFile().getAbsolutePath();
-			//System.out.println("includePath= "+includePath);
-	
-			assertTrue(file instanceof IAdaptable);
-	
-			CoreModel.getDefault().getCModel().makeConsistent(new NullProgressMonitor());//jeff
-	
-			assertNotNull(cproject);
-			ICElement ce = cproject.findElement(file.getFullPath());
-	
-			// ICElement covers folders and translationunits
-			//final ICElement ce = (ICElement) ((IAdaptable)file).getAdapter(ICElement.class);
-			assertNotNull(ce);
-			List<String> includes = Arrays.asList(new String[] {includePath});
-			RunAnalyseOpenMPcommandHandler racm = new RunAnalyseOpenMPcommandHandler();
-			
-			racm.runResource(new NullProgressMonitor(), ce, 0, includes);
-			
-			IMarker[] markers=file.findMarkers(OpenMPPlugin.MARKER_ID, true, IResource.DEPTH_INFINITE);
-			assertNotNull(markers);
-			System.out.println("numMarkers: "+markers.length);
-			// need to sort markers, since they are not returned in a pre-determined order??
-			
-			for (int i = 0; i < markers.length; i++) {
-				IMarker marker = markers[i];
-				int lineNo=(Integer) marker.getAttribute(IMarker.LINE_NUMBER);
-				System.out.println(i+ " marker: lineNo "+lineNo+ " name: "+marker.getAttribute(IDs.NAME));
-			}
-	
-	
-			//When strings don't match, click on the first entry (ComparisonFailure) in the Failure Trace in the JUnit view to get a diff view
-			//assertEquals("This\nis\na\ntest", "This\nwas\na\ntest");
-			// there really should be three, including a pragma. testOpenMP_pragmas will
-			// concentrate on these
-			int[] expectedLinenos = {12, 14,20};
-			final String pragma="#pragma omp parallel private(numThreads, tid)";
-			String[] expectedOpenMPTypes= {pragma, "omp_get_thread_num","omp_get_num_threads"};
-			ArtifactWithLine[] expectedArts = new ArtifactWithLine[expectedLinenos.length];
-			ArtifactWithLine[] markerArts = new ArtifactWithLine[markers.length];
-			for (int i = 0; i < expectedArts.length; i++) {
-				expectedArts[i]=new ArtifactWithLine(expectedLinenos[i],expectedOpenMPTypes[i]);		
-			}
-			for (int i = 0; i < markerArts.length; i++) {
-				markerArts[i]=new ArtifactWithLine(markers[i]);
-			}
-			Arrays.sort(expectedArts);
-			Arrays.sort(markerArts);
-			
-			assertEquals(expectedArts.length, markerArts.length);
-			// Since these tests are in a loop, if one fails, must inspect the Console output to know which ones finished and which one failed.
-			for (int i = 0; i < markers.length; i++) {
-				// Marker should be on the line number we expect
-				System.out.println(i+". "+expectedArts[i].getLineNo()+" = "+markerArts[i].getLineNo());			
-				assertEquals(expectedArts[i].getLineNo(), markerArts[i].getLineNo());
-				
-				// Marker should be of the type name we expect
-				System.out.println("    "+expectedArts[i].getName()+" = "+markerArts[i].getName());			
-				assertEquals(expectedArts[i].getName(), markerArts[i].getName());
-				
-				boolean test=markerArts[i].equals(expectedArts[i]);
-				System.out.println("   markerArts.equals expectedArts: "+test);
-				//the following never works, so we'll be happy enough with the two assertEquals above.
-				//assertEquals(expectedArts[i], markerArts[i]);
-	
-			}
-	
-		}
-
-
-
-	public void testOpenMP_pragmas() throws Exception {
-		System.out.println("\n==> "+getMethodName()+"()...");
-	
-		IFile file = importFile("resources", "helloOpenMPpragmas.c");
-		assertNotNull(file);
-		
-		IFile openmpInclude = importFile("resources/includes","omp.h");
-		assertNotNull(openmpInclude);
-		String tempPath = openmpInclude.getFullPath().toOSString();//includePath= /RegressionTestProject/mpi.h
-		//System.out.println("tempPath="+tempPath);
-		String includePath = openmpInclude.getWorkspace().getRoot().getRawLocation().toOSString()
-			+ openmpInclude.getFullPath().toFile().getAbsolutePath();
-		//System.out.println("includePath= "+includePath);
-	
-		assertTrue(file instanceof IAdaptable);
-	
-		CoreModel.getDefault().getCModel().makeConsistent(new NullProgressMonitor());//jeff
-	
-		assertNotNull(cproject);
-		ICElement ce = cproject.findElement(file.getFullPath());
-	
-		// ICElement covers folders and translationunits
-		//final ICElement ce = (ICElement) ((IAdaptable)file).getAdapter(ICElement.class);
-		assertNotNull(ce);
-		List<String> includes = Arrays.asList(new String[] {includePath});
-		RunAnalyseOpenMPcommandHandler racm = new RunAnalyseOpenMPcommandHandler();
-		
-		racm.runResource(new NullProgressMonitor(), ce, 0, includes);
-		
-		IMarker[] markers=file.findMarkers(OpenMPPlugin.MARKER_ID, true, IResource.DEPTH_INFINITE);
-		assertNotNull(markers);
-		System.out.println("numMarkers: "+markers.length);
-		// need to sort markers, since they are not returned in a pre-determined order??
-		
-
-	
-	
-		//When strings don't match, click on the first entry (ComparisonFailure) in the Failure Trace in the JUnit view to get a diff view
-		//assertEquals("This\nis\na\ntest", "This\nwas\na\ntest");
-	
-		int[] expectedLinenos = {21, 23, 29,34,36,40};
-		final String prag="#pragma omp parallel private(numThreads, tid)";
-		final String prag2="#pragma omp parallel shared(n,a,b)";
-		final String pragFor = "#pragma omp for";
-		final String pragParFor="#pragma omp parallel for";
-		String[] expectedMpiTypes= {prag,"omp_get_thread_num","omp_get_num_threads",prag2,pragFor,pragParFor};
-		ArtifactWithLine[] expectedArts = new ArtifactWithLine[expectedLinenos.length];
-		ArtifactWithLine[] markerArts = new ArtifactWithLine[markers.length];
-		for (int i = 0; i < expectedArts.length; i++) {
-			expectedArts[i]=new ArtifactWithLine(expectedLinenos[i],expectedMpiTypes[i]);		
-		}
-		for (int i = 0; i < markerArts.length; i++) {
-			markerArts[i]=new ArtifactWithLine(markers[i]);
-		}
-		Arrays.sort(expectedArts);
-		Arrays.sort(markerArts);
-		for (int i = 0; i < markers.length; i++) {
-			IMarker marker = markers[i];
-			int lineNo=(Integer) marker.getAttribute(IMarker.LINE_NUMBER);
-			System.out.println(i+ " marker: lineNo "+lineNo+ " name: "+marker.getAttribute(IDs.NAME));
-		}
-		
-		// should find pragma and two other openmp artifacts
-		assertEquals(expectedArts.length, markerArts.length);
-		// Since these tests are in a loop, if one fails, must inspect the Console output to know which ones finished and which one failed.
-		for (int i = 0; i < markers.length; i++) {
-			// Marker should be on the line number we expect
-			System.out.println(i+". "+expectedArts[i].getLineNo()+" = "+markerArts[i].getLineNo());			
-			assertEquals(expectedArts[i].getLineNo(), markerArts[i].getLineNo());
-			
-			// Marker should be of the type name we expect
-			System.out.println("    "+expectedArts[i].getName()+" = "+markerArts[i].getName());			
-			assertEquals(expectedArts[i].getName(), markerArts[i].getName());
-			
-			boolean test=markerArts[i].equals(expectedArts[i]);
-			//the following never works, so we'll be happy enough with the two assertEquals above.
-			//assertEquals(expectedArts[i], markerArts[i]);
-	
-		}
-		System.out.println("== Check regions for 'show pragma region' usage");
-		// check information needed for pragma show region action
-        RegionInfo ri0 = getRegion(ArtifactManager.getArtifact(markerArts[0].getMarker()));      
-        assertNotNull(ri0);
-        System.out.println("0. region offset:"+ri0.offset+ " length:"+ri0.length+"  "+markerArts[0].getName());
-        assertEquals(642,ri0.offset);
-        assertEquals(290, ri0.length);
-       
-        RegionInfo ri1=getRegion(ArtifactManager.getArtifact(markerArts[1].getMarker()));
-        assertNull(ri1);
-        //System.out.println("1. region offset:"+ri1.offset+ " length:"+ri1.length);
-        System.out.println("1. not a pragma    "+markerArts[1].getName());
-        
-        RegionInfo ri2=getRegion(ArtifactManager.getArtifact(markerArts[2].getMarker()));
-        assertNull(ri2);
-        System.out.println("2. not a pragma    "+markerArts[2].getName());
-        //assertEquals(642,ri0.offset);
-        //assertEquals(290, ri0.length);
-        
-        RegionInfo ri3=getRegion(ArtifactManager.getArtifact(markerArts[3].getMarker()));
-        assertNotNull(ri3);
-        System.out.println("3. region offset:"+ri3.offset+ " length:"+ri3.length+"  "+markerArts[3].getName());
-		assertEquals(1014, ri3.offset);
-		assertEquals(214, ri3.length);
-        
-        RegionInfo ri4=getRegion(ArtifactManager.getArtifact(markerArts[4].getMarker()));
-        assertNotNull(ri4);
-        System.out.println("4. region offset:"+ri4.offset+ " length:"+ri4.length+"  "+markerArts[4].getName());
-		assertEquals(1038, ri4.offset);
-		assertEquals(187, ri4.length);
-        
-		RegionInfo ri5 = getRegion(ArtifactManager.getArtifact(markerArts[5].getMarker()));
-		assertNotNull(ri5);
-		System.out.println("5. region offset:" + ri5.offset + " length:"+ ri5.length + "  " + markerArts[5].getName());
-		assertEquals(1170, ri5.offset);
-		assertEquals(50, ri5.length);
-		 
-		System.out.println("done");
-		
-	
-	}
-	/**
-	 * copied from OpenMPArtifactView.makeShowInfoAction() more or less - not ideal
-	 * @param a
-	 */
-	RegionInfo getRegion(IArtifact a) {
-		Artifact artifact = (Artifact)a;
-	    Object p = artifact.getArtifactAssist();
-        if (p==null || !(p instanceof PASTOMPPragma))  return null;;
-        PASTOMPPragma ompPragma = (PASTOMPPragma)p;
-        IASTNode      iRegion    = ompPragma.getRegion();
-        ASTNode       region     = (iRegion instanceof ASTNode ? (ASTNode)iRegion : null);
-		if (region == null)
-			return null;
-		int offset = ompPragma.getRegionOffset();
-		int length = ompPragma.getRegionLength(); 
-		RegionInfo ri=new RegionInfo(offset, length);
-		return ri;
-
-	}
-	protected class RegionInfo{
-		int offset;
-		int length;
-		RegionInfo(int offset, int length){
-			this.offset=offset;
-			this.length=length;
-		}
-	}
-
-
-
-
-}
diff --git a/tools/ppw/org.eclipse.ptp.etfw.ppw/.classpath b/tools/ppw/org.eclipse.ptp.etfw.ppw/.classpath
deleted file mode 100644
index 64c5e31..0000000
--- a/tools/ppw/org.eclipse.ptp.etfw.ppw/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<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="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tools/ppw/org.eclipse.ptp.etfw.ppw/.project b/tools/ppw/org.eclipse.ptp.etfw.ppw/.project
deleted file mode 100644
index 357fa0b..0000000
--- a/tools/ppw/org.eclipse.ptp.etfw.ppw/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.etfw.ppw</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/tools/ppw/org.eclipse.ptp.etfw.ppw/.settings/org.eclipse.jdt.core.prefs b/tools/ppw/org.eclipse.ptp.etfw.ppw/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index 66053c7..0000000
--- a/tools/ppw/org.eclipse.ptp.etfw.ppw/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,8 +0,0 @@
-#Thu Jul 09 22:47:58 EDT 2009
-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.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/tools/ppw/org.eclipse.ptp.etfw.ppw/META-INF/MANIFEST.MF b/tools/ppw/org.eclipse.ptp.etfw.ppw/META-INF/MANIFEST.MF
deleted file mode 100644
index 025f2aa..0000000
--- a/tools/ppw/org.eclipse.ptp.etfw.ppw/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,17 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: ETFw PPW Support
-Bundle-SymbolicName: org.eclipse.ptp.etfw.ppw;singleton:=true
-Bundle-Version: 1.0.2.qualifier
-Bundle-Vendor: UPC Group
-Require-Bundle: org.eclipse.ptp.etfw;bundle-version="1.0.1",
- org.eclipse.ui;bundle-version="3.5.1",
- org.eclipse.core.runtime;bundle-version="3.5.0",
- org.eclipse.debug.core;bundle-version="3.5.0",
- org.eclipse.ptp.etfw.ppw.jars;bundle-version="1.0.0",
- org.eclipse.jface.text;bundle-version="3.5.1",
- org.eclipse.ui.editors;bundle-version="3.5.0",
- org.eclipse.ui.workbench.texteditor;bundle-version="3.5.0",
- org.eclipse.ui.ide;bundle-version="3.5.1"
-Bundle-ActivationPolicy: lazy
-Bundle-Activator: org.eclipse.ptp.etfw.ppw.Activator
diff --git a/tools/ppw/org.eclipse.ptp.etfw.ppw/about.html b/tools/ppw/org.eclipse.ptp.etfw.ppw/about.html
deleted file mode 100644
index a78242d..0000000
--- a/tools/ppw/org.eclipse.ptp.etfw.ppw/about.html
+++ /dev/null
@@ -1,22 +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">
-<h2>About This Content</h2>
- 
-<p>May 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; 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 (&quot;Redistributor&quot;) 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.</p>
-
-</body>
-</html>
diff --git a/tools/ppw/org.eclipse.ptp.etfw.ppw/bin/org/eclipse/ptp/etfw/ppw/Activator.class b/tools/ppw/org.eclipse.ptp.etfw.ppw/bin/org/eclipse/ptp/etfw/ppw/Activator.class
deleted file mode 100644
index 4e478c3..0000000
--- a/tools/ppw/org.eclipse.ptp.etfw.ppw/bin/org/eclipse/ptp/etfw/ppw/Activator.class
+++ /dev/null
Binary files differ
diff --git a/tools/ppw/org.eclipse.ptp.etfw.ppw/bin/org/eclipse/ptp/etfw/ppw/PPWDataManager$1.class b/tools/ppw/org.eclipse.ptp.etfw.ppw/bin/org/eclipse/ptp/etfw/ppw/PPWDataManager$1.class
deleted file mode 100644
index 59ecf8d..0000000
--- a/tools/ppw/org.eclipse.ptp.etfw.ppw/bin/org/eclipse/ptp/etfw/ppw/PPWDataManager$1.class
+++ /dev/null
Binary files differ
diff --git a/tools/ppw/org.eclipse.ptp.etfw.ppw/bin/org/eclipse/ptp/etfw/ppw/PPWDataManager$2$1SourceView.class b/tools/ppw/org.eclipse.ptp.etfw.ppw/bin/org/eclipse/ptp/etfw/ppw/PPWDataManager$2$1SourceView.class
deleted file mode 100644
index bd80015..0000000
--- a/tools/ppw/org.eclipse.ptp.etfw.ppw/bin/org/eclipse/ptp/etfw/ppw/PPWDataManager$2$1SourceView.class
+++ /dev/null
Binary files differ
diff --git a/tools/ppw/org.eclipse.ptp.etfw.ppw/bin/org/eclipse/ptp/etfw/ppw/PPWDataManager$2.class b/tools/ppw/org.eclipse.ptp.etfw.ppw/bin/org/eclipse/ptp/etfw/ppw/PPWDataManager$2.class
deleted file mode 100644
index 3ee3ea7..0000000
--- a/tools/ppw/org.eclipse.ptp.etfw.ppw/bin/org/eclipse/ptp/etfw/ppw/PPWDataManager$2.class
+++ /dev/null
Binary files differ
diff --git a/tools/ppw/org.eclipse.ptp.etfw.ppw/bin/org/eclipse/ptp/etfw/ppw/PPWDataManager.class b/tools/ppw/org.eclipse.ptp.etfw.ppw/bin/org/eclipse/ptp/etfw/ppw/PPWDataManager.class
deleted file mode 100644
index d2d6846..0000000
--- a/tools/ppw/org.eclipse.ptp.etfw.ppw/bin/org/eclipse/ptp/etfw/ppw/PPWDataManager.class
+++ /dev/null
Binary files differ
diff --git a/tools/ppw/org.eclipse.ptp.etfw.ppw/build.properties b/tools/ppw/org.eclipse.ptp.etfw.ppw/build.properties
deleted file mode 100644
index 4c9cc25..0000000
--- a/tools/ppw/org.eclipse.ptp.etfw.ppw/build.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               about.html,\
-               data/
diff --git a/tools/ppw/org.eclipse.ptp.etfw.ppw/data/toolxml/ppw_upc.xml b/tools/ppw/org.eclipse.ptp.etfw.ppw/data/toolxml/ppw_upc.xml
deleted file mode 100644
index b3cb2ac..0000000
--- a/tools/ppw/org.eclipse.ptp.etfw.ppw/data/toolxml/ppw_upc.xml
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<toolset.01>
-<tool name="PPW_UPC">
-  <compile replace="true">
-    <allcompilers command="" group="ppw"/>
-    <UPC command="ppwupcc" group="ppw">
-      <optionpane title="PPW Compiler Wrapper - UPC" prependwith=""
-                  enclosewith="" separatewith=" ">
-        <togoption label="Instrument functions"
-                   optname="--inst-functions"
-                   tooltip="Track all function entries and exits"
-                   defstate="false"/>
-        <togoption label="Record data for shared-local accesses"
-                   optname="--inst-local"
-                   tooltip="Instrument source files to record performance data about both
-shared-remote and shared-local memory accesses. By default, only shared-remote
-accesses (accesses to the shared data space to remote data located on other
-threads) will be tracked unless this option is given."
-                   defstate="false"/>
-        <togoption label="Use polite synchronization"
-                   optname="--ppw-overschedule"
-                   tooltip="Forces PPW to use polite synchronization methods when collecting
-performance data into a PAR file at the end of the run, such as calling
-sched_yield(2) while inside synchronization spinlocks. This is only useful if
-you are severely overscheduling threads to CPUs, such as using -pthreads=32 on
-a uniprocessor cluster with Berkeley UPC."
-                   defstate="false"/>
-      </optionpane>
-    </UPC>
-    <CC command="" group="ppw"/>
-    <CXX command="" group="ppw"/>
-    <F90 command="" group="ppw"/>
-  </compile>
-  <execute>
-    <global>
-      <envvar flag="PPW_OUTPUT" value="ppw_eclipse.par"/>
-      <optionpane title="PPW Program Run - UPC" prependwith=""
-                  enclosewith="" enclosevalues="" separatewith=" ">
-        <togoption label="Enable tracing" envvar="true"
-        		   optname="PPW_TRACEMODE"
-                   tooltip="Record full program trace during run">
-        	<optvalue type="toggle" seton="1"></optvalue>
-        </togoption>
-        <togoption label="Trace buffer size" envvar="true"
-                   optname="PPW_TRACEBUFFERSIZE"
-                   tooltip="Set the trace buffer size to the specified number of bytes (most users
-should not need to change this)">
-          <optvalue type="text" default=""></optvalue>
-        </togoption>
-        <togoption label="Collect communication statistics" envvar="true"
-                   optname="PPW_COMMSTATS"
-                   tooltip="Record statistics on (explicit and implicit) communication during
-program run">
-			<optvalue type="toggle" seton="1"></optvalue>
-		</togoption>
-        <togoption label="Collect per-line communication statistics" envvar="true"
-                   optname="PPW_LINECOMMSTATS"
-                   tooltip="Record per-line statistics on (explicit and implicit) communication
-during program run"
-                   defstate="false">
-            <optvalue type="toggle" seton="1"></optvalue>
-        </togoption>
-      </optionpane>
-    </global>
-  </execute>
-  <analyze>
-	<utility command="process-PPW" group="internal"/>
-  </analyze>
-</tool>
-
-</toolset.01>
diff --git a/tools/ppw/org.eclipse.ptp.etfw.ppw/plugin.xml b/tools/ppw/org.eclipse.ptp.etfw.ppw/plugin.xml
deleted file mode 100644
index e65c3f5..0000000
--- a/tools/ppw/org.eclipse.ptp.etfw.ppw/plugin.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <extension
-         point="org.eclipse.ptp.etfw.workflows">
-           <workflowDefinitionXML
-            XMLFile="data/toolxml/ppw_upc.xml">
-      </workflowDefinitionXML>
-   </extension>
-   <extension
-         point="org.eclipse.ptp.etfw.dataManagers">
-      <PerformanceDataManager
-            class="org.eclipse.ptp.etfw.ppw.PPWDataManager">
-      </PerformanceDataManager>
-   </extension>
-
-</plugin>
diff --git a/tools/ppw/org.eclipse.ptp.etfw.ppw/src/org/eclipse/ptp/etfw/ppw/Activator.java b/tools/ppw/org.eclipse.ptp.etfw.ppw/src/org/eclipse/ptp/etfw/ppw/Activator.java
deleted file mode 100644
index 40c3e43..0000000
--- a/tools/ppw/org.eclipse.ptp.etfw.ppw/src/org/eclipse/ptp/etfw/ppw/Activator.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/****************************************************************************
- * Copyright (c) 2010, University of Florida
- *
- * 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:
- *    Max Billingsley III - initial API and implementation
- ****************************************************************************/
-package org.eclipse.ptp.etfw.ppw;
-
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class Activator extends AbstractUIPlugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "org.eclipse.ptp.etfw.ppw"; //$NON-NLS-1$
-
-	// The shared instance
-	private static Activator plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public Activator() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		plugin = this;
-	}
-
-	/*
-	 * (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 Activator getDefault() {
-		return plugin;
-	}
-
-}
diff --git a/tools/ppw/org.eclipse.ptp.etfw.ppw/src/org/eclipse/ptp/etfw/ppw/PPWDataManager.java b/tools/ppw/org.eclipse.ptp.etfw.ppw/src/org/eclipse/ptp/etfw/ppw/PPWDataManager.java
deleted file mode 100644
index df0a82f..0000000
--- a/tools/ppw/org.eclipse.ptp.etfw.ppw/src/org/eclipse/ptp/etfw/ppw/PPWDataManager.java
+++ /dev/null
@@ -1,241 +0,0 @@
-/****************************************************************************
- * Copyright (c) 2010, University of Florida
- *
- * 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:
- *    Max Billingsley III - initial API and implementation
- ****************************************************************************/
-package org.eclipse.ptp.etfw.ppw;
-
-import java.io.File;
-import java.lang.reflect.Field;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-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.debug.core.ILaunchConfiguration;
-import org.eclipse.jface.text.source.ISourceViewer;
-import org.eclipse.ptp.etfw.AbstractToolDataManager;
-import org.eclipse.ptp.etfw.ppw.messages.Messages;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.FileDialog;
-import org.eclipse.swt.widgets.Shell;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PlatformUI;
-import org.eclipse.ui.editors.text.TextEditor;
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.texteditor.AbstractTextEditor;
-
-public class PPWDataManager extends AbstractToolDataManager {
-	boolean externalTarget = false;
-	
-	@Override
-	public void cleanup() {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	public String getName() {
-		return "process-PPW"; //$NON-NLS-1$
-	}
-
-	@Override
-	public void setExternalTarget(boolean external) {
-		externalTarget = external;
-	}
-
-	public void process(String projname, ILaunchConfiguration configuration,
-			final String directory) throws CoreException {
-		try {
-			// Argument(s) to pass to PPW -- the name of the PAR file to open
-			final String[] args = new String[1];
-			
-			if (externalTarget || projname == null) {
-				Display.getDefault().syncExec(new Runnable() {	
-					public void run() {
-						Shell s = PlatformUI.getWorkbench().getDisplay().getActiveShell();
-						
-						if (s == null){
-							s = PlatformUI.getWorkbench().getDisplay().getShells()[0];
-						}
-						
-						FileDialog dl = new FileDialog(s, SWT.OPEN);
-						dl.setFilterPath(directory);
-						dl.setFilterExtensions(new String[] {"*.par"}); //$NON-NLS-1$
-						dl.setText(Messages.PPWDataManager_0);
-						String file = dl.open();
-						if (file != null) {
-							args[0] = file;
-						} else {
-							// Dialog was canceled or an error occurred... so just return
-							return;
-						}
-					}
-				});
-			} else {
-				boolean renameSuccess = false;
-				File parFile = new File(directory + File.separator + "ppw_eclipse.par"); //$NON-NLS-1$
-				
-				File newFile = null;
-				final int FILE_CNT_LIM = 64;
-				for (int i = 1; i < FILE_CNT_LIM; i++) {
-					newFile = new File(directory + File.separator + projname + "_" + i + ".par"); //$NON-NLS-1$ //$NON-NLS-2$
-					if (!newFile.exists()) {
-						renameSuccess = parFile.renameTo(newFile);
-						break;
-					}
-				}
-				
-				if (renameSuccess) {
-					args[0] = newFile.getPath();
-				} else {
-					args[0] = parFile.getPath();
-				}
-			}
-			
-			// Set up handler for source-code highlighting in Eclipse
-			EclipseHandler handler = new EclipseHandler() {
-				public boolean highlightSourceLine(final String filename, final int line) {
-					
-					class SourceView implements Runnable {
-						public void run() {
-							openSource(filename, line);							
-						}
-					}
-					
-					SourceView sv = new SourceView();
-					Display.getDefault().syncExec(sv);
-					
-					return true;
-				}
-			};
-			
-			// Launch PPW by directly calling into the GUIController
-			GUIController.setInEclipse(true);
-			GUIController.setEclipseHandler(handler);
-			GUIController.go(args);
-			
-		} catch (Throwable e) {
-			e.printStackTrace();
-		}
-	}
-	
-	/*
-	 * Adapted from org.eclipse.ptp.etfw.tau.perfdmf.views.PerfDMFView
-	 */
-	void openSource(String filename, int line) {
-        try {
-            IWorkspace workspace = ResourcesPlugin.getWorkspace();
-            IWorkspaceRoot root = workspace.getRoot();
-
-            IFile file = getFile(filename, root.members());
-
-            if (file == null) {
-                return;
-            }
-            IEditorInput iEditorInput = new FileEditorInput(file);
-            
-            IWorkbenchPage p = getActivePage();
-            String editorid="org.eclipse.cdt.ui.editor.CEditor"; //$NON-NLS-1$
-            
-            IEditorPart part = null;
-            if (p != null) {
-                part = p.openEditor(iEditorInput, editorid, true);
-            }
-           
-            
-            //IEditorPart part = EditorUtility.openInEditor(file);
-
-            TextEditor textEditor = (TextEditor) part;
-
-            final int start = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()).getLineOffset(
-                    line - 1);
-            final int end = textEditor.getDocumentProvider().getDocument(textEditor.getEditorInput()).getLineOffset(
-                    line);
-
-            textEditor.setHighlightRange(start, end - start, true);
-
-            AbstractTextEditor abstractTextEditor = textEditor;
-
-            ISourceViewer viewer = null;
-
-            final Field fields[] = AbstractTextEditor.class.getDeclaredFields();
-            for (int i = 0; i < fields.length; ++i) {
-                if ("fSourceViewer".equals(fields[i].getName())) { //$NON-NLS-1$
-                    Field f = fields[i];
-                    f.setAccessible(true);
-                    viewer = (ISourceViewer) f.get(abstractTextEditor);
-                    break;
-                }
-            }
-
-            if (viewer != null) {
-                viewer.revealRange(start, end - start);
-                viewer.setSelectedRange(start, end - start);
-            }
-
-        } catch (Throwable t) {
-           // t.printStackTrace();
-        }
-	}
-	
-	/*
-	 * Borrowed from org.eclipse.ptp.etfw.tau.perfdmf.views.PerfDMFView
-	 */
-    IFile getFile(String filename, IResource[] resources) {
-        try {
-            for (int j = 0; j < resources.length; j++) {
-                if (resources[j] instanceof IFile) {
-                    IFile f = (IFile) resources[j];
-                    if (f.getName().equals(filename)) {
-                        return f;
-                    }
-                } else if (resources[j] instanceof IFolder) {
-                    IFile f = getFile(filename, ((IFolder) resources[j]).members());
-                    if (f != null) {
-                        return f;
-                    }
-                } else if (resources[j] instanceof IProject) {
-                    IFile f = getFile(filename, ((IProject) resources[j]).members());
-                    if (f != null) {
-                        return f;
-                    }
-                }
-            }
-        } catch (Throwable t) {
-            t.printStackTrace();
-        }
-        return null;
-    }
-	
-	/*
-	 * Borrowed from org.eclipse.ptp.etfw.tau.perfdmf.views.PerfDMFView
-	 */
-    public static IWorkbenchPage getActivePage() {
-        IWorkbenchWindow window = PlatformUI.getWorkbench().getActiveWorkbenchWindow();
-        if (window != null) {
-            return window.getActivePage();
-        }
-        return null;
-    }
-    
-	@Override
-	public void view() {
-		// ---- currently unused ----
-	}
-
-}
diff --git a/tools/ppw/org.eclipse.ptp.etfw.ppw/src/org/eclipse/ptp/etfw/ppw/messages/Messages.java b/tools/ppw/org.eclipse.ptp.etfw.ppw/src/org/eclipse/ptp/etfw/ppw/messages/Messages.java
deleted file mode 100644
index b0f7fb6..0000000
--- a/tools/ppw/org.eclipse.ptp.etfw.ppw/src/org/eclipse/ptp/etfw/ppw/messages/Messages.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/****************************************************************************
- * Copyright (c) 2010, University of Florida
- *
- * 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:
- *    Max Billingsley III - initial API and implementation
- ****************************************************************************/
-
-package org.eclipse.ptp.etfw.ppw.messages;
-
-import org.eclipse.osgi.util.NLS;
-
-public class Messages extends NLS {
-	private static final String BUNDLE_NAME = "org.eclipse.ptp.etfw.ppw.messages.messages"; //$NON-NLS-1$
-	
-	public static String PPWDataManager_0;
-	
-	static {
-		// initialize resource bundle
-		NLS.initializeMessages(BUNDLE_NAME, Messages.class);
-	}
-
-	private Messages() {
-	}
-}
diff --git a/tools/ppw/org.eclipse.ptp.etfw.ppw/src/org/eclipse/ptp/etfw/ppw/messages/messages.properties b/tools/ppw/org.eclipse.ptp.etfw.ppw/src/org/eclipse/ptp/etfw/ppw/messages/messages.properties
deleted file mode 100644
index 2b5d961..0000000
--- a/tools/ppw/org.eclipse.ptp.etfw.ppw/src/org/eclipse/ptp/etfw/ppw/messages/messages.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-/****************************************************************************
- * Copyright (c) 2010, University of Florida
- *
- * 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:
- *    Max Billingsley III - initial API and implementation
- ****************************************************************************/
- 
- PPWDataManager_0=Select the PAR file to open.
diff --git a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/.classpath b/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/.classpath
deleted file mode 100644
index 751c8f2..0000000
--- a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/.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"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/.project b/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/.project
deleted file mode 100644
index 5b6f673..0000000
--- a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/.project
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.pldt.sampleCDTstaticAnalysis</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/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/META-INF/MANIFEST.MF b/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/META-INF/MANIFEST.MF
deleted file mode 100644
index 2984ab7..0000000
--- a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,15 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Sample CDT Static Analysis
-Bundle-SymbolicName: org.eclipse.ptp.pldt.sampleCDTstaticAnalysis;singleton:=true
-Bundle-Version: 1.0.0
-Bundle-Activator: org.eclipse.ptp.pldt.sampleCDTstaticAnalysis.Activator
-Require-Bundle: org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.cdt.core,
- org.eclipse.core.resources,
- org.eclipse.ptp.pldt.common,
- org.eclipse.ptp.pldt.mpi.analysis,
- org.eclipse.ptp.pldt.mpi.analysis.cdt
-Eclipse-LazyStart: true
-Bundle-Vendor: IBM Research
diff --git a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/build.properties b/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/build.properties
deleted file mode 100644
index 0d3d3a7..0000000
--- a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/build.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = plugin.xml,\
-               META-INF/,\
-               .,\
-               icons/
diff --git a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/icons/calls.gif b/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/icons/calls.gif
deleted file mode 100644
index 695e5a5..0000000
--- a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/icons/calls.gif
+++ /dev/null
Binary files differ
diff --git a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/icons/callsC.gif b/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/icons/callsC.gif
deleted file mode 100644
index 469fa25..0000000
--- a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/icons/callsC.gif
+++ /dev/null
Binary files differ
diff --git a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/icons/callsCF.gif b/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/icons/callsCF.gif
deleted file mode 100644
index 4433b19..0000000
--- a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/icons/callsCF.gif
+++ /dev/null
Binary files differ
diff --git a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/icons/class_hi.gif b/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/icons/class_hi.gif
deleted file mode 100644
index 17f927e..0000000
--- a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/icons/class_hi.gif
+++ /dev/null
Binary files differ
diff --git a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/icons/graphC.gif b/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/icons/graphC.gif
deleted file mode 100644
index 905c338..0000000
--- a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/icons/graphC.gif
+++ /dev/null
Binary files differ
diff --git a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/icons/graphW.gif b/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/icons/graphW.gif
deleted file mode 100644
index 23b294b..0000000
--- a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/icons/graphW.gif
+++ /dev/null
Binary files differ
diff --git a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/icons/sample.gif b/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/icons/sample.gif
deleted file mode 100644
index 34fb3c9..0000000
--- a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/icons/sample.gif
+++ /dev/null
Binary files differ
diff --git a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/plugin.xml b/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/plugin.xml
deleted file mode 100644
index 6ba6e75..0000000
--- a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/plugin.xml
+++ /dev/null
@@ -1,99 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.2"?>
-<plugin>
-
-   <extension
-         point="org.eclipse.ui.commands">
-      <category
-            name="Sample Category"
-            id="cdtAST2.commands.category">
-      </category>
-      <command
-            name="CallGraph Command"
-            categoryId="cdtAST2.commands.category"
-            id="cdtAST2.commands.cgCommand">
-      </command>
-       <command
-            name="CFG Command"
-            categoryId="cdtAST2.commands.category"
-            id="cdtAST2.commands.cfgCommand">
-      </command>
-   </extension>
-   <extension
-         point="org.eclipse.ui.handlers">
-      <handler
-            commandId="cdtAST2.commands.cgCommand"
-            class="org.eclipse.ptp.pldt.sampleCDTstaticAnalysis.handlers.BuildCallGraphHandler">
-      </handler>
-      <handler
-            commandId="cdtAST2.commands.cfgCommand"
-            class="org.eclipse.ptp.pldt.sampleCDTstaticAnalysis.handlers.BuildCFGraphHandler">
-      </handler>
-   </extension>
-   <extension
-         point="org.eclipse.ui.bindings">
-      <key
-            commandId="cdtAST2.commands.cgCommand"
-            contextId="org.eclipse.ui.contexts.window"
-            sequence="M1+6"
-            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration">
-      </key>
-   </extension>
-   <extension
-         point="org.eclipse.ui.menus">
-      <menuContribution
-            locationURI="menu:org.eclipse.ui.main.menu?after=additions">
-         <menu
-               label="Sample Menu"
-               mnemonic="M"
-               id="cdtAST2.menus.sampleMenu">
-            <command
-                  commandId="cdtAST2.commands.cgCommand"
-                  icon="icons/graphW.gif"
-                  id="cdtAST2.menus.cgCommand"
-                  label="Walk AST tree"
-                  mnemonic="S"
-                  tooltip="Walk AST Tree tooltip">
-            </command>
-         </menu>
-      </menuContribution>
-      <menuContribution
-            locationURI="toolbar:org.eclipse.ui.main.toolbar?after=additions">
-         <toolbar
-               id="cdtAST2.toolbars.sampleToolbar">
-            <command
-                  commandId="cdtAST2.commands.cgCommand"
-                  icon="icons/callsC.gif"
-                  id="cdtAST2.toolbars.buildCallGraphCommand"
-                  label="Build Call Graph"
-                  tooltip="Build Call Graph">
-            </command>
-             <command
-                  commandId="cdtAST2.commands.cfgCommand"
-                  icon="icons/callsCF.gif"
-                  id="cdtAST2.toolbars.buildCallGraphCommand"
-                  label="Build CFGraph"
-                  tooltip="Build Control Flow Graph">
-            </command>
-         </toolbar>
-      </menuContribution>
-   </extension>
-   <extension
-         point="org.eclipse.ui.actionSets">
-      <actionSet
-            label="Sample Action Set"
-            visible="true"
-            id="cdtAST2.actionSet">
-         <action
-               label="Walk AST"
-               icon="icons/graphW.gif"
-               class="org.eclipse.ptp.pldt.sampleCDTstaticAnalysis.actions.ASTWalkerAction"
-               tooltip="Walk AST tooltip"
-               menubarPath="sampleMenu/sampleGroup"
-               toolbarPath="sampleGroup"
-               id="cdtast2.actions.SampleAction">
-         </action>
-      </actionSet>
-   </extension>
-
-</plugin>
diff --git a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/samples/Hello.c b/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/samples/Hello.c
deleted file mode 100644
index efe282b..0000000
--- a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/samples/Hello.c
+++ /dev/null
@@ -1,15 +0,0 @@
-
-
-#include <stdio.h>
-#define MYVAR 42
-
-int graphtest(void) {
-	int a,b;
-	int pi=3.14;
-	a=0;
-	b=MYVAR; // use defined
-	b = b + a;
-	a=3.14;
-	return b;
-}
-
diff --git a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/samples/graph.c b/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/samples/graph.c
deleted file mode 100644
index d6fc2c5..0000000
--- a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/samples/graph.c
+++ /dev/null
@@ -1,31 +0,0 @@
-#include "mpi.h"
-#include "stdio.h"
- 
-void foo(int x);
-void gee(int x);
-void kei(int x);
-
-void foo(int x){
-  x ++;
-  gee(x);
-}
-
-void gee(int x){
-  x *= 3;
-  kei(x);
-}
-
-void kei(int x){
-  x = x % 10;
-  foo(x);
-}
-
-void a(int x){
-  x --;
-}
-
-int main3(int argc, char* argv[]){
-  int x = 0;
-  foo(x);
-  a(x);
-}
\ No newline at end of file
diff --git a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/samples/walkast.c b/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/samples/walkast.c
deleted file mode 100644
index 26deb89..0000000
--- a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/samples/walkast.c
+++ /dev/null
@@ -1,15 +0,0 @@
-// p16
-#include <stdio.h>
-#define MYVAR 42
-
-int main(void) {
-	int a,b;
-	a=0;
-	b=MYVAR; // use defined
-	b = b + a;
-	return b;
-}
-int foo(int bar){
-  int z = bar;
-  return z;
-}
\ No newline at end of file
diff --git a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/samples/walkast_edge.c b/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/samples/walkast_edge.c
deleted file mode 100644
index 12a81b9..0000000
--- a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/samples/walkast_edge.c
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <stdio.h>
-
-void edge(int a) {
-	int x,y;
-	if(a>0)
-		x=0;
-	else 
-		x=1;
-	y=x;
-}
-int foo(int bar){
-  int z = bar;
-  return z;
-}
diff --git a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/samples/walkast_edge_comments.c b/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/samples/walkast_edge_comments.c
deleted file mode 100644
index a1700eb..0000000
--- a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/samples/walkast_edge_comments.c
+++ /dev/null
@@ -1,16 +0,0 @@
-//#include <stdio.h>
-/** function that shows a short edge in a CFG */
-void edge(int a) {
-	int x,y;
-	if(a>0)
-		x=0;  // the then case
-	else 
-		x=1;  // the else case
-	// use resultant value of x
-	/* partLine comment */ y=x; 
-}
-/** the ever-present foo function */
-int foo(int bar){
-  int z = bar;
-  return z;
-}
\ No newline at end of file
diff --git a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/src/org/eclipse/ptp/pldt/sampleCDTstaticAnalysis/Activator.java b/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/src/org/eclipse/ptp/pldt/sampleCDTstaticAnalysis/Activator.java
deleted file mode 100644
index 5b260ca..0000000
--- a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/src/org/eclipse/ptp/pldt/sampleCDTstaticAnalysis/Activator.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.eclipse.ptp.pldt.sampleCDTstaticAnalysis;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.osgi.framework.BundleContext;
-
-/**
- * The activator class controls the plug-in life cycle
- */
-public class Activator extends AbstractUIPlugin {
-
-	// The plug-in ID
-	public static final String PLUGIN_ID = "cdtAST2";
-
-	// The shared instance
-	private static Activator plugin;
-	
-	/**
-	 * The constructor
-	 */
-	public Activator() {
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
-	 */
-	public void start(BundleContext context) throws Exception {
-		super.start(context);
-		plugin = this;
-	}
-
-	/*
-	 * (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 Activator getDefault() {
-		return plugin;
-	}
-
-	/**
-	 * Returns an image descriptor for the image file at the given
-	 * plug-in relative path
-	 *
-	 * @param path the path
-	 * @return the image descriptor
-	 */
-	public static ImageDescriptor getImageDescriptor(String path) {
-		return imageDescriptorFromPlugin(PLUGIN_ID, path);
-	}
-}
diff --git a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/src/org/eclipse/ptp/pldt/sampleCDTstaticAnalysis/actions/ASTWalkerAction.java b/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/src/org/eclipse/ptp/pldt/sampleCDTstaticAnalysis/actions/ASTWalkerAction.java
deleted file mode 100644
index 56323bc..0000000
--- a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/src/org/eclipse/ptp/pldt/sampleCDTstaticAnalysis/actions/ASTWalkerAction.java
+++ /dev/null
@@ -1,402 +0,0 @@
-package org.eclipse.ptp.pldt.sampleCDTstaticAnalysis.actions;
-
-import java.util.Iterator;
-
-import org.eclipse.cdt.core.dom.ast.ASTVisitor;
-import org.eclipse.cdt.core.dom.ast.IASTBinaryExpression;
-import org.eclipse.cdt.core.dom.ast.IASTComment;
-import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
-import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
-import org.eclipse.cdt.core.dom.ast.IASTExpression;
-import org.eclipse.cdt.core.dom.ast.IASTName;
-import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement;
-import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement;
-import org.eclipse.cdt.core.dom.ast.IASTStatement;
-import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
-import org.eclipse.cdt.core.dom.ast.IType;
-import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit.IDependencyTree;
-import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit.IDependencyTree.IASTInclusionNode;
-import org.eclipse.cdt.core.model.ICElement;
-import org.eclipse.cdt.core.model.ICElementVisitor;
-import org.eclipse.cdt.core.model.ITranslationUnit;
-import org.eclipse.cdt.internal.core.dom.parser.c.CASTExpressionStatement;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
-
-/**
- * This was initially built from the "Sample Action" plugin example.
- * 
- * This sample action walks an AST tree for a selected C source file.
- * Select a C source file in the Projects view and click the icon in the toolbar
- * to print AST walking information.
- * 
- * @see IWorkbenchWindowActionDelegate
- * 
- * @author Beth Tibbitts tibbitts@us.ibm.com
- */
-public class ASTWalkerAction implements IWorkbenchWindowActionDelegate {
-	private IWorkbenchWindow window;
-	private IStructuredSelection selection;
-
-	/**
-	 * The constructor.
-	 */
-	public ASTWalkerAction() {
-	}
-
-	/**
-	 * The action has been activated. The argument of the method represents the
-	 * 'real' action sitting in the workbench UI.
-	 * 
-	 * @see IWorkbenchWindowActionDelegate#run
-	 */
-	public void run(IAction action) {
-		MessageDialog.openInformation(window.getShell(), "CdtAST2 Plug-in",
-				"See Console for AST walking results");
-		try {
-			runSelectionExample(selection);
-		} catch (CoreException e) {
-			// TODO Auto-generated catch block
-			e.printStackTrace();
-		}
-	}
-
-	/**
-	 * Selection in the workbench has been changed. We can change the state of
-	 * the 'real' action here if we want, but this can only happen after the
-	 * delegate has been created.
-	 * 
-	 * @see IWorkbenchWindowActionDelegate#selectionChanged
-	 */
-	public void selectionChanged(IAction action, ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			this.selection = (IStructuredSelection) selection;
-		}
-
-	}
-
-	public void runSelection(ISelection selection) {
-		System.out.println("selection=" + selection);
-		if (selection instanceof ITranslationUnit) {
-			System.out.println("   ITranslationUnit");
-		}
-		if (selection instanceof ICElement) {
-			System.out.println("ICElement");
-			walkICElement((ICElement) selection);
-
-		}
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection ss = (IStructuredSelection) selection;
-			// System.out.println(" IStructuredSelection, contents:");
-
-			for (Iterator iter = ss.iterator(); iter.hasNext();) {
-				Object obj = (Object) iter.next();
-				// It can be a Project, Folder, File, etc...
-				if (obj instanceof IAdaptable) {
-					IAdaptable iad = (IAdaptable) obj;
-					final IResource res = (IResource) iad
-							.getAdapter(IResource.class);
-					System.out.println("     got resource: " + res);
-
-					// ICElement covers folders and translationunits
-					final ICElement ce = (ICElement) iad
-							.getAdapter(ICElement.class);// cdt40
-					System.out.println("     got ICElement: " + ce);
-
-					ITranslationUnit tu = (ITranslationUnit) iad
-							.getAdapter(ITranslationUnit.class);
-					System.out.println("     got ITranslationUnit: " + tu);
-					try {
-						listFlatInfo(tu);
-						walkITU(tu);
-					} catch (CoreException e) {
-						// TODO Auto-generated catch block
-						e.printStackTrace();
-					}
-				}
-			}// end for
-		}
-	}
-
-	public void runSelectionExample(ISelection selection) throws CoreException {
-		if (selection instanceof IStructuredSelection) {
-			IStructuredSelection ss = (IStructuredSelection) selection;
-			for (Iterator iter = ss.iterator(); iter.hasNext();) {
-				Object obj = (Object) iter.next();
-				// It can be a Project, Folder, File, etc...
-				if (obj instanceof IAdaptable) {
-					IAdaptable iad = (IAdaptable) obj;
-					final IResource res = (IResource) iad
-							.getAdapter(IResource.class);
-					System.out.println("     got resource: " + res);
-
-					// ICElement covers folders and translation units
-					final ICElement ce = (ICElement) iad
-							.getAdapter(ICElement.class);// cdt40
-					System.out.println("     got ICElement: " + ce);
-
-					ITranslationUnit tu = (ITranslationUnit) iad
-							.getAdapter(ITranslationUnit.class);
-					System.out.println("     got ITranslationUnit: " + tu);
-					System.out.println("\n==========listFlatInfo():");
-					listFlatInfo(tu);
-					System.out.println("\n==========walkITU():");
-					walkITU(tu);
-					System.out.println("\n==========walkITU_AST():");
-					walkITU_AST(tu);
-
-				}
-			}
-		}
-	}
-
-	/**
-	 * We can use this method to dispose of any system resources we previously
-	 * allocated.
-	 * 
-	 * @see IWorkbenchWindowActionDelegate#dispose
-	 */
-	public void dispose() {
-	}
-
-	/**
-	 * We will cache window object in order to be able to provide parent shell
-	 * for the message dialog.
-	 * 
-	 * @see IWorkbenchWindowActionDelegate#init
-	 */
-	public void init(IWorkbenchWindow window) {
-		this.window = window;
-	}
-
-	public void walkICElement(ICElement ice) {
-		// ICElement ice = (ICElement)selection;
-		String eName = ice.getElementName();
-		System.out.println("ICElement name: " + eName);
-
-	}
-
-	/**
-	 * Walk the ITranslationUnit with a visitor, which (only) visits ICElements
-	 * 
-	 * @param tu
-	 * @throws CoreException
-	 */
-	private void walkITU(ITranslationUnit tu) throws CoreException {
-		String tuName = tu.getElementName();
-		System.out.println("ITranslationUnit name: " + tuName);
-		tu.accept(new ICElementVisitor() {
-			public boolean visit(ICElement element) throws CoreException {
-				boolean visitChildren = true;
-				System.out.println("Visiting: " + element.getElementName());
-				return visitChildren;
-			}
-		});
-		System.out.println("AST visitor for " + tuName);
-		IASTTranslationUnit ast = tu.getAST();
-		ast.accept(new MyASTVisitor());
-	}
-
-	/**
-	 * Walk the IASTTranslationUnit's AST tree, which can visit many types of
-	 * nodes
-	 * 
-	 * @param tu
-	 * @throws CoreException
-	 */
-	private void walkITU_AST(ITranslationUnit tu) throws CoreException {
-		System.out.println("AST visitor for " + tu.getElementName());
-		IASTTranslationUnit ast = tu.getAST();
-		System.out
-				.println("\n=================MyASTVisitor2 also implements leave() \n");
-		ast.accept(new MyASTVisitor2());
-	}
-
-	class MyASTVisitor extends ASTVisitor {
-
-		MyASTVisitor() {
-			this.shouldVisitStatements = true; // lots more
-			this.shouldVisitDeclarations = true;
-		}
-
-		public int visit(IASTStatement stmt) { // lots more
-			String sig = stmt.getRawSignature();
-			if (sig.length() > 0)
-				System.out.println("Visiting stmt: " + stmt.getRawSignature());
-			else if (stmt instanceof IASTCompoundStatement) {
-				IASTCompoundStatement cstmt = (IASTCompoundStatement) stmt;
-				IASTStatement[] stmts = cstmt.getStatements();
-				System.out.println("Visiting compound stmt with stmts: "
-						+ stmts.length);
-				for (IASTStatement st : stmts) {
-					String rawSig = st.getRawSignature();
-
-					if (rawSig.length() == 0) {
-						System.out.println("   ->" + st);
-						if (st instanceof CASTExpressionStatement) {
-							CASTExpressionStatement es = (CASTExpressionStatement) st;
-							IASTExpression exp = es.getExpression();
-							if (exp instanceof IASTBinaryExpression) {
-								IASTBinaryExpression bexp = (IASTBinaryExpression) exp;
-
-								System.out.println("    binary exp: "
-										+ bexp.getOperand1() + " "
-										+ bexp.getOperator() + " "
-										+ bexp.getOperand2());
-							}
-							String expStr = exp.getRawSignature();
-							IType type = exp.getExpressionType();
-						}
-					} else {
-						System.out.println("   ->" + rawSig);
-					}
-				}
-			}
-			return PROCESS_CONTINUE;
-		}
-
-		public int visit(IASTDeclaration decl) {
-			System.out.println("Visiting decl: " + decl.getRawSignature());
-			return PROCESS_CONTINUE;
-		}
-
-	}
-
-
-	/** Visitor that uses leave() to show nesting */
-	class MyASTVisitor2 extends ASTVisitor {
-
-		MyASTVisitor2() {
-			this.shouldVisitStatements = true;
-			this.shouldVisitDeclarations = true;
-			this.shouldVisitNames = true;
-		}
-
-		/**
-		 * Print statement info: if altered by preprocessor, then
-		 * getRawSignature() is empty; use alternate representation
-		 */
-		public int visit(IASTStatement stmt) {
-			String sig = stmt.getRawSignature();
-			if (sig.length() > 0)
-				System.out.println("Visiting stmt: " + stmt.getRawSignature());
-			else
-				System.out.println("Visiting stmt: " + stmt.toString());
-			return PROCESS_CONTINUE;
-		}
-
-		public int visit(IASTDeclaration decl) {
-			System.out.println("Visiting decl: " + decl.getRawSignature());
-			return PROCESS_CONTINUE;
-		}
-
-		public int visit(IASTName name) {
-			String prtName = name.toString();
-			if (prtName.length() == 0)
-				prtName = name.getRawSignature(); // use pre pre-processor
-			// value
-			System.out.println("Visiting name: " + prtName);
-			return PROCESS_CONTINUE;
-		}
-
-		public int leave(IASTStatement stmt) {
-			System.out.println(" Leaving stmt: " + stmt.getRawSignature());
-			return PROCESS_CONTINUE;
-		}
-
-		public int leave(IASTDeclaration decl) {
-			System.out.println(" Leaving decl: " + decl.getRawSignature());
-			return PROCESS_CONTINUE;
-		}
-
-		public int leave(IASTName name) {
-			System.out.println(" Leaving name: " + name);// possibly empty
-			return PROCESS_CONTINUE;
-		}
-	}
-
-	/**
-	 * List "flat info" type queries that return lists of things on the ast
-	 * 
-	 * @param tu
-	 * @throws CoreException
-	 */
-	void listFlatInfo(ITranslationUnit tu) throws CoreException {
-		IASTTranslationUnit ast = tu.getAST();
-
-		System.out.println("AST for: " + ast.getContainingFilename());
-
-		IASTPreprocessorStatement[] ppss = ast.getAllPreprocessorStatements();
-		System.out.println("PreprocessorStmts: (omit /usr/...)");
-		for (int i = 0; i < ppss.length; i++) {
-			IASTPreprocessorStatement pps = ppss[i];
-			String fn = pps.getContainingFilename();
-			if (!fn.startsWith("/usr")) {
-				System.out.println(i + "  PreprocessorStmt: " + lastpart(fn)
-						+ " " + pps.getRawSignature());
-			}
-		}
-		IASTDeclaration[] decls = ast.getDeclarations();
-		System.out.println("Declarations: (omit /usr/...)");
-		for (int i = 0; i < decls.length; i++) {
-			IASTDeclaration decl = decls[i];
-			String fn = decl.getContainingFilename();
-			if (!fn.startsWith("/usr")) {
-				System.out.println(i + "  Declaration: " + lastpart(fn) + " "
-						+ decl.getRawSignature());
-			}
-		}
-		IASTPreprocessorStatement[] idirs = ast.getIncludeDirectives();
-		// recurses thru includes included by other includes...
-		System.out.println("Include directives: ");
-		for (int i = 0; i < idirs.length; i++) {
-			IASTPreprocessorStatement idir = idirs[i];
-			System.out.println(i + " include directive: " + idir);
-
-		}
-
-		IDependencyTree dt = ast.getDependencyTree();
-		IASTInclusionNode[] ins = dt.getInclusions();
-		// this lists only the includes immediately included by this src file
-		System.out.println("Dependency tree/Include statements:");
-		for (int i = 0; i < ins.length; i++) {
-			IASTInclusionNode in = ins[i];
-			IASTPreprocessorIncludeStatement is = in.getIncludeDirective();
-			System.out.println(i + "  include stmt: " + is);
-		}
-		// note: comments are not available as AST Nodes but are available here.
-		// (In spite of the existence of IASTComment class and visit(IASTComment) method.)
-		// These are deprecated in CDT 5.0
-		ast = tu.getAST(null,ITranslationUnit.AST_CREATE_COMMENT_NODES);
-		IASTComment[] cmts = ast.getComments();
-		System.out.println("Comments found: "+cmts.length);
-		for (int i = 0; i < cmts.length; i++) {
-			IASTComment comment = cmts[i];
-			char[] cmtChar=comment.getComment();
-			String cmtStr=String.valueOf(cmtChar);
-			
-			System.out.println(i + " Comment: [" + cmtStr + "] rawSig: ["+comment.getRawSignature()+"] line "
-					+ comment.getFileLocation());
-
-		}
-
-	}
-
-	/**
-	 * Return last part of string pathname: e.g. a/b/c/foo.c returns foo.c
-	 * 
-	 * @param pathname
-	 * @return
-	 */
-	String lastpart(String pathname) {
-		int loc = pathname.lastIndexOf('/');
-		return pathname.substring(loc + 1);
-	}
-}
\ No newline at end of file
diff --git a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/src/org/eclipse/ptp/pldt/sampleCDTstaticAnalysis/handlers/BuildCFGraphHandler.java b/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/src/org/eclipse/ptp/pldt/sampleCDTstaticAnalysis/handlers/BuildCFGraphHandler.java
deleted file mode 100644
index 624ad8e..0000000
--- a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/src/org/eclipse/ptp/pldt/sampleCDTstaticAnalysis/handlers/BuildCFGraphHandler.java
+++ /dev/null
@@ -1,135 +0,0 @@
-package org.eclipse.ptp.pldt.sampleCDTstaticAnalysis.handlers;
-
-import java.util.Iterator;
-
-import org.eclipse.cdt.core.dom.ast.IASTStatement;
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.GraphCreator;
-import org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.IBlock;
-import org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.ICallGraph;
-import org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.ICallGraphNode;
-import org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.IControlFlowGraph;
-import org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.impl.ControlFlowGraph;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.handlers.HandlerUtil;
-
-/**
- * Build Control Flow Graph
- * 
- * @author Beth Tibbitts  tibbitts@us.ibm.com
- *  
- * @see org.eclipse.core.commands.IHandler
- * @see org.eclipse.core.commands.AbstractHandler
- * @see org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.GraphCreator
- */
-public class BuildCFGraphHandler extends AbstractHandler implements
-		ISelectionListener {
-	private IStructuredSelection selection;
-	protected ICallGraph callGraph;
-	protected GraphCreator graphCreator;
-	protected IWorkbenchWindow window;
-
-	/**
-	 * The constructor.
-	 */
-	public BuildCFGraphHandler() {
-		graphCreator = new GraphCreator();
-
-	}
-
-	/**
-	 * Execute the command: extract extract the needed information from the
-	 * application context. <br>
-	 * A new call graph is constructed for the selected resources.
-	 * 
-	 * @param event
-	 * @return the result of the execution. Reserved for future use by IHandler
-	 *         interface, must be <code>null</code>.
-	 */
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-		window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
-		System.out.println("BuildCFGraphHandler.execute()");
-		// create an empty call graph to begin with
-		callGraph = graphCreator.initCallGraph();
-		// Get the current selection
-		if (selection == null) {
-			ISelection sel = HandlerUtil.getCurrentSelection(event);
-			if (sel instanceof IStructuredSelection) {
-				selection = (IStructuredSelection) sel;
-			}
-			if (selection == null) {
-				message("No selection detected. Please select a file, folder, or project in the Projects View.");
-				selection=null;
-				return null;
-			}
-		}
-
-		// We iterate here only to handle the possibility of multiple-selection.
-		// graphCreator will descend into child nodes.
-		/*final*/ IResource res=null;
-		for (Iterator iter = selection.iterator(); iter.hasNext();) {
-			Object obj = (Object) iter.next();
-			// It can be a Project, Folder, File, etc...
-			if (obj instanceof IAdaptable) {
-				IAdaptable iad = (IAdaptable) obj;
-				res = (IResource) iad.getAdapter(IResource.class);
-				// Note: put this in a Job or WorkspaceModifyOperation if resources
-				// will be changed.
-				if (res != null) {
-					callGraph = graphCreator.initCallGraph(res);
-				} else {
-					message("Please select a file, folder, or project in the Projects view");
-					selection=null;
-					return null;
-				}
-			}
-		}
-
-		graphCreator.computeCallGraph(callGraph);
-		// get the first node
-		ICallGraphNode topNode = callGraph.topEntry();
-		String topName=topNode.getFuncName();
-		
-		ICallGraphNode firstNode=callGraph.getAllNodes().get(0);
-		String firstName=firstNode.getFuncName();
-		// get a node by function name
-		ICallGraphNode namedNode = callGraph.getNode(res.getName(), "foo");
-		String namedName="";
-		if(namedNode!=null) {
-			namedName=namedNode.getFuncName();
-		}
-		
-		ICallGraphNode node = topNode;
-		IASTStatement funcBody=node.getFuncDef().getBody();
-		IControlFlowGraph cfg = new ControlFlowGraph(funcBody);
-		cfg.buildCFG();
-		
-		IBlock entryBlock = cfg.getEntry();
-		for (IBlock block= cfg.getEntry(); block!=null; block = block.getTopNext()) {
-			block.print();
-		}
-		return null;
-	}
-
-	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			this.selection = (IStructuredSelection) selection;
-			System.out.println("BuildCallGraphHandler got selection");
-		}
-
-	}
-
-	public void message(String msg) {
-		MessageDialog.openInformation(window.getShell(),
-				"Houston, we have a problem", msg);
-	}
-}
diff --git a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/src/org/eclipse/ptp/pldt/sampleCDTstaticAnalysis/handlers/BuildCallGraphHandler.java b/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/src/org/eclipse/ptp/pldt/sampleCDTstaticAnalysis/handlers/BuildCallGraphHandler.java
deleted file mode 100644
index d5c6861..0000000
--- a/tools/samples/org.eclipse.ptp.pldt.sampleCDTstaticAnalysis/src/org/eclipse/ptp/pldt/sampleCDTstaticAnalysis/handlers/BuildCallGraphHandler.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package org.eclipse.ptp.pldt.sampleCDTstaticAnalysis.handlers;
-
-import java.util.Iterator;
-
-import org.eclipse.core.commands.AbstractHandler;
-import org.eclipse.core.commands.ExecutionEvent;
-import org.eclipse.core.commands.ExecutionException;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.runtime.IAdaptable;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.GraphCreator;
-import org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.ICallGraph;
-import org.eclipse.ui.ISelectionListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.handlers.HandlerUtil;
-
-/**
- * This handler extends AbstractHandler, an IHandler base class. This handler
- * builds a call graph for the selected resource(s) in the Project Explorer view. <br>
- * 
- * Two steps to building call graph: <br>
- * 1. collect all function definitions in the call graph <br>
- * 2. construct the caller and callee relationship among the CallGraphNodes
- * <br>Most of the work is done by GraphCreator
- * 
- * @author Beth Tibbitts tibbitts@us.ibm.com
- * 
- * @see org.eclipse.core.commands.IHandler
- * @see org.eclipse.core.commands.AbstractHandler
- * @see org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.GraphCreator
- */
-public class BuildCallGraphHandler extends AbstractHandler implements
-		ISelectionListener {
-	private IStructuredSelection selection;
-	protected ICallGraph callGraph;
-	protected GraphCreator graphCreator;
-	protected IWorkbenchWindow window;
-
-	/**
-	 * The constructor.
-	 */
-	public BuildCallGraphHandler() {
-		graphCreator = new GraphCreator();
-
-	}
-
-	/**
-	 * Execute the command: extract extract the needed information from the
-	 * application context. <br>
-	 * A new call graph is constructed for the selected resources.
-	 * 
-	 * @param event
-	 * @return the result of the execution. Reserved for future use by IHandler
-	 *         interface, must be <code>null</code>.
-	 */
-	public Object execute(ExecutionEvent event) throws ExecutionException {
-		window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
-		System.out.println("BuildCallGraphHandler.execute()");
-		// create an empty call graph to begin with
-		callGraph = graphCreator.initCallGraph();
-		// Get the current selection
-		if (selection == null) {
-			ISelection sel = HandlerUtil.getCurrentSelection(event);
-			if (sel instanceof IStructuredSelection) {
-				selection = (IStructuredSelection) sel;
-			}
-			if (selection == null) {
-				message("No selection detected. Please select a file, folder, or project in the Projects View.");
-				selection=null;
-				return null;
-			}
-		}
-
-		// We iterate here only to handle the possibility of multiple-selection.
-		// graphCreator will descend into child nodes.
-		for (Iterator iter = selection.iterator(); iter.hasNext();) {
-			Object obj = (Object) iter.next();
-			// It can be a Project, Folder, File, etc...
-			if (obj instanceof IAdaptable) {
-				IAdaptable iad = (IAdaptable) obj;
-				final IResource res = (IResource) iad.getAdapter(IResource.class);
-				// Note: put this in a Job or WorkspaceModifyOperation if resources
-				// will be changed.
-				if (res != null) {
-					callGraph = graphCreator.initCallGraph(res);
-				} else {
-					message("Please select a file, folder, or project in the Projects view");
-					selection=null;
-					return null;
-				}
-			}
-		}
-		System.out.println("resources scanned. Now search for callers/callees");
-		graphCreator.computeCallGraph(callGraph);
-		System.out.println("showCallGraph...");
-		graphCreator.showCallGraph(callGraph);
-		System.out.println("showCallGraph complete.");
-		return null;
-	}
-
-	public void selectionChanged(IWorkbenchPart part, ISelection selection) {
-		if (selection instanceof IStructuredSelection) {
-			this.selection = (IStructuredSelection) selection;
-			System.out.println("BuildCallGraphHandler got selection");
-		}
-
-	}
-
-	public void message(String msg) {
-		MessageDialog.openInformation(window.getShell(),
-				"Houston, we have a problem", msg);
-	}
-}
diff --git a/tools/sci/org.eclipse.ptp.sci/.cproject b/tools/sci/org.eclipse.ptp.sci/.cproject
deleted file mode 100644
index 1c2230d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/.cproject
+++ /dev/null
@@ -1,210 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?fileVersion 4.0.0?>
-
-<cproject storage_type_id="org.eclipse.cdt.core.XmlProjectDescriptionStorage">
-	<storageModule moduleId="org.eclipse.cdt.core.settings">
-		<cconfiguration id="0.2009535681">
-			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="0.2009535681" moduleId="org.eclipse.cdt.core.settings" name="Default">
-				<externalSettings/>
-				<extensions>
-					<extension id="org.eclipse.cdt.core.VCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
-				</extensions>
-			</storageModule>
-			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-				<configuration artifactName="${ProjName}" buildProperties="" description="" id="0.2009535681" name="Default" parent="org.eclipse.cdt.build.core.prefbase.cfg">
-					<folderInfo id="0.2009535681." name="/" resourcePath="">
-						<toolChain id="org.eclipse.cdt.build.core.prefbase.toolchain.1594998210" name="No ToolChain" resourceTypeBasedDiscovery="false" superClass="org.eclipse.cdt.build.core.prefbase.toolchain">
-							<targetPlatform id="org.eclipse.cdt.build.core.prefbase.toolchain.1594998210.2064958559" name=""/>
-							<builder id="org.eclipse.cdt.build.core.settings.default.builder.984714857" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="org.eclipse.cdt.build.core.settings.default.builder"/>
-							<tool id="org.eclipse.cdt.build.core.settings.holder.libs.1654805868" name="holder for library settings" superClass="org.eclipse.cdt.build.core.settings.holder.libs"/>
-							<tool id="org.eclipse.cdt.build.core.settings.holder.143460927" name="Assembly" superClass="org.eclipse.cdt.build.core.settings.holder">
-								<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.113121391" languageId="org.eclipse.cdt.core.assembly" languageName="Assembly" sourceContentType="org.eclipse.cdt.core.asmSource" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
-							</tool>
-							<tool id="org.eclipse.cdt.build.core.settings.holder.92741190" name="GNU C++" superClass="org.eclipse.cdt.build.core.settings.holder">
-								<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1046866184" languageId="org.eclipse.cdt.core.g++" languageName="GNU C++" sourceContentType="org.eclipse.cdt.core.cxxSource,org.eclipse.cdt.core.cxxHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
-							</tool>
-							<tool id="org.eclipse.cdt.build.core.settings.holder.2013909110" name="GNU C" superClass="org.eclipse.cdt.build.core.settings.holder">
-								<inputType id="org.eclipse.cdt.build.core.settings.holder.inType.1776969854" languageId="org.eclipse.cdt.core.gcc" languageName="GNU C" sourceContentType="org.eclipse.cdt.core.cSource,org.eclipse.cdt.core.cHeader" superClass="org.eclipse.cdt.build.core.settings.holder.inType"/>
-							</tool>
-						</toolChain>
-					</folderInfo>
-				</configuration>
-			</storageModule>
-			<storageModule moduleId="scannerConfiguration">
-				<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
-				<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
-					<buildOutputProvider>
-						<openAction enabled="true" filePath=""/>
-						<parser enabled="true"/>
-					</buildOutputProvider>
-					<scannerInfoProvider id="specsFile">
-						<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-						<parser enabled="true"/>
-					</scannerInfoProvider>
-				</profile>
-				<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
-					<buildOutputProvider>
-						<openAction enabled="true" filePath=""/>
-						<parser enabled="true"/>
-					</buildOutputProvider>
-					<scannerInfoProvider id="makefileGenerator">
-						<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
-						<parser enabled="true"/>
-					</scannerInfoProvider>
-				</profile>
-				<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
-					<buildOutputProvider>
-						<openAction enabled="true" filePath=""/>
-						<parser enabled="true"/>
-					</buildOutputProvider>
-					<scannerInfoProvider id="specsFile">
-						<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-						<parser enabled="true"/>
-					</scannerInfoProvider>
-				</profile>
-				<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
-					<buildOutputProvider>
-						<openAction enabled="true" filePath=""/>
-						<parser enabled="true"/>
-					</buildOutputProvider>
-					<scannerInfoProvider id="specsFile">
-						<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
-						<parser enabled="true"/>
-					</scannerInfoProvider>
-				</profile>
-				<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
-					<buildOutputProvider>
-						<openAction enabled="true" filePath=""/>
-						<parser enabled="true"/>
-					</buildOutputProvider>
-					<scannerInfoProvider id="specsFile">
-						<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
-						<parser enabled="true"/>
-					</scannerInfoProvider>
-				</profile>
-				<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
-					<buildOutputProvider>
-						<openAction enabled="true" filePath=""/>
-						<parser enabled="true"/>
-					</buildOutputProvider>
-					<scannerInfoProvider id="specsFile">
-						<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
-						<parser enabled="true"/>
-					</scannerInfoProvider>
-				</profile>
-				<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
-					<buildOutputProvider>
-						<openAction enabled="true" filePath=""/>
-						<parser enabled="true"/>
-					</buildOutputProvider>
-					<scannerInfoProvider id="specsFile">
-						<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
-						<parser enabled="true"/>
-					</scannerInfoProvider>
-				</profile>
-				<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
-					<buildOutputProvider>
-						<openAction enabled="true" filePath=""/>
-						<parser enabled="true"/>
-					</buildOutputProvider>
-					<scannerInfoProvider id="specsFile">
-						<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
-						<parser enabled="true"/>
-					</scannerInfoProvider>
-				</profile>
-				<scannerConfigBuildInfo instanceId="0.2009535681">
-					<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
-					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerProjectProfile">
-						<buildOutputProvider>
-							<openAction enabled="true" filePath=""/>
-							<parser enabled="true"/>
-						</buildOutputProvider>
-						<scannerInfoProvider id="specsFile">
-							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-							<parser enabled="true"/>
-						</scannerInfoProvider>
-					</profile>
-					<profile id="org.eclipse.cdt.make.core.GCCStandardMakePerFileProfile">
-						<buildOutputProvider>
-							<openAction enabled="true" filePath=""/>
-							<parser enabled="true"/>
-						</buildOutputProvider>
-						<scannerInfoProvider id="makefileGenerator">
-							<runAction arguments="-f ${project_name}_scd.mk" command="make" useDefault="true"/>
-							<parser enabled="true"/>
-						</scannerInfoProvider>
-					</profile>
-					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfile">
-						<buildOutputProvider>
-							<openAction enabled="true" filePath=""/>
-							<parser enabled="true"/>
-						</buildOutputProvider>
-						<scannerInfoProvider id="specsFile">
-							<runAction arguments="-E -P -v -dD ${plugin_state_location}/${specs_file}" command="gcc" useDefault="true"/>
-							<parser enabled="true"/>
-						</scannerInfoProvider>
-					</profile>
-					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileCPP">
-						<buildOutputProvider>
-							<openAction enabled="true" filePath=""/>
-							<parser enabled="true"/>
-						</buildOutputProvider>
-						<scannerInfoProvider id="specsFile">
-							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.cpp" command="g++" useDefault="true"/>
-							<parser enabled="true"/>
-						</scannerInfoProvider>
-					</profile>
-					<profile id="org.eclipse.cdt.managedbuilder.core.GCCManagedMakePerProjectProfileC">
-						<buildOutputProvider>
-							<openAction enabled="true" filePath=""/>
-							<parser enabled="true"/>
-						</buildOutputProvider>
-						<scannerInfoProvider id="specsFile">
-							<runAction arguments="-E -P -v -dD ${plugin_state_location}/specs.c" command="gcc" useDefault="true"/>
-							<parser enabled="true"/>
-						</scannerInfoProvider>
-					</profile>
-					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfile">
-						<buildOutputProvider>
-							<openAction enabled="true" filePath=""/>
-							<parser enabled="true"/>
-						</buildOutputProvider>
-						<scannerInfoProvider id="specsFile">
-							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/${specs_file}&quot;'" command="sh" useDefault="true"/>
-							<parser enabled="true"/>
-						</scannerInfoProvider>
-					</profile>
-					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileCPP">
-						<buildOutputProvider>
-							<openAction enabled="true" filePath=""/>
-							<parser enabled="true"/>
-						</buildOutputProvider>
-						<scannerInfoProvider id="specsFile">
-							<runAction arguments="-c 'g++ -E -P -v -dD &quot;${plugin_state_location}/specs.cpp&quot;'" command="sh" useDefault="true"/>
-							<parser enabled="true"/>
-						</scannerInfoProvider>
-					</profile>
-					<profile id="org.eclipse.cdt.managedbuilder.core.GCCWinManagedMakePerProjectProfileC">
-						<buildOutputProvider>
-							<openAction enabled="true" filePath=""/>
-							<parser enabled="true"/>
-						</buildOutputProvider>
-						<scannerInfoProvider id="specsFile">
-							<runAction arguments="-c 'gcc -E -P -v -dD &quot;${plugin_state_location}/specs.c&quot;'" command="sh" useDefault="true"/>
-							<parser enabled="true"/>
-						</scannerInfoProvider>
-					</profile>
-				</scannerConfigBuildInfo>
-			</storageModule>
-			<storageModule moduleId="org.eclipse.cdt.core.externalSettings"/>
-		</cconfiguration>
-	</storageModule>
-	<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-		<project id="org.eclipse.ptp.sci.null.763117367" name="org.eclipse.ptp.sci"/>
-	</storageModule>
-</cproject>
diff --git a/tools/sci/org.eclipse.ptp.sci/.project b/tools/sci/org.eclipse.ptp.sci/.project
deleted file mode 100644
index bda8d41..0000000
--- a/tools/sci/org.eclipse.ptp.sci/.project
+++ /dev/null
@@ -1,78 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.sci</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
-			<triggers>clean,full,incremental,</triggers>
-			<arguments>
-				<dictionary>
-					<key>?name?</key>
-					<value></value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.append_environment</key>
-					<value>true</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.autoBuildTarget</key>
-					<value>all</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.buildArguments</key>
-					<value></value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.buildCommand</key>
-					<value>make</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.cleanBuildTarget</key>
-					<value>clean</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.contents</key>
-					<value>org.eclipse.cdt.make.core.activeConfigSettings</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.enableAutoBuild</key>
-					<value>false</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.enableCleanBuild</key>
-					<value>true</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.enableFullBuild</key>
-					<value>true</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.fullBuildTarget</key>
-					<value>all</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.stopOnError</key>
-					<value>true</value>
-				</dictionary>
-				<dictionary>
-					<key>org.eclipse.cdt.make.core.useDefaultBuildCmd</key>
-					<value>true</value>
-				</dictionary>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.cdt.core.cnature</nature>
-		<nature>org.eclipse.cdt.core.ccnature</nature>
-		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
-		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
-	</natures>
-</projectDescription>
diff --git a/tools/sci/org.eclipse.ptp.sci/META-INF/MANIFEST.MF b/tools/sci/org.eclipse.ptp.sci/META-INF/MANIFEST.MF
deleted file mode 100644
index ea2bde5..0000000
--- a/tools/sci/org.eclipse.ptp.sci/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,6 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.ptp.sci
-Bundle-Version: 1.0.0.qualifier
-Bundle-Vendor: %pluginProvider
diff --git a/tools/sci/org.eclipse.ptp.sci/Makefile b/tools/sci/org.eclipse.ptp.sci/Makefile
deleted file mode 100644
index a50c42b..0000000
--- a/tools/sci/org.eclipse.ptp.sci/Makefile
+++ /dev/null
@@ -1,35 +0,0 @@
-# Makefile for MMSC common library
-#include ../../makefile.define
-#=========================== DISPLAY SETTING ===================================
-esc	=	\033[
-fore 	= 	33
-back	=	41
-
-#light:1m non-light:m
-light	=	1m
-
-#			echo "${esc}${back};${fore};${light}making all in $$i${esc}m";
-#			echo "${esc}${back};${fore};${light}installing all in $$i${esc}m";
-#			echo "${esc}${back};${fore};${light}cleaning all in $$i${esc}m";
-#			echo "${esc}${back};${fore};${light}verycleaningall in $$i${esc}m";
-#================================================================================
-SUBDIRS =	common libsci scia scid scie include man
-
-all:
-	@for i in $(SUBDIRS); do\
-	    echo -e "${esc}0;37;44;1mmaking ${esc}0;32;43;1m all ${esc}0;33;41;1m in $$i ${esc}0m";\
-	    (cd $$i && $(MAKE) all) || exit 1; \
-	done
-
-install:
-	@for i in $(SUBDIRS); do \
-	    echo -e "${esc}0;37;44;1mmaking ${esc}0;32;43;1m installing ${esc}0;33;41;1m in $$i ${esc}0m";\
-	    (cd $$i && $(MAKE) install) || exit 1; \
-	done
-
-clean:
-	@for i in $(SUBDIRS); do \
-	    echo -e "${esc}0;37;44;1mmaking ${esc}0;32;43;1m cleaning ${esc}0;33;41;1m in $$i ${esc}0m";\
-	    (cd $$i && $(MAKE) clean) || exit 1;\
-	done
-
diff --git a/tools/sci/org.eclipse.ptp.sci/about.html b/tools/sci/org.eclipse.ptp.sci/about.html
deleted file mode 100644
index 3f81093..0000000
--- a/tools/sci/org.eclipse.ptp.sci/about.html
+++ /dev/null
@@ -1,22 +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">
-<h2>About This Content</h2>
- 
-<p>May 2, 2006</p>	
-<h3>License</h3>
-
-<p>The Eclipse Foundation makes available all content in this plug-in (&quot;Content&quot;).  Unless otherwise indicated below, the Content is provided to you under the terms and conditions of the
-Eclipse Public License Version 1.0 (&quot;EPL&quot;).  A copy of the EPL is available at <a href="http://www.eclipse.org/legal/epl-v10.html">http://www.eclipse.org/legal/epl-v10.html</a>.
-For purposes of the EPL, &quot;Program&quot; 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 (&quot;Redistributor&quot;) 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.</p>
-
-</body>
-</html>
\ No newline at end of file
diff --git a/tools/sci/org.eclipse.ptp.sci/build.properties b/tools/sci/org.eclipse.ptp.sci/build.properties
deleted file mode 100644
index 855a1da..0000000
--- a/tools/sci/org.eclipse.ptp.sci/build.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-bin.includes = about.html,\
-               META-INF/,\
-               Makefile,\
-               aix/,\
-               common/,\
-               libsci/,\
-               linux/,\
-               makefile.define,\
-               man/,\
-               packages/,\
-               prototype/,\
-               regression/,\
-               scia/,\
-               plugin.properties,\
-               scid/,\
-               scie/,\
-               usecase/,\
-               include/
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/Makefile b/tools/sci/org.eclipse.ptp.sci/common/Makefile
deleted file mode 100644
index 93cc52c..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/Makefile
+++ /dev/null
@@ -1,25 +0,0 @@
-include ../makefile.define
-
-CPPFLAGS = $(MY_FLAGS) -fPIC
-
-ifeq ($(ARCH), i686)
-    LIBRARY = libcmn.a
-    LIBRARY64 = 
-else
-    LIBRARY = libcmn.a
-    LIBRARY64 = libcmn64.a
-endif
-
-all : $(LIBRARY) $(LIBRARY64)
-
-$(LIBRARY) : $(OBJS) 
-	@$(AR) $(ARFLAGS) $(LIBRARY) $(OBJS)
-
-$(LIBRARY64) : $(OBJS64)
-	@$(AR) $(AR64FLAGS) $(LIBRARY64) $(OBJS64)
-
-install: $(LIBRARY) $(LIBRARY64)
-
-clean :
-	rm -f $(LIBRARY) $(LIBRARY64) $(OBJS) $(OBJS64) core *.d
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/envvar.cpp b/tools/sci/org.eclipse.ptp.sci/common/envvar.cpp
deleted file mode 100644
index b45d001..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/envvar.cpp
+++ /dev/null
@@ -1,132 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Envvar
-
- Description: Environment variable manipulation.
-   
- Author: Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code
-
-****************************************************************************/
-
-#include "envvar.hpp"
-#include <assert.h>
-
-#include "tools.hpp"
-
-EnvVar::EnvVar()
-{
-}
-
-EnvVar::~EnvVar()
-{
-    envlist.clear();
-}
-
-void EnvVar::set(string &env, const char *value)
-{
-    if (value) {
-        envlist[env] = env + "=" + value;
-    }
-}
-
-void EnvVar::set(string &env, string &value)
-{
-    envlist[env] = env + "=" + value;
-}
-
-void EnvVar::set(string &env, int value)
-{
-    envlist[env] = env + "=" + SysUtil::itoa(value);
-}
-
-void EnvVar::set(const char *env, const char *value)
-{
-    assert(env);
-    if (value) {
-        envlist[env] = string(env) + "=" + value;
-    }
-}
-
-void EnvVar::set(const char *env, string &value)
-{
-    assert(env);
-    envlist[env] = string(env) + "=" + value;
-}
-
-void EnvVar::set(const char *env, int value)
-{
-    assert(env);
-    envlist[env] = string(env) + "=" + SysUtil::itoa(value);
-}
-
-string & EnvVar::get(string &env)
-{
-    retval = "";
-    
-    if (envlist.find(env) != envlist.end())
-        retval = envlist[env];
-    
-    return retval;
-}
-
-string & EnvVar::get(const char *env)
-{
-    retval = "";
-    
-    if (envlist.find(env) != envlist.end())
-        retval = envlist[env];
-    
-    return retval;
-}
-
-string & EnvVar::getExportcmd()
-{
-    retval = "";
-    
-    map<string, string>::const_iterator p = envlist.begin();
-    for(; p != envlist.end(); ++p) 
-        retval += "export " + p->second + ";";
-
-    return retval;
-}
-
-string & EnvVar::getEnvString()
-{
-    retval = "";
-    
-    map<string, string>::const_iterator p = envlist.begin();
-    for(; p != envlist.end(); ++p) {
-        retval += ";" + p->second;
-    }
-    
-    return retval;
-}
-
-void EnvVar::unsetAll()
-{
-    envlist.clear();
-}
-
-void EnvVar::dump()
-{
-    map<string, string>::const_iterator p = envlist.begin();
-    for(; p != envlist.end(); ++p) {
-        printf("%s\n", p->second.c_str());
-    }
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/envvar.hpp b/tools/sci/org.eclipse.ptp.sci/common/envvar.hpp
deleted file mode 100644
index 2c54292..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/envvar.hpp
+++ /dev/null
@@ -1,61 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Envvar
-
- Description: Environment variable manipulation.
-   
- Author: Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _ENVVAR_HPP
-#define _ENVVAR_HPP
-
-#include <map>
-#include <string>
-
-using namespace std;
-
-class EnvVar 
-{
-    private:
-        map<string, string> envlist;
-        string              retval;
-        
-    public:
-        EnvVar();
-        ~EnvVar();
-        
-        void set(string &env, const char *val);
-        void set(string &env, string &val);
-        void set(string &env, int val);
-        void set(const char *env, const char *val);
-        void set(const char *env, string &val);
-        void set(const char *env, int val);
-        string & get(string &env);
-        string & get(const char *env);
-
-        string & getExportcmd();
-        string & getEnvString();
-
-        void unsetAll();
-        void dump();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/exception.cpp b/tools/sci/org.eclipse.ptp.sci/common/exception.cpp
deleted file mode 100644
index 2585daa..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/exception.cpp
+++ /dev/null
@@ -1,51 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Exception
-
- Description: Wrapper for SCI's exceptions.
-   
- Author: Liu Wei, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 lwbjcdl      Initial code (D153875)
-
-****************************************************************************/
-
-#include "exception.hpp"
-#include <assert.h>
-
-const char * ErrMsg[] = {
-    "Memory allocation failed.",
-    "Error occur when call getaddrinfo.",
-    "Invalid user credential.",
-    "Error occur when call some system call.",
-    "Invalid launch action."
-};
-
-Exception::Exception(int code) throw()
-        : errCode(code)
-{
-}
-
-const char * Exception::getErrMsg() const throw()
-{
-    return ErrMsg[errCode];
-}
-
-int Exception::getErrCode() const throw()
-{
-    return errCode;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/exception.hpp b/tools/sci/org.eclipse.ptp.sci/common/exception.hpp
deleted file mode 100644
index 094b36d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/exception.hpp
+++ /dev/null
@@ -1,51 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Exception
-
- Description: Wrapper for SCI's exceptions.
-   
- Author: Liu Wei, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 lwbjcdl      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _EXCEPTION_HPP
-#define _EXCEPTION_HPP
-
-class Exception
-{
-    public:
-        enum CODE {
-            MEM_BAD_ALLOC,
-            GET_ADDR_INFO,
-            INVALID_USER,
-            SYS_CALL,
-            INVALID_LAUNCH
-        };
-        
-    private:
-        int        errCode;
-        
-    public:
-        Exception(int code) throw();
-        
-        const char * getErrMsg() const throw();
-        int getErrCode() const throw();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/group.cpp b/tools/sci/org.eclipse.ptp.sci/common/group.cpp
deleted file mode 100644
index 980c5c9..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/group.cpp
+++ /dev/null
@@ -1,256 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Group
-
- Description: Group manipulation.
-   
- Author: Hanhong Xue
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 hxue         Initial code (D153875)
-
-****************************************************************************/
-
-#include "group.hpp"
-#include <assert.h>
-#include <ctype.h>
-#include <stdio.h>
-
-Group::Group()
-{
-}
-
-Group::Group(ClientId clientId)
-{
-    Add(Range(clientId, clientId+1));
-}
-
-Group::Group(Range r)
-{
-    Add(r);
-}
-
-Group::Group(Group &group)
-{
-    Add(group);
-}
-
-bool Group::operator == (Group &g)
-{
-    if (rangeList.size() != g.rangeList.size())
-        return false;
-    for (int i = 0; i < (int)rangeList.size(); i++)
-        if (rangeList[i] != g.rangeList[i])
-            return false;
-    return true;
-}
-
-bool Group::HasMember(ClientId clientId)
-{
-    range_iterator it;
-    for (it=rangeList.begin(); it!=rangeList.end(); ++it) {
-        if (clientId >= (*it).end()) {
-            continue;
-        } else if (clientId >= (*it).begin()) {
-            return true;
-        }
-    }
-
-    return false;
-}
-
-bool Group::HasRange(Range & r)
-{    
-    for(Range::iterator i=r.begin(); i< r.end(); i++ )
-        if (this->HasMember(i))
-            continue;
-        else 
-            return false;    
-    return true;
-}
-
-int Group::Index(ClientId clientId)
-{
-    int index = 0;
-    range_iterator it = rangeList.begin();
-    for ( ; it!=rangeList.end(); ++it) {
-        if (clientId < (*it).begin()) {
-            break;
-        } else if (clientId < (*it).end()) {
-            return index + clientId - (*it).begin();
-        } else {
-            index += (*it).end() - (*it).begin();
-        }
-    }
-       
-    assert(!"Should have found index");
-    return index;
-}
-
-range_iterator Group::Add(ClientId clientId)
-{
-    return Add(Range(clientId, clientId+1));
-}
-
-range_iterator Group::Add(Range r)
-{
-    return Add(r, rangeList.begin());
-}
-
-range_iterator Group::Add(Range r, range_iterator range)
-{
-    // shortcut for a higher range
-    if (!rangeList.empty() && !r.Touches(*rangeList.rbegin())
-            && !r.IsBefore(*rangeList.rbegin()))
-        return rangeList.insert(rangeList.end(), r);
-
-    for (; range != rangeList.end(); range++)
-        if (r.Touches(*range) || r.IsBefore(*range))
-            break;
-    if (range == rangeList.end()) {
-        return rangeList.insert(range, r);
-    } else if (r.Touches(*range)) {
-        *range = r.Union(*range);
-        while (range + 1 != rangeList.end() && range->Touches(*(range+1))) {
-            *range = range->Union(*(range+1));
-            rangeList.erase(range+1);
-        }
-        return range;
-    } else {
-        return rangeList.insert(range, r);
-    }
-}
-
-void Group::Add(Group &group)
-{
-    range_iterator pos = rangeList.begin();
-    range_iterator it = group.rangeList.begin();
-    for ( ; it!=group.rangeList.end(); ++it) {
-        pos = Add((*it), pos);
-    }
-}
-
-void Group::Delete(ClientId clientId)
-{
-    Delete(Range(clientId, clientId+1));
-}
-
-void Group::Delete(Range r)
-{
-    Delete(r, rangeList.begin());
-}
-
-range_iterator Group::Delete(Range r, range_iterator range)
-{
-    for (; range != rangeList.end(); range++)
-        if (r.Intersects(*range) || r.IsBefore(*range))
-            break;
-    if (range == rangeList.end())
-        return range;
-    else if (r.Intersects(*range)) {
-        range_iterator savedRange = range;
-        if (r.Splits(*range)) {
-            Range newRange(r.end(), range->end());
-            *range = Range(range->begin(), r.begin());
-            range = rangeList.insert(range+1, newRange);
-            return range;
-        } else {
-            while (range != rangeList.end()) {
-                if (r.Contains(*range)) {
-                    rangeList.erase(range);
-                } else {
-                    *range = range->Difference(r);
-                    range++;
-                }
-            }
-        }
-        return savedRange;
-    } else
-        return range;
-}
-
-void Group::Delete(Group &group)
-{
-    range_iterator pos = rangeList.begin();
-    range_iterator it = group.rangeList.begin();
-    for ( ; it!=group.rangeList.end(); ++it) {
-        pos = Delete((*it), pos);
-    }
-}
-
-void Group::Clear()
-{
-    rangeList.clear();
-}
-
-Group::iterator Group::begin()
-{
-    return iterator(rangeList.begin(), rangeList.end());
-}
-
-Group::iterator Group::end()
-{
-    return iterator(rangeList.end(), rangeList.end()); 
-}
-
-size_t Group::size()
-{
-    int len = 0;
-    range_iterator it = rangeList.begin();
-    for ( ; it!=rangeList.end(); ++it) {
-        len += (*it).end() - (*it).begin();
-    }
-
-    return len;
-}
-
-/////////////////////////////////////////
-
-Group::iterator::iterator(range_iterator first, range_iterator last)
-    : firstRange(first), lastRange(last)
-{
-    if (firstRange != lastRange)
-        clientId = firstRange->begin();
-    else
-        clientId = -1;
-}
-
-ClientId & Group::iterator::operator *()
-{
-    return clientId;
-}
-
-Group::iterator Group::iterator::operator ++ (int)
-{
-    if (++clientId == firstRange->end()) {
-        firstRange++;
-        if (firstRange != lastRange)
-            clientId = firstRange->begin();
-        else
-            clientId = -1;
-    }
-    return *this;
-}
-
-bool Group::iterator::operator == (Group::iterator it)
-{
-    return firstRange == it.firstRange && clientId == it.clientId;
-}
-
-bool Group::iterator::operator != (Group::iterator it)
-{
-    return !(*this == it);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/group.hpp b/tools/sci/org.eclipse.ptp.sci/common/group.hpp
deleted file mode 100644
index 5e3b618..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/group.hpp
+++ /dev/null
@@ -1,88 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Group
-
- Description: Group manipulation.
-   
- Author: Hanhong Xue
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 hxue         Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _GROUP_HPP
-#define _GROUP_HPP
-
-#include <map>
-#include <string>
-#include <vector>
-
-#include "range.hpp"
-
-using namespace std;
-
-typedef int  ClientId;
-typedef int  GroupId;
-typedef vector<Range> RangeList;
-typedef RangeList::iterator range_iterator;
-
-class Group
-{
-    private:
-        RangeList  rangeList;
-
-    public:
-        Group();
-        Group(ClientId);
-        Group(Range r);
-        Group(Group &group);
-
-        bool operator == (Group &);
-        bool HasMember(ClientId);
-        bool HasRange(Range &);
-        int  Index(ClientId);
-
-        range_iterator Add(ClientId);
-        range_iterator Add(Range);
-        range_iterator Add(Range, range_iterator range);
-        void           Add(Group &group);
-        void           Delete(ClientId);
-        void           Delete(Range);
-        range_iterator Delete(Range, range_iterator range);
-        void           Delete(Group &group);
-        void           Clear();
-
-        class iterator { 
-            private:
-                range_iterator   firstRange;
-                range_iterator   lastRange;
-                ClientId         clientId;
-            public:
-                iterator(range_iterator first, range_iterator last);
-                iterator   operator ++ (int);
-                ClientId  &operator *  ();
-                bool       operator == (iterator it);
-                bool       operator != (iterator it);
-        };
-
-        iterator begin();
-        iterator end();
-        bool     empty() { return rangeList.empty(); }
-        size_t   size();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/ipconverter.cpp b/tools/sci/org.eclipse.ptp.sci/common/ipconverter.cpp
deleted file mode 100644
index 4698a11..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/ipconverter.cpp
+++ /dev/null
@@ -1,201 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: IPConverter
-
- Description: Convert ifname to ip addresses.
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   12/10/09 nieyy      Initial code
-
-****************************************************************************/
-
-#include "ipconverter.hpp"
-#include <assert.h>
-#include <netinet/in.h>
-#include <string.h>
-
-#include "exception.hpp"
-
-IPConverter::IPConverter() 
-    : ip_addr("")
-{
-    int ret = 0;
-#ifdef _SCI_LINUX
-    ret = ::getifaddrs(&ifa);
-    if (ret != 0) {
-        throw Exception(Exception::SYS_CALL);
-    }
-#else
-    int fd, ifsize;
-    if ((fd = ::socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
-        ret = -1;
-    }
-
-    if (ret == 0 && ::ioctl(fd, SIOCGSIZIFCONF, (caddr_t)&ifsize) < 0) {
-        ret = -1;
-    }
-
-    if (ret == 0 && (ifc.ifc_req = (struct ifreq *)::malloc(ifsize)) == NULL) {
-        ret = -1;
-    }
-
-    ifc.ifc_len = ifsize;
-
-    if (ret == 0 && ::ioctl(fd, SIOCGIFCONF, (caddr_t)&ifc) < 0) {
-        ret = -1;
-    }
-    if (ret != 0) {
-        throw Exception(Exception::SYS_CALL);
-    }
-#endif
-}
-
-IPConverter::~IPConverter()
-{
-#ifdef _SCI_LINUX
-    if (ifa) {
-        ::freeifaddrs(ifa);
-        ifa = NULL;
-    }
-#else
-    if (ifc.ifc_req) {
-        ::free(ifc.ifc_req);
-    }
-#endif
-}
-
-int IPConverter::getIP(const string &ifname, bool ipv4, string &addr)
-{
-    if (getIP(ifname, ipv4)) {
-        return -1;
-    }
-    addr = ip_addr;
-    ip_addr = "";
-    return 0;
-}
-
-int IPConverter::getIP(const string &ifname, bool ipv4, struct sockaddr_in *addr)
-{
-    if (!ipv4 || getIP(ifname, ipv4)) {
-        return -1;
-    }
-    ::memcpy(addr, &sin, sizeof(struct sockaddr_in));
-    return 0;
-}
-
-int IPConverter::getIP(const string &ifname, bool ipv4, struct sockaddr_in6 *addr)
-{
-    if (ipv4 || getIP(ifname, ipv4)) {
-        return -1;
-    }
-    ::memcpy(addr, &sin6, sizeof(struct sockaddr_in6));
-    return 0;
-}
-
-int IPConverter::getIP(const string &ifname, bool ipv4)
-{
-#ifdef _SCI_LINUX
-    return getIPLinux(ifname, ipv4);
-#else
-    return getIPAIX(ifname, ipv4);
-#endif
-}
-
-#ifdef _SCI_LINUX
-
-int IPConverter::getIPLinux(const string &ifname, bool ipv4)
-{
-    struct ifaddrs *ifa_tmp;
-    char addr[INET6_ADDRSTRLEN];
-    int ret = -1;
-
-    ifa_tmp = ifa;
-
-    for (; ifa_tmp; ifa_tmp = ifa_tmp->ifa_next) {
-        string name(ifa_tmp->ifa_name);
-        if (ifname != name ||
-            ifa_tmp->ifa_addr->sa_family != (ipv4 ? AF_INET : AF_INET6)) {
-            continue;
-        }
-
-        if (ifa_tmp->ifa_addr) {
-            if (ipv4) {
-                ::memcpy(&sin, ifa_tmp->ifa_addr, sizeof(struct sockaddr_in));
-                if (::inet_ntop(AF_INET, &sin.sin_addr, addr, sizeof(addr)) == NULL) {
-                    continue;
-                }
-            } else {
-                ::memcpy(&sin6, ifa_tmp->ifa_addr, sizeof(struct sockaddr_in6));
-                if (::inet_ntop(AF_INET6, &sin6.sin6_addr, addr, sizeof(addr)) == NULL) {
-                    continue;
-                }
-            }
-            ip_addr = addr;
-            ret = 0;
-            break;
-        }
-    }
-
-    return(ret);        //return 0 is okay
-}
-
-#else /* AIX */
-
-#define REAL_SIZE(a) (((a).sa_len) > (sizeof(a)) ? ((a).sa_len) : (sizeof(a)))
-
-int IPConverter::getIPAIX(const string &ifname, bool ipv4)
-{
-    char *ifr_ch, addr[INET6_ADDRSTRLEN];
-    struct ifreq *ifr = ifc.ifc_req;
-    struct sockaddr *sa;
-    int ret = -1;
-    /*
-     * On AIX, actual size of ifr->ifr_addr is possibly larger than
-     * size of the structure, real size is in sa_len
-     */
-    for (ifr_ch = (char *)ifc.ifc_req; ifr_ch < (char *)ifc.ifc_req + ifc.ifc_len;
-        ifr_ch += (sizeof(ifr->ifr_name) + REAL_SIZE(ifr->ifr_addr))) {
-        ifr = (struct ifreq *)ifr_ch;
-        sa = (struct sockaddr *)&(ifr->ifr_addr);
-
-        if (::strcasecmp(ifr->ifr_name, ifname.c_str()) ||
-            sa->sa_family != (ipv4 ? AF_INET : AF_INET6)) {
-            continue;
-        }
-
-        if (ipv4) {
-            ::memcpy((void *)&sin, (void *)sa, sizeof(struct sockaddr_in));
-            if (::inet_ntop(AF_INET, (void *)(&sin.sin_addr), addr, sizeof(addr)) == NULL) {
-                continue;
-            }
-        } else {
-            ::memcpy((void *)&sin6, (void *)sa, sizeof(struct sockaddr_in6));
-            if (::inet_ntop(AF_INET6, (void *)(&sin6.sin6_addr), addr, sizeof(addr)) == NULL) {
-                continue;
-            }
-        }
-        ip_addr = addr;
-        ret = 0;
-
-        break;
-    }
-
-    return ret;     //return 0 is okay
-}
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/ipconverter.hpp b/tools/sci/org.eclipse.ptp.sci/common/ipconverter.hpp
deleted file mode 100644
index f932909..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/ipconverter.hpp
+++ /dev/null
@@ -1,78 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: IPConverter
-
- Description: Convert ifname to ip addresses.
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   12/10/09 nieyy      Initial code
-
-****************************************************************************/
-
-#ifndef _IPCONVERTER_HPP
-#define _IPCONVERTER_HPP
-
-#ifdef _SCI_LINUX
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <arpa/inet.h>
-#include <ifaddrs.h>
-#else /* AIX */
-#include <sys/ioctl.h>
-#include <net/if.h>
-#include <net/if_arp.h>
-#include <net/netopt.h>
-#include <arpa/inet.h>
-#endif
-
-#include <string>
-using namespace std;
-
-class IPConverter
-{
-    private:
-        string ip_addr;
-        struct sockaddr_in sin;
-        struct sockaddr_in6 sin6;
-
-#ifdef _SCI_LINUX
-        struct ifaddrs *ifa;
-#else /* AIX */
-        struct ifconf ifc;
-#endif
-
-    public:
-        IPConverter();
-        ~IPConverter();
-        
-        int getIP(const string &ifname, bool ipv4, string &addr);
-        int getIP(const string &ifname, bool ipv4, struct sockaddr_in *addr);
-        int getIP(const string &ifname, bool ipv4, struct sockaddr_in6 *addr);
-
-    private:
-        int getIP(const string &ifname, bool ipv4);
-
-#ifdef _SCI_LINUX
-        int getIPLinux(const string &ifname, bool ipv4);
-#else /* AIX */
-        #define REAL_SIZE(a) (((a).sa_len) > (sizeof(a)) ? ((a).sa_len) : (sizeof(a)))
-        int getIPAIX(const string &ifname, bool ipv4);
-#endif       
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/log.cpp b/tools/sci/org.eclipse.ptp.sci/common/log.cpp
deleted file mode 100644
index 0f4106d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/log.cpp
+++ /dev/null
@@ -1,95 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Envvar
-
- Description: Environment variable manipulation.
-   
- Author: Liu Wei, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 lwbjcdl      Initial code (D153875)
-
-****************************************************************************/
-
-#include "log.hpp"
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <time.h>
-#include <stdarg.h>
-#include <errno.h>
-#include <string.h>
-
-const char *logHeader[] = {
-    "[CRIT]",
-    "[ERROR]",
-    "[WARN]",
-    "[INFO]",
-    "[DEBUG]",
-    "[PERF]",
-    "[OTHER]",
-};
-
-Log *Log::logger = NULL;
-
-Log::Log()
-{
-}
-
-Log::~Log()
-{
-}
-
-void Log::init(const char *directory, const char * filename, int level)
-{
-    assert(filename);
-    assert(directory);
-    
-    char node[256] = {0};
-    gethostname(node, sizeof(node));
-
-    logDir = (char *) directory;
-    sprintf(logPath, "%s/%s.%s.%d" , directory, node, filename, (int)getpid());
-    permitLevel = level;
-}
-
-void Log::print(int level, char *srcFile, int srcLine, const char *format, ...)
-{
-    if(level > permitLevel)
-        return;
-    
-    char tmMsg[MAX_LOG_LEN];
-    time_t time1;
-    struct tm tm1;
-    va_list args;
-    
-    va_start(args, format);
-    memset(tmMsg, 0, MAX_LOG_LEN);
-    time(&time1);
-    localtime_r(&time1, &tm1);
-    strftime(tmMsg, MAX_LOG_LEN, "%y%m%d-%H:%M:%S", &tm1);
-    
-    FILE *fp = fopen(logPath, "a");
-    if (fp) {
-        fprintf(fp, "%s", tmMsg);
-        fprintf(fp, "%s ", (char *)logHeader[level]);
-        vfprintf(fp, format, args);
-        fprintf(fp, " (%s:%d|%lu)\n", srcFile, srcLine, pthread_self());
-        fclose(fp);
-    }
-    
-    va_end(args);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/log.hpp b/tools/sci/org.eclipse.ptp.sci/common/log.hpp
deleted file mode 100644
index 24c0761..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/log.hpp
+++ /dev/null
@@ -1,96 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Envvar
-
- Description: Environment variable manipulation.
-   
- Author: Liu Wei, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 lwbjcdl      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _LOG_HPP
-#define _LOG_HPP
-
-#include <pthread.h>
-#include <string>
-#include <vector>
-
-#define MAX_LOG_LEN 1024
-#define MAX_PATH_LEN 512
-
-using namespace std;
-
-class Log 
-{
-    public:
-        enum LEVEL {
-            CRITICAL,
-            ERROR,
-            WARNING,
-            INFORMATION,
-            DEBUG,
-            PERFORMANCE,
-            OTHER
-        };
-        
-    private:
-        Log();
-        
-        int permitLevel;
-        char *logDir;
-        char logPath[2 * MAX_PATH_LEN];
-
-        static Log *logger;
-        
-    public:
-        ~Log();
-        static Log * getInstance() {
-            if(logger == NULL)
-                logger = new Log();
-            return logger;
-        }
-        
-        void init(const char *directory = "../log", const char * filename = "debug.log", int level = INFORMATION);
-        void print(int level, char * srcFile, int srcLine, const char * format, ...);
-
-        const char * getLogDir() { return logDir; }
-        int getLogLevel() { return permitLevel; }
-};
-
-#ifdef _SCI_DEBUG
-
-#define log_crit(...)   Log::getInstance()->print(Log::CRITICAL, __FILE__, __LINE__,  __VA_ARGS__)
-#define log_error(...)  Log::getInstance()->print(Log::ERROR, __FILE__, __LINE__,  __VA_ARGS__)
-#define log_warn(...)   Log::getInstance()->print(Log::WARNING, __FILE__, __LINE__,  __VA_ARGS__)
-#define log_info(...)   Log::getInstance()->print(Log::INFORMATION, __FILE__, __LINE__,  __VA_ARGS__)
-#define log_debug(...)  Log::getInstance()->print(Log::DEBUG, __FILE__, __LINE__,  __VA_ARGS__)
-#define log_perf(...)   Log::getInstance()->print(Log::PERFORMANCE, __FILE__, __LINE__,  __VA_ARGS__)
-
-#else
-
-#define log_crit(...)
-#define log_error(...)
-#define log_warn(...)
-#define log_info(...)
-#define log_debug(...)
-#define log_perf(...)
-
-#endif
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/packer.cpp b/tools/sci/org.eclipse.ptp.sci/common/packer.cpp
deleted file mode 100644
index a8c0f76..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/packer.cpp
+++ /dev/null
@@ -1,136 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Packer
-
- Description: Wrapper for various kind of information.
-   
- Author: Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#include "packer.hpp"
-#include <stdlib.h>
-#include <arpa/inet.h>
-#include <string.h>
-
-const int PACK_SIZE = 256;
-
-Packer::Packer()
-    : msgLen(0), bufSize(PACK_SIZE)
-{
-    msgBuf = new char[bufSize];
-    msgPtr = msgBuf;
-}
-
-Packer::Packer(char *msg)
-    : msgLen(0), bufSize(0)
-{
-    msgBuf = msg;
-    msgPtr = msgBuf;
-}
-
-char * Packer::getPackedMsg()
-{
-    return msgBuf;
-}
-
-int Packer::getPackedMsgLen()
-{
-    return msgLen;
-}
-
-
-void Packer::packInt(int value)
-{
-    int val = htonl(value);
-    int len = sizeof(val);
-
-    checkBuffer(len);
-    memcpy(msgPtr, &val, len);
-    msgPtr += len;
-    msgLen += len;
-}
-
-void Packer::packStr(const char *value)
-{
-    int len = strlen(value) + 1;
-    packInt(len);
-
-    checkBuffer(len);
-    memcpy(msgPtr, value, len);
-    msgPtr += len;
-    msgLen += len;
-}
-
-void Packer::packStr(const string &value)
-{
-    int len = strlen(value.c_str()) + 1;
-    packInt(len);
-
-    checkBuffer(len);
-    memcpy(msgPtr, value.c_str(), len);
-    msgPtr += len;
-    msgLen += len;
-}
-
-void Packer::setPackedMsg(const void * msg)
-{
-    msgBuf = (char *) msg;
-    msgPtr = msgBuf;
-}
-
-int Packer::unpackInt()
-{
-    int size, value;
-    memcpy(&size, msgPtr, sizeof(size));
-
-    value = ntohl(size);
-    msgPtr += sizeof(size);
-
-    return value;
-}
-
-char * Packer::unpackStr()
-{
-    int len;
-    char *value;
-
-    len = unpackInt();
-    value = msgPtr;
-    msgPtr += len;
-
-    return value;
-}
-
-void Packer::checkBuffer(int size)
-{
-    char *tmp = NULL;
-    int len = msgLen + size;
-
-    if (len <= bufSize) 
-        return;
-
-    while (bufSize < len)
-        bufSize *= 2;
-    tmp = new char[bufSize];
-    memcpy(tmp, msgBuf, msgLen);
-    msgPtr = tmp + (msgPtr - msgBuf);
-    delete []msgBuf;
-    msgBuf = tmp;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/packer.hpp b/tools/sci/org.eclipse.ptp.sci/common/packer.hpp
deleted file mode 100644
index 25dc3ce..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/packer.hpp
+++ /dev/null
@@ -1,64 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Packer
-
- Description: Wrapper for various kind of information.
-   
- Author: Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _PACKER_HPP
-#define _PACKER_HPP
-
-#include <vector>
-#include <map>
-#include <string>
-
-using namespace std;
-
-class Packer 
-{
-    private:
-        char        *msgBuf;
-        char        *msgPtr;
-        int         msgLen;
-        int         bufSize;
-        
-    public:
-        Packer();
-        Packer(char *msg);
-
-        // for message packing usage
-        void packInt(int value);
-        void packStr(const char *value);
-        void packStr(const string &value);
-        char * getPackedMsg();
-        int getPackedMsgLen();
-
-        // for message unpacking usage
-        void setPackedMsg(const void *msg);
-        int unpackInt();
-        char * unpackStr();
-
-    public:
-        void checkBuffer(int size);
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/range.cpp b/tools/sci/org.eclipse.ptp.sci/common/range.cpp
deleted file mode 100644
index bda89a8..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/range.cpp
+++ /dev/null
@@ -1,108 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Range
-
- Description: Range manipulation.
-   
- Author: Hanhong Xue
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 hxue         Initial code (D153875)
-
-****************************************************************************/
-
-#include "range.hpp"
-#include <assert.h>
-#include <stdio.h>
-
-Range::Range()
-    : first(0), last(0)
-{
-}
-
-Range::Range(const Range &r)
-    : first(r.first), last(r.last)
-{
-}
-
-Range::Range(int _first, int _last)
-    : first(_first), last(_last)
-{
-}
-
-bool Range::operator == (Range &r)
-{
-    return first == r.first && last == r.last;
-}
-
-bool Range::operator != (Range &r)
-{
-    return first != r.first || last != r.last;
-}
-
-bool Range::Intersects(Range r)
-{
-    return (first <= r.first && r.first < last
-             || first < r.last && r.last <= last
-             || this->Contains(r) || r.Contains(*this));
-}
-
-bool Range::Touches(Range r)
-{
-    return (first <= r.first && r.first <= last
-             || first <= r.last && r.last <= last
-             || this->Contains(r) || r.Contains(*this));
-}
-
-bool Range::IsBefore(Range r)
-{
-    return last <= r.first;
-}
-
-bool Range::IsAfter(Range r)
-{
-    return r.last <= first;
-}
-
-bool Range::Contains(Range r)
-{
-    return (first <= r.first && r.last <= last);
-}
-
-bool Range::Splits(Range r)
-{
-    return (r.first < first && last < r.last);
-}
-
-Range Range::Union(Range r)
-{
-    assert(this->Touches(r));
-    return Range(min(first, r.first), max(last, r.last));
-}
-
-Range Range::Difference(Range r)
-{
-    assert(!r.Splits(*this));
-    if (this->Intersects(r)) {
-        if (first < r.first) {
-            return Range(first, r.first);
-        } else {
-            assert(r.last < last);
-            return Range(r.last, last);
-        }
-    } else
-        return *this;  // unchanged
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/range.hpp b/tools/sci/org.eclipse.ptp.sci/common/range.hpp
deleted file mode 100644
index 1a55c0f..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/range.hpp
+++ /dev/null
@@ -1,62 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Range
-
- Description: Range manipulation.
-   
- Author: Hanhong Xue
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 hxue         Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _RANGE_HPP
-#define _RANGE_HPP
-
-#include <string>
-
-using namespace std;
-
-#define RANGE_SEPARATOR ":"
-
-class Range
-{
-    private:
-        int   first;
-        int   last;
-    public:
-        Range();
-        Range(const Range &r);
-        Range(int _first, int _last);
-
-        typedef int iterator;
-        iterator begin() { return first; }
-        iterator end()   { return last; }
-
-        bool  operator == (Range &r);
-        bool  operator != (Range &r);
-        bool  Intersects(Range r);
-        bool  Touches(Range r);
-        bool  Splits(Range r);
-        bool  Contains(Range r);
-        bool  IsBefore(Range r);
-        bool  IsAfter(Range r);
-        Range Union(Range r);
-        Range Difference(Range r);
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/socket.cpp b/tools/sci/org.eclipse.ptp.sci/common/socket.cpp
deleted file mode 100644
index 2e009dc..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/socket.cpp
+++ /dev/null
@@ -1,347 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Socket, SocketException
-
- Description: Socket manipulation.
-   
- Author: Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-
-****************************************************************************/
-
-#include "socket.hpp"
-#include <assert.h>
-#include <errno.h>
-#include <string.h>
-#include <sys/socket.h>
-#include <netinet/tcp.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <stdlib.h>
-
-#include "ipconverter.hpp"
-
-Socket::Socket(int sockfd)
-    : socket(sockfd)
-{
-}
-
-Socket::~Socket()
-{
-    close(BOTH);
-    ::close(socket);
-}
-
-int Socket::setMode(bool mode)
-{
-    int flags, newflags;
-
-    flags = ::fcntl(socket, F_GETFL);
-    if (flags < 0)
-        throw SocketException(SocketException::NET_ERR_FCNTL, errno);
-
-    if (mode)
-        newflags = flags & ~O_NONBLOCK;
-    else
-        newflags = flags | O_NONBLOCK;
-
-    if (newflags != flags) {
-        if (::fcntl(socket, F_SETFL, newflags) < 0) {
-            throw SocketException(SocketException::NET_ERR_FCNTL, errno);
-        }
-    }
-    
-    return 0;
-}
-
-int Socket::setFd(int fd)
-{
-    socket = fd;
-
-    return 0;
-}
-
-int Socket::listen(int &port)
-{
-    int sockfd;
-    int yes;
-    struct addrinfo hints, *host, *ressave;
-    char service[NI_MAXSERV] = {0};
-
-    ::memset(&hints, 0, sizeof(struct addrinfo));
-    hints.ai_flags = AI_PASSIVE;
-    hints.ai_family = AF_UNSPEC;
-    hints.ai_socktype = SOCK_STREAM;
-    ::sprintf(service, "%d", port);
-    ::getaddrinfo(NULL, service, &hints, &host);
-    ressave = host;
-
-    bool binded = false;
-    while (host) {
-        sockfd = ::socket(host->ai_family, host->ai_socktype, host->ai_protocol);
-        yes = 1;
-        ::setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
-
-        if (sockfd >= 0) {
-            int rc = ::bind(sockfd, host->ai_addr, host->ai_addrlen);
-            if (rc == 0) {
-                struct sockaddr_storage sockaddr;
-                socklen_t len = sizeof(sockaddr);
-
-                ::getsockname(sockfd, (struct sockaddr *)&sockaddr, &len);
-                ::getnameinfo((struct sockaddr *)&sockaddr, len, NULL, 0,
-                        service, sizeof(service), NI_NUMERICSERV);
-                port = ::atoi(service);
-
-                binded = true;
-                break;
-            }
-        }
-        host = host->ai_next;
-    }
-
-    if (binded) {
-        ::listen(sockfd, SOMAXCONN);
-    } else {
-        throw SocketException(SocketException::NET_ERR_BIND, errno);
-    }
-    ::freeaddrinfo(ressave);
-
-    return sockfd;
-}
-
-int Socket::listen(int & port, const string & ifname)
-{
-    char service[NI_MAXSERV] = {0};
-    ::sprintf(service, "%d", port);
-    
-    int sockfd = ::socket(AF_INET, SOCK_STREAM, 0);
-    if (sockfd < 0) {
-        throw SocketException(SocketException::NET_ERR_SOCKET, errno);
-    }
-
-    int yes = 1;
-    ::setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
-
-    IPConverter converter;
-    struct sockaddr_in addr;
-    converter.getIP(ifname, true, &addr);
-
-    int rc = ::bind(sockfd, (struct sockaddr *)&addr, sizeof(addr));
-    if (rc == 0) {
-        struct sockaddr_storage sockaddr;
-        socklen_t len = sizeof(sockaddr);
-
-        ::getsockname(sockfd, (struct sockaddr *)&sockaddr, &len);
-        ::getnameinfo((struct sockaddr *)&sockaddr, len, NULL, 0,
-            service, sizeof(service), NI_NUMERICSERV);
-        port = ::atoi(service);
-    } else {
-        throw SocketException(SocketException::NET_ERR_BIND, errno);
-    }
-
-    ::listen(sockfd, SOMAXCONN);
-    return sockfd;
-}
-
-int Socket::connect(const char *hostName, in_port_t port)
-{
-    int rc = -1;
-    int sockfd, nodelay;
-    char service[NI_MAXSERV] = {0};
-    struct addrinfo hints = {0};
-    struct addrinfo *host = NULL;
-
-    ::sprintf(service, "%d", port);
-    hints.ai_family = AF_UNSPEC;
-    hints.ai_socktype = SOCK_STREAM;
-
-    ::getaddrinfo(hostName, service, &hints, &host);
-    if (!host) {
-        throw SocketException(SocketException::NET_ERR_GETADDRINFO, errno);
-    }
-
-    sockfd = ::socket(host->ai_family, host->ai_socktype, host->ai_protocol);
-    if (sockfd < 0) {
-        ::freeaddrinfo(host);
-        throw SocketException(SocketException::NET_ERR_SOCKET, errno);
-    }
-    nodelay = 1;
-    rc = ::setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char*)&nodelay, sizeof(nodelay));
-
-    rc = ::connect(sockfd, host->ai_addr, host->ai_addrlen);
-    if (rc < 0) {
-        ::freeaddrinfo(host);
-        throw SocketException(SocketException::NET_ERR_CONNECT, errno);
-    }
-    ::freeaddrinfo(host);
-    socket = sockfd;
-
-    return sockfd;
-}
-
-int Socket::accept(int sockfd)
-{
-    int client = -1;
-    int nodelay = 1;
-    struct sockaddr_storage sockaddr;
-    socklen_t  len = sizeof(sockaddr);
-
-    client = ::accept(sockfd, (struct sockaddr *)&sockaddr, &len);
-    if (client < 0) {
-        throw (SocketException(SocketException::NET_ERR_ACCEPT, errno));
-    }
-    ::setsockopt(client, IPPROTO_TCP, TCP_NODELAY, (char*)&nodelay, sizeof(nodelay));
-
-    return client;
-}
-
-int Socket::send(const char *buf, int len)
-{
-    int n;
-    char *pos = NULL;
-    int left;
-
-    pos = (char *) buf;
-    left = len;
-
-    while (left > 0) {
-        n = ::send(socket, pos, left, 0);
-        if (n < 0) {
-            if ((errno == EAGAIN) || (errno == EWOULDBLOCK) || (errno == EINTR)) {
-                continue;
-            } 
-            throw (SocketException(SocketException::NET_ERR_SEND, errno));
-        }
-        pos += n;
-        left -= n;
-    }
-
-    return 0;
-}
-
-int Socket::recv(char *buf, int len)
-{
-    int n;
-    int left;
-    char *pos;
-
-    pos = buf;
-    left    = len;
-
-    while (left > 0) {
-        n = ::recv(socket, pos, left, 0);
-        if (n < 0) {
-            if (errno == EINTR) {
-                continue;
-            }
-            if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) {
-                break;
-            }
-            throw (SocketException(SocketException::NET_ERR_RECV, errno));
-        } else if (n == 0) {
-            throw (SocketException(SocketException::NET_ERR_CLOSED));
-        }
-
-        pos += n;
-        left -= n;
-    }
-
-    return (len - left);
-}
-
-void Socket::close(Socket::DIRECTION how)
-{
-    if (socket < 0)
-        return;
-
-    switch (how) {
-        case READ:
-            ::shutdown(socket, SHUT_RD); 
-            break;
-        case WRITE:
-            ::shutdown(socket, SHUT_WR);
-            break;
-        case BOTH:
-            ::shutdown(socket, SHUT_RDWR);
-        default:
-            break;
-    }
-}
-
-SocketException::SocketException(int code) throw()
-    : errCode(code), errNum(0)
-{
-}
-
-SocketException::SocketException(int code, int num) throw()
-    : errCode(code), errNum(num)
-{
-}
-
-int SocketException::getErrCode() const throw()
-{
-    return errCode;
-}
-
-int SocketException::getErrNum() const throw()
-{
-    return errNum;
-}
-
-string & SocketException::getErrMsg() throw()
-{
-    switch (errCode) {
-        case NET_ERR_SOCKET:
-            errMsg = "Function ::socket()";
-            break;
-        case NET_ERR_CONNECT:
-            errMsg = "Function ::connect()";
-            break;
-        case NET_ERR_GETADDRINFO:
-            errMsg = "Function ::getaddrinfo()";
-            break;
-        case NET_ERR_SEND:
-            errMsg = "Function ::send()";
-            break;
-        case NET_ERR_RECV:
-            errMsg = "Function ::recv()";
-            break;
-        case NET_ERR_FCNTL:
-            errMsg = "Function ::fcntl()";
-            break;
-        case NET_ERR_CLOSED:
-            errMsg = "Function ::recv() connection was closed by peer";
-            break;
-        case NET_ERR_DATA:
-            errMsg = "Received unexpected data";
-            break;
-        case NET_ERR_BIND:
-            errMsg = "Function ::bind()";
-        default:
-            errMsg = "Unknown error";
-            break;
-    }
-
-    if (errNum != 0) {
-        errMsg += "; system error: ";
-        errMsg += ::strerror(errNum);
-    }
-
-    return errMsg;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/socket.hpp b/tools/sci/org.eclipse.ptp.sci/common/socket.hpp
deleted file mode 100644
index 394a3d7..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/socket.hpp
+++ /dev/null
@@ -1,97 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Socket, SocketException
-
- Description: Socket manipulation.
-   
- Author: Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _SOCKET_HPP
-#define _SOCKET_HPP
-
-#include <netdb.h>
-#include <netinet/in.h>
-#include <string>
-
-using namespace std;
-
-class Socket 
-{
-    public:
-        enum DIRECTION 
-        {
-            READ,
-            WRITE,
-            BOTH
-        };
-        
-    private:
-        int socket;
-
-    public:
-        Socket(int sockfd = -1);
-        ~Socket();
-
-        int setMode(bool mode); // blocking or non-blocking
-        int setFd(int fd);
-        
-        int listen(int &port);
-        int listen(int &port, const string &ifname);
-        int connect(const char *hostName, in_port_t port);
-        int accept(int sock);
-        int send(const char *buf, int len);
-        int recv(char *buf, int len);
-        void close(DIRECTION how);
-};
-
-class SocketException 
-{
-    public:
-        enum CODE 
-        {
-            NET_ERR_SOCKET = -101,  
-            NET_ERR_CONNECT = -102,    
-            NET_ERR_GETADDRINFO = -103,
-            NET_ERR_SEND = -104,
-            NET_ERR_RECV = -105,
-            NET_ERR_CLOSED = -106,
-            NET_ERR_INTR = -107,
-            NET_ERR_FCNTL = -108,
-            NET_ERR_ACCEPT = -109,
-            NET_ERR_DATA = -110,
-            NET_ERR_BIND = -111
-        };
-        
-    private:
-        int       errCode;
-        int       errNum;
-        string    errMsg;
-
-    public:
-        SocketException(int code) throw();
-        SocketException(int code, int num) throw();
-
-        int getErrCode() const throw();
-        int getErrNum() const throw();
-        string & getErrMsg() throw();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/stream.cpp b/tools/sci/org.eclipse.ptp.sci/common/stream.cpp
deleted file mode 100644
index 43d7703..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/stream.cpp
+++ /dev/null
@@ -1,263 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Stream
-
- Description: Data stream processing.
-   
- Author: Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-
-****************************************************************************/
-
-#include "stream.hpp"
-#include <string.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <arpa/inet.h>
-
-#include "socket.hpp"
-
-const int  BUFFER_SIZE = 4380;
-const char END_OF_LINE = '\n';
-
-void endl() {}
-
-Stream::Stream()
-    : socket(NULL)
-{
-    buffer = new char[BUFFER_SIZE];
-    cursor = buffer;
-    *cursor = '\0';
-
-    readActive = false;
-    writeActive = false;
-}
-
-Stream::~Stream()
-{
-    if (socket != NULL)
-        delete socket;
-    delete [] buffer;
-}
-
-int Stream::init(const char *nodeAddr, in_port_t port)
-{
-    socket = new Socket();
-   
-    if ((nodeAddr == NULL) || (port <= 0)) 
-        return -1;
-
-    socket->connect(nodeAddr, port);
-
-    readActive = true;
-    writeActive = true;
-    
-    return 0;
-}
-
-int Stream::init(int sockfd)
-{
-    socket = new Socket();
-    socket->setFd(sockfd);
-
-    readActive = true;
-    writeActive = true;
-    
-    return 0;
-}
-
-int Stream::setAsync()
-{
-    socket->setMode(false);
-    return 0;
-}
-
-void Stream::read(char *buf, int size)
-{
-    int n = 0;
-    int count = size;
-    char *p = buf;
-    
-    while (n < size) {
-        count = size - n;
-        n += socket->recv(p, count);
-        p = buf + n;
-    }
-}
-
-void Stream::write(const char *buf, int size)
-{
-    int len = size; // including '\0' at the end
-    int count = len;
-    char *p = (char *) buf;
-
-    while (len > 0) {
-        checkBuffer(len);
-        count = (len - BUFFER_SIZE) > 0 ? BUFFER_SIZE : len;
-        memcpy(cursor, p, count);
-        cursor += count;
-        p += count;
-        len -= count;
-    }
-}
-
-void Stream::stop()
-{
-    stopRead();
-    stopWrite();
-}
-
-void Stream::stopRead()
-{
-    if (readActive) {
-        readActive = false;
-        socket->close(Socket::READ);
-    }
-}
-
-void Stream::stopWrite()
-{
-    if (writeActive) {
-        writeActive = false;
-        socket->close(Socket::WRITE);
-    }
-}
-
-bool Stream::isReadActive()
-{
-    return readActive;
-}
-
-bool Stream::isWriteActive()
-{
-    return writeActive;
-}
-
-Stream & Stream::flush()
-{
-    socket->send(buffer, cursor - buffer);
-    cursor = buffer;
-
-    return *this;
-}
-
-Stream & Stream::operator >> (char &value) 
-{
-    read(&value, sizeof(value));
-
-    return *this;
-}
-
-Stream & Stream::operator >> (int &value)
-{
-    read((char *)&value, sizeof(value));
-    value = ntohl(value);
-    
-    return *this;
-}
-
-Stream & Stream::operator >> (char *value)
-{
-    int len;
-    *this >> len;
-    len = ntohl(len);
-    read(value, len);
-    
-    return *this;
-}
-
-Stream & Stream::operator >> (string &value)
-{
-    int len;
-    *this >> len;
-    len = ntohl(len);
-    
-    char *buf = new char[len];
-    read(buf, len);
-    value = buf;
-    delete [] buf;
-   
-    return *this;
-}
-
-Stream & Stream::operator >> (EndOfLine)
-{
-    char value;
-    *this >> value;
-    if (value != END_OF_LINE)
-        throw SocketException(SocketException::NET_ERR_DATA);
-   
-    return *this;
-}
-
-Stream & Stream::operator << (char value)
-{
-    checkBuffer(sizeof(value));
-    *cursor = value;
-    cursor += sizeof(value);
-   
-    return *this;
-}
-
-Stream & Stream::operator << (int value)
-{
-    checkBuffer(sizeof(value));
-    *(int *)cursor = htonl(value);
-    cursor += sizeof(value);
-   
-    return *this;
-}
-
-Stream & Stream::operator << (const char *value)
-{
-    int len = ::strlen(value) + 1; // including '\0' at the end
-    int tmp = htonl(len);
-    *this << tmp;
-
-    int count = len;
-    char *p = (char *)value;
-    while (len > 0) {
-        checkBuffer(len);
-        count = (len - BUFFER_SIZE) > 0 ? BUFFER_SIZE : len;
-        ::memcpy(cursor, p, count);
-        cursor += count;
-        p += count;
-        len -= count;
-    }
-    
-    return *this;
-}
-
-Stream & Stream::operator << (const string &value)
-{
-    *this << value.c_str();
-
-    return *this;
-}
-
-Stream & Stream::operator << (EndOfLine)
-{
-    *this << END_OF_LINE;
-
-    return flush();
-}
-
-void Stream::checkBuffer(int size)
-{
-    if ((cursor - buffer + size) >= BUFFER_SIZE)
-        flush();
-}
diff --git a/tools/sci/org.eclipse.ptp.sci/common/stream.hpp b/tools/sci/org.eclipse.ptp.sci/common/stream.hpp
deleted file mode 100644
index 582d733..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/stream.hpp
+++ /dev/null
@@ -1,85 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Stream
-
- Description: Data stream processing.
-   
- Author: Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _STREAM_HPP
-#define _STREAM_HPP
-
-#include <netdb.h>
-#include <netinet/in.h>
-#include <string>
-
-using namespace std;
-
-typedef void (EndOfLine)();
-void endl();
-
-class Socket;
-
-class Stream 
-{
-    private:
-        Socket       *socket;
-        char         *buffer;
-        char         *cursor;
-
-        bool         readActive;
-        bool         writeActive;
-        static long long    thresHold;
-
-    public:
-        Stream();
-        ~Stream();
-
-        int init(const char *nodeAddr, in_port_t port);
-        int init(int sockfd);
-        int setAsync();
-
-        void read(char *buf, int size);
-        void write(const char *buf, int size);
-        void stop();
-        void stopRead();
-        void stopWrite();
-        bool isReadActive();
-        bool isWriteActive();
-        Stream & flush();
-
-        Stream & operator >> (char &value);
-        Stream & operator >> (int &value);
-        Stream & operator >> (char *value);
-        Stream & operator >> (string &value);
-        Stream & operator >> (EndOfLine);
-        
-        Stream & operator << (char value);
-        Stream & operator << (int value);
-        Stream & operator << (const char *value);
-        Stream & operator << (const string &value);
-        Stream & operator << (EndOfLine);
-
-    private:
-        void checkBuffer(int size);
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/thread.cpp b/tools/sci/org.eclipse.ptp.sci/common/thread.cpp
deleted file mode 100644
index 65a3f73..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/thread.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Thread, ThreadException
-
- Description: Thread manipulation.
-   
- Author: Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-
-****************************************************************************/
-
-#include "thread.hpp"
-#include <assert.h>
-#include <string.h>
-
-using namespace std;
-
-void* init(void * pthis)
-{
-    Thread *p = (Thread *) pthis;
-    pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
-    pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
-    p->setState(true);
-    p->run();
-
-    return 0;
-}
-
-Thread::Thread(int hndl)
-    : handle(hndl), launched(false), running(false)
-{
-}
-
-Thread::~Thread() 
-{
-}
-
-void Thread::start()
-{
-    if (!launched) {
-        if (pthread_create(&(thread), NULL, init, this) == 0) {
-            launched = true;
-        } else {
-            running = false;
-            throw ThreadException(ThreadException::ERR_CREATE);
-        }
-    } else {
-        throw ThreadException(ThreadException::ERR_LAUNCH);
-    }
-}
-
-void Thread::join()
-{
-    if (!launched)
-        return;
-    
-    pthread_join(thread, NULL);
-    running = false;
-}
-
-void Thread::detach()
-{
-    if (launched) {
-        pthread_detach(thread);
-    } else {
-        throw ThreadException(ThreadException::ERR_DETACH);
-    }
-}
-
-void Thread::cancel()
-{
-    pthread_cancel(thread);
-}
-
-ThreadException::ThreadException(int code) throw()
-    : errCode(code)
-{
-}
-
-int ThreadException::getErrCode() const throw()
-{
-    return errCode;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/thread.hpp b/tools/sci/org.eclipse.ptp.sci/common/thread.hpp
deleted file mode 100644
index c9479b5..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/thread.hpp
+++ /dev/null
@@ -1,84 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Thread, ThreadException
-
- Description: Thread manipulation.
-   
- Author: Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _THREAD_HPP
-#define _THREAD_HPP
-
-#include <pthread.h>
-
-#include <string>
-#include <vector>
-
-using namespace std;
-
-class Thread 
-{
-    protected :
-        int          handle;
-        bool         launched;
-        bool         running;
-        pthread_t    thread;
-
-    public :
-        Thread(int hndl = 0);
-        virtual ~Thread();
-
-        void start();
-        void join();
-        void detach();
-        void cancel();
-        virtual void run() = 0;
-        
-        bool isLaunched() { return launched; }
-        bool getState() { return running; }
-        void setState(bool state) { running = state; }
-};
-
-class ThreadException
-{
-    public:
-        enum CODE
-        {
-            ERR_CREATE,
-            ERR_LAUNCH,
-            ERR_END,
-            ERR_PRIO,
-            ERR_LOCK,
-            ERR_UNLOCK,
-            ERR_SLEEP,
-            ERR_DETACH
-        };
-        
-    private:
-        int         errCode;
-
-    public:
-        ThreadException(int code) throw();
-
-        int getErrCode() const throw();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/tools.cpp b/tools/sci/org.eclipse.ptp.sci/common/tools.cpp
deleted file mode 100644
index 6fd23ad..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/tools.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Tool functions.
-   
- Author: Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#include "tools.hpp"
-#include <ctype.h>
-#include <fcntl.h>
-#include <signal.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <netdb.h>                                                              
-#include <netinet/in.h>                                                         
-#include <sys/socket.h>   
-#include <string.h>
-#include <sys/param.h>
-#include <sys/time.h> 
-#include <dlfcn.h>
-
-#include "exception.hpp"
-
-string SysUtil::itoa(int value)
-{
-    static char buffer[32];
-    sprintf(buffer, "%d", value);
-    return string(buffer);
-}
-
-double SysUtil::microseconds()
-{
-    struct timeval time_v;
-    ::gettimeofday(&time_v, NULL);
-    return time_v.tv_sec * 1e6 + time_v.tv_usec;
-}
-
-void SysUtil::sleep(int nsecs)
-{
-    struct timespec req;
-    req.tv_sec = nsecs / 1000000;
-    req.tv_nsec = (nsecs % 1000000) * 1000;
-    ::nanosleep (&req, NULL);
-}
-
-string SysUtil::get_hostname(const char * name)
-{
-    string uniquestring;
-    
-    struct addrinfo hints, *host = NULL, *ressave = NULL;
-    memset(&hints, 0, sizeof(struct addrinfo));
-    hints.ai_flags = AI_CANONNAME;
-    hints.ai_family = AF_UNSPEC;
-    hints.ai_socktype = SOCK_STREAM;
-    int rc = ::getaddrinfo(name, NULL, &hints, &host);
-    if (rc < 0)
-        throw Exception(Exception::GET_ADDR_INFO);
-    ressave = host;
-    uniquestring = string(host->ai_canonname);
-    ::freeaddrinfo(ressave);
-
-    return uniquestring;
-}
-
-char* SysUtil::get_path_name(const char *program)
-{
-    static char path[MAXPATHLEN];
-    sprintf(path, "which %s", program);
-    FILE *fp = popen(path, "r");
-    if (!fp)
-        return NULL;
-    path[0] = '\0';
-    fscanf(fp, "%s", path);
-    pclose(fp);
-    if (!path[0]){
-        return NULL;
-    }
-    if (path[0] == '.' && path[1] == '/') {
-        char save_path[MAXPATHLEN];
-        strcpy(save_path, path);
-        strcpy(path, getenv("PWD"));
-        strcat(path, save_path + 1);
-    }
-    return path;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/common/tools.hpp b/tools/sci/org.eclipse.ptp.sci/common/tools.hpp
deleted file mode 100644
index 12980ae..0000000
--- a/tools/sci/org.eclipse.ptp.sci/common/tools.hpp
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Tool functions.
-   
- Author: Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _TOOLS_HPP
-#define _TOOLS_HPP
-
-#include <string>
-#include <vector>
-
-using namespace std;
-
-class SysUtil 
-{       
-    public:
-        static string itoa(int value);
-        static double microseconds();
-        static void sleep(int nsecs);
-
-        static string get_hostname(const char *name);
-        static char * get_path_name(const char *program);
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/include/Makefile b/tools/sci/org.eclipse.ptp.sci/include/Makefile
deleted file mode 100644
index dbbb5ab..0000000
--- a/tools/sci/org.eclipse.ptp.sci/include/Makefile
+++ /dev/null
@@ -1,7 +0,0 @@
-include ../makefile.define
-
-install: sci.h
-	cp sci.h /opt/sci/include
-	ln -sf $(INC_DIR)/sci.h /usr/include/sci.h
-
-clean:
diff --git a/tools/sci/org.eclipse.ptp.sci/include/sci.h b/tools/sci/org.eclipse.ptp.sci/include/sci.h
deleted file mode 100644
index 30f787d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/include/sci.h
+++ /dev/null
@@ -1,211 +0,0 @@
-#ifndef _SCI_H
-#define _SCI_H
-/***************************************************************************
-"%Z% %I% %W% %D% %T%\0"
- Name: sci.h
-
- Description:
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
-***************************************************************************/
-
-/*
-** SCI Return/Error Codes
-*/
-#define SCI_SUCCESS                  (0)
-#define SCI_ERR_INVALID_HOSTFILE     (-2001)
-#define SCI_ERR_INVALID_ENDTYPE      (-2002)   
-#define SCI_ERR_INITIALIZE_FAILED    (-2003)
-#define SCI_ERR_INVALID_CALLER       (-2004)
-#define SCI_ERR_GROUP_NOTFOUND       (-2005)
-#define SCI_ERR_FILTER_NOTFOUND      (-2006)
-#define SCI_ERR_INVALID_FILTER       (-2007)
-#define SCI_ERR_BACKEND_NOTFOUND     (-2008)
-#define SCI_ERR_UNKNOWN_INFO         (-2009)
-#define SCI_ERR_UNINTIALIZED         (-2010)
-#define SCI_ERR_GROUP_PREDEFINED     (-2011)
-#define SCI_ERR_GROUP_EMPTY          (-2012)
-#define SCI_ERR_INVALID_OPERATOR     (-2013)
-#define SCI_ERR_FILTER_PREDEFINED    (-2014)
-#define SCI_ERR_POLL_TIMEOUT         (-2015)
-#define SCI_ERR_INVALID_JOBKEY       (-2016)
-#define SCI_ERR_MODE                 (-2017)
-#define SCI_ERR_FILTER_ID            (-2018)
-#define SCI_ERR_INVALID_SUCCESSOR    (-2019)
-#define SCI_ERR_BACKEND_EXISTED      (-2020)
-#define SCI_ERR_NO_MEM               (-2021)
-#define SCI_ERR_LAUNCH_FAILED        (-2022)
-#define SCI_ERR_POLL_INVALID         (-2023)
-
-#define SCI_ERR_PARENT_BROKEN        (-5000)
-#define SCI_ERR_CHILD_BROKEN         (-5001)
-#define SCI_ERR_RECOVERED            (-5002)
-#define SCI_ERR_RECOVER_FAILED       (-5003)
-
-/*
-** SCI Structures and typedefs
-*/
-typedef int sci_group_t;
-
-/*
-** SCI Bcast & Upload message handler
-*/
-typedef int (SCI_msg_hndlr)(void *user_param, sci_group_t group, void *buf, int size);
-
-/*
-** SCI Error message handler
-*/
-typedef int (SCI_err_hndlr)(int err_code, int node_id, int num_bes);
-
-/*
-** SCI Filter message handler
-*/
-typedef int (filter_init_hndlr)(void **user_param);
-typedef int (filter_input_hndlr)(void *user_param, sci_group_t group, void *buf, int size);
-typedef int (filter_term_hndlr)(void *user_param);
-
-/*
-** SCI Predefined groups
-*/
-#define SCI_GROUP_ALL -1
-
-/*
-** SCI Predefined filter IDs
-*/
-#define SCI_FILTER_NULL -1
-
-#pragma enum (int)
-typedef enum {
-    SCI_FRONT_END,
-    SCI_BACK_END
-} sci_end_type_t;
-
-typedef enum {
-    SCI_INTERRUPT,
-    SCI_POLLING
-} sci_mode_t;
-#pragma enum (pop)
-
-typedef struct {
-    sci_end_type_t   type;
-    sci_mode_t       mode;
-    SCI_msg_hndlr    *hndlr;
-    void             *param;
-    SCI_err_hndlr    *err_hndlr;
-    char             *hostfile;
-    char             *bepath;
-    char             **beenvp;
-    char             reserve[64];
-} sci_fe_info_t;
-
-typedef struct {
-    sci_end_type_t   type;
-    sci_mode_t       mode;
-    SCI_msg_hndlr    *hndlr;
-    void             *param;
-    SCI_err_hndlr    *err_hndlr;
-    char             reserve[64];
-} sci_be_info_t;
-
-typedef union {
-    sci_end_type_t   type;
-    sci_fe_info_t    fe_info;
-    sci_be_info_t    be_info;
-} sci_info_t;
-
-typedef struct {
-    int              filter_id;
-    char             *so_file;
-} sci_filter_info_t;
-
-typedef struct {
-    int              id;
-    char             *hostname;
-} sci_be_t;
-
-typedef enum {
-    JOB_KEY,
-    NUM_BACKENDS,
-    BACKEND_ID,
-    POLLING_FD,
-    NUM_FILTERS,
-    FILTER_IDLIST,
-    AGENT_ID,
-    NUM_SUCCESSORS,
-    SUCCESSOR_IDLIST,
-    HEALTH_STATUS
-} sci_query_t;
-
-typedef enum {
-    GROUP_MEMBER_NUM,
-    GROUP_MEMBER,
-    GROUP_SUCCESSOR_NUM,
-    GROUP_SUCCESSOR
-} sci_group_query_t;
-
-typedef enum {
-    SCI_UNION,
-    SCI_INTERSECTION,
-    SCI_DIFFERENCE
-} sci_op_t;
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-/*
-***************************************************************
-****************** SCI C Externalized API's ******************
-***************************************************************
-*/
-/*
-** SCI Environment setup/terminate/query functions.
-*/
-int SCI_Initialize(sci_info_t *info);
-int SCI_Terminate();
-int SCI_Query(sci_query_t query, void *ret_val);
-
-/*
-** SCI Communication functions.
-*/
-int SCI_Bcast(int filter_id, sci_group_t group, int num_bufs, void *bufs[], int sizes[]);
-int SCI_Upload(int filter_id, sci_group_t group, int num_bufs, void *bufs[], int sizes[]);
-int SCI_Poll(int timeout);
-
-/*
-** SCI Group manipulation functions.
-*/
-int SCI_Group_create(int num_bes, int *be_list, sci_group_t *group);
-int SCI_Group_free(sci_group_t group);
-int SCI_Group_operate(sci_group_t group1, sci_group_t group2,
-        sci_op_t op, sci_group_t *newgroup);
-int SCI_Group_operate_ext(sci_group_t group, int num_bes, int *be_list, 
-        sci_op_t op, sci_group_t *newgroup);
-int SCI_Group_query(sci_group_t group, sci_group_query_t query, void *ret_val);
-
-/*
-** SCI Filter related functions.
-*/
-int SCI_Filter_load(sci_filter_info_t *filter_info); 
-int SCI_Filter_unload(int filter_id);
-int SCI_Filter_bcast(int filter_id, int num_successors, int *successor_list, int num_bufs,
-        void *bufs[], int sizes[]);
-int SCI_Filter_upload(int filter_id, sci_group_t group, int num_bufs, void *bufs[], int sizes[]);
-
-/*
-** SCI Dynamic add/remove back end.
-*/
-int SCI_BE_add(sci_be_t *be);
-int SCI_BE_remove(int be_id);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/Makefile b/tools/sci/org.eclipse.ptp.sci/libsci/Makefile
deleted file mode 100644
index f3f283d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/Makefile
+++ /dev/null
@@ -1,51 +0,0 @@
-include ../makefile.define
-
-ifeq ($(OS), AIX)
-    CPPFLAGS = $(MY_FLAGS) -I../libsci -qmkshrobj
-    LIBRARY = libsci_r.o
-    LIBRARY64 = libsci64_r.o
-else
-    CPPFLAGS = $(MY_FLAGS) -I../libsci -fPIC -shared
-    ifeq ($(ARCH), i686)
-        LIBRARY = libsci.so.32
-        LIBRARY64 = 
-    else
-        LIBRARY = libsci.so.32
-        LIBRARY64 = libsci.so.64
-    endif
-endif
-
-all : $(LIBRARY) $(LIBRARY64)
-
-$(LIBRARY) : $(OBJS) ../common/libcmn.a
-	@$(CC32) $(CPPFLAGS) -o $(LIBRARY) $(OBJS) -L../common -lcmn -lrt
-ifeq ($(OS), AIX)
-	rm -f libsci_r.a
-	@$(AR) $(ARFLAGS) libsci_r.a $(LIBRARY)
-endif
-
-$(LIBRARY64) : $(OBJS64) ../common/libcmn64.a
-	@$(CC64) $(CPPFLAGS) -o $(LIBRARY64) $(OBJS64) -L../common -lcmn64 -lrt 
-ifeq ($(OS), AIX)
-	@$(AR) $(AR64FLAGS) libsci_r.a $(LIBRARY64)
-endif
-
-install : $(LIBRARY) $(LIBRARY64)
-ifeq ($(OS), AIX)
-	cp -p libsci_r.a $(LIB_DIR)
-	chmod 755 $(LIB_DIR)/libsci_r.a
-	ln -sf $(LIB_DIR)/libsci_r.a /usr/lib/libsci_r.a
-else
-	cp -p $(LIBRARY) $(LIB_DIR)
-	chmod 775 $(LIB_DIR)/$(LIBRARY)
-	ln -sf $(LIB_DIR)/$(LIBRARY) /usr/lib/libsci.so
-ifneq ($(ARCH), i686)
-	cp -p $(LIBRARY64) $(LIB_DIR)
-	chmod 775 $(LIB_DIR)/$(LIBRARY64)
-	ln -sf $(LIB_DIR)/$(LIBRARY64) /usr/lib64/libsci.so
-endif
-endif
-
-clean :
-	rm -f $(LIBRARY) $(LIBRARY64) libsci_r.a $(OBJS) $(OBJS64) core *.d
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/allocator.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/allocator.cpp
deleted file mode 100644
index ed34b05..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/allocator.cpp
+++ /dev/null
@@ -1,67 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Allocator
-
- Description: Allocate global resources.
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   03/03/09 nieyy         Initial code (D153875)
-
-****************************************************************************/
-
-#include "allocator.hpp"
-#include <assert.h>
-
-#include "atomic.hpp"
-#include "topology.hpp"
-#include "ctrlblock.hpp"
-
-Allocator * Allocator::instance = NULL;
-
-Allocator::Allocator()
-{
-}
-
-Allocator::~Allocator()
-{
-}
-
-void Allocator::reset()
-{
-    nextGroupID = SCI_GROUP_ALL - 1;
-    nextBEID = gCtrlBlock->getTopology()->getBENum();
-}
-
-Allocator * Allocator::getInstance()
-{
-    if (instance == NULL)
-        instance = new Allocator();
-    return instance;
-}
-
-void Allocator::allocateGroup(sci_group_t * group)
-{
-    assert(group);
-    *group = fetch_and_add(&nextGroupID, -1);
-}
-
-void Allocator::allocateBE(int * be_id)
-{
-    assert(be_id);
-    *be_id = fetch_and_add(&nextBEID, 1);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/allocator.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/allocator.hpp
deleted file mode 100644
index 36bc1b0..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/allocator.hpp
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Allocator
-
- Description: Allocate global resources.
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   03/03/09 nieyy         Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _ALLOCATOR_HPP
-#define _ALLOCATOR_HPP
-
-#include "sci.h"
-
-class Allocator 
-{
-    private:
-        int             nextGroupID;
-        int             nextBEID;
-        
-        Allocator();
-        static Allocator *instance;
-        
-    public:
-        ~Allocator();
-        static Allocator *getInstance();
-
-        void reset();
-
-        void allocateGroup(sci_group_t *group);
-        void allocateBE(int *be_id);
-};
-
-#define gAllocator Allocator::getInstance()
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/api.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/api.cpp
deleted file mode 100644
index 19c2589..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/api.cpp
+++ /dev/null
@@ -1,708 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: SCI APIs.
-   
- Author: Liu Wei, Nicole Nie, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 lwbjcdl      Initial code (D153875)
-
-****************************************************************************/
-
-#include <assert.h>
-#include <stdlib.h>
-#include <math.h>
-#include <string.h>
-#include <vector>
-
-#include "sci.h"
-
-#include "tools.hpp"
-#include "log.hpp"
-#include "envvar.hpp"
-#include "packer.hpp"
-
-#include "general.hpp"
-
-#include "message.hpp"
-#include "queue.hpp"
-#include "topology.hpp"
-#include "ctrlblock.hpp"
-#include "routinglist.hpp"
-#include "eventntf.hpp"
-#include "initializer.hpp"
-#include "observer.hpp"
-#include "filter.hpp"
-#include "filterlist.hpp"
-#include "filterproc.hpp"
-#include "routerproc.hpp"
-#include "statemachine.hpp"
-#include "allocator.hpp"
-
-SCI_msg_hndlr *gHndlr = NULL;
-void *gParam = NULL;
-
-// Initialization & Termination
-
-int SCI_Initialize(sci_info_t *info)
-{
-    if (gCtrlBlock->getMyRole() != CtrlBlock::INVALID) {
-        log_warn("Has already been initialized");
-        return SCI_SUCCESS;
-    }
-
-    int hndl = -1;
-    char *envp = ::getenv("SCI_CLIENT_ID");
-    if (envp != NULL) {
-        hndl = ::atoi(envp);
-    }
-
-    int rc;
-
-    try {
-        if (info != NULL) {
-            switch (info->type) {
-                case SCI_FRONT_END:
-                    hndl = -1;
-                    rc = gCtrlBlock->initFE(-1, info);
-                    gHndlr = info->fe_info.hndlr;
-                    gParam = info->fe_info.param;
-                    break;
-                case SCI_BACK_END:
-                    rc = gCtrlBlock->initBE(hndl, info);
-                    gHndlr = info->be_info.hndlr;
-                    gParam = info->be_info.param;
-                    break;
-                default:
-                    rc = SCI_ERR_INVALID_ENDTYPE;
-            }
-        } else {
-            rc = gCtrlBlock->initAgent(hndl);
-        }
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-
-    if (rc != SCI_SUCCESS) {
-        return rc;
-    }
-
-    return gInitializer->init(hndl);
-}
-
-int SCI_Terminate()
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-
-    try {
-        if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-            Message *msg = new Message();
-            msg->build(SCI_FILTER_NULL, SCI_GROUP_ALL, 0, NULL, NULL, Message::QUIT);
-            gCtrlBlock->getRouterInQueue()->produce(msg);
-        }
-        gCtrlBlock->term();
-
-        delete gRoutingList;
-        delete gFilterList;
-        delete gNotifier;
-        delete gInitializer;
-        delete gStateMachine;
-        delete gCtrlBlock;
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-
-    return SCI_SUCCESS;
-}
-
-
-// Information Query
-
-
-int SCI_Query(sci_query_t query, void *ret_val)
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if(NULL == ret_val) 
-        return SCI_ERR_UNKNOWN_INFO;
-
-    int *p = (int *) ret_val;
-    switch (query) 
-    {
-        case JOB_KEY:
-            *p = gCtrlBlock->getJobKey();
-            break;
-        case NUM_BACKENDS:
-            if(gCtrlBlock->getMyRole() == CtrlBlock::BACK_END) 
-                return SCI_ERR_INVALID_CALLER;
-            *p = gCtrlBlock->getTopology()->getBENum();
-            break;
-        case BACKEND_ID:
-            if(gCtrlBlock->getMyRole() != CtrlBlock::BACK_END) 
-                return SCI_ERR_INVALID_CALLER;
-            *p = gCtrlBlock->getMyHandle();
-            break;
-        case POLLING_FD:
-            if (gCtrlBlock->getMyRole() == CtrlBlock::AGENT)
-                return SCI_ERR_INVALID_CALLER;
-            if (!gCtrlBlock->getObserver())
-                return SCI_ERR_MODE;
-            else
-                *p = gCtrlBlock->getObserver()->getPollFd();
-            break;
-        case NUM_FILTERS:
-            *p = gFilterList->numOfFilters();
-            break;
-        case FILTER_IDLIST:
-            gFilterList->retrieveFilterList(p);
-            break;
-        case AGENT_ID:
-            if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_END) 
-                return SCI_ERR_INVALID_CALLER;
-            *p = gCtrlBlock->getMyHandle();
-            break;
-        case NUM_SUCCESSORS:
-            if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_END)
-                return SCI_ERR_INVALID_CALLER;
-            *p = gRoutingList->numOfSuccessor(SCI_GROUP_ALL);
-            break;
-        case SUCCESSOR_IDLIST:
-            if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_END)
-                return SCI_ERR_INVALID_CALLER;
-            gRoutingList->retrieveSuccessorList(SCI_GROUP_ALL, p);
-            break;
-        case HEALTH_STATUS:
-            if (gCtrlBlock->isEnabled()) {
-                *p = 0; // 0 - normal
-            } else {
-                *p = 1; // 1 - exited
-            }
-            break;
-        default:
-            return SCI_ERR_UNKNOWN_INFO;
-    }
-
-    return SCI_SUCCESS;
-}
-
-
-// Communication
-
-int SCI_Bcast(int filter_id, sci_group_t group, int num_bufs, void *bufs[], int sizes[])
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() != CtrlBlock::FRONT_END)
-        return SCI_ERR_INVALID_CALLER;
-
-    if (group > SCI_GROUP_ALL) {
-        if (!gCtrlBlock->getTopology()->hasBE((int)group))
-            return SCI_ERR_GROUP_NOTFOUND;
-    } else {
-        if (!gRoutingList->isGroupExist(group))
-            return SCI_ERR_GROUP_NOTFOUND;
-    }
-
-    try {
-        Message *msg = new Message();
-        msg->build(filter_id, group, num_bufs, (char **)bufs, sizes, Message::COMMAND);
-        log_debug("Produced a message bcast command, message group=%d, message size=%d",
-            (int) group, msg->getContentLen());
-        gCtrlBlock->getRouterInQueue()->produce(msg);
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-  
-    return SCI_SUCCESS;
-}
-
-int SCI_Upload(int filter_id, sci_group_t group, int num_bufs, void *bufs[], int sizes[])
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() != CtrlBlock::BACK_END)
-        return SCI_ERR_INVALID_CALLER;
-
-    try {
-        Message *msg = new Message();
-        msg->build(filter_id, group, num_bufs, (char **)bufs, sizes, Message::DATA);
-        gCtrlBlock->getUpQueue()->produce(msg);
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-
-    return SCI_SUCCESS;
-}
-
-int SCI_Poll(int timeout)
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() == CtrlBlock::AGENT)
-        return SCI_ERR_INVALID_CALLER;
-
-    sci_mode_t mode;
-    if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END)
-        mode = gCtrlBlock->getEndInfo()->fe_info.mode;
-    else
-        mode = gCtrlBlock->getEndInfo()->be_info.mode;
-    if (mode != SCI_POLLING)
-        return SCI_ERR_MODE;
-
-    if (gCtrlBlock->getPollQueue()->getSize() == 0) {
-        // no messages in the polling queue
-        if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-            if (gStateMachine->getState() == StateMachine::IDLING) {
-                return SCI_ERR_POLL_INVALID;
-            }
-        } else {
-            if (gStateMachine->getState() == StateMachine::EXITING) {
-                return SCI_ERR_POLL_INVALID;
-            }
-        }
-    }
-
-    int rc = SCI_SUCCESS;
-    Message *msg = gCtrlBlock->getPollQueue()->consume(timeout);
-    if (msg) {
-        switch(msg->getType()) {
-            case Message::COMMAND:
-            case Message::DATA:
-                try {
-                    gHndlr(gParam, msg->getGroup(), msg->getContentBuf(), msg->getContentLen());
-                } catch (...) {
-                    gStateMachine->parse(StateMachine::FATAL_EXCEPTION);
-                }
-
-                gCtrlBlock->getObserver()->unnotify();
-                break;
-            case Message::INVALID_POLL:
-                rc = SCI_ERR_POLL_INVALID;
-                gCtrlBlock->getObserver()->unnotify();
-                break;
-            default:
-                log_error("SCI_Poll: received unknown command");
-                break;
-        }
-
-        gCtrlBlock->getPollQueue()->remove();
-    } else {
-        rc = SCI_ERR_POLL_TIMEOUT;
-    }
-
-    return rc;
-}
-
-// Group
-
-int SCI_Group_create(int num_bes, int * be_list, sci_group_t * group)
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() != CtrlBlock::FRONT_END)
-        return SCI_ERR_INVALID_CALLER;
-
-    assert(be_list);
-    for (int i=0; i<num_bes; i++) {
-        if (!gCtrlBlock->getTopology()->hasBE(be_list[i]))
-            return SCI_ERR_BACKEND_NOTFOUND;
-    }
-
-    int msgID;
-    try {
-        Packer packer;
-        packer.packInt(num_bes);
-        for (int i=0; i<num_bes; i++) {
-            packer.packInt(be_list[i]);
-        }
-
-        char *bufs[1];
-        int sizes[1];
-
-        bufs[0] = packer.getPackedMsg();
-        sizes[0] = packer.getPackedMsgLen();
-        msgID = gNotifier->allocate();
-
-        Message *msg = new Message();
-        gAllocator->allocateGroup(group);
-        msg->build(SCI_FILTER_NULL, *group, 1, bufs, sizes, Message::GROUP_CREATE, msgID);
-        delete [] bufs[0];
-        gCtrlBlock->getRouterInQueue()->produce(msg);
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-    
-    int rc;
-    gNotifier->freeze(msgID, &rc);
-    return rc;
-}
-
-int SCI_Group_free(sci_group_t group)
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() != CtrlBlock::FRONT_END)
-        return SCI_ERR_INVALID_CALLER;
-
-    if (group>=SCI_GROUP_ALL)
-        return SCI_ERR_GROUP_PREDEFINED;
-
-    if (!gRoutingList->isGroupExist(group))
-        return SCI_ERR_GROUP_NOTFOUND;
-
-    int msgID;
-    try {
-        Message *msg = new Message();
-        msgID = gNotifier->allocate();
-        msg->build(SCI_FILTER_NULL, group, 0, NULL, NULL, Message::GROUP_FREE, msgID);
-        gCtrlBlock->getRouterInQueue()->produce(msg);
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-    
-    int rc;
-    gNotifier->freeze(msgID, &rc);
-    return rc;
-}
-
-int SCI_Group_operate(sci_group_t group1, sci_group_t group2,
-        sci_op_t op, sci_group_t *newgroup)
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() != CtrlBlock::FRONT_END)
-        return SCI_ERR_INVALID_CALLER;
-
-    if (!gRoutingList->isGroupExist(group1))
-        return SCI_ERR_GROUP_NOTFOUND;
-
-    if (!gRoutingList->isGroupExist(group2))
-        return SCI_ERR_GROUP_NOTFOUND;
-
-    if ((op!=SCI_UNION) && (op!=SCI_INTERSECTION) && (op!=SCI_DIFFERENCE))
-        return SCI_ERR_INVALID_OPERATOR;
-
-    int msgID;
-    try {
-        Packer packer;
-        packer.packInt((int) op);
-        packer.packInt((int) group1);
-        packer.packInt((int) group2);
-
-        char *bufs[1];
-        int sizes[1];
-
-        bufs[0] = packer.getPackedMsg();
-        sizes[0] = packer.getPackedMsgLen();
-        msgID = gNotifier->allocate();
-
-        Message *msg = new Message();
-        gAllocator->allocateGroup(newgroup);
-        msg->build(SCI_FILTER_NULL, *newgroup, 1, bufs, sizes, Message::GROUP_OPERATE, msgID);
-        delete [] bufs[0];
-        gCtrlBlock->getRouterInQueue()->produce(msg);
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-    
-    int rc;
-    gNotifier->freeze(msgID, &rc);
-    return rc;
-}
-
-int SCI_Group_operate_ext(sci_group_t group, int num_bes, int *be_list, 
-        sci_op_t op, sci_group_t *newgroup)
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() != CtrlBlock::FRONT_END)
-        return SCI_ERR_INVALID_CALLER;
-
-    if (!gRoutingList->isGroupExist(group))
-        return SCI_ERR_GROUP_NOTFOUND;
-
-    assert(be_list);
-    for (int i=0; i<num_bes; i++) {
-        if (!gCtrlBlock->getTopology()->hasBE(be_list[i]))
-            return SCI_ERR_BACKEND_NOTFOUND;
-    }
-
-    int msgID;
-    try {
-        Packer packer;
-        packer.packInt((int) op);
-        packer.packInt((int) group);
-        packer.packInt(num_bes);
-        for (int i=0; i<num_bes; i++) {
-            packer.packInt(be_list[i]);
-        }
-
-        char *bufs[1];
-        int sizes[1];
-
-        bufs[0] = packer.getPackedMsg();
-        sizes[0] = packer.getPackedMsgLen();
-        msgID = gNotifier->allocate();
-
-        Message *msg = new Message();
-        gAllocator->allocateGroup(newgroup);
-        msg->build(SCI_FILTER_NULL, *newgroup, 1, bufs, sizes, Message::GROUP_OPERATE_EXT, msgID);
-        delete [] bufs[0];
-        gCtrlBlock->getRouterInQueue()->produce(msg);
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-
-    int rc;
-    gNotifier->freeze(msgID, &rc);
-    return rc;
-}
-
-int SCI_Group_query(sci_group_t group, sci_group_query_t query, void *ret_val)
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_END)
-        return SCI_ERR_INVALID_CALLER;
-
-    if (!gRoutingList->isGroupExist(group))
-        return SCI_ERR_GROUP_NOTFOUND;
-
-    switch(query) 
-    {
-        case GROUP_MEMBER_NUM:
-            *((int *) ret_val) = gRoutingList->numOfBE(group);
-            break;
-        case GROUP_MEMBER:
-            gRoutingList->retrieveBEList(group, (int *) ret_val);
-            break;
-        case GROUP_SUCCESSOR_NUM:
-            *((int *) ret_val) = gRoutingList->numOfSuccessor(group);
-            break;
-        case GROUP_SUCCESSOR:
-            gRoutingList->retrieveSuccessorList(group, (int *) ret_val);
-            break;
-        default:
-            return SCI_ERR_UNKNOWN_INFO;
-    }
-    
-    return SCI_SUCCESS;
-}
-
-
-// Filter
-
-int SCI_Filter_load(sci_filter_info_t *filter_info) 
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() != CtrlBlock::FRONT_END)
-        return SCI_ERR_INVALID_CALLER;
-
-    assert(filter_info);
-    if (filter_info->filter_id == SCI_FILTER_NULL)
-        return SCI_ERR_FILTER_PREDEFINED;
-
-    if (filter_info->filter_id < SCI_FILTER_NULL)
-        return SCI_ERR_FILTER_ID;
-
-    int msgID;
-    try {
-        Filter *filter = new Filter(*filter_info);
-        Message *msg = filter->packMsg();
-        msgID = gNotifier->allocate();
-        msg->setID(msgID);
-        gCtrlBlock->getRouterInQueue()->produce(msg);
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-
-    int rc;
-    gNotifier->freeze(msgID, &rc);
-    return rc;
-}
-
-int SCI_Filter_unload(int filter_id)
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() != CtrlBlock::FRONT_END)
-        return SCI_ERR_INVALID_CALLER;
-    
-    if (filter_id == SCI_FILTER_NULL)
-        return SCI_ERR_FILTER_PREDEFINED;
-
-    if (filter_id < SCI_FILTER_NULL)
-        return SCI_ERR_FILTER_ID;
-
-    int msgID;
-    try {
-        Message *msg = new Message();
-        msgID = gNotifier->allocate();
-        msg->build(filter_id, SCI_GROUP_ALL, 0, NULL, NULL, Message::FILTER_UNLOAD, msgID);
-        gCtrlBlock->getRouterInQueue()->produce(msg);
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-
-    int rc;
-    gNotifier->freeze(msgID, &rc);
-    return rc;
-}
-
-int SCI_Filter_bcast(int filter_id, int num_successors, int * successor_list, int num_bufs, 
-        void *bufs[], int sizes[])
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if ((gCtrlBlock->getMyRole() != CtrlBlock::FRONT_END) && (gCtrlBlock->getMyRole() != CtrlBlock::AGENT)) {
-        return SCI_ERR_INVALID_CALLER;
-    }
-
-    for (int i=0; i<num_successors; i++) {
-        if (!gRoutingList->isSuccessorExist(successor_list[i]))
-            return SCI_ERR_INVALID_SUCCESSOR;
-    }
-
-    try {
-        Message *msg = new Message();
-        int nextFilterID = filter_id;
-        if (filter_id == SCI_FILTER_NULL) {
-            nextFilterID = gCtrlBlock->getRouterProcessor()->getCurFilterID();
-        }
-        sci_group_t curGroup = gCtrlBlock->getRouterProcessor()->getCurGroup();
-        msg->build(nextFilterID, curGroup, num_bufs, (char **)bufs, sizes, Message::COMMAND);
-        msg->setRefCount(num_successors);
-        gRoutingList->mcast(msg, successor_list, num_successors);
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-
-    return SCI_SUCCESS;
-}
-
-int SCI_Filter_upload(int filter_id, sci_group_t group, int num_bufs, void *bufs[], int sizes[])
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if ((gCtrlBlock->getMyRole() != CtrlBlock::FRONT_END) && (gCtrlBlock->getMyRole() != CtrlBlock::AGENT)) {
-        return SCI_ERR_INVALID_CALLER;
-    }
-
-    try {
-        Filter *filter = NULL;
-        if (filter_id != SCI_FILTER_NULL) {
-            filter = gFilterList->getFilter(filter_id);
-        }
-        int curFilterID = gCtrlBlock->getFilterProcessor()->getCurFilterID();
-        Message *msg = new Message();
-        msg->build(curFilterID, group, num_bufs, (char **)bufs, sizes, Message::DATA);
-        if (filter) {
-            filter->input(group, msg->getContentBuf(), msg->getContentLen());
-            delete msg;
-        } else {    
-            gCtrlBlock->getFilterProcessor()->deliever(msg);
-        }
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-
-    return SCI_SUCCESS;
-}
-
-// Dynamic Back End
-
-int SCI_BE_add(sci_be_t *be)
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() != CtrlBlock::FRONT_END)
-        return SCI_ERR_INVALID_CALLER;
-
-    if (be->id >= 0) { // user-assigned back end id
-        if (gCtrlBlock->getTopology()->hasBE(be->id)) 
-            return SCI_ERR_BACKEND_EXISTED;
-    } else { // SCI allocated back end id
-        gAllocator->allocateBE(&(be->id));
-    }
-
-    int msgID;
-    try {
-        Packer packer; 
-        packer.packStr(be->hostname);
-
-        char *bufs[1];
-        int sizes[1];
-
-        bufs[0] = packer.getPackedMsg();
-        sizes[0] = packer.getPackedMsgLen();
-
-        Message *msg = new Message();
-        msgID = gNotifier->allocate();
-        msg->build(SCI_FILTER_NULL, (sci_group_t) (be->id), 1, bufs, sizes, Message::BE_ADD, msgID);
-        delete [] bufs[0];
-        gCtrlBlock->getRouterInQueue()->produce(msg);
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-
-    int rc;
-    gNotifier->freeze(msgID, &rc);
-    return rc;
-}
-
-int SCI_BE_remove(int be_id)
-{
-    if (gCtrlBlock->getMyRole() == CtrlBlock::INVALID)
-        return SCI_ERR_UNINTIALIZED;
-    
-    if (gCtrlBlock->getMyRole() != CtrlBlock::FRONT_END)
-        return SCI_ERR_INVALID_CALLER;
-    
-    if (!gCtrlBlock->getTopology()->hasBE(be_id)) 
-        return SCI_ERR_BACKEND_NOTFOUND;
-
-    int msgID;
-    try {
-        Message *msg = new Message();
-        msgID = gNotifier->allocate();
-        msg->build(SCI_FILTER_NULL, (sci_group_t) be_id, 0, NULL, NULL, Message::BE_REMOVE, msgID);
-        gCtrlBlock->getRouterInQueue()->produce(msg);
-    } catch (std::bad_alloc) {
-        return SCI_ERR_NO_MEM;
-    }
-
-    int rc;
-    gNotifier->freeze(msgID, &rc);
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/atomic.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/atomic.hpp
deleted file mode 100644
index 310505d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/atomic.hpp
+++ /dev/null
@@ -1,505 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Atomic operations
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   04/01/09 nieyy        Initial code (From LAPI)
-
-****************************************************************************/
-
-#ifndef _ATOMIC_HPP
-#define _ATOMIC_HPP
-
-#include <assert.h>
-#include <pthread.h>
-
-#ifdef _SCI_LINUX // Linux
-
-/**********************************************************************
- *
- *  Atomic operations
- *
- **********************************************************************/
-typedef int          *atomic_p;
-typedef long long   *atomic_l;
-typedef int          boolean_t;
-typedef unsigned int uint;
-
-#ifndef __64BIT__
-static __inline__ boolean_t compare_and_swaplp(atomic_l v, int *old, int new_v)
-{
-    assert(0);
-}
-static __inline__ int  fetch_and_addlp(atomic_l v, int a) { assert(0); }
-static __inline__ uint fetch_and_andlp(atomic_l v, uint a) { assert(0); }
-static __inline__ uint fetch_and_orlp(atomic_l v, uint a) { assert(0); }
-#endif
-
-
-#ifdef POWER_ARCH
-
-/*
-  For Power architecture, isync is only necessary when entering a 
-  critical section to discard any instruction prefetch and possible
-  execution on stale data. 
-
-  It's handy to put it in _check_lock but not other routines.
-*/
-
-static __inline__ 
-int compare_and_swap(atomic_p dest, int *comp_addr, int exch)
-{
-    int        old, comp;
-    boolean_t  rc; 
-
-    __asm__ __volatile__(
-            "1: lwarx   %[old], 0, %[dest]       \n\t"
-            "   lwz     %[comp], 0(%[comp_addr]) \n\t"
-            "   cmplw   cr0, %[old], %[comp]     \n\t"
-            "   bne-    2f                       \n\t"
-            "   li      %[rc], 1                 \n\t"
-            "   stwcx.  %[exch], 0, %[dest]      \n\t"
-            "   beq-    3f                       \n\t"
-            "   b       1b                       \n\t"
-            "2: li      %[rc], 0                 \n\t"
-            "   stw     %[old], 0(%[comp_addr])  \n\t"
-            "3:                                  \n\t"
-            : [old] "=&r" (old), [comp] "=&r" (comp), [rc] "=&r" (rc)
-            : [dest] "r" (dest), [comp_addr] "r" (comp_addr), [exch] "r" (exch)
-            : "%0", "cc", "memory");
-    return rc;
-}
-
-static __inline__ 
-int fetch_and_add(atomic_p dest, int val)
-{
-    int old, sum;
-    __asm__ __volatile__(
-            "1: lwarx   %[old], 0, %[dest]      \n\t"
-            "   add     %[sum], %[old], %[val]  \n\t"
-            "   stwcx.  %[sum], 0, %[dest]      \n\t"
-            "   bne-    1b                      \n\t"
-            : [sum] "=&r" (sum), [old] "=&r" (old)
-            : [val] "r" (val), [dest] "r" (dest)
-            : "%0", "cc", "memory");
-    return old;
-}
-
-static __inline__ 
-uint fetch_and_and(atomic_p dest, uint val)
-{
-    int old, sum;
-    __asm__ __volatile__(
-            "1: lwarx   %[old], 0, %[dest]      \n\t"
-            "   and     %[sum], %[old], %[val]  \n\t"
-            "   stwcx.  %[sum], 0, %[dest]      \n\t"
-            "   bne-    1b                      \n\t"
-            : [sum] "=&r" (sum), [old] "=&r" (old)
-            : [val] "r" (val), [dest] "r" (dest)
-            : "%0", "cc", "memory");
-    return old;
-}
-
-static __inline__ 
-uint fetch_and_or(atomic_p dest, uint val)
-{
-    int old, sum;
-    __asm__ __volatile__(
-            "1: lwarx   %[old], 0, %[dest]      \n\t"
-            "   or      %[sum], %[old], %[val]  \n\t"
-            "   stwcx.  %[sum], 0, %[dest]      \n\t"
-            "   bne-    1b                      \n\t"
-            : [sum] "=&r" (sum), [old] "=&r" (old)
-            : [val] "r" (val), [dest] "r" (dest)
-            : "%0", "cc", "memory");
-    return old;
-}
-
-#ifdef __64BIT__
-static __inline__
-int compare_and_swaplp(atomic_l dest, long long *comp_addr, long long exch)
-{
-    long long  old, comp;
-    boolean_t  rc;
-
-    __asm__ __volatile__(
-            "1: ldarx   %[old], 0, %[dest]       \n\t"
-            "   ld     %[comp], 0(%[comp_addr]) \n\t"
-            "   cmpld   cr0, %[old], %[comp]     \n\t"
-            "   bne-    2f                       \n\t"
-            "   li      %[rc], 1                 \n\t"
-            "   stdcx.  %[exch], 0, %[dest]      \n\t"
-            "   beq-    3f                       \n\t"
-            "   b       1b                       \n\t"
-            "2: li      %[rc], 0                 \n\t"
-            "   std     %[old], 0(%[comp_addr])  \n\t"
-            "3:                                  \n\t"
-            : [old] "=&r" (old), [comp] "=&r" (comp), [rc] "=&r" (rc)
-            : [dest] "r" (dest), [comp_addr] "r" (comp_addr), [exch] "r" (exch)
-            : "%0", "cc", "memory");
-
-    return rc;
-}
-
-static __inline__
-long long fetch_and_addlp(atomic_l dest, long long val)
-{
-    long long old, sum;
-    __asm__ __volatile__(
-            "1: ldarx   %[old], 0,  %[dest]     \n\t"
-            "   add     %[sum], %[old], %[val]  \n\t"
-            "   stdcx.  %[sum], 0, %[dest]      \n\t"
-            "   bne-    1b                      \n\t"
-            : [sum] "=&r" (sum), [old] "=&r" (old)
-            : [val] "r" (val), [dest] "r" (dest)
-            : "%0", "cc", "memory");
-
-    return old;
-}
-
-static __inline__
-unsigned long long fetch_and_andlp(atomic_l dest, unsigned long long val)
-{
-    long long old, sum;
-    __asm__ __volatile__(
-            "1: ldarx   %[old], 0, %[dest]      \n\t"
-            "   and     %[sum], %[old], %[val]  \n\t"
-            "   stdcx.  %[sum], 0, %[dest]      \n\t"
-            "   bne-    1b                      \n\t"
-            : [sum] "=&r" (sum), [old] "=&r" (old)
-            : [val] "r" (val), [dest] "r" (dest)
-            : "%0", "cc", "memory");
-    return old;
-}
-
-static __inline__
-unsigned long long fetch_and_orlp(atomic_l dest, unsigned long long val)
-{
-    long old, sum;
-    __asm__ __volatile__(
-            "1: ldarx   %[old], 0, %[dest]      \n\t"
-            "   or      %[sum], %[old], %[val]  \n\t"
-            "   stdcx.  %[sum], 0, %[dest]      \n\t"
-            "   bne-    1b                      \n\t"
-            : [sum] "=&r" (sum), [old] "=&r" (old)
-            : [val] "r" (val), [dest] "r" (dest)
-            : "%0", "cc", "memory");
-    return old;
-}
-
-#endif
-
-static __inline__ 
-boolean_t _check_lock(atomic_p dest, int comp, int exch)
-{
-    int        old;
-    boolean_t  rc; 
-
-    __asm__ __volatile__(
-            "1: lwarx   %[old], 0, %[dest]    \n\t"
-            "   cmplw   cr0, %[old], %[comp]  \n\t"
-            "   bne-    2f                    \n\t"
-            "   li      %[rc], 0              \n\t"
-            "   stwcx.  %[exch], 0, %[dest]   \n\t"
-            "   beq-    3f                    \n\t"
-            "   b       1b                    \n\t"
-            "2: li      %[rc], 1              \n\t"
-            "3: isync                         \n\t"
-            : [old] "=&r" (old), [rc] "=&r" (rc)
-            : [dest] "r" (dest), [comp] "r" (comp), [exch] "r" (exch)
-            : "%0", "cc", "memory");
-
-    return rc;
-}
-
-static __inline__ 
-void _clear_lock(atomic_p ptr, int new_val)
-{
-        __asm__ __volatile__("lwsync");
-        *ptr = new_val;
-}
-
-#endif /* POWER_ARCH */
-
-#ifdef INTEL_ARCH
-/*
- Note: Inlining cmpxchg2 and compare_and_swap doesn't generate
-       correct code!
- */
-static //__inline__ 
-boolean_t cmpxchg2(atomic_p dest, int comp, int exch)
-{
-    unsigned int old;
-    __asm__ __volatile__(
-        "lock; cmpxchgl %[exch], %[dest]"
-        : [dest] "=m" (*dest), "=a" (old)
-        : [exch] "r" (exch), "m"  (*dest), "a"  (comp)
-        : "memory" );
-    return (old == comp);
-}
-
-static //__inline__
-boolean_t compare_and_swap(atomic_p dest, int *comp_addr, int exch)
-{
-    unsigned int old;
-    __asm__ __volatile__(
-        "lock; cmpxchgl %[exch], %[dest]"
-        : [dest] "=m" (*dest), "=a" (old)
-        : [exch] "r" (exch), "m" (*dest), "a" (*comp_addr)
-        : "memory" );
-    if (*comp_addr == old)
-        return 1;
-    else {
-        *comp_addr = old;
-        return 0;
-    }
-}
-
-static __inline__ 
-int fetch_and_add(atomic_p ptr, int val)
-{
-    int prev;
-    do prev = *ptr;
-    while (!cmpxchg2(ptr, prev, (prev+val)));
-    return prev;
-}
-
-static __inline__ 
-uint fetch_and_and(atomic_p ptr, uint val)
-{
-    uint prev;
-    do prev = *ptr;
-    while (!cmpxchg2(ptr, prev, (prev&val)));
-    return prev;
-}
-
-static __inline__ 
-uint fetch_and_or(atomic_p ptr, uint val)
-{
-    uint prev;
-    do prev = *ptr;
-    while (!cmpxchg2(ptr, prev, (prev|val)));
-    return prev;
-}
-
-#ifdef __64BIT__
-static 
-boolean_t cmpxchg2lp(atomic_l dest, long long comp, long long exch)
-{
-    unsigned long long old;
-    __asm__ __volatile__(
-        "lock; cmpxchgq %[exch], %[dest]"
-        : [dest] "=m" (*dest), "=a" (old)
-        : [exch] "r" (exch), "m"  (*dest), "a"  (comp)
-        : "memory" );
-    return (old == comp);
-}
-
-static //__inline__
-boolean_t compare_and_swaplp(atomic_l dest, long long *comp_addr, long long exch)
-{
-    unsigned long long old;
-    __asm__ __volatile__(
-        "lock; cmpxchgq %[exch], %[dest]"
-        : [dest] "=m" (*dest), "=a" (old)
-        : [exch] "r" (exch), "m" (*dest), "a" (*comp_addr)
-        : "memory" );
-    if (*comp_addr == old)
-        return 1;
-    else {
-        *comp_addr = old;
-        return 0;
-    }
-}
-
-static __inline__
-long long fetch_and_addlp(atomic_l ptr, long long val)
-{
-    long long prev;
-    do prev = *ptr;
-    while (!cmpxchg2lp(ptr, prev, (prev+val)));
-    return prev;
-}
-
-static __inline__
-unsigned long long fetch_and_andlp(atomic_l ptr, unsigned long long val)
-{
-    unsigned long long prev;
-    do prev = *ptr;
-    while (!cmpxchg2lp(ptr, prev, (prev&val)));
-    return prev;
-}
-
-static __inline__
-unsigned long long fetch_and_orlp(atomic_l ptr, unsigned long long val)
-{
-    unsigned long long prev;
-    do prev = *ptr;
-    while (!cmpxchg2lp(ptr, prev, (prev|val)));
-    return prev;
-}
-
-#endif
-
-static __inline__ 
-boolean_t _check_lock(atomic_p ptr, int old_val, int new_val)
-{
-    return !cmpxchg2(ptr, old_val, new_val);
-}
-
-static __inline__ 
-void _clear_lock(atomic_p ptr, int new_val)
-{
-    *ptr = new_val;
-}
-
-#endif /* INTEL_ARCH */
-
-
-/**********************************************************************
- *
- *  Sync. functions
- *
- **********************************************************************/
-
-static __inline__ void lwsync()
-{
-#ifdef POWER_ARCH
-    __asm__ __volatile__ ("lwsync");
-#endif /* POWER_ARCH */
-}
-
-static __inline__ void hwsync()
-{
-#ifdef POWER_ARCH
-    __asm__ __volatile__ ("sync");
-#endif /* POWER_ARCH */
-}
-
-static __inline__ void isync()
-{
-#ifdef POWER_ARCH
-    __asm__ __volatile__ ("isync");
-#endif /* POWER_ARCH */
-}
-
-/**********************************************************************
- *
- *  Lock functions
- *
- **********************************************************************/
-
-typedef pthread_t lw_mutex_t;
-
-extern "C" {
-#ifdef POWER_ARCH
-static __inline__ 
-void lw_mutex_lock(lw_mutex_t *lock, pthread_t tid)
-{
-    int   val;
-    __asm__ __volatile__ (
-            "1: lwarx  %[val], 0, %[lock]  \n\t"
-            "   cmpwi  %[val], 0           \n\t"
-            "   bne-   1b                  \n\t"
-            "   stwcx. %[tid], 0, %[lock]  \n\t"
-            "   bne-   1b                  \n\t"
-            "   isync                      \n\t"
-            : [val] "=&r" (val)
-            : [lock] "r" (lock), [tid] "r" (tid)
-            : "%0", "cc", "memory");
-}
-
-static __inline__ 
-int  lw_mutex_trylock(lw_mutex_t *lock, pthread_t tid)
-{
-    int    val;
-    __asm__ __volatile__ (
-            "1: lwarx  %[val], 0, %[lock]  \n\t"
-            "   cmpwi  %[val], 0           \n\t"
-            "   bne-   2f                  \n\t"
-            "   stwcx. %[tid], 0, %[lock]  \n\t"
-            "   bne-   1b                  \n\t"
-            "   isync                      \n\t"
-            "2:                            \n\t"  
-            : [val] "=&r" (val)
-            : [lock] "r" (lock), [tid] "r" (tid)
-            : "%0", "cc", "memory");
-    return val;
-}
-#endif /* POWER_ARCH */
-
-#ifdef INTEL_ARCH
-static __inline__ 
-void lw_mutex_lock(lw_mutex_t *lock, pthread_t tid)
-{
-    while (_check_lock((atomic_p)lock, 0, tid));
-}
-
-static __inline__ 
-int  lw_mutex_trylock(lw_mutex_t *lock, pthread_t tid)
-{
-    return _check_lock((atomic_p)lock, 0, tid);
-}
-#endif /* INTEL_ARCH */
-
-static __inline__ 
-void lw_mutex_unlock(lw_mutex_t *lock)
-{
-    lwsync();
-    *lock = 0;
-}
-}
-
-/**********************************************************************
- *
- *  Misc. functions
- *
- **********************************************************************/
-
-static __inline__ int _count_leading_zeros(unsigned word)
-{
-    int res;
-#ifdef INTEL_ARCH
-    if (!word)
-        return 32;
-    __asm__("bsr %[res], %[word]" : [res] "=d" (res): [word] "d" (word));
-    return (31-res);
-#endif /* INTEL_ARCH */
-#ifdef POWER_ARCH
-    __asm__ ("cntlzw %[res], %[word]" : [res] "=r" (res) : [word] "r" (word));
-    return res;
-#endif /* POWER_ARCH */
-}
-
-#else // AIX
-
-#include <sys/atomic_op.h>
-
-typedef pthread_t   lw_mutex_t;
-
-extern "C" {
-void lw_mutex_lock(lw_mutex_t *lock, pthread_t tid);
-void lw_mutex_unlock(lw_mutex_t *lock);
-int  lw_mutex_trylock(lw_mutex_t *lock, pthread_t tid);
-}
-
-#endif
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/ctrlblock.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/ctrlblock.cpp
deleted file mode 100644
index 799b90b..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/ctrlblock.cpp
+++ /dev/null
@@ -1,536 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: CtrlBlock
-
- Description: Internal running information management (Note: STL does not 
-              guarantee the safety of several readers & one writer cowork 
-              together, and user threads can query group information at 
-              runtime, so it's necessary to add a lock to protect these 
-              read & write operations).
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-
-****************************************************************************/
-
-#include "ctrlblock.hpp"
-#include <assert.h>
-#include <stdlib.h>
-#include <string.h>
-
-#include "stream.hpp"
-#include "exception.hpp"
-#include "group.hpp"
-#include "log.hpp"
-#include "tools.hpp"
-
-#include "statemachine.hpp"
-#include "eventntf.hpp"
-#include "topology.hpp"
-#include "routinglist.hpp"
-#include "message.hpp"
-#include "queue.hpp"
-#include "listener.hpp"
-#include "errinjector.hpp"
-#include "processor.hpp"
-#include "routerproc.hpp"
-#include "filterproc.hpp"
-#include "observer.hpp"
-#include "parent.hpp"
-
-CtrlBlock * CtrlBlock::instance = NULL;
-
-CtrlBlock::CtrlBlock()
-    : role(INVALID)
-{
-    endInfo = NULL;
-    topoInfo = NULL;
-    
-    listener = NULL;
-    errInjector = NULL;
-    routerProc = NULL;
-    filterProc = NULL;
-    observer = NULL;
-
-    routerInQueue = NULL;
-    filterInQueue = NULL;
-    filterOutQueue = NULL;
-    purifierOutQueue = NULL;
-    upQueue = NULL;
-    pollQueue = NULL;
-    monitorInQueue = NULL;
-    errorQueue = NULL;
-
-    parentStream = NULL;
-
-    queues.clear();
-    streams.clear();
-    processors.clear();
-
-    queueInfo.clear();
-
-    enabled = false;
-
-    ::pthread_mutex_init(&mtx, NULL);
-}
-
-CtrlBlock::~CtrlBlock()
-{
-    ::pthread_mutex_destroy(&mtx);
-
-    instance = NULL;
-}
-
-CtrlBlock::ROLE CtrlBlock::getMyRole() 
-{
-    return role; 
-}
-
-int CtrlBlock::getMyHandle() 
-{ 
-    return handle; 
-}
-
-sci_info_t * CtrlBlock::getEndInfo() 
-{ 
-    return endInfo; 
-}
-
-int CtrlBlock::getJobKey() 
-{ 
-    return jobKey; 
-}
-
-int CtrlBlock::initFE(int hndl, sci_info_t * info)
-{
-    role = FRONT_END;
-    handle = hndl;
-    endInfo = (sci_info_t *) ::malloc(sizeof(sci_info_t));
-    if (NULL == endInfo) {
-        return SCI_ERR_NO_MEM;
-    }
-    
-    ::memset(endInfo, 0, sizeof(sci_info_t));
-    ::memcpy(endInfo, info, sizeof(sci_info_t));
-
-    char *envp = ::getenv("SCI_JOB_KEY");
-    if (envp) {
-        // use user's job key
-        jobKey = ::atoi(envp);
-    } else {
-        // generate a random job key
-        ::srand((unsigned int) ::time(NULL));
-        jobKey = ::rand();
-    }
-
-    gStateMachine->reset();
-    return SCI_SUCCESS;
-}
-
-int CtrlBlock::initAgent(int hndl)
-{
-    role = AGENT;
-    handle = hndl;
-
-    char *envp = ::getenv("SCI_JOB_KEY");
-    if (envp == NULL)
-        return SCI_ERR_INVALID_JOBKEY;
-    jobKey = ::atoi(envp);
-    
-    gStateMachine->reset();
-    return SCI_SUCCESS;
-}
-
-int CtrlBlock::initBE(int hndl, sci_info_t * info)
-{
-    role = BACK_END;
-    handle = hndl;
-    endInfo = (sci_info_t *) ::malloc(sizeof(sci_info_t));
-    if (NULL == endInfo) {
-        return SCI_ERR_NO_MEM;
-    }
-    
-    ::memcpy(endInfo, info, sizeof(sci_info_t));
-    
-    handle = hndl;
-
-    char *envp = ::getenv("SCI_JOB_KEY");
-    if (envp == NULL)
-        return SCI_ERR_INVALID_JOBKEY;
-    jobKey = ::atoi(envp);
-
-    gStateMachine->reset();
-    return SCI_SUCCESS;
-}
-
-void CtrlBlock::term()
-{
-    while (enabled) {
-        SysUtil::sleep(1000);
-    }
-
-    // stop listener if have
-    if (listener != NULL) {
-        listener->stop();
-        listener->join();
-    }
-
-    // stop error injector if have
-    if (errInjector != NULL) {
-        errInjector->stop();
-        errInjector->join();
-    }
-
-    // produce a NULL message in all message queues
-    QUEUE_VEC::iterator qit = queues.begin();
-    for (; qit!=queues.end(); ++qit) {
-        (*qit)->produce();
-    }
-
-    // close all streams
-    STREAM_VEC::iterator sit = streams.begin();
-    for (; sit!=streams.end(); ++sit) {
-        (*sit)->stop();
-    }
-
-    // waiting for all processor threads terminate
-    PROC_VEC::iterator pit = processors.begin();
-    for (; pit!=processors.end(); ++pit) {
-        while (!(*pit)->isLaunched()) {
-            // before join, this thread should have been launched
-            SysUtil::sleep(1000);
-        }
-        (*pit)->join();
-    }
-
-    clean();
-}
-
-void CtrlBlock::clean()
-{
-    // delete all registered processors
-    PROC_VEC::iterator pit = processors.begin();
-    for (; pit!=processors.end(); ++pit) {
-        (*pit)->dump();
-        delete (*pit);
-    }
-    processors.clear();
-
-    // delete all registered streams
-    STREAM_VEC::iterator sit = streams.begin();
-    for (; sit!=streams.end(); ++sit) {
-        delete (*sit);
-    }
-    streams.clear();
-
-    // delete all registered message queues
-    QUEUE_VEC::iterator qit = queues.begin();
-    for (; qit!=queues.end(); ++qit) {
-        delete (*qit);
-    }
-    queues.clear();
-
-    queueInfo.clear();
-
-    // delete listener
-    if (listener != NULL) {
-        delete listener;
-        listener = NULL;
-    }
-
-    // delete error injector
-    if (errInjector!= NULL) {
-        delete errInjector;
-        errInjector = NULL;
-    }
-
-    routerProc = NULL;
-    filterProc = NULL;
-
-    routerInQueue = NULL;
-    filterInQueue = NULL;
-    filterOutQueue = NULL;
-    purifierOutQueue = NULL;
-    upQueue = NULL;
-    pollQueue = NULL;
-    monitorInQueue = NULL;
-    errorQueue = NULL;
-
-    parentStream = NULL;
-
-    if (observer != NULL) {
-        delete observer;
-        observer = NULL;
-    }
-
-    if (topoInfo) {
-        delete topoInfo;
-        topoInfo = NULL;
-    }
-
-    gStateMachine->parse(StateMachine::DATASTUCT_CLEANED);
-
-    role = INVALID;
-    if (endInfo) {
-        ::free(endInfo);
-        endInfo = NULL;
-    }
-}
-
-
-void CtrlBlock::enable()
-{
-    enabled = true;
-}
-
-void CtrlBlock::disable()
-{
-    if (!enabled) // already disabled?
-        return;
-    
-    enabled = false;
-}
-
-bool CtrlBlock::isEnabled() 
-{ 
-    return enabled;
-}
-
-void CtrlBlock::notifyPollQueue()
-{
-    // so far, valid for polling mode only
-    assert(role != AGENT);
-    observer->notify();
-    Message *msg = new Message(Message::INVALID_POLL);
-    pollQueue->produce(msg);
-}
-
-void CtrlBlock::setTopology(Topology *topo) 
-{ 
-    topoInfo = topo; 
-}
-
-void CtrlBlock::setListener(Listener *li) 
-{
-    listener = li;
-}
-
-void CtrlBlock::setObserver(Observer *ob) 
-{
-    observer = ob;
-}
-
-void CtrlBlock::setErrorInjector(ErrorInjector *injector) 
-{
-    errInjector = injector;
-}
-
-Topology * CtrlBlock::getTopology() 
-{ 
-    return topoInfo;
-}
-
-Listener * CtrlBlock::getListener() 
-{
-    return listener;
-}
-
-Observer * CtrlBlock::getObserver() {
-    return observer;
-}
-
-void CtrlBlock::registerQueue(MessageQueue *queue) 
-{
-    queues.push_back(queue);
-}
-
-void CtrlBlock::registerProcessor(Processor *proc) 
-{
-    processors.push_back(proc);
-}
-
-void CtrlBlock::registerStream(Stream *stream) 
-{
-    streams.push_back(stream);
-}
-
-/* need lock protection */
-void CtrlBlock::mapQueue(int hndl, MessageQueue *queue) 
-{
-    lock();
-    queueInfo[hndl] = queue;
-    unlock();
-}
-
-/* need lock protection */
-MessageQueue * CtrlBlock::queryQueue(int hndl) 
-{
-    MessageQueue *queue = NULL;
-
-    lock();
-    QUEUE_MAP::iterator qit = queueInfo.find(hndl);
-    if (qit != queueInfo.end()) {
-        queue = (*qit).second;
-    }
-    unlock();
-    
-    return queue;
-}
-
-void CtrlBlock::setRouterInQueue(MessageQueue * queue)
-{
-    routerInQueue = queue;
-}
-
-void CtrlBlock::setFilterInQueue(MessageQueue *queue) 
-{
-    filterInQueue = queue;
-}
-
-void CtrlBlock::setFilterOutQueue(MessageQueue *queue) 
-{
-    filterOutQueue = queue;
-}
-
-void CtrlBlock::setPurifierOutQueue(MessageQueue *queue) 
-{
-    purifierOutQueue = queue;
-}
-
-void CtrlBlock::setUpQueue(MessageQueue * queue)
-{
-    upQueue = queue;
-}
-
-void CtrlBlock::setPollQueue(MessageQueue *queue) 
-{
-    pollQueue = queue;
-}
-
-void CtrlBlock::setMonitorInQueue(MessageQueue *queue) 
-{
-    monitorInQueue = queue;
-}
-
-void CtrlBlock::setErrorQueue(MessageQueue *queue) 
-{
-    errorQueue = queue;
-}
-
-MessageQueue * CtrlBlock::getRouterInQueue()
-{
-    return routerInQueue;
-}
-
-MessageQueue * CtrlBlock::getFilterInQueue() 
-{
-    return filterInQueue;
-}
-
-MessageQueue * CtrlBlock::getFilterOutQueue() 
-{
-    return filterOutQueue;
-}
-
-MessageQueue * CtrlBlock::getPurifierOutQueue() 
-{
-    return purifierOutQueue;
-}
-
-MessageQueue * CtrlBlock::getUpQueue()
-{
-    return upQueue;
-}
-
-MessageQueue * CtrlBlock::getPollQueue() 
-{
-    return pollQueue;
-}
-
-MessageQueue * CtrlBlock::getErrorQueue() 
-{
-    return errorQueue;
-}
-
-MessageQueue * CtrlBlock::getMonitorInQueue() 
-{
-    return monitorInQueue;
-}
-
-void CtrlBlock::setRouterProcessor(RouterProcessor *proc) 
-{
-    routerProc = proc;
-}
-
-void CtrlBlock::setFilterProcessor(FilterProcessor *proc) 
-{
-    filterProc = proc;
-}
-        
-RouterProcessor * CtrlBlock::getRouterProcessor() 
-{
-    return routerProc;
-}
-        
-FilterProcessor * CtrlBlock::getFilterProcessor() 
-{
-    return filterProc;
-}
-
-void CtrlBlock::setParentStream(Stream * stream)
-{
-    parentStream = stream;
-}
-
-Stream * CtrlBlock::getParentStream()
-{
-    return parentStream;
-}
-
-void CtrlBlock::genSelfInfo(MessageQueue * queue, bool isUncle)
-{
-    assert(queue);
-
-    // generate this message only when turn on failover mechanism
-    char *envp = ::getenv("SCI_ENABLE_FAILOVER");
-    if (envp != NULL) {
-        if (::strcmp(envp, "yes") == 0) {
-            char tmp[256] = {0};
-            string envStr;
-
-            ::gethostname(tmp, sizeof(tmp));
-            string localName = SysUtil::get_hostname(tmp);
-            
-            Parent parent(handle, localName.c_str(), listener->getBindPort());
-            parent.setLevel(topoInfo->getLevel());
-
-            Message *msg = parent.packMsg(isUncle);
-            queue->produce(msg);
-        }
-    }
-}
-
-void CtrlBlock::lock()
-{
-    ::pthread_mutex_lock(&mtx);
-}
-
-void CtrlBlock::unlock()
-{
-    ::pthread_mutex_unlock(&mtx);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/ctrlblock.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/ctrlblock.hpp
deleted file mode 100644
index 174e28a..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/ctrlblock.hpp
+++ /dev/null
@@ -1,191 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: CtrlBlock
-
- Description: Internal running information management (Note: STL does not 
-              guarantee the safety of several readers & one writer cowork 
-              together, and user threads can query group information at 
-              runtime, so it's necessary to add a lock to protect these 
-              read & write operations).
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _CTRLBLOCK_HPP
-#define _CTRLBLOCK_HPP
-
-#include <pthread.h>
-#include <map>
-#include <vector>
-
-#include "sci.h"
-#include "general.hpp"
-
-using namespace std;
-
-class MessageQueue;
-class Processor;
-class Stream;
-
-class FilterProcessor;
-class RouterProcessor;
-
-class Listener;
-class Topology;
-class Observer;
-
-class ErrorInjector;
-
-class CtrlBlock
-{
-    public:
-        enum ROLE {
-            INVALID,
-            FRONT_END,
-            AGENT,
-            BACK_END
-        };
-        
-        typedef map<int, MessageQueue*> QUEUE_MAP;
-
-        typedef vector<Stream*> STREAM_VEC;
-        typedef vector<Processor*> PROC_VEC;
-        typedef vector<MessageQueue*> QUEUE_VEC;
-
-    private:
-        // basic information
-        ROLE                 role;
-        int                  handle;
-        int                  jobKey;
-        bool                 enabled;
-
-        sci_info_t           *endInfo;
-        Topology             *topoInfo;
-        Listener             *listener;
-
-        Observer             *observer;
-        ErrorInjector        *errInjector;
-
-        // internal queue, processor, stream information
-        QUEUE_VEC            queues;
-        PROC_VEC             processors;
-        STREAM_VEC           streams;
-
-        QUEUE_MAP            queueInfo;
-
-        // additional information for convenient purpose
-        MessageQueue         *routerInQueue;
-        MessageQueue         *filterInQueue;
-        MessageQueue         *filterOutQueue;
-        MessageQueue         *purifierOutQueue;
-        MessageQueue         *upQueue;
-        MessageQueue         *pollQueue;
-        
-        MessageQueue         *errorQueue;
-        MessageQueue         *monitorInQueue;
-
-        RouterProcessor      *routerProc;
-        FilterProcessor      *filterProc;
-
-        Stream               *parentStream;
-
-        // lock
-        pthread_mutex_t      mtx;
-
-        CtrlBlock();
-        static CtrlBlock *instance;
-        
-    public:
-        ~CtrlBlock();
-        static CtrlBlock* getInstance() {
-            if (instance == NULL)
-                instance = new CtrlBlock();
-            return instance;
-        }
-
-        ROLE getMyRole();
-        int getMyHandle();
-        sci_info_t * getEndInfo();
-        int getJobKey();
-        
-        int initFE(int hndl, sci_info_t *info);
-        int initBE(int hndl, sci_info_t *info);
-        int initAgent(int hndl);
-        void term();
-
-        void enable();
-        void disable();
-        bool isEnabled();
-        void notifyPollQueue();
-
-        void setTopology(Topology *topo);
-        void setListener(Listener *li);
-        void setObserver(Observer *ob);
-        void setErrorInjector(ErrorInjector *injector);
-        Topology * getTopology();
-        Listener * getListener();
-        Observer * getObserver();
-
-        // main components in SCI
-        void registerQueue(MessageQueue *queue);
-        void registerProcessor(Processor *proc);
-        void registerStream(Stream *stream);
-
-        // only these two operations required lock protection
-        void mapQueue(int hndl, MessageQueue *queue);
-        MessageQueue * queryQueue(int hndl);
-
-        void setRouterInQueue(MessageQueue *queue);
-        void setFilterInQueue(MessageQueue *queue);
-        void setFilterOutQueue(MessageQueue *queue);
-        void setPurifierOutQueue(MessageQueue *queue);
-        void setUpQueue(MessageQueue *queue);
-        void setPollQueue(MessageQueue *queue);
-        void setMonitorInQueue(MessageQueue *queue);
-        void setErrorQueue(MessageQueue *queue);
-        MessageQueue * getRouterInQueue();
-        MessageQueue * getFilterInQueue();
-        MessageQueue * getFilterOutQueue();
-        MessageQueue * getPurifierOutQueue();
-        MessageQueue * getPollQueue();
-        MessageQueue * getUpQueue();
-        MessageQueue * getErrorQueue();
-        MessageQueue * getMonitorInQueue();
-        
-        void setRouterProcessor(RouterProcessor *proc);
-        void setFilterProcessor(FilterProcessor *proc);
-        RouterProcessor * getRouterProcessor();
-        FilterProcessor * getFilterProcessor();
-
-        void setParentStream(Stream *stream);
-        Stream * getParentStream();
-
-        void genSelfInfo(MessageQueue *queue, bool isUncle);
-
-    private:
-        void clean();
-
-        void lock();
-        void unlock();
-};
-
-#define gCtrlBlock CtrlBlock::getInstance()
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/dgroup.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/dgroup.cpp
deleted file mode 100644
index 759ea75..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/dgroup.cpp
+++ /dev/null
@@ -1,806 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Distributed Group
-
- Description: Distributed group manipulation (Note: STL does not guarantee 
-              the safety of several readers & one writer cowork together, 
-              and user threads can query group information at runtime, 
-              so it's necessary to add a lock to protect these read & write 
-              operations).
-   
- Author: Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/08/09 nieyy        Initial code (F156654)
-
-****************************************************************************/
-
-#include "dgroup.hpp"
-#include <stdlib.h>
-
-#include "packer.hpp"
-#include "group.hpp"
-
-#include "message.hpp"
-
-DistributedGroup::DistributedGroup(int pid)
-    : parentId(pid)
-{
-    generalInfo.clear();
-
-    beInfo.clear();
-    successorInfo.clear();
-
-    beListInfo.clear();
-    successorListInfo.clear();
-
-    ::pthread_mutex_init(&mtx, NULL);
-}
-
-DistributedGroup::~DistributedGroup()
-{  
-    GRP_MAP_MAP::iterator it = generalInfo.begin();
-    for (; it != generalInfo.end(); ++it) {
-        GRP_MAP::iterator git = (*it).second.begin();
-        for (; git != (*it).second.end(); ++git) {
-            delete (*git).second;
-        }
-    }
-    generalInfo.clear();
-
-    beInfo.clear();
-    successorInfo.clear();
-
-    beListInfo.clear();
-    successorListInfo.clear();
-
-    ::pthread_mutex_destroy(&mtx);
-}
-
-void DistributedGroup::setPID(int id)
-{
-    parentId = id;
-}
-
-int DistributedGroup::getPID()
-{
-    return parentId;
-}
-
-Message * DistributedGroup::packMsg()
-{
-    Packer packer;
-    
-    packer.packInt(parentId);
-    packer.packInt(generalInfo.size());
-    GRP_MAP_MAP::iterator it = generalInfo.begin();
-    for (; it != generalInfo.end(); ++it) {
-        packer.packInt((int) (*it).first);
-        packer.packInt((*it).second.size());
-        
-        GRP_MAP::iterator git = (*it).second.begin();
-        for (; git != (*it).second.end(); ++git) {
-            packer.packInt((*git).first);
-            packer.packInt((*git).second->size());
-
-            Group::iterator ggit = (*git).second->begin();
-            for (; ggit != (*git).second->end(); ggit++) {
-                packer.packInt((*ggit));
-            }
-        }
-    }
-
-    char *bufs[1];
-    int sizes[1];
-    
-    bufs[0] = packer.getPackedMsg();
-    sizes[0] = packer.getPackedMsgLen();
-
-    Message *msg = new Message();
-    msg->build(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes, Message::GROUP_MERGE);
-    delete [] bufs[0];
-    return msg;
-}
-
-void DistributedGroup::unpackMsg(Message & msg)
-{
-    Packer packer(msg.getContentBuf());
-    
-    parentId = packer.unpackInt();
-    int size1 = packer.unpackInt();
-    for (int i=0; i<size1; i++) {
-        sci_group_t groupId = (sci_group_t) packer.unpackInt();
-
-        int size2 = packer.unpackInt();
-        for (int j=0; j<size2; j++) {
-            int childId = packer.unpackInt();
-
-            Group *group = new Group();
-            int size3 = packer.unpackInt();
-            for (int k=0; k<size3; k++) {
-                group->Add(packer.unpackInt());
-            }
-
-            generalInfo[groupId][childId] = group;
-        }
-    }
-}
-
-void DistributedGroup::create(int num_bes, int * be_list, sci_group_t group)
-{
-    Group total;
-    for (int i=0; i<num_bes; i++) {
-        total.Add(be_list[i]);
-    }
-
-    lock();
-
-    GRP_MAP_MAP::iterator it = generalInfo.find(SCI_GROUP_ALL);
-    
-    GRP_MAP::iterator git = (*it).second.begin();
-    for (; git!=(*it).second.end(); ++git) {
-        int childHndl = (*git).first;
-        Group *grp = (*git).second;
-
-        Group diff(*grp);
-        diff.Delete(total);
-
-        Group *intersect = new Group(*grp);
-        intersect->Delete(diff);
-        if (!intersect->empty()) { // if not empty
-            generalInfo[group][childHndl] = intersect;
-        } else {
-            delete intersect;
-        }
-    }
-
-    reset(group);
-
-    unlock();
-}
-
-void DistributedGroup::remove(sci_group_t group)
-{
-    lock();
-
-    GRP_MAP_MAP::iterator it = generalInfo.find(group);
-    
-    GRP_MAP::iterator git = (*it).second.begin();
-    for (; git!=(*it).second.end(); ++git) {
-        delete (*git).second;
-    }
-    generalInfo.erase(group);
-
-    beInfo.erase(group);
-    successorInfo.erase(group);
-
-    beListInfo.erase(group);
-    successorListInfo.erase(group);
-
-    unlock();
-}
-
-int DistributedGroup::operate(sci_group_t group1, sci_group_t group2, sci_op_t op,
-    sci_group_t newgroup)
-{
-    bool hasMember = false;
-
-    lock();
-    
-    if (op == SCI_UNION) {     
-        // Add all members in group_info[group1]
-        GRP_MAP::iterator git = generalInfo[group1].begin();
-        for (; git!=generalInfo[group1].end(); ++git) {            
-            int childHndl = (*git).first;
-            Group *grp = (*git).second;
-            
-            Group *uni = new Group(*grp);
-            if (generalInfo[group2].find(childHndl) != generalInfo[group2].end()) {
-                // if found
-                uni->Add(*generalInfo[group2][childHndl]);
-            }
-            generalInfo[newgroup][childHndl] = uni;
-        }
-
-        // Add members of group_info[group2] missing in the previous step
-        git = generalInfo[group2].begin();
-        for (; git!=generalInfo[group2].end(); ++git) {            
-            int childHndl = (*git).first;
-            Group *grp = (*git).second;
-            
-            if (generalInfo[group1].find(childHndl) == generalInfo[group1].end()) {
-                // if not found
-                Group *uni = new Group(*grp);
-                generalInfo[newgroup][childHndl] = uni;
-            }
-        }
-
-        // should always be true
-        hasMember = true;
-    } else if (op == SCI_INTERSECTION) {
-        GRP_MAP_MAP::iterator it = generalInfo.find(group1);
-        
-        GRP_MAP::iterator git = (*it).second.begin();
-        for (; git!=(*it).second.end(); ++git) {
-            int childHndl = (*git).first;
-            Group *grp = (*git).second;
-            
-            if (generalInfo[group2].find(childHndl) == generalInfo[group2].end()) {
-                // if not found
-                continue;
-            }
-            Group diff(*grp);
-            diff.Delete(*generalInfo[group2][childHndl]);
-
-            Group *intersect = new Group(*grp);
-            intersect->Delete(diff);
-            if (!intersect->empty()) { // if not empty
-                generalInfo[newgroup][childHndl] = intersect;
-                hasMember = true;
-            } else {
-                delete intersect;
-            }
-        }
-    } else if (op == SCI_DIFFERENCE) {
-        GRP_MAP_MAP::iterator it = generalInfo.find(group1);
-        
-        GRP_MAP::iterator git = (*it).second.begin();
-        for (; git!=(*it).second.end(); ++git) {
-            int childHndl = (*git).first;
-            Group *grp = (*git).second;
-            
-            if (generalInfo[group2].find(childHndl) == generalInfo[group2].end()) {
-                // if not found
-                continue;
-            }
-            Group *diff = new Group(*grp);
-            diff->Delete(*generalInfo[group2][childHndl]);
-            if (!diff->empty()) { // if not empty
-                generalInfo[newgroup][childHndl] = diff;
-                hasMember = true;
-            } else {
-                delete diff;
-            }
-        }
-    }
-
-    int rc = SCI_SUCCESS;
-    if (hasMember) {
-        reset(newgroup);
-    } else {
-        rc = SCI_ERR_GROUP_EMPTY;
-    }
-
-    unlock();
-
-    return rc;
-}
-
-int DistributedGroup::operateExt(sci_group_t group, int num_bes, int * be_list, 
-    sci_op_t op, sci_group_t newgroup)
-{
-    Group total;
-    for (int i=0; i<num_bes; i++) {
-        total.Add(be_list[i]);
-    }
-
-    lock();
-    
-    bool hasMember = false;
-    if (op == SCI_UNION) {
-        GRP_MAP_MAP::iterator it = generalInfo.find(SCI_GROUP_ALL);
-        
-        GRP_MAP::iterator git = (*it).second.begin();
-        for (; git!=(*it).second.end(); ++git) {
-            int childHndl = (*git).first;
-            Group *grp = (*git).second;
-
-            Group diff(*grp);
-            diff.Delete(total);
-
-            Group intersect(*grp);
-            intersect.Delete(diff);
-
-            if (generalInfo[group].find(childHndl) == generalInfo[group].end()) {
-                // if not found
-                if (!intersect.empty()) { // if not empty
-                    Group *uni = new Group();
-                    uni->Add(intersect);
-                    generalInfo[newgroup][childHndl] = uni;
-                }
-            } else {
-                if (!intersect.empty()) { // if not empty
-                    Group *uni = new Group(*grp);
-                    uni->Add(intersect);
-                    generalInfo[newgroup][childHndl] = uni;
-                } else {
-                    Group *uni = new Group(*grp);
-                    generalInfo[newgroup][childHndl] = uni;
-                }
-            }
-        }
-
-        // should always be true
-        hasMember = true;
-    } else if (op == SCI_INTERSECTION) {
-        GRP_MAP_MAP::iterator it = generalInfo.find(group);
-        
-        GRP_MAP::iterator git = (*it).second.begin();
-        for (; git!=(*it).second.end(); ++git) {
-            int childHndl = (*git).first;
-            Group *grp = (*git).second;
-
-            Group diff(*grp);
-            diff.Delete(total);
-
-            Group *intersect = new Group(*grp);
-            intersect->Delete(diff);
-            if (!intersect->empty()) { // if not empty
-                generalInfo[newgroup][childHndl] = intersect;
-                hasMember = true;
-            } else {
-                delete intersect;
-            }
-        }
-    } else if (op == SCI_DIFFERENCE) {
-        GRP_MAP_MAP::iterator it = generalInfo.find(group);
-
-        GRP_MAP::iterator git = (*it).second.begin();
-        for (; git!=(*it).second.end(); ++git) {
-            int childHndl = (*git).first;
-            Group *grp = (*git).second;
-
-            Group *diff = new Group(*grp);
-            diff->Delete(total);
-            if (!diff->empty()) { // if not empty
-                generalInfo[newgroup][childHndl] = diff;
-                hasMember = true;
-            } else {
-                delete diff;
-            }
-        }
-    }
-
-    int rc = SCI_SUCCESS;
-    if (hasMember) {
-        reset(newgroup);
-    } else {
-        rc = SCI_ERR_GROUP_EMPTY;
-    }
-
-    unlock();
-
-    return rc;
-}
-
-void DistributedGroup::initSubGroup(int successor_id, int start_be_id, int end_be_id)
-{
-    lock();
-
-    // init generalInfo
-    Group *grp = new Group();
-    grp->Add(Range(start_be_id, end_be_id+1));
-    generalInfo[SCI_GROUP_ALL][successor_id] = grp;
-
-    // init beListInfo & beInfo
-    for (int id=start_be_id; id<=end_be_id; id++) {
-        beListInfo[SCI_GROUP_ALL].push_back(id);
-    }
-    if (beInfo.find(SCI_GROUP_ALL) == beInfo.end()) {
-        beInfo[SCI_GROUP_ALL] = (end_be_id - start_be_id + 1);
-    } else {
-        beInfo[SCI_GROUP_ALL] += (end_be_id - start_be_id + 1);
-    }
-
-    // init successorListInfo & successorInfo
-    if (successorInfo.find(SCI_GROUP_ALL) == successorInfo.end()) {
-        successorInfo[SCI_GROUP_ALL] = 0;
-    }
-    
-    if (successor_id != VALIDBACKENDIDS) {
-        successorListInfo[SCI_GROUP_ALL].push_back(successor_id);
-        successorInfo[SCI_GROUP_ALL] += 1;
-    } else {
-        for (int id=start_be_id; id<=end_be_id; id++) {
-            successorListInfo[SCI_GROUP_ALL].push_back(id);
-        }
-        successorInfo[SCI_GROUP_ALL] += (end_be_id - start_be_id + 1);
-    }
-
-    unlock();
-}
-
-void DistributedGroup::addBE(sci_group_t group, int successor_id, int be_id)
-{
-    lock();
-
-    GRP_MAP_MAP::iterator it = generalInfo.find(group);
-    if (generalInfo.find(group) == generalInfo.end()) {
-        Group *grp = new Group();
-        grp->Add(be_id);
-        generalInfo[group][successor_id] = grp;
-    } else {
-        GRP_MAP::iterator git = (*it).second.find(successor_id);
-        if (git == (*it).second.end()) {
-            Group *grp = new Group();
-            grp->Add(be_id);
-            ((*it).second)[successor_id] = grp;
-        } else {
-            (*git).second->Add(be_id);
-        }
-    }
-    reset(group);
-
-    unlock();
-}
-
-void DistributedGroup::removeBE(int be_id)
-{
-    lock();
-    
-    // this function will remove all empty groups after 'be_id' is removed
-    GRP_MAP_MAP::iterator it = generalInfo.begin();
-    vector<sci_group_t> junkGrps;
-    for(; it != generalInfo.end(); ++it) {
-        GRP_MAP::iterator git = (*it).second.begin();
-        vector<int> junkSubGrps;
-        for (; git != (*it).second.end(); ++git) {
-            Group *grp = (*git).second;
-            grp->Delete(be_id);
-            if (grp->size() == 0) {
-                junkSubGrps.push_back((*git).first);
-            }
-        }
-        
-        for (int j=0; j<(int) junkSubGrps.size(); j++) {
-            if ((*it).first == SCI_GROUP_ALL) {
-                if (junkSubGrps[j] >= 0) { // back end id
-                    delete ((*it).second)[junkSubGrps[j]];
-                    (*it).second.erase(junkSubGrps[j]);
-                }
-            } else {
-                delete ((*it).second)[junkSubGrps[j]];
-                (*it).second.erase(junkSubGrps[j]);
-            }
-        }
-
-        if ((*it).second.size() == 0) {
-            junkGrps.push_back((*it).first);
-        }
-    }
-    for (int i=0; i<(int) junkGrps.size(); i++) {
-        generalInfo.erase(junkGrps[i]);
-        beInfo.erase(junkGrps[i]);
-        successorInfo.erase(junkGrps[i]);
-        beListInfo.erase(junkGrps[i]);
-        successorListInfo.erase(junkGrps[i]);
-    }
-
-    resetAll();
-
-    unlock();
-}
-
-void DistributedGroup::dropSuccessor(int successor_id)
-{
-    lock();
-    
-    // delete all group inforamtion related to 'successor_id'
-    if (successor_id >= 0) {
-        GRP_MAP_MAP::iterator it = generalInfo.begin();
-        for (; it!=generalInfo.end(); ++it) {
-            GRP_MAP::iterator git = (*it).second.find(VALIDBACKENDIDS);
-            if (git != (*it).second.end()) {
-                (*git).second->Delete(successor_id);
-                reset((*it).first);
-            }
-        }
-    } else {
-        GRP_MAP_MAP::iterator it = generalInfo.begin();
-        for (; it!=generalInfo.end(); ++it) {
-            GRP_MAP::iterator git = (*it).second.find(successor_id);
-            if (git != (*it).second.end()) {
-                delete (*git).second;
-                (*it).second.erase(successor_id);
-                reset((*it).first);
-            }
-        }
-    }
-
-    unlock();
-}
-
-void DistributedGroup::merge(int successor_id, DistributedGroup & dgroup, bool overwrite)
-{
-    lock();
-    
-    // overwrite - whether or not use the information from 'group' if group id does not exist
-    GRP_MAP_MAP::iterator dit = dgroup.generalInfo.begin();
-    for(; dit != dgroup.generalInfo.end(); ++dit) {
-        GRP_MAP_MAP::iterator it = generalInfo.find((*dit).first);
-        if (it == generalInfo.end()) {
-            // if this group id does not exist here
-            if (overwrite) {
-                if (successor_id >= 0) {
-                    Group *group = new Group();
-                    group->Add(successor_id);
-                    
-                    generalInfo[(*dit).first][VALIDBACKENDIDS] = group;
-                } else {
-                    Group *group = new Group();
-                    GRP_MAP::iterator git = (*dit).second.begin();
-                    for (; git != (*dit).second.end(); ++git) {
-                        group->Add(*((*git).second));
-                    }
-                
-                    generalInfo[(*dit).first][successor_id] = group;
-                }
-                reset((*dit).first);
-            } else {
-                continue;
-            }
-        } else {
-            // or this group does exist here
-            if (successor_id >= 0) {
-                if ((*it).second.find(VALIDBACKENDIDS) == (*it).second.end()) {
-                    ((*it).second)[VALIDBACKENDIDS] = new Group();
-                }
-                ((*it).second)[VALIDBACKENDIDS]->Add(successor_id);
-
-                GRP_MAP::iterator git = (*it).second.begin();
-                for (; git != (*it).second.end(); ++git) {
-                    if ((*git).first != VALIDBACKENDIDS) {
-                        (*git).second->Delete(successor_id);
-                    }
-                }
-            } else {
-                if ((*it).second.find(successor_id) == (*it).second.end()) {
-                    ((*it).second)[successor_id] = new Group();
-                }
-                GRP_MAP::iterator git = (*dit).second.begin();
-                for (; git != (*dit).second.end(); ++git) {
-                    ((*it).second)[successor_id]->Add(*((*git).second));
-                }
-                
-                git = (*it).second.begin();
-                for (; git != (*it).second.end(); ++git) {
-                    if ((*git).first != successor_id) {
-                        Group *grp = ((*it).second)[successor_id];
-                        (*git).second->Delete(*grp);
-                    }
-                }
-            }
-            reset((*dit).first);
-        }
-    }
-
-    unlock();
-}
-
-bool DistributedGroup::isGroupExist(sci_group_t group)
-{
-    bool rc = false;
-
-    lock();
-    if (generalInfo.find(group) != generalInfo.end()) {
-        rc = true;
-    }
-    unlock();
-
-    return rc;
-}
-
-bool DistributedGroup::isSuccessorExist(int successor_id)
-{
-    bool rc = false;
-
-    lock();
-    GRP_MAP_MAP::iterator it = generalInfo.find(SCI_GROUP_ALL);
-    if (it != generalInfo.end()) {
-        GRP_MAP::iterator git = (*it).second.find(successor_id);
-        if (git != (*it).second.end()) {
-            rc = true;
-        } else {
-            git = (*it).second.find(VALIDBACKENDIDS);
-            if (git != (*it).second.end()) {
-                Group *grp = (*git).second;
-                if (grp->HasMember(successor_id)) {
-                    rc = true;
-                }
-            }
-        }
-    }
-    unlock();
-
-    return rc;
-}
-
-int DistributedGroup::numOfBE(sci_group_t group)
-{
-    int num = 0;
-
-    lock();
-    INT_MAP::iterator it = beInfo.find(group);
-    if (it != beInfo.end()) {
-        num = (*it).second;
-    }
-    unlock();
-
-    return num;
-}
-
-int DistributedGroup::numOfSuccessor(sci_group_t group)
-{
-    int num = 0;
-
-    lock();
-    INT_MAP::iterator it = successorInfo.find(group);
-    if (it != successorInfo.end()) {
-        num = (*it).second;
-    }
-    unlock();
-
-    return num;
-}
-
-int DistributedGroup::numOfBEOfSuccessor(int successor_id)
-{
-    int num = 0;
-    
-    lock();
-    GRP_MAP_MAP::iterator it = generalInfo.find(SCI_GROUP_ALL);
-    if (it != generalInfo.end()) {
-        GRP_MAP::iterator git = (*it).second.find(successor_id);
-        if (git != (*it).second.end()) {
-            num = (*git).second->size();
-        }
-    }
-    unlock();
-
-    return num;
-}
-
-void DistributedGroup::retrieveBEList(sci_group_t group, int * ret_val)
-{
-    lock();
-    INTLIST_MAP::iterator it = beListInfo.find(group);
-    if (it != beListInfo.end()) {
-        for (int i=0; i<(int) (*it).second.size(); i++) {
-            ret_val[i] = ((*it).second)[i];
-        }
-    }
-    unlock();
-}
-
-void DistributedGroup::retrieveSuccessorList(sci_group_t group, int * ret_val)
-{
-    lock();
-    INTLIST_MAP::iterator it = successorListInfo.find(group);
-    if (it != successorListInfo.end()) {
-        for (int i=0; i<(int) (*it).second.size(); i++) {
-            ret_val[i] = ((*it).second)[i];
-        }
-    }
-    unlock();
-}
-
-int DistributedGroup::querySuccessorId(int be_id)
-{
-    int id = INVLIDSUCCESSORID;
-
-    lock();
-    GRP_MAP_MAP::iterator it = generalInfo.find(SCI_GROUP_ALL);
-    if (it != generalInfo.end()) {
-        GRP_MAP::iterator git = (*it).second.begin();
-        for (; git!=(*it).second.end(); ++git) {
-            Group *grp = (*git).second;
-            if (grp->HasMember(be_id)) {
-                id = (*git).first;
-                break;
-            }
-        }
-    }
-    unlock();
-
-    return id;
-}
-
-void DistributedGroup::dump()
-{
-    printf("Here below is the distributed group information (pid %d):\n\n", parentId);
-
-    GRP_MAP_MAP::iterator it = generalInfo.begin();
-    for (; it != generalInfo.end(); ++it) {
-        printf("[group id %d]:\n", (*it).first);
-        printf("\tnum of back ends: %d\n", beInfo[(*it).first]);
-        printf("\tnum of successors: %d\n", successorInfo[(*it).first]);
-        
-        GRP_MAP::iterator git = (*it).second.begin();
-        for (; git != (*it).second.end(); ++git) {
-            printf("\tchild id %d: ", (*git).first);
-
-            Group::iterator ggit = (*git).second->begin();
-            for (; ggit != (*git).second->end(); ggit++) {
-                printf("%d ", (*ggit));
-            }
-
-            printf("\n");
-        }
-    }
-
-    printf("\nEnd\n\n");
-}
-
-void DistributedGroup::reset(sci_group_t group)
-{  
-    int num;
-    
-    // reset beListInfo & beInfo
-    beListInfo.erase(group);
-    num = 0;
-    
-    GRP_MAP::iterator it = generalInfo[group].begin();
-    for (; it!=generalInfo[group].end(); ++it) {
-        Group *grp = (*it).second;
-        Group::iterator git = grp->begin();
-        for (; git!=grp->end(); git++) {
-            beListInfo[group].push_back((*git));
-            num++;
-        }
-    }
-
-    beInfo[group] = num;
-
-    // reset successorListInfo & successorInfo
-    successorListInfo.erase(group);
-    num = 0;
-    
-    it = generalInfo[group].begin();
-    for (; it!=generalInfo[group].end(); ++it) {
-        int hndl = (*it).first;
-        if (hndl != VALIDBACKENDIDS) {
-            successorListInfo[group].push_back(hndl);
-            num++;
-        } else {
-            Group *grp = (*it).second;
-            Group::iterator git = grp->begin();
-            for (; git!=grp->end(); git++) {
-                successorListInfo[group].push_back((*git));
-                num++;
-            }
-        }
-    }
-
-    successorInfo[group] = num;
-}
-
-void DistributedGroup::resetAll()
-{
-    GRP_MAP_MAP::iterator it = generalInfo.begin();
-    for(; it != generalInfo.end(); ++it) {
-        reset((*it).first);
-    }
-}
-
-void DistributedGroup::lock()
-{
-    ::pthread_mutex_lock(&mtx);
-}
-
-void DistributedGroup::unlock()
-{
-    ::pthread_mutex_unlock(&mtx);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/dgroup.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/dgroup.hpp
deleted file mode 100644
index b6e45a3..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/dgroup.hpp
+++ /dev/null
@@ -1,116 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Distributed Group
-
- Description: Distributed group manipulation (Note: STL does not guarantee 
-              the safety of several readers & one writer cowork together, 
-              and user threads can query group information at runtime, 
-              so it's necessary to add a lock to protect these read & write 
-              operations).
-   
- Author: Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/08/09 nieyy        Initial code (F156654)
-
-****************************************************************************/
-
-#ifndef _DGROUP_HPP
-#define _DGROUP_HPP
-
-#include <pthread.h>
-
-#include <map>
-#include <vector>
-
-#include "sci.h"
-#include "general.hpp"
-
-using namespace std;
-
-class Group;
-class Message;
-
-class DistributedGroup
-{
-    public:
-        typedef map<int, Group*> GRP_MAP;
-        typedef map<sci_group_t, GRP_MAP> GRP_MAP_MAP;
-        typedef map<sci_group_t, int> INT_MAP;
-        typedef map<sci_group_t, vector<int> > INTLIST_MAP;
-        
-    private:
-        int                   parentId;
-        GRP_MAP_MAP           generalInfo;
-        
-        INT_MAP               beInfo;
-        INT_MAP               successorInfo;
-
-        INTLIST_MAP           beListInfo;
-        INTLIST_MAP           successorListInfo;
-
-        pthread_mutex_t       mtx;
-
-    public:
-        DistributedGroup(int pid);
-        ~DistributedGroup();
-        
-        void setPID(int id);
-        int getPID();
-
-        Message * packMsg();
-        void unpackMsg(Message &msg);
-
-        // write operations
-        void create(int num_bes, int *be_list, sci_group_t group);
-        void remove(sci_group_t group);
-        int operate(sci_group_t group1, sci_group_t group2, sci_op_t op, 
-            sci_group_t newgroup);
-        int operateExt(sci_group_t group, int num_bes, int *be_list, 
-            sci_op_t op, sci_group_t newgroup);
-
-        void initSubGroup(int successor_id, int start_be_id, int end_be_id);
-        void addBE(sci_group_t group, int successor_id, int be_id);
-        void removeBE(int be_id);
-        void dropSuccessor(int successor_id);
-
-        void merge(int successor_id, DistributedGroup &dgroup, bool overwrite);
-
-        // read operations
-        bool isGroupExist(sci_group_t group);
-        bool isSuccessorExist(int successor_id);
-        
-        int numOfBE(sci_group_t group);
-        int numOfSuccessor(sci_group_t group);
-        int numOfBEOfSuccessor(int successor_id);
-        
-        void retrieveBEList(sci_group_t group, int *ret_val);
-        void retrieveSuccessorList(sci_group_t, int *ret_val);
-
-        int querySuccessorId(int be_id);
-
-        // for debugging purpose
-        void dump();
-
-    private:
-        void reset(sci_group_t group);
-        void resetAll();
-
-        void lock();
-        void unlock();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/errdetector.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/errdetector.cpp
deleted file mode 100644
index 629e6ae..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/errdetector.cpp
+++ /dev/null
@@ -1,352 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: ErrorDetector
-
- Description: The functions of error detector include:
-     a. detect connection broken events from peer processes.
-     b. detect heartbeat packets from peer processes
-     c. propagate failure data to peer processes
-     d. propagate recovery information to peer processes
-     e. establish new connection dynamically
-     f. accept error injection data for testing purposes
-     g. delegate eror information to error handling thread (EHT)
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   04/28/09 nieyy       Initial code (F156654)
-
-****************************************************************************/
-
-#include "errdetector.hpp"
-#include <assert.h>
-#include <stdlib.h>
-
-#include "log.hpp"
-#include "exception.hpp"
-#include "socket.hpp"
-#include "packer.hpp"
-#include "stream.hpp"
-
-#include "ctrlblock.hpp"
-#include "routinglist.hpp"
-#include "statemachine.hpp"
-#include "message.hpp"
-#include "queue.hpp"
-#include "parent.hpp"
-#include "errevent.hpp"
-#include "topology.hpp"
-#include "initializer.hpp"
-
-ErrorDetector::ErrorDetector(int hndl) 
-    : Processor(hndl)
-{
-    name = "ErrorDetector";
-
-    inQueue = NULL;
-    outQueue = NULL;
-
-    parent = NULL;
-    uncleList = NULL;
-    uncleList2 = NULL;
-
-    needForward = false;
-}
-
-ErrorDetector::~ErrorDetector()
-{
-    if (parent) {
-        delete parent;
-    }
-    if (uncleList) {
-        delete uncleList;
-    }
-    if (uncleList2) {
-        delete uncleList2;
-    }
-}
-
-Message * ErrorDetector::read()
-{
-    assert(inQueue);
-
-    Message *msg = NULL;
-
-    msg = inQueue->consume();
-    
-    return msg;
-}
-
-void ErrorDetector::process(Message * msg)
-{
-    assert(msg);
-
-    needForward = false;
-    switch(msg->getType()) {
-        case Message::UNCLE:
-        case Message::UNCLE_LIST:
-        case Message::PARENT:
-            processParentInfo(msg);
-            break;
-        case Message::ERROR_EVENT:
-            processErrorEvent(msg);
-            break;
-        case Message::SHUTDOWN:
-        case Message::KILLNODE:
-            processErrorInjection(msg);
-            break;
-        case Message::GROUP_MERGE:
-            // transfer this message to relay processor
-            msg->setRefCount(msg->getRefCount() + 1);
-            gCtrlBlock->getRouterInQueue()->produce(msg);
-            break;
-        default:
-            log_error("Processor %s: received unknown command", name.c_str());
-            break;
-    }
-}
-
-void ErrorDetector::write(Message * msg)
-{
-    if (needForward) {
-        if (outQueue) {
-            msg->setRefCount(msg->getRefCount() + 1);
-        }
-        if (gCtrlBlock->getMonitorInQueue()) {
-            msg->setRefCount(msg->getRefCount() + 1);
-            gCtrlBlock->getMonitorInQueue()->produce(msg);
-        }
-        if (outQueue) {
-            outQueue->produce(msg);
-        }
-    }
-    inQueue->remove();
-}
-
-void ErrorDetector::seize()
-{
-    gStateMachine->parse(StateMachine::FATAL_EXCEPTION);
-}
-
-void ErrorDetector::clean()
-{
-    // no action
-}
-
-bool ErrorDetector::isActive()
-{
-    return gCtrlBlock->isEnabled() || (inQueue->getSize() > 0);
-}
-
-void ErrorDetector::processParentInfo(Message * msg)
-{
-    needForward = false;
-    if (msg->getType() == Message::UNCLE) {
-        // accumulate uncle information of my grandsons
-        Parent *p = new Parent();
-        p->unpackMsg(*msg);
-
-        if (NULL == uncleList2) {
-            uncleList2 = new ParentList();
-            uncleList2->setLevel(gCtrlBlock->getTopology()->getLevel());
-        }
-        uncleList2->add(p);
-
-        if (uncleList2->isAllGathered()) {
-            // pack message and bcast it
-            Message *unclesmsg = uncleList2->packMsg();
-            gCtrlBlock->getRouterInQueue()->produce(unclesmsg);
-        }
-    } else if (msg->getType() == Message::UNCLE_LIST) {
-        ParentList *tmpList = new ParentList();
-        tmpList->unpackMsg(*msg);
-
-        bool ignore = true;
-        if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_END) {
-            ignore = false;
-        } else if (gCtrlBlock->getTopology()->getLevel() > tmpList->getLevel()+1) {
-            ignore = false;
-        }
-
-        if (ignore) {
-            // if it is from my parent, just bcast it and ignore it
-            msg->setRefCount(msg->getRefCount() + 1);
-            gCtrlBlock->getRouterInQueue()->produce(msg);
-            delete tmpList;
-        } else {
-            // else it is from my grandparent, it's what I need
-            if (uncleList) {
-                delete uncleList;
-                uncleList = NULL;
-            }
-            uncleList = tmpList;
-        }
-    } else {
-        if (parent) {
-            delete parent;
-            parent = NULL;
-        }
-        parent = new Parent();
-        parent->unpackMsg(*msg);
-    }
-}
-
-void ErrorDetector::processErrorEvent(Message * msg)
-{
-    ErrorEvent event;
-    event.unpackMsg(*msg);
-
-    Message *notifymsg = NULL;
-
-    needForward = true;
-    switch(event.getErrCode()) {
-        case SCI_ERR_PARENT_BROKEN:
-            // if I am an agent, broadcast this message to all my children
-            if (gCtrlBlock->getMyRole() == CtrlBlock::AGENT) {
-                msg->setRefCount(msg->getRefCount() + 1);
-                gCtrlBlock->getRouterInQueue()->produce(msg);
-            }
-            // and if this event is generated by myself, try to recover the connection
-            if (event.getNodeID() == gCtrlBlock->getMyHandle()) {
-                recover();
-            }
-            break;
-        case SCI_ERR_CHILD_BROKEN:
-            // notify router processor to drop groups related to this child, use 'id' field to
-            // store the successor id information
-            notifymsg = new Message();
-            notifymsg->build(SCI_FILTER_NULL, SCI_GROUP_ALL, 0, NULL, NULL, Message::GROUP_DROP, 
-                event.getNodeID());
-            gCtrlBlock->getRouterInQueue()->produce(notifymsg);
-            
-            // and if I am an agent, upload this message to my parent
-            if (gCtrlBlock->getMyRole() == CtrlBlock::AGENT) {
-                msg->setRefCount(msg->getRefCount() + 1);
-                gCtrlBlock->getFilterOutQueue()->produce(msg);
-            }
-            break;
-        case SCI_ERR_RECOVERED:
-        case SCI_ERR_RECOVER_FAILED:
-            if (gCtrlBlock->getMyRole() == CtrlBlock::AGENT) {
-                if (msg->getID() == gCtrlBlock->getMyHandle()) {
-                    // from my parent, bcast to my children
-                    msg->setRefCount(msg->getRefCount() + 1);
-                    gCtrlBlock->getRouterInQueue()->produce(msg);
-                } else {
-                    // from my child, upload to my parent
-                    msg->setRefCount(msg->getRefCount() + 1);
-                    gCtrlBlock->getFilterOutQueue()->produce(msg);
-                }
-            }
-            break;
-        default:
-            break;
-    }
-}
-
-void ErrorDetector::processErrorInjection(Message * msg)
-{
-    Packer packer(msg->getContentBuf());
-
-    int nodeId = packer.unpackInt();
-    if (nodeId == gCtrlBlock->getMyHandle()) {
-        if (msg->getType() == Message::SHUTDOWN) {
-            // if i am not a front end, shutdown the connection between me and my parent
-            if (gCtrlBlock->getMyRole() != CtrlBlock::FRONT_END) {
-                gCtrlBlock->getParentStream()->stop();
-            }
-        } else {
-            // force this node to exit
-            ::_exit(1);
-        }
-    } else {
-        // if i am not a back end, bcast messages to all my children
-        if (gCtrlBlock->getMyRole() != CtrlBlock::BACK_END) {
-            msg->setRefCount(msg->getRefCount() + 1);
-            gCtrlBlock->getRouterInQueue()->produce(msg);
-        }
-    }
-}
-
-void ErrorDetector::recover()
-{
-    Stream *stream = NULL;
-    int pid;
-
-    if (parent) {
-        // first try my parent
-        stream = parent->connect();
-        pid = parent->getNodeID();
-    }
-    if ((!stream) && uncleList) {
-        // if can't connect to parent, then try my uncles
-        stream = uncleList->select(&pid);
-    }
-
-    // generate an error message and put it into error message queue
-    ErrorEvent event;
-    event.setNodeID(gCtrlBlock->getMyHandle());
-    event.setBENum(gRoutingList->numOfBE(SCI_GROUP_ALL));
-    
-    if (stream) {
-        event.setErrCode(SCI_ERR_RECOVERED);
-
-        // reset the corresponding processor
-        if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_END) {
-            gInitializer->recoverBE(stream);
-        } else {
-            gInitializer->recoverAgent(stream);
-        }
-
-        gCtrlBlock->registerStream(stream);
-        gCtrlBlock->setParentStream(stream);
-        gStateMachine->parse(StateMachine::RECOVER_OK);
-        gRoutingList->updateParentId(pid);
-    } else {
-        event.setErrCode(SCI_ERR_RECOVER_FAILED);
-        gStateMachine->parse(StateMachine::RECOVER_FAILED);
-    }
-
-    Message *msg = event.packMsg();
-    if (gCtrlBlock->getMyRole() == CtrlBlock::AGENT) {
-        msg->setRefCount(msg->getRefCount() + 1);
-        // bcast this message to all my successors
-        gCtrlBlock->getRouterInQueue()->produce(msg);
-        // upload this message to my parent
-        gCtrlBlock->getFilterOutQueue()->produce(msg);
-    } else if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_END) {
-        // forward this message to Error Handling Thread (EHT) if have
-        if (outQueue) {
-            msg->setRefCount(msg->getRefCount() + 1);
-            outQueue->produce(msg);
-        }
-        
-        // upload this message to my parent
-        gCtrlBlock->getRouterInQueue()->produce(msg);
-    } else {
-        assert(!"Should never be here");
-    }
-}
-
-void ErrorDetector::setInQueue(MessageQueue * queue)
-{
-    inQueue = queue;
-}
-
-void ErrorDetector::setOutQueue(MessageQueue * queue)
-{
-    outQueue = queue;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/errdetector.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/errdetector.hpp
deleted file mode 100644
index 9b256f3..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/errdetector.hpp
+++ /dev/null
@@ -1,78 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: ErrorDetector
-
- Description: The functions of error detector include:
-     a. detect connection broken events from peer processes.
-     b. detect heartbeat packets from peer processes
-     c. propagate failure data to peer processes
-     d. propagate recovery information to peer processes
-     e. establish new connection dynamically
-     f. accept error injection data for testing purposes
-     g. delegate eror information to error handling thread (EHT)
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   04/28/09 nieyy       Initial code (F156654)
-
-****************************************************************************/
-
-#ifndef _ERRORDETECTOR_HPP
-#define _ERRORDETECTOR_HPP
-
-#include "processor.hpp"
-
-class Stream;
-class MessageQueue;
-class Parent;
-class ParentList;
-
-class ErrorDetector : public Processor 
-{
-    private:
-        MessageQueue        *inQueue;
-        MessageQueue        *outQueue; // in queue for error handler thread
-
-        Parent              *parent;
-        ParentList          *uncleList; // uncle list of mine
-        ParentList          *uncleList2; // uncle list of my grandsons
-
-        bool                needForward;
-
-    public:
-        ErrorDetector(int hndl = -1);
-        ~ErrorDetector();
-
-        virtual Message * read();
-        virtual void process(Message *msg);
-        virtual void write(Message *msg);
-        virtual void seize();
-        virtual void clean();
-
-        virtual bool isActive();
-
-        void processParentInfo(Message *msg);
-        void processErrorEvent(Message *msg);
-        void processErrorInjection(Message *msg);
-
-        void recover();
-
-        void setInQueue(MessageQueue *queue);
-        void setOutQueue(MessageQueue *queue);
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/errevent.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/errevent.cpp
deleted file mode 100644
index 275eec0..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/errevent.cpp
+++ /dev/null
@@ -1,100 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Event
-
- Description: Error events.
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   04/29/09 nieyy        Initial code (F156654)
-
-****************************************************************************/
-
-#include "errevent.hpp"
-#include <stdlib.h>
-#include <math.h>
-#include <assert.h>
-#include <ctype.h>
-#include <string.h>
-
-#include "packer.hpp"
-#include "log.hpp"
-
-#include "message.hpp"
-
-ErrorEvent::ErrorEvent()
-{
-}
-
-void ErrorEvent::setErrCode(int code)
-{
-    err_code = code;
-}
-
-void ErrorEvent::setNodeID(int id)
-{
-    node_id = id;
-}
-
-void ErrorEvent::setBENum(int num)
-{
-    num_bes = num;
-}
-
-Message * ErrorEvent::packMsg()
-{
-    Packer packer;
-
-    packer.packInt(err_code);
-    packer.packInt(node_id);
-    packer.packInt(num_bes);
-
-    char *bufs[1];
-    int sizes[1];
-    
-    bufs[0] = packer.getPackedMsg();
-    sizes[0] = packer.getPackedMsgLen();
-
-    Message *msg = new Message();
-    msg->build(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes, Message::ERROR_EVENT);
-    delete [] bufs[0];
-    return msg;
-}
-
-void ErrorEvent::unpackMsg(Message &msg) 
-{
-    Packer packer(msg.getContentBuf());
-
-    err_code = packer.unpackInt();
-    node_id = packer.unpackInt();
-    num_bes = packer.unpackInt();
-}
-
-int ErrorEvent::getErrCode()
-{
-    return err_code;
-}
-
-int ErrorEvent::getNodeID()
-{
-    return node_id;
-}
-
-int ErrorEvent::getBENum()
-{
-    return num_bes;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/errevent.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/errevent.hpp
deleted file mode 100644
index eca337a..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/errevent.hpp
+++ /dev/null
@@ -1,55 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Event
-
- Description: Error events.
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   04/29/09 nieyy        Initial code (F156654)
-
-****************************************************************************/
-
-#ifndef _ERROREVENT_HPP
-#define _ERROREVENT_HPP
-
-#include "sci.h"
-
-class Message;
-
-class ErrorEvent 
-{
-    private:
-        int                 err_code;
-        int                 node_id;
-        int                 num_bes;
-
-    public:
-        ErrorEvent();
-        void setErrCode(int code);
-        void setNodeID(int id);
-        void setBENum(int num);
-        
-        Message * packMsg();
-        void unpackMsg(Message &msg);
-        
-        int getErrCode();
-        int getNodeID();
-        int getBENum();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/errhandler.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/errhandler.cpp
deleted file mode 100644
index d22eb26..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/errhandler.cpp
+++ /dev/null
@@ -1,107 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: ErrorHandler
-
- Description: The functions of error handler include:
-     a. call user-defined error handlers to process error messages
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   04/28/09 nieyy       Initial code (F156654)
-
-****************************************************************************/
-
-#include "errhandler.hpp"
-#include <assert.h>
-
-#include "log.hpp"
-#include "exception.hpp"
-#include "socket.hpp"
-
-#include "ctrlblock.hpp"
-#include "statemachine.hpp"
-#include "message.hpp"
-#include "stream.hpp"
-#include "queue.hpp"
-#include "errevent.hpp"
-
-ErrorHandler::ErrorHandler(int hndl) 
-    : Processor(hndl)
-{
-    name = "ErrorHandler";
-
-    inQueue = NULL;
-
-    if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-        hndlr = gCtrlBlock->getEndInfo()->fe_info.err_hndlr;
-    } else if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_END) {
-        hndlr = gCtrlBlock->getEndInfo()->be_info.err_hndlr;
-    } else {
-        assert(!"Should never go here!");
-    }
-}
-
-Message * ErrorHandler::read()
-{
-    assert(inQueue);
-
-    Message *msg = NULL;
-    msg = inQueue->consume();
-    return msg;
-}
-
-void ErrorHandler::process(Message * msg)
-{
-    assert(msg);
-
-    ErrorEvent event;
-    switch(msg->getType()) {
-        case Message::ERROR_EVENT:
-            event.unpackMsg(*msg);
-            hndlr(event.getErrCode(), event.getNodeID(), event.getBENum());
-            break;
-        default:
-            log_error("Processor %s: received unknown command", name.c_str());
-            break;
-    }
-}
-
-void ErrorHandler::write(Message * msg)
-{
-    // almost no action
-    inQueue->remove();
-}
-
-void ErrorHandler::seize()
-{
-    gStateMachine->parse(StateMachine::FATAL_EXCEPTION);
-}
-
-void ErrorHandler::clean()
-{
-    // no action
-}
-
-bool ErrorHandler::isActive()
-{
-    return gCtrlBlock->isEnabled() || (inQueue->getSize() > 0);
-}
-
-void ErrorHandler::setInQueue(MessageQueue * queue)
-{
-    inQueue = queue;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/errhandler.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/errhandler.hpp
deleted file mode 100644
index 336b564..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/errhandler.hpp
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: ErrorHandler
-
- Description: The functions of error handler include:
-     a. call user-defined error handlers to process error messages
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   04/28/09 nieyy       Initial code (F156654)
-
-****************************************************************************/
-
-#ifndef _ERRORHANDLER_HPP
-#define _ERRORHANDLER_HPP
-
-#include "sci.h"
-#include "processor.hpp"
-
-class Stream;
-class MessageQueue;
-
-class ErrorHandler : public Processor 
-{
-    private:
-        MessageQueue        *inQueue;
-
-        SCI_err_hndlr       *hndlr;
-
-    public:
-        ErrorHandler(int hndl = -1);
-
-        virtual Message * read();
-        virtual void process(Message *msg);
-        virtual void write(Message *msg);
-        virtual void seize();
-        virtual void clean();
-
-        virtual bool isActive();
-
-        void setInQueue(MessageQueue *queue);
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/errinjector.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/errinjector.cpp
deleted file mode 100644
index f012227..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/errinjector.cpp
+++ /dev/null
@@ -1,202 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: ErrorInjector
-
- Description: The functions of error handler include:
-     a. accept user commands and sent to destination nodes
-     b. prompt failure data to use with time stamp
-     c. prompt recovery data to user with time stamp
-   
- Author: CSH
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/11/09 CSH       Initial code (F156654)
-
-****************************************************************************/
-
-#include <assert.h>
-
-#include <sys/socket.h>
-#include <sys/wait.h>
-
-#include "errinjector.hpp"
-#include "errmonitor.hpp"
-
-#include "queue.hpp"
-#include "socket.hpp"
-#include "stream.hpp"
-#include "log.hpp"
-#include "packer.hpp"
-#include "message.hpp"
-
-#include "ctrlblock.hpp"
-
-const int INJECTION_PORT = 6689;
-const int KILLNODE = 1;
-const int SHUTDOWN = 2;
-
-ErrorInjector::ErrorInjector()
-{
-    injOutErrQueue=NULL;
-    monitor=NULL;
-
-    MessageQueue *monitorInQ = new MessageQueue();
-    monitorInQ->setName("monitorInQ");
-    gCtrlBlock->setMonitorInQueue(monitorInQ);
-    gCtrlBlock->registerQueue(monitorInQ);
-}
-
-ErrorInjector::~ErrorInjector()
-{
-}
-
-void ErrorInjector::run()
-{
-    int child = -1;
-    int port = INJECTION_PORT;
-    int sockfd;
-    try {
-        sockfd = socket.listen(port);
-    } catch (SocketException &e) {
-        log_error("socket exception %s", e.getErrMsg().c_str());
-        return;
-    } catch (...) {
-        log_error("unknown exception");
-        return;
-    }
-    listenSockFd = sockfd;
-
-    log_crit("Error injector is running");
-    while (getState()) {
-        try {
-            child = socket.accept(sockfd);
-            childSockFd = child;
-        } catch (SocketException &e) {
-            log_error("socket exception %s", e.getErrMsg().c_str());
-            break;
-        } catch (...) {
-            log_error("unknown exception");
-            break;
-        }
-        
-        if (child < 0)
-           continue;
-        
-        //create errorMonitor
-        monitor = new ErrorMonitor(child);
-        monitor->start();
-        //create stream
-        Stream *stream = new Stream();
-        stream->init(child);
-
-        // process user's commands once a connection is established
-        process(stream);
-        stream->stop();
-        monitor->join();
-        delete monitor;
-        monitor=NULL;
-    }
-
-    ::close(sockfd);
-    setState(false);
-}
-
-void ErrorInjector::process(Stream *stream)
-{        
-    int errInjectType;
-    int numArrSize;
-    int i;
-    int temp;
-    std::vector<int> numArr;
-    //assert(monitorStream);
-    while(1)
-    {    
-        try{
-             *stream>>errInjectType>>numArrSize;
-             for(i=0; i<numArrSize; i++)
-             {
-                 *stream>>temp;
-                 numArr.push_back(temp);
-             }
-             *stream>>endl;
-        }
-        catch (SocketException &e) {
-            log_error("error injector socket exception %s", e.getErrMsg().c_str());
-            monitor->setState(false);
-            gCtrlBlock->getMonitorInQueue()->produce();
-            break;
-        } catch (...) {
-            log_error("unknown exception");
-            monitor->setState(false);
-            gCtrlBlock->getMonitorInQueue()->produce();
-            break;
-        }
-        handleCommand(numArr, errInjectType);
-        numArr.clear();
-    }
-}
-
-void ErrorInjector::handleCommand(std::vector<int>& numArray, int errInjType)
-{
-    std::vector<int>::iterator it;
-    for(it=numArray.begin(); it!=numArray.end(); ++it)
-    {
-        handleItem(*it, errInjType);
-    }
-}
-
-void ErrorInjector::handleItem(int nodeId, int errInjType)
-{
-    Packer packer;
-    packer.packInt(nodeId);
-
-    char *bufs[1];
-    int sizes[1];
-    
-    bufs[0] = packer.getPackedMsg();
-    sizes[0] = packer.getPackedMsgLen();
-
-    Message *msg = new Message();
-    switch(errInjType){
-        case KILLNODE:  
-            msg->build(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes, Message::KILLNODE);
-            break;
-        case SHUTDOWN:  
-            msg->build(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes, Message::SHUTDOWN);
-            break;
-        default:
-            break;
-    }
-    assert(injOutErrQueue);
-    injOutErrQueue->produce(msg);
-    delete [] bufs[0];
-}
-
-int ErrorInjector::stop()
-{
-    ::shutdown(listenSockFd, SHUT_RDWR);
-    ::close(listenSockFd);
-    ::shutdown(childSockFd, SHUT_RDWR);
-    ::close(childSockFd);
-    setState(false);
-    return 0;
-}
-
-void ErrorInjector::setInjOutQueue(MessageQueue* queue)
-{
-    injOutErrQueue = queue;
-}
-
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/errinjector.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/errinjector.hpp
deleted file mode 100644
index 7d077bb..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/errinjector.hpp
+++ /dev/null
@@ -1,63 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: ErrorInjector
-
- Description: The functions of error handler include:
-     a. accept user commands and sent to destination nodes
-     b. prompt failure data to use with time stamp
-     c. prompt recovery data to user with time stamp
-   
- Author: CSH
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/11/09 CSH       Initial code (F156654)
-
-****************************************************************************/
-
-#ifndef _ERROTINJECTOR_HPP
-#define _ERROTINJECTOR_HPP
-
-#include "thread.hpp"
-#include "socket.hpp"
-#include <vector>
-
-class ErrorMonitor;
-class Stream;
-class MessageQueue;
-
-class ErrorInjector : public Thread 
-{
-    private:
-        Socket              socket;
-        int                 listenSockFd;
-        int                 childSockFd;
-        MessageQueue        *injOutErrQueue;
-        ErrorMonitor        *monitor;
-
-    public:
-        ErrorInjector();
-        virtual ~ErrorInjector();
-        
-        virtual void run();
-        int stop();
-        void process(Stream *stream);
-        void handleCommand(std::vector<int>& numArray, int errInjType);
-        void handleItem(int nodeId, int errInjType);
-        
-        void setInjOutQueue(MessageQueue* queue);
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/errmonitor.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/errmonitor.cpp
deleted file mode 100644
index 23f9413..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/errmonitor.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: ErrorInjector
-
- Description: The functions of error handler include:
-     a. accept user commands and sent to destination nodes
-     b. prompt failure data to use with time stamp
-     c. prompt recovery data to user with time stamp
-   
- Author: SuiHe Chen
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/11/09 chensuih   Initial code
-
-****************************************************************************/
-
-#include "errmonitor.hpp"
-#include <assert.h>
-
-#include <sys/time.h> 
-#include <time.h> 
-
-#include "stream.hpp"
-#include "log.hpp"
-#include "errevent.hpp"
-#include "ctrlblock.hpp"
-#include "socket.hpp"
-#include "message.hpp"
-#include "queue.hpp"
-#include "packer.hpp"
-
-#define DATE_TIME_DURATION_LEN      50
-
-ErrorMonitor::ErrorMonitor(int sockFd)
-{
-    socketFd = sockFd;
-}
-
-ErrorMonitor::ErrorMonitor()
-{
-}
-
-ErrorMonitor::~ErrorMonitor()
-{
-}
-
-void ErrorMonitor::run()
-{
-    log_crit("Error Monitor is running");
-    Stream stream;
-    stream.init(socketFd);
-    Message *msg = NULL;
-    ErrorEvent errEvt;
-    MessageQueue  *monitorInQueue;
-    monitorInQueue = gCtrlBlock->getMonitorInQueue();
-    assert(monitorInQueue);
-    while (getState()) {
-        msg = monitorInQueue->consume();
-        if (msg == NULL) 
-        {
-            continue;
-        }
-
-        errEvt.unpackMsg(*msg);
-        //after handle msg, will remove it.
-        monitorInQueue->remove();
-        try{
-            handleErrData(errEvt, stream);
-        }
-        catch (SocketException &e) {
-            log_error("socket exception %s", e.getErrMsg().c_str());
-            break;
-        } catch (...) {
-            log_error("unknown exception");
-            break;
-        } 
-    }
-    setState(false);
-}
-
-void ErrorMonitor::handleErrData(ErrorEvent &errEvent, Stream &stream)
-{
-    //failure or recovery time
-    time_t curr_time;                                           
-    struct tm *date;                         
-    char dateTimeDuration[DATE_TIME_DURATION_LEN];
-    curr_time = time( NULL );                                   
-    date = gmtime( &curr_time );
-    //stamp
-    struct timeval time_v;
-    ::gettimeofday(&time_v, NULL);
-    double stamp = time_v.tv_sec * 1e6  + time_v.tv_usec;
-
-    snprintf(dateTimeDuration, DATE_TIME_DURATION_LEN, "%02d:%02d:%02d(%.0lf)  ", 
-             date->tm_hour + 8, date->tm_min, date->tm_sec, stamp);
-    stream << errEvent.getErrCode() << errEvent.getNodeID() << errEvent.getBENum() << dateTimeDuration << endl;
-}
-
-
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/errmonitor.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/errmonitor.hpp
deleted file mode 100644
index 9c50abf..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/errmonitor.hpp
+++ /dev/null
@@ -1,51 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: ErrorInjector
-
- Description: The functions of error handler include:
-     a. accept user commands and sent to destination nodes
-     b. prompt failure data to use with time stamp
-     c. prompt recovery data to user with time stamp
-   
- Author: SuiHe Chen
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/11/09 chensuih  Initial code
-
-****************************************************************************/
-
-#ifndef _ERRMONITOR_HPP
-#define _ERRMONITOR_HPP
-
-#include "thread.hpp"
-
-class Stream;
-class ErrorEvent;
-
-class ErrorMonitor : public Thread 
-{
-    private:
-        int     socketFd;
-
-    public:
-        ErrorMonitor(int sockFd);
-        ErrorMonitor();
-        virtual ~ErrorMonitor();
-        virtual void run();
-        void handleErrData(ErrorEvent &errEvent, Stream &stream);
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/eventntf.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/eventntf.cpp
deleted file mode 100644
index a87aa07..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/eventntf.cpp
+++ /dev/null
@@ -1,121 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: EventNotify
-
- Description: Synchronization between threads
-   
- Author: Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   12/05/08 tuhongj      Initial code (D154660)
-
-****************************************************************************/
-
-#include "eventntf.hpp"
-#include <unistd.h>
-#include <string.h>
-#include <assert.h>
-
-#include "tools.hpp"
-
-EventNotify * EventNotify::notifier = NULL;
-
-EventNotify::EventNotify()
-    : serialNum(0)
-{
-    ::pthread_mutex_init(&mtx, NULL);
-    ::pthread_cond_init(&cond, NULL);
-    ::memset(serialTest, 0, sizeof(serialTest));
-}
-
-EventNotify::~EventNotify()
-{
-    ::pthread_cond_destroy(&cond);
-    ::pthread_mutex_destroy(&mtx);
-
-    notifier = NULL;
-}
-
-int EventNotify::allocate()
-{
-    int num;
-
-    lock();
-    serialNum = (serialNum + 1) % MAX_SERIAL_NUM;
-    serialNum = (serialNum == 0) ? 1 : serialNum;
-    num = serialNum;
-    unlock();
-
-    return num;
-}
-
-void EventNotify::freeze(int id, void *ret_val)
-{
-    lock();
-    serialTest[id].ret = ret_val;
-    serialTest[id].notified = false;
-    serialTest[id].freezed= true;
-    while(serialTest[id].notified == false) {
-        ::pthread_cond_wait(&cond, &mtx);
-    }
-    serialTest[id].freezed= false;
-    unlock();
-}
-
-void EventNotify::notify(int id)
-{
-    test(id);
-    lock();
-    serialTest[id].notified = true;
-    ::pthread_cond_broadcast(&cond); 
-    unlock();
-}
-
-void * EventNotify::getRetVal(int id)
-{
-    test(id);
-    return serialTest[id].ret;
-}
-
-bool EventNotify::test(int id)
-{
-    assert((id >= 0) && (id < MAX_SERIAL_NUM));
-    while (serialTest[id].freezed == false) {
-        /* Almost impossible running into here */
-        SysUtil::sleep(1000);
-    }
-    
-    return true;
-}
-
-void EventNotify::tryFreeze()
-{
-    lock();
-    while(serialTest[serialNum].freezed == true) {
-        ::pthread_cond_wait(&cond, &mtx);
-    }
-    unlock();
-}
-
-void EventNotify::lock()
-{
-    ::pthread_mutex_lock(&mtx);
-}
-
-void EventNotify::unlock()
-{
-    ::pthread_mutex_unlock(&mtx);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/eventntf.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/eventntf.hpp
deleted file mode 100644
index 9c31bcc..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/eventntf.hpp
+++ /dev/null
@@ -1,74 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: EventNotify
-
- Description: Synchronization between threads
-   
- Author: Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   12/05/08 tuhongj      Initial code (D154660)
-
-****************************************************************************/
-
-#ifndef _EVENTNTF_HPP
-#define _EVENTNTF_HPP
-
-#include <pthread.h>
-
-const int MAX_SERIAL_NUM = 256;
-
-struct serialNtfTest 
-{
-    bool    freezed; // freeze() been called?
-    bool    notified; // notify() been called?
-    void    *ret;
-};
-
-class EventNotify 
-{
-    private:
-        static EventNotify *notifier;
-        EventNotify();
-        pthread_mutex_t     mtx;
-        pthread_cond_t      cond;
-        int                 serialNum;
-        struct serialNtfTest   serialTest[MAX_SERIAL_NUM];
-
-    public:
-        ~EventNotify();
-        static EventNotify * getInstance() {
-            if (notifier == NULL)
-                notifier = new EventNotify();
-            return notifier;
-        }
-
-        int allocate();
-        void freeze(int id, void *ret_val = NULL);
-        void notify(int id);
-        void * getRetVal(int id);
-
-    private:
-        bool test(int id);
-        void tryFreeze();
-
-        void lock();
-        void unlock();
-};
-
-#define gNotifier EventNotify::getInstance()
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/filter.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/filter.cpp
deleted file mode 100644
index dffe6c5..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/filter.cpp
+++ /dev/null
@@ -1,152 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Filter
-
- Description: Filter manipulation.
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#include "filter.hpp"
-#include <stdlib.h>
-#include <math.h>
-#include <assert.h>
-#include <ctype.h>
-#include <string.h>
-#include <dlfcn.h>
-
-#include "packer.hpp"
-#include "log.hpp"
-
-#include "message.hpp"
-#include "queue.hpp"
-#include "filterproc.hpp"
-
-Filter::Filter()
-{
-    info.filter_id = 0;
-    info.so_file = NULL;
-    
-    handler.init_hndlr = NULL;
-    handler.input_hndlr = NULL;
-    handler.term_hndlr = NULL;
-
-    param = NULL;
-    file = NULL;
-}
-
-Filter::Filter(sci_filter_info_t & filter_info)
-{
-    info.filter_id = filter_info.filter_id;
-    info.so_file = filter_info.so_file;
-    
-    handler.init_hndlr = NULL;
-    handler.input_hndlr = NULL;
-    handler.term_hndlr = NULL;
-
-    param = NULL;
-    file = NULL;
-}
-
-Filter::~Filter()
-{
-    if (file) {
-        ::dlclose(file);
-        file = NULL;
-    }
-}
-
-Message * Filter::packMsg()
-{
-    Packer packer;
-    packer.packInt(info.filter_id);
-    packer.packStr(info.so_file);
-
-    char *bufs[1];
-    int sizes[1];
-    
-    bufs[0] = packer.getPackedMsg();
-    sizes[0] = packer.getPackedMsgLen();
-
-    Message *msg = new Message();
-    msg->build(info.filter_id, SCI_GROUP_ALL, 1, bufs, sizes, Message::FILTER_LOAD);
-    delete [] bufs[0];
-    return msg;
-}
-
-void Filter::unpackMsg(Message &msg) 
-{
-    Packer packer(msg.getContentBuf());
-
-    info.filter_id = packer.unpackInt();
-    info.so_file = packer.unpackStr();
-}
-
-int Filter::load()
-{
-#ifdef _SCI_LINUX // Linux
-    file = ::dlopen(info.so_file, RTLD_NOW | RTLD_GLOBAL);
-#else // aix
-    file = ::dlopen(info.so_file, RTLD_NOW | RTLD_GLOBAL | RTLD_MEMBER);
-#endif
-    if (file == NULL) {
-        log_error("Loading filter failed %s", ::dlerror());
-        return SCI_ERR_INVALID_FILTER;
-    }
-    
-    handler.init_hndlr = (filter_init_hndlr *) ::dlsym(file, "filter_initialize");
-    if (handler.init_hndlr == NULL) {
-        log_error("Loading filter failed %s", ::dlerror());
-        return SCI_ERR_INVALID_FILTER;
-    }
-    handler.input_hndlr = (filter_input_hndlr *) ::dlsym(file, "filter_input");
-    if (handler.input_hndlr == NULL) {
-        log_error("Loading filter failed %s", ::dlerror());
-        return SCI_ERR_INVALID_FILTER;
-    }
-    handler.term_hndlr = (filter_term_hndlr *) ::dlsym(file, "filter_terminate");
-    if (handler.term_hndlr == NULL) {
-        log_error("Loading filter failed %s", ::dlerror());
-        return SCI_ERR_INVALID_FILTER;
-    }
-
-    return handler.init_hndlr(&param);
-}
-
-int Filter::input(sci_group_t group, void *buf, int size)
-{
-    return handler.input_hndlr(param, group, buf, size);
-}
-
-int Filter::unload()
-{
-    int rc = handler.term_hndlr(param);
-
-    // close library handle
-    ::dlclose(file);
-    file = NULL;
-
-    return rc;
-}
-
-int Filter::getId()
-{
-    return info.filter_id;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/filter.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/filter.hpp
deleted file mode 100644
index b698bf1..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/filter.hpp
+++ /dev/null
@@ -1,65 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Filter
-
- Description: Filter manipulation.
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _FILTER_HPP
-#define _FILTER_HPP
-
-#include "sci.h"
-#include "general.hpp"
-
-class Message;
-
-class Filter
-{
-    public:
-        struct Handler {
-            filter_init_hndlr    *init_hndlr;
-            filter_input_hndlr   *input_hndlr;
-            filter_term_hndlr    *term_hndlr;
-        };
-        
-    private:
-        sci_filter_info_t        info;
-        Handler                  handler;
-        void                     *param;
-        void                     *file;
-
-    public:
-        Filter();
-        Filter(sci_filter_info_t &filter_info);
-        ~Filter();
-
-        Message * packMsg();
-        void unpackMsg(Message &msg);
-        
-        int load();
-        int input(sci_group_t group, void *buf, int size);
-        int unload();
-
-        int getId();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/filterlist.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/filterlist.cpp
deleted file mode 100644
index 4b7655a..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/filterlist.cpp
+++ /dev/null
@@ -1,153 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: FilterList
-
- Description: Filter management (Note: STL does not guarantee the safety of 
-              several readers & one writer cowork together, and user threads
-              can query filter information at runtime, so it's necessary 
-              to add a lock to protect these read & write operations).
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/24/08 nieyy        Initial code (F156654)
-
-****************************************************************************/
-
-#include "filterlist.hpp"
-#include <assert.h>
-
-#include "filter.hpp"
-
-FilterList* FilterList::instance = NULL;
-FilterList * FilterList::getInstance()
-{
-    if (instance == NULL) {
-        instance = new FilterList();
-    }
-    return instance;
-}
-
-FilterList::FilterList()
-{
-    filterInfo.clear();
-
-    ::pthread_mutex_init(&mtx, NULL);
-}
-
-FilterList::~FilterList()
-{
-    // delete all loaded filters
-    FILTER_MAP::iterator fit = filterInfo.begin();
-    for (; fit != filterInfo.end(); fit++) {
-        delete (*fit).second;
-    }
-    filterInfo.clear();
-
-    ::pthread_mutex_destroy(&mtx);
-
-    instance = NULL;
-}
-
-int FilterList::loadFilter(int filter_id, Filter * filter, bool invoke)
-{
-    int rc = SCI_SUCCESS;
-    if (invoke) {
-        // call init func
-        rc = filter->load();
-    }
-    
-    if (rc == SCI_SUCCESS) {
-        lock();
-        filterInfo[filter_id] = filter;
-        unlock();
-    }
-
-    return rc;
-}
-
-Filter * FilterList::getFilter(int filter_id)
-{
-    Filter *filter = NULL;
-
-    lock();
-    FILTER_MAP::iterator fit = filterInfo.find(filter_id);
-    if (fit != filterInfo.end()) {
-        filter = (*fit).second;
-    }
-    unlock();
-
-    return filter;
-}
-
-int FilterList::unloadFilter(int filter_id, bool invoke)
-{
-    Filter *filter = NULL;
-
-    lock();
-    FILTER_MAP::iterator fit = filterInfo.find(filter_id);
-    if (fit != filterInfo.end()) {
-        filter = (*fit).second;
-    } else {
-        unlock();
-        return SCI_ERR_FILTER_NOTFOUND;
-    }
-
-    filterInfo.erase(filter_id);
-    unlock();
-    
-    int rc = SCI_SUCCESS;
-    if (invoke) {
-        // call term_func
-        rc = filter->unload();
-    }
-    delete filter;
-    
-    return rc;
-}
-
-int FilterList::numOfFilters()
-{
-    int size;
-
-    lock();
-    size = filterInfo.size();
-    unlock();
-
-    return size;
-}
-
-void FilterList::retrieveFilterList(int * ret_val)
-{
-    int i = 0;
-
-    lock();
-    FILTER_MAP::iterator it = filterInfo.begin();
-    for (; it!=filterInfo.end(); ++it) {
-        ret_val[i++] = (*it).first;
-    }
-    unlock();
-}
-
-void FilterList::lock()
-{
-    ::pthread_mutex_lock(&mtx);
-}
-
-void FilterList::unlock()
-{
-    ::pthread_mutex_unlock(&mtx);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/filterlist.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/filterlist.hpp
deleted file mode 100644
index affa1db..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/filterlist.hpp
+++ /dev/null
@@ -1,73 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: FilterList
-
- Description: Filter management (Note: STL does not guarantee the safety of 
-              several readers & one writer cowork together, and user threads
-              can query filter information at runtime, so it's necessary 
-              to add a lock to protect these read & write operations).
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/24/08 nieyy        Initial code (F156654)
-
-****************************************************************************/
-
-#ifndef _FILTERLIST_HPP
-#define _FILTERLIST_HPP
-
-#include <pthread.h>
-#include <map>
-
-using namespace std;
-
-#include "general.hpp"
-
-class Filter;
-
-class FilterList
-{
-    public:
-        typedef map<int, Filter*> FILTER_MAP;
-        
-    private:
-        FilterList();
-        static FilterList    *instance;
-        
-        FILTER_MAP           filterInfo;
-
-        pthread_mutex_t      mtx;
-
-    public:
-        ~FilterList();
-        static FilterList * getInstance();
-
-        int loadFilter(int filter_id, Filter *filter, bool invoke = true);
-        int unloadFilter(int filter_id, bool invoke = true);
-        
-        Filter * getFilter(int filter_id);
-        int numOfFilters();
-        void retrieveFilterList(int *ret_val);
-
-    private:
-        void lock();
-        void unlock();
-};
-
-#define gFilterList FilterList::getInstance()
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/filterproc.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/filterproc.cpp
deleted file mode 100644
index af931f7..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/filterproc.cpp
+++ /dev/null
@@ -1,165 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: FilterProcessor
-
- Description: Properties of class 'FilterProcessor':
-    input: a. a message queue
-    output: a. a stream
-            b. a message queue
-    action: use user-defined filter handlers to process the messages
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/10/09 nieyy      Initial code (D153875)
-
-****************************************************************************/
-
-#include "filterproc.hpp"
-#include <assert.h>
-
-#include "log.hpp"
-#include "exception.hpp"
-#include "socket.hpp"
-
-#include "statemachine.hpp"
-#include "ctrlblock.hpp"
-#include "message.hpp"
-#include "stream.hpp"
-#include "filter.hpp"
-#include "filterlist.hpp"
-#include "queue.hpp"
-#include "eventntf.hpp"
-#include "observer.hpp"
-
-FilterProcessor::FilterProcessor(int hndl)
-    : Processor(hndl), filtered(false), curFilterID(SCI_FILTER_NULL)
-{
-    name = "UpstreamFilter";
-
-    inQueue = NULL;
-    outQueue = NULL;
-
-    observer = NULL;
-}
-
-Message * FilterProcessor::read()
-{
-    assert(inQueue);
-
-    Message *msg = NULL;
-
-    filtered = false;
-    msg = inQueue->consume();
-    
-    return msg;
-}
-
-void FilterProcessor::process(Message * msg)
-{
-    assert(msg);
-
-    int id = msg->getFilterID();
-    if (id != SCI_FILTER_NULL) {
-        Filter *filter = gFilterList->getFilter(id);
-        // call user's filter handler
-        if (filter != NULL) {
-            curFilterID = id;
-            
-            filtered = true;
-            filter->input(msg->getGroup(), msg->getContentBuf(), msg->getContentLen());
-        }
-    }
-}
-
-void FilterProcessor::write(Message * msg)
-{
-    assert(outQueue);
-
-    if (filtered) {
-        inQueue->remove();
-        return;
-    }
-
-    if ((msg->getType() == Message::INIT_ACK) && 
-            (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END)) {
-        struct eventRC {
-            int num;
-            int count;
-        } *frc;
-
-        frc = (eventRC *)gNotifier->getRetVal(msg->getID());
-        frc->count++;
-        if (frc->count == frc->num) {
-            gNotifier->notify(msg->getID());
-        }
-        inQueue->remove();
-
-        return;
-    }
-
-    if (observer) {
-        observer->notify();
-    }
-
-    msg->setRefCount(msg->getRefCount() + 1);
-    outQueue->produce(msg);
-
-    inQueue->remove();
-}
-
-void FilterProcessor::seize()
-{
-    gStateMachine->parse(StateMachine::FATAL_EXCEPTION);
-}
-
-void FilterProcessor::clean()
-{
-    // no action
-}
-
-bool FilterProcessor::isActive()
-{
-    return gCtrlBlock->isEnabled() || (inQueue->getSize() > 0);
-}
-
-void FilterProcessor::deliever(Message * msg)
-{
-    if (observer) {
-        observer->notify();
-    }
-    outQueue->produce(msg);
-}
-
-int FilterProcessor::getCurFilterID()
-{
-    return curFilterID;
-}
-
-void FilterProcessor::setInQueue(MessageQueue * queue)
-{
-    inQueue = queue;
-}
-
-void FilterProcessor::setOutQueue(MessageQueue * queue)
-{
-    outQueue = queue;
-}
-
-void FilterProcessor::setObserver(Observer * ob)
-{
-    observer = ob;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/filterproc.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/filterproc.hpp
deleted file mode 100644
index 198aed0..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/filterproc.hpp
+++ /dev/null
@@ -1,70 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: FilterProcessor
-
- Description: Properties of class 'FilterProcessor':
-    input: a. a message queue
-    output: a. a message queue
-    action: use user-defined filter handlers to process the messages
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/10/09 nieyy      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _FILTERPROC_HPP
-#define _FILTERPROC_HPP
-
-#include "processor.hpp"
-
-class Stream;
-class MessageQueue;
-class Observer;
-
-class FilterProcessor : public Processor 
-{
-    private:
-        MessageQueue        *inQueue;
-        MessageQueue        *outQueue;
-
-        Observer            *observer;
-
-        bool                filtered;
-        int                 curFilterID;
-
-    public:
-        FilterProcessor(int hndl = -1);
-
-        virtual Message * read();
-        virtual void process(Message *msg);
-        virtual void write(Message *msg);
-        virtual void seize();
-        virtual void clean();
-
-        virtual bool isActive();
-
-        void deliever(Message *msg);
-        int getCurFilterID();
-
-        void setInQueue(MessageQueue *queue);
-        void setOutQueue(MessageQueue *queue);
-
-        void setObserver(Observer *ob);
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/general.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/general.hpp
deleted file mode 100644
index 71d04b8..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/general.hpp
+++ /dev/null
@@ -1,36 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: General definitions.
-   
- Author: Nicole Nie, Liu Wei, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _GENERAL_HPP
-#define _GENERAL_HPP
-
-#include <assert.h>
-#include <pthread.h>
-
-#define VALIDBACKENDIDS (-1024*1024)
-#define INVLIDSUCCESSORID (-999999)
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/handlerproc.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/handlerproc.cpp
deleted file mode 100644
index 96a76d1..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/handlerproc.cpp
+++ /dev/null
@@ -1,122 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: HandlerProcessor
-
- Description: Properties of class 'HandlerProcessor':
-    input: a. a message queue
-    output: none
-    action: use handler in sci_info_t to process the messages
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/10/09 nieyy      Initial code (D153875)
-
-****************************************************************************/
-
-#include "handlerproc.hpp"
-#include <stdlib.h>
-#include <assert.h>
-
-#include "log.hpp"
-#include "exception.hpp"
-#include "socket.hpp"
-
-#include "ctrlblock.hpp"
-#include "statemachine.hpp"
-#include "message.hpp"
-#include "stream.hpp"
-#include "queue.hpp"
-
-HandlerProcessor::HandlerProcessor(int hndl) 
-    : Processor(hndl)
-{
-    name = "Handler";
-
-    inQueue = NULL;
-
-    if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-        hndlr = gCtrlBlock->getEndInfo()->fe_info.hndlr;
-        param = gCtrlBlock->getEndInfo()->fe_info.param;
-    } else if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_END) {
-        hndlr = gCtrlBlock->getEndInfo()->be_info.hndlr;
-        param = gCtrlBlock->getEndInfo()->be_info.param;
-    } else {
-        assert(!"Should never go here!");
-    }
-}
-
-Message * HandlerProcessor::read()
-{
-    assert(inQueue);
-
-    Message *msg = NULL;
-    msg = inQueue->consume();
-    
-    if (msg && (msg->getType() == Message::SEGMENT)) {
-        int segnum = msg->getID() - 1; // exclude the SEGMENT header
-        Message **segments = (Message **)::malloc(segnum * sizeof(Message *));
-        inQueue->remove();
-
-        msg = new Message();
-        inQueue->multiConsume(segments, segnum);
-        msg->joinSegments(segments, segnum);
-        ::free(segments);
-    }
-
-    return msg;
-}
-
-void HandlerProcessor::process(Message * msg)
-{
-    assert(msg);
-
-    switch(msg->getType()) {
-        case Message::COMMAND:
-        case Message::DATA:
-            hndlr(param, msg->getGroup(), msg->getContentBuf(), msg->getContentLen());
-            break;
-        default:
-            log_error("Processor %s: received unknown command", name.c_str());
-            break;
-    }
-}
-
-void HandlerProcessor::write(Message * msg)
-{
-    // almost no action
-    inQueue->remove();
-}
-
-void HandlerProcessor::seize()
-{
-    gStateMachine->parse(StateMachine::FATAL_EXCEPTION);
-}
-
-void HandlerProcessor::clean()
-{
-    // no action
-}
-
-bool HandlerProcessor::isActive()
-{
-    return gCtrlBlock->isEnabled() || (inQueue->getSize() > 0);
-}
-
-void HandlerProcessor::setInQueue(MessageQueue * queue)
-{
-    inQueue = queue;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/handlerproc.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/handlerproc.hpp
deleted file mode 100644
index 52cbac9..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/handlerproc.hpp
+++ /dev/null
@@ -1,61 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: HandlerProcessor
-
- Description: Properties of class 'HandlerProcessor':
-    input: a. a message queue
-    output: none
-    action: use handler in sci_info_t to process the messages
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/10/09 nieyy      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _HANDLERPROC_HPP
-#define _HANDLERPROC_HPP
-
-#include "sci.h"
-#include "processor.hpp"
-
-class Stream;
-class MessageQueue;
-
-class HandlerProcessor : public Processor 
-{
-    private:
-        MessageQueue        *inQueue;
-
-        SCI_msg_hndlr       *hndlr;
-        void                *param;
-
-    public:
-        HandlerProcessor(int hndl = -1);
-
-        virtual Message * read();
-        virtual void process(Message *msg);
-        virtual void write(Message *msg);
-        virtual void seize();
-        virtual void clean();
-
-        virtual bool isActive();
-        
-        void setInQueue(MessageQueue *queue);
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/initializer.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/initializer.cpp
deleted file mode 100644
index 7e66eac..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/initializer.cpp
+++ /dev/null
@@ -1,590 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Initializer
-
- Description: Prepare the environment when startup, which includes:
-        1) Processor threads
-        2) Message queue
-        3) Others like environment variables
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/10/09 nieyy      Initial code (D153875)
-
-****************************************************************************/
-
-#include "initializer.hpp"
-#include <assert.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/types.h>
-#include <pwd.h>
-
-#include "sci.h"
-
-#include "log.hpp"
-#include "socket.hpp"
-#include "stream.hpp"
-#include "exception.hpp"
-
-#include "ctrlblock.hpp"
-#include "routinglist.hpp"
-#include "statemachine.hpp"
-#include "topology.hpp"
-#include "queue.hpp"
-#include "message.hpp"
-#include "readerproc.hpp"
-#include "writerproc.hpp"
-#include "filterproc.hpp"
-#include "handlerproc.hpp"
-#include "routerproc.hpp"
-#include "purifierproc.hpp"
-#include "observer.hpp"
-#include "listener.hpp"
-#include "parent.hpp"
-#include "errdetector.hpp"
-#include "errhandler.hpp"
-#include "errinjector.hpp"
-#include "eventntf.hpp"
-#include "allocator.hpp"
-
-#define SCI_DAEMON_PORT 6688
-
-Initializer* Initializer::instance = NULL;
-
-Initializer::Initializer()
-{
-}
-
-Initializer::~Initializer()
-{
-    instance = NULL;
-}
-
-int Initializer::init(int hndl)
-{
-    int rc = SCI_SUCCESS;
-
-    int level = Log::INFORMATION;
-    char dir[MAX_PATH_LEN] = "/opt/sci/log";
-    
-    char *envp = ::getenv("SCI_LOG_DIRECTORY");
-    if (envp != NULL) {
-        ::strncpy(dir, envp, sizeof(dir));
-    }
-    
-    envp = ::getenv("SCI_LOG_LEVEL"); 
-    if (envp != NULL)
-        level = ::atoi(envp);
-
-    if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-        Log::getInstance()->init(dir, "fe.log", level);
-        log_debug("I am a front end, my handle is %d", hndl);
-    } else if (gCtrlBlock->getMyRole() == CtrlBlock::AGENT) {
-        Log::getInstance()->init(dir, "scia.log", level);
-        log_debug("I am an agent, my handle is %d", hndl);
-    } else {
-        Log::getInstance()->init(dir, "be.log", level);
-        log_debug("I am a back end, my handle is %d", hndl);
-    }
-    
-    try {
-        if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-            initListener();
-            rc = initFE(hndl);
-        } else if (gCtrlBlock->getMyRole() == CtrlBlock::AGENT) {
-            initListener();
-            rc = initAgent(hndl);
-        } else {
-            rc = initBE(hndl);
-        }
-    } catch (Exception &e) {
-        log_error("Initializer: exception %s", e.getErrMsg());
-        gStateMachine->parse(StateMachine::FATAL_EXCEPTION);
-        return SCI_ERR_INITIALIZE_FAILED;
-    } catch (ThreadException &e) {
-        log_error("Initializer: thread exception %d", e.getErrCode());
-        gStateMachine->parse(StateMachine::FATAL_EXCEPTION);
-        return SCI_ERR_INITIALIZE_FAILED;
-    } catch (SocketException &e) {
-        log_error("Initializer: socket exception: %s", e.getErrMsg().c_str());
-        gStateMachine->parse(StateMachine::FATAL_EXCEPTION);
-        return SCI_ERR_INITIALIZE_FAILED;
-    } catch (std::bad_alloc) {
-        log_error("Initializer: out of memory");
-        gStateMachine->parse(StateMachine::FATAL_EXCEPTION);
-        return SCI_ERR_INITIALIZE_FAILED;
-    } catch (...) {
-        log_error("Initializer: unknown exception");
-        gStateMachine->parse(StateMachine::FATAL_EXCEPTION);
-        return SCI_ERR_INITIALIZE_FAILED;
-    }
-
-    return rc;
-}
-
-void Initializer::recoverAgent(Stream * stream)
-{
-    assert(stream);
-    
-    int hndl = gCtrlBlock->getMyHandle();
-
-    ReaderProcessor *reader = new ReaderProcessor(hndl);
-    reader->setName("ReaderP");
-    reader->setInStream(stream);
-    reader->setOutQueue(gCtrlBlock->getRouterInQueue());
-    reader->setOutErrorQueue(gCtrlBlock->getErrorQueue());
-    
-    WriterProcessor *writer = new WriterProcessor(hndl);
-    writer->setName("WriterP");
-    writer->setInQueue(gCtrlBlock->getFilterOutQueue());
-    writer->setOutStream(stream);
-
-    // writer is a peer processor of reader
-    reader->setPeerProcessor(writer);
-
-    gCtrlBlock->registerProcessor(reader);
-    gCtrlBlock->registerProcessor(writer);
-    
-    gRoutingList->propagateGroupInfo();
-
-    reader->start();
-    writer->start();
-}
-
-void Initializer::recoverBE(Stream * stream)
-{
-    assert(stream);
-
-    int hndl = gCtrlBlock->getMyHandle();
-    
-    WriterProcessor *writer = new WriterProcessor(hndl);
-    writer->setInQueue(gCtrlBlock->getUpQueue());
-    writer->setOutStream(stream);
-
-    PurifierProcessor *purifier = new PurifierProcessor(hndl);
-    purifier->setInStream(stream);
-    purifier->setOutQueue(gCtrlBlock->getPurifierOutQueue());
-
-    // writer is a peer processor of purifier
-    purifier->setPeerProcessor(writer);
-
-    if (gCtrlBlock->getEndInfo()->be_info.mode == SCI_POLLING) {
-        // interrupt mode
-        purifier->setObserver(gCtrlBlock->getObserver());
-    }
-
-    gCtrlBlock->registerProcessor(writer);
-    gCtrlBlock->registerProcessor(purifier);
-
-    gRoutingList->propagateGroupInfo();
-
-    writer->start();
-    purifier->start();
-}
-
-int Initializer::initFE(int hndl)
-{
-    char *envp = NULL;
-    
-    Topology *topo = new Topology(hndl);
-    gCtrlBlock->setTopology(topo);
-    int rc = topo->init();
-    if (rc != SCI_SUCCESS)
-        return rc;
-    gAllocator->reset();
-
-    MessageQueue *routerInQ = new MessageQueue();
-    routerInQ->setName("routerInQ");
-    gCtrlBlock->registerQueue(routerInQ);
-    gCtrlBlock->setRouterInQueue(routerInQ);
-
-    RouterProcessor *router = new RouterProcessor();
-    gCtrlBlock->setRouterProcessor(router);
-    gCtrlBlock->registerProcessor(router);
-    router->setInQueue(routerInQ);
-
-    MessageQueue *inq = new MessageQueue();
-    inq->setName("filterInQ");
-    gCtrlBlock->registerQueue(inq);
-    gCtrlBlock->setFilterInQueue(inq);
-    
-    MessageQueue *outq = new MessageQueue();
-    outq->setName("filterOutQ");
-    gCtrlBlock->registerQueue(outq);
-    gCtrlBlock->setFilterOutQueue(outq);
-
-    FilterProcessor *filter = new FilterProcessor();
-    gCtrlBlock->registerProcessor(filter);
-    gCtrlBlock->setFilterProcessor(filter);
-    filter->setInQueue(inq);
-    filter->setOutQueue(outq);
-
-    ErrorDetector *errDetector = NULL;
-    ErrorHandler *errHandler = NULL;
-    ErrorInjector *errInjector = NULL;
-
-    envp = ::getenv("SCI_ENABLE_FAILOVER");
-    if (envp != NULL) {
-        if (::strcmp(envp, "yes") == 0) {
-            MessageQueue *errInQ = new MessageQueue();
-            errInQ->setName("errInQ");
-            gCtrlBlock->registerQueue(errInQ);
-            gCtrlBlock->setErrorQueue(errInQ);
-
-            errDetector = new ErrorDetector(hndl);
-            gCtrlBlock->registerProcessor(errDetector);
-            errDetector->setInQueue(errInQ);
-
-            if (gCtrlBlock->getEndInfo()->fe_info.err_hndlr != NULL) {
-                MessageQueue *errOutQ = new MessageQueue();
-                errOutQ->setName("errOutQ");
-                gCtrlBlock->registerQueue(errOutQ);
-                errDetector->setOutQueue(errOutQ);
-
-                errHandler = new ErrorHandler(hndl);
-                gCtrlBlock->registerProcessor(errHandler);
-                errHandler->setInQueue(errOutQ);
-            }
-
-            // see if we have error injection thread
-            envp = ::getenv("SCI_DEBUG_USE_INJECTOR");
-            if (envp != NULL) {
-                if (::strcasecmp(envp, "yes") == 0) {
-                    errInjector = new ErrorInjector();
-                    gCtrlBlock->setErrorInjector(errInjector);
-                    errInjector->setInjOutQueue(errInQ);
-                }
-            }
-        }
-    }
-
-    HandlerProcessor *handler = NULL;
-    if (gCtrlBlock->getEndInfo()->fe_info.mode == SCI_INTERRUPT) {
-        // interrupt mode
-        handler = new HandlerProcessor();
-        gCtrlBlock->registerProcessor(handler);
-        handler->setInQueue(outq);
-    } else {
-        // polling mode
-        Observer *ob = new Observer();
-        gCtrlBlock->setObserver(ob);
-        gCtrlBlock->setPollQueue(outq);
-        filter->setObserver(ob);
-    }
-
-    gStateMachine->parse(StateMachine::DATASTRUC_CREATED);
-
-    router->start();
-    filter->start();
-    if (errDetector) {
-        errDetector->start();
-    }
-    if (errHandler) {
-        errHandler->start();
-    }
-    if (errInjector) {
-        errInjector->start();
-    }
-    if (handler) {
-        handler->start();
-    }
-    int msgID = gNotifier->allocate();
-    Message *topoMsg = topo->packMsg();
-    topoMsg->setID(msgID);
-    routerInQ->produce(topoMsg);
-    gNotifier->freeze(msgID, &rc);
-
-    return rc;
-}
-
-int Initializer::initAgent(int hndl)
-{ 
-    string nodeAddr;
-    int port = -1;
-
-    // get hostname and port no from environment variable.
-    char *envp = ::getenv("SCI_WORK_DIRECTORY");
-    if (envp != NULL) {
-        ::chdir(envp);
-        log_debug("Change working directory to %s", envp);
-    }
-
-    envp = ::getenv("SCI_PARENT_HOSTNAME");
-    if (envp != NULL) {
-        nodeAddr = envp;
-    }
-
-    envp = ::getenv("SCI_PARENT_PORT");
-    if (envp != NULL) {
-        port = ::atoi(envp);
-    }
-    
-    log_debug("My parent host is %s, parent port id %d, my ID is %d", nodeAddr.c_str(), port, hndl);
-
-    Stream *stream = new Stream();   
-    stream->init(nodeAddr.c_str(), port);
-    *stream << gCtrlBlock->getJobKey() << hndl << endl;
-
-    gCtrlBlock->registerStream(stream);
-    gCtrlBlock->setParentStream(stream);
-    gStateMachine->parse(StateMachine::PARENT_CONNECTED);
-
-    ErrorDetector *errDetector = NULL;
-
-    // err detector need to be created before relay processor
-    envp = ::getenv("SCI_ENABLE_FAILOVER");
-    if (envp != NULL) {
-        if (::strcmp(envp, "yes") == 0) {
-            MessageQueue *errInQ = new MessageQueue();
-            errInQ->setName("errInQ");
-            gCtrlBlock->registerQueue(errInQ);
-            gCtrlBlock->setErrorQueue(errInQ);
-
-            errDetector = new ErrorDetector(hndl);
-            gCtrlBlock->registerProcessor(errDetector);
-            errDetector->setInQueue(errInQ);
-        }
-    }
-    
-    MessageQueue *routerInQ = new MessageQueue();
-    routerInQ->setName("routerInQ");
-    gCtrlBlock->registerQueue(routerInQ);
-    gCtrlBlock->setRouterInQueue(routerInQ);
-
-    ReaderProcessor *reader = new ReaderProcessor(hndl);
-    reader->setName("ReaderP");
-    gCtrlBlock->registerProcessor(reader);
-    reader->setInStream(stream);
-    reader->setOutQueue(routerInQ);
-    reader->setOutErrorQueue(gCtrlBlock->getErrorQueue());
-
-    RouterProcessor *router = new RouterProcessor();
-    gCtrlBlock->registerProcessor(router);
-    gCtrlBlock->setRouterProcessor(router);
-    router->setInQueue(routerInQ);
-
-    MessageQueue *filterInQ = new MessageQueue();
-    filterInQ->setName("filterInQ");
-    gCtrlBlock->setFilterInQueue(filterInQ);
-    gCtrlBlock->registerQueue(filterInQ);
-
-    MessageQueue *filterOutQ = new MessageQueue();
-    filterOutQ->setName("filterOutQ");
-    gCtrlBlock->setFilterOutQueue(filterOutQ);
-    gCtrlBlock->registerQueue(filterOutQ);
-
-    WriterProcessor *writer = new WriterProcessor(hndl);
-    writer->setName("WriterP");
-    gCtrlBlock->registerProcessor(writer);
-    writer->setInQueue(filterOutQ);
-    writer->setOutStream(stream);
-
-    // writer is a peer processor of reader
-    reader->setPeerProcessor(writer);
-    
-    FilterProcessor *filter = new FilterProcessor();
-    gCtrlBlock->registerProcessor(filter);
-    gCtrlBlock->setFilterProcessor(filter);
-    filter->setInQueue(filterInQ);
-    filter->setOutQueue(filterOutQ);
-
-    gStateMachine->parse(StateMachine::DATASTRUC_CREATED);
-
-    reader->start();
-    writer->start();
-    router->start();
-    filter->start();
-    if (errDetector) {
-        errDetector->start();
-    }
-
-    return SCI_SUCCESS;
-}
-
-int Initializer::initBE(int hndl)
-{
-    char *envp = ::getenv("SCI_USE_EXTLAUNCHER");
-    if (envp != NULL) {
-        if (::strcasecmp(envp, "yes") == 0) {
-            initExtBE(hndl);
-        }
-    }
-
-    string nodeAddr;
-    int port = -1;
-
-    // get hostname and port no from environment variable.
-    envp = ::getenv("SCI_WORK_DIRECTORY");
-    if (envp != NULL) {
-        chdir(envp);
-        log_debug("Change working directory to %s", envp);
-    }
-
-    envp = ::getenv("SCI_PARENT_HOSTNAME");
-    if (envp != NULL) {
-        nodeAddr = envp;
-    }
-
-    envp = ::getenv("SCI_PARENT_PORT");
-    if (envp != NULL) {
-        port = ::atoi(envp);
-    }
-    
-    log_debug("My parent host is %s, parent port id %d, my ID is %d", nodeAddr.c_str(), port, hndl);
-
-    Stream *stream = new Stream();   
-    stream->init(nodeAddr.c_str(), port);
-    *stream << gCtrlBlock->getJobKey() << hndl << endl;
-
-    gCtrlBlock->registerStream(stream);
-    gCtrlBlock->setParentStream(stream);
-    gStateMachine->parse(StateMachine::PARENT_CONNECTED);
-
-    ErrorDetector *errDetector = NULL;
-    ErrorHandler *errHandler = NULL;
-
-    // err detector need to be created before purifier processor
-    envp = ::getenv("SCI_ENABLE_FAILOVER");
-    if (envp != NULL) {
-        if (::strcmp(envp, "yes") == 0) {
-            MessageQueue *errInQ = new MessageQueue();
-            errInQ->setName("errInQ");
-            gCtrlBlock->registerQueue(errInQ);
-            gCtrlBlock->setErrorQueue(errInQ);
-
-            errDetector = new ErrorDetector(hndl);
-            gCtrlBlock->registerProcessor(errDetector);
-            errDetector->setInQueue(errInQ);
-
-            if (gCtrlBlock->getEndInfo()->be_info.err_hndlr != NULL) {
-                MessageQueue *errOutQ = new MessageQueue();
-                errOutQ->setName("errOutQ");
-                gCtrlBlock->registerQueue(errOutQ);
-                errDetector->setOutQueue(errOutQ);
-
-                errHandler = new ErrorHandler(hndl);
-                gCtrlBlock->registerProcessor(errHandler);
-                errHandler->setInQueue(errOutQ);
-            }
-        }
-    }
-    
-    MessageQueue *userQ = new MessageQueue();
-    userQ->setName("userQ");
-    gCtrlBlock->registerQueue(userQ);
-    gCtrlBlock->setUpQueue(userQ);
-    envp = ::getenv("SCI_SYNC_INIT");
-    if (envp && (strcasecmp(envp, "yes") == 0)) {
-        int msgID = atoi(::getenv("SCI_INIT_ACKID"));
-        Message *msg = new Message();
-        msg->build(SCI_FILTER_NULL, hndl, 0, NULL, NULL, Message::INIT_ACK, msgID);
-        userQ->produce(msg);
-    }
-
-    MessageQueue *sysQ = new MessageQueue();
-    sysQ->setName("sysQ");
-    gCtrlBlock->setPurifierOutQueue(sysQ);
-    gCtrlBlock->registerQueue(sysQ);
-
-    WriterProcessor *writer = new WriterProcessor(hndl);
-    gCtrlBlock->registerProcessor(writer);
-    writer->setInQueue(userQ);
-    writer->setOutStream(stream);
-
-    PurifierProcessor *purifier = new PurifierProcessor(hndl);
-    gCtrlBlock->registerProcessor(purifier);
-    purifier->setInStream(stream);
-    purifier->setOutQueue(sysQ);
-    purifier->setOutErrorQueue(gCtrlBlock->getErrorQueue());
-
-    // writer is a peer processor of purifier
-    purifier->setPeerProcessor(writer);
-
-    HandlerProcessor *handler = NULL;
-    if (gCtrlBlock->getEndInfo()->be_info.mode == SCI_INTERRUPT) {
-        // interrupt mode
-        handler = new HandlerProcessor();
-        gCtrlBlock->registerProcessor(handler);
-        handler->setInQueue(sysQ);
-    } else {
-        // polling mode
-        Observer *ob = new Observer();
-        gCtrlBlock->setObserver(ob);
-        gCtrlBlock->setPollQueue(sysQ);
-        purifier->setObserver(ob);
-    }
-
-    gRoutingList->addBE(SCI_GROUP_ALL, VALIDBACKENDIDS, hndl);
-    gStateMachine->parse(StateMachine::DATASTRUC_CREATED);
-
-    writer->start();
-    purifier->start();
-    if (errDetector) {
-        errDetector->start();
-    }
-    if (errHandler) {
-        errHandler->start();
-    }
-    if (handler) {
-        handler->start();
-    }
-
-    return SCI_SUCCESS;
-}
-
-void Initializer::initExtBE(int hndl)
-{
-    string envStr;
-    char hostname[256];
-
-    Stream stream;
-    struct passwd *pwd = ::getpwuid(::getuid());
-    string username = pwd->pw_name;
-
-    ::gethostname(hostname, sizeof(hostname));
-    stream.init(hostname, SCI_DAEMON_PORT);
-    stream << username << (int) Launcher::REQUEST << gCtrlBlock->getJobKey() << hndl << endl;
-    stream >> envStr >> endl;
-        
-    stream.stop();
-
-    string key, val;
-    char *st = (char *) envStr.c_str();
-    char *p = st + envStr.size();
-    while (p > st) {
-        p--;
-        if ((*p) == '=') {
-            *p = '\0';
-            val = (p+1);
-        } else if ((*p) == ';') {
-            *p = '\0';
-            key = (p+1);
-            ::setenv(key.c_str(), val.c_str(), 1);
-        }
-    }
-}
-
-void Initializer::initListener()
-{
-    Listener *listener = new Listener(gCtrlBlock->getMyHandle());
-    gCtrlBlock->setListener(listener);
-    
-    listener->init();
-    listener->start();
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/initializer.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/initializer.hpp
deleted file mode 100644
index 6c414b8..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/initializer.hpp
+++ /dev/null
@@ -1,69 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Initializer
-
- Description: Prepare the environment when startup, which includes:
-        1) Processor threads
-        2) Message queue
-        3) Others like environment variables
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/10/09 nieyy      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _INITIALIZER_HPP
-#define _INITIALIZER_HPP
-
-#include <string>
-
-using namespace std;
-
-class Stream;
-
-class Initializer
-{
-    private:
-        Initializer();
-        static Initializer *instance;
-        
-    public:
-        ~Initializer();
-        static Initializer* getInstance() {
-            if (instance == NULL)
-                instance = new Initializer();
-            return instance;
-        }
-
-        int init(int hndl);
-
-        void recoverAgent(Stream *stream);
-        void recoverBE(Stream *stream);
-
-    private:
-        int initFE(int hndl);
-        int initAgent(int hndl);
-        int initBE(int hndl);
-        void initExtBE(int hndl);
-
-        void initListener();
-};
-
-#define gInitializer Initializer::getInstance()
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/listener.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/listener.cpp
deleted file mode 100644
index def84bd..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/listener.cpp
+++ /dev/null
@@ -1,190 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Listener
-
- Description: Listener Thread.
-   
- Author: Tu HongJ, Liu Wei, Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-
-****************************************************************************/
-
-#include "listener.hpp"
-#include <assert.h>
-#include <stdlib.h>
-#include <sys/socket.h>
-#include <sys/wait.h>
-
-#include "log.hpp"
-#include "stream.hpp"
-#include "exception.hpp"
-
-#include "ctrlblock.hpp"
-#include "statemachine.hpp"
-#include "socket.hpp"
-#include "readerproc.hpp"
-#include "writerproc.hpp"
-#include "queue.hpp"
-
-Listener:: Listener(int hndl)
-        : Thread(hndl), bindPort(-1)
-{
-    socket = new Socket();
-}
-
-Listener::~Listener()
-{
-    delete socket;
-}
-
-int Listener::init()
-{
-    bindPort = 0;
-    char *envp = ::getenv("SCI_DEVICE_NAME");
-    if (envp) {
-        string ifname = envp;
-        sockfd = socket->listen(bindPort, ifname);
-    } else {
-        sockfd = socket->listen(bindPort);
-    }
-    
-    log_debug("listener binded to port %d", bindPort);
-
-    return bindPort;
-}
-
-int Listener::stop()
-{
-    setState(false);
-    ::shutdown(sockfd, SHUT_RDWR);
-    ::close(sockfd);
-
-    return 0;
-}
-
-void Listener::run()
-{
-    int child = -1;
-    int hndl = -1;
-    int key;
-
-    while (getState()) {
-        try {
-            child = socket->accept(sockfd);
-        } catch (SocketException &e) {
-            log_warn("Listener: socket broken: %s", e.getErrMsg().c_str());
-            break;
-        } catch (...) {
-            log_warn("Listener: unknown exception: %s");
-            break;
-        }
-        if (child < 0) {
-            // invalid connection
-           continue;
-        }
-        if (!gCtrlBlock->isEnabled()) {
-            log_debug("Listener: uninitialized, rejected this connection");
-            break;
-        }
-
-        log_debug("Listener: accepted a child agent sockfd %d", child);
-
-        try {
-            Stream *stream = new Stream();
-            stream->init(child);
-            *stream >> key;
-            if (key != gCtrlBlock->getJobKey()) {
-                log_warn("Listener: client with invalid credential is trying to connect.");
-                stream->stop();
-                delete stream;
-                continue;
-            }
-
-            *stream >> hndl >> endl;
-            if (hndl >= 0) {
-                log_debug("Listener: back end %d is connected", hndl); 
-            } else {
-                log_debug("Listener: agent %d is connected", hndl); 
-            }
-
-            gStateMachine->parse(StateMachine::CLIENT_CONNECTED);
-        
-            char name[32];
-            MessageQueue *inQ = gCtrlBlock->queryQueue(hndl);
-            if (NULL == inQ) {
-                inQ = new MessageQueue();
-                if (hndl >= 0) {
-                    ::sprintf(name, "BE%d_inQ", hndl);
-                } else {
-                    ::sprintf(name, "Agent%d_inQ", hndl);
-                }
-                inQ->setName(string(name));
-                gCtrlBlock->registerQueue(inQ);
-                gCtrlBlock->mapQueue(hndl, inQ);
-                gCtrlBlock->genSelfInfo(inQ, false);
-            }
-
-            ReaderProcessor *reader = new ReaderProcessor(hndl);
-            reader->setInStream(stream);
-            reader->setOutQueue(gCtrlBlock->getFilterInQueue());
-            ::sprintf(name, "Reader%d", hndl);
-            reader->setName(string(name));
-            reader->setOutErrorQueue(gCtrlBlock->getErrorQueue());
-
-            WriterProcessor *writer = new WriterProcessor(hndl);
-            writer->setInQueue(inQ);
-            writer->setOutStream(stream);
-            ::sprintf(name, "Writer%d", hndl);
-            writer->setName(string(name));
-
-            // writer is a peer processor of reader
-            reader->setPeerProcessor(writer);
-            
-            reader->start();
-            writer->start(); 
-
-            gCtrlBlock->registerProcessor(reader);
-            gCtrlBlock->registerProcessor(writer);
-        
-            gCtrlBlock->registerStream(stream);
-        } catch (Exception &e) {
-            log_error("Listener: exception %s", e.getErrMsg());
-            gStateMachine->parse(StateMachine::FATAL_EXCEPTION);
-            break;
-        } catch (ThreadException &e) {
-            log_error("Listener: thread exception %d", e.getErrCode());
-            gStateMachine->parse(StateMachine::FATAL_EXCEPTION);
-            break;
-        } catch (SocketException &e) {
-            log_error("Listener: socket exception: %s", e.getErrMsg().c_str());
-            gStateMachine->parse(StateMachine::FATAL_EXCEPTION);
-            break;
-        } catch (std::bad_alloc) {
-            log_error("Listener: out of memory");
-            gStateMachine->parse(StateMachine::FATAL_EXCEPTION);
-            break;
-        } catch (...) {
-            log_error("Listener: unknown exception");
-            gStateMachine->parse(StateMachine::FATAL_EXCEPTION);
-            break;
-        }
-    }
-
-    ::close(sockfd);
-    setState(false);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/listener.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/listener.hpp
deleted file mode 100644
index 3639832..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/listener.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Listener
-
- Description: Listener Thread.
-   
- Author: Tu HongJ, Liu Wei, Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _LISTENER_HPP
-#define _LISTENER_HPP
-
-#include "general.hpp"
-#include "thread.hpp"
-
-class Socket;
-
-class Listener : public Thread 
-{
-    private:
-        int              bindPort;
-        int              sockfd;
-        Socket           *socket;
-    
-    public:
-        Listener(int hndl);
-        virtual ~Listener();
-        
-        int init();
-        int stop();
-
-        int getBindPort() { return bindPort; }
-        
-        virtual void run();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/message.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/message.cpp
deleted file mode 100644
index 2ff5c6e..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/message.cpp
+++ /dev/null
@@ -1,164 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Message
-
- Description: SCI internal message
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-
-****************************************************************************/
-
-#include "message.hpp"
-#include <stdlib.h>
-#include <pthread.h>
-#include <sys/time.h>
-#include <time.h>
-#include <errno.h>
-#include <assert.h>
-#include <string.h>
-
-#include "exception.hpp"
-#include "log.hpp"
-
-#include "atomic.hpp"
-
-Message::Message(Type t)
-    : type(t)
-{
-    msgID = DEFAULT_MSG_ID;
-    filterID = SCI_FILTER_NULL;
-    group= SCI_GROUP_ALL;
-    len = 0;
-    buf = NULL;
-
-    refCount = 1;
-}
-
-Message::~Message()
-{
-    if (buf && len) {
-        delete [] buf;
-    }
-
-    buf = NULL;
-    len = 0;
-}
-
-int Message::joinSegments(Message **segments, int segnum)
-{
-    int i;
-    char **bufs = (char **)::malloc(segnum * sizeof(char *));
-    int *sizes = new int[segnum];
-    int fid = segments[0]->getFilterID();
-    sci_group_t gid = segments[0]->getGroup();
-    Type typ = segments[0]->getType();
-    int id = segments[0]->getID();
-
-    for (i = 0; i < segnum; i++) {
-        bufs[i] = segments[i]->getContentBuf();
-        sizes[i] = segments[i]->getContentLen();
-    }
-    build(fid, gid, segnum, bufs, sizes, typ, id);
-    ::free(bufs);
-    delete sizes;
-    for (i = 0; i < segnum; i++) {
-        if (segments[i]->decRefCount() == 0) {
-            delete segments[i];
-        }
-    }
-
-    return 0;
-}
-
-void Message::build(int fid, sci_group_t g, int num_bufs, char *bufs[], int sizes[], Type t, int id)
-{
-    type = t;
-    msgID = id;
-    
-    filterID = fid;
-    group = g;
-
-    len = 0;
-    for (int i=0; i<num_bufs; i++) {
-        len += sizes[i];
-    }
-
-    if (len > 0) {
-        buf = new char[len];
-        char *ptr = buf;
-        for (int i=0; i<num_bufs; i++) {
-            if (sizes[i] > 0) {
-                ::memcpy(ptr, bufs[i], sizes[i]);
-                ptr += sizes[i];
-            }
-        }
-    }
-}
-
-void Message::setRefCount(int cnt) 
-{
-    refCount = cnt;
-}
-
-int Message::getRefCount()
-{
-    return refCount;
-}
-
-int Message::decRefCount()
-{
-    int cnt = fetch_and_add(&refCount, -1);
-    return (cnt - 1);
-}
-
-Stream & operator >> (Stream &stream, Message &msg)
-{  
-    // receive message header
-    stream >> (int &) msg.type;
-    stream >> msg.msgID;
-    stream >> msg.filterID;
-    stream >> (int &) msg.group;
-    
-    // receive message content
-    stream >> msg.len;
-    if (msg.len > 0) {
-        msg.buf = new char[msg.len];
-        ::memset(msg.buf, 0, msg.len);
-        stream.read(msg.buf, msg.len);
-    }
-
-    return stream;
-}
-
-Stream & operator << (Stream &stream, Message &msg)
-{
-    // send message header
-    stream << (int) msg.type;
-    stream << msg.msgID;
-    stream << msg.filterID;
-    stream << (int) msg.group;
-
-    // send message content
-    stream << msg.len;
-    if (msg.len > 0) {
-        stream.write(msg.buf, msg.len);
-    }
- 
-    return stream.flush();
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/message.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/message.hpp
deleted file mode 100644
index 07f035d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/message.hpp
+++ /dev/null
@@ -1,114 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Message
-
- Description: SCI internal message
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _MESSAGE_HPP
-#define _MESSAGE_HPP
-
-#include "sci.h"
-
-#include "stream.hpp"
-
-#include "general.hpp"
-
-const int DEFAULT_MSG_ID = (-1024 * 1024);
-
-class Message 
-{
-    public:
-        enum Type {
-            UNKNOWN = -1,
-            // used for downstream messages
-            CONFIG = -1001,
-            COMMAND = -1002,
-            FILTER_LOAD = -1003,
-            FILTER_UNLOAD = -1004,
-            GROUP_CREATE = -1005,
-            GROUP_FREE = -1006,
-            GROUP_OPERATE = -1007,
-            GROUP_OPERATE_EXT = -1008,
-            QUIT = -1009,
-            // used for upstream messages
-            DATA = -1010,
-            // used for dynamic +/- backend messages
-            BE_REMOVE = -1011,
-            BE_ADD = -1012,
-            INIT_ACK = -1013,
-            // used for error handling
-            UNCLE = -2001,
-            UNCLE_LIST = -2002,
-            PARENT = -2003,
-            ERROR_EVENT = -2004, // failure/recovery events
-            GROUP_MERGE = -2005,
-            GROUP_DROP = -2006,
-            // used for error injection 
-            SHUTDOWN = -3001,            
-            KILLNODE = -3002,
-            // used for polling mode
-            INVALID_POLL = -4001,
-            // used for message segmentation
-            SEGMENT = -5001
-        };
-        
-    private:
-        // message header
-        Type            type;
-        int             msgID;
-        int             filterID;
-        sci_group_t     group;
-
-        // message content
-        int             len;
-        char            *buf;
-
-        int             refCount;
-        
-    public:
-        Message(Type t = UNKNOWN);
-        ~Message();
-
-        int joinSegments(Message **segments, int segnum);
-        void build(int fid, sci_group_t g, int num_bufs, char *bufs[], int sizes[], Type t, 
-            int id = DEFAULT_MSG_ID);
-        void setRefCount(int cnt);
-        int getRefCount();
-        int decRefCount();
-
-        void setID(int id) { msgID = id; }
-        void setFilterID(int id) { filterID = id; }
-        void setGroup(sci_group_t g) { group = g; }
-        Type getType() {  return type; }
-        int getID() { return msgID; }
-        int getFilterID() { return filterID; }
-        sci_group_t getGroup() { return group; }
-        
-        char * getContentBuf() { return buf; }
-        int getContentLen() { return len; }
-
-        friend Stream & operator >> (Stream &stream, Message &msg);
-        friend Stream & operator << (Stream &stream, Message &msg);
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/observer.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/observer.cpp
deleted file mode 100644
index 59fc317..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/observer.cpp
+++ /dev/null
@@ -1,158 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Observer
-
- Description: For external notification usage.
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/12/09 nieyy         Initial code (D153875)
-
-****************************************************************************/
-
-#include "observer.hpp"
-#include <assert.h>
-#include <errno.h>
-#include <unistd.h>
-#include <stddef.h>
-#include <fcntl.h>
-#include <stdio.h>
-
-#include "exception.hpp"
-
-Observer::Observer()
-{
-    pipeFd[0] = -1;
-    pipeFd[1] = -1;
-
-    count = 0;
-    hasChar = false;
-
-    int rc = ::pipe(pipeFd);
-    if (rc != 0) {
-        throw Exception(Exception::SYS_CALL);
-    }
-    async(pipeFd[0]);
-    async(pipeFd[1]);
-
-    ::pthread_mutex_init(&mtx, NULL);
-}
-
-Observer::~Observer()
-{
-    ::close(pipeFd[0]);
-    ::close(pipeFd[1]);
-
-    ::pthread_mutex_destroy(&mtx);
-}
-
-void Observer::notify()
-{
-    lock();
-    count++;
-    check();
-    unlock();
-}
-
-void Observer::unnotify()
-{
-    lock();
-    if (hasChar) {
-        readChar();
-        hasChar = false;
-    }
-    check();
-    unlock();
-}
-
-int Observer::getPollFd()
-{
-    return pipeFd[0];
-}
-
-void Observer::async(int fd)
-{
-    int flags, newflags;
-
-    flags = ::fcntl(fd, F_GETFL);
-    if (flags < 0)
-        throw Exception(Exception::SYS_CALL);
-
-    newflags = flags & ~O_NONBLOCK;
-
-    if (newflags != flags) {
-        if (::fcntl(fd, F_SETFL, newflags) < 0) {
-            throw Exception(Exception::SYS_CALL);
-        }
-    }
-}
-
-void Observer::readChar()
-{
-    // read a char signal from the socket
-    char signal;
-    while (true) {
-        int bytes = ::read(pipeFd[0], &signal, sizeof(char));
-        if (bytes < 0) {
-            if (errno == EINTR) {
-                continue;
-            }
-            if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) {
-                break;
-            }
-            throw Exception(Exception::SYS_CALL);
-        }
-        break;
-    }
-}
-
-void Observer::writeChar()
-{
-    // write a char signal to the socket
-    char signal = 'a';
-    while (true) {
-        int bytes = ::write(pipeFd[1], &signal, sizeof(char));
-        if (bytes < 0) {
-            if ((errno == EAGAIN) || (errno == EWOULDBLOCK) || (errno == EINTR)) {
-                continue;
-            }
-            throw Exception(Exception::SYS_CALL);
-        }
-        break;
-    }
-}
-
-void Observer::check()
-{
-    if (!hasChar) {
-        if (count > 0) {
-            hasChar = true;
-            writeChar();
-            count--;
-        }
-    }
-}
-
-void Observer::lock()
-{
-    ::pthread_mutex_lock(&mtx);
-}
-
-void Observer::unlock()
-{
-    ::pthread_mutex_unlock(&mtx);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/observer.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/observer.hpp
deleted file mode 100644
index 1185f71..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/observer.hpp
+++ /dev/null
@@ -1,62 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Observer
-
- Description: For external notification usage.
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/12/09 nieyy         Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _OBSERVER_HPP
-#define _OBSERVER_HPP
-
-#include <pthread.h>
-
-class Observer 
-{
-    private:
-        int             pipeFd[2];
-        int             count;
-        bool            hasChar;
-
-        pthread_mutex_t mtx;
-        
-    public:
-        Observer();
-        ~Observer();
-        
-        void notify();
-        void unnotify();
-
-        // access 
-        int  getPollFd();
-
-    private:
-        void async(int fd);
-        void readChar();
-        void writeChar();
-
-        void check();
-
-        void lock();
-        void unlock();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/parent.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/parent.cpp
deleted file mode 100644
index bc54f45..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/parent.cpp
+++ /dev/null
@@ -1,243 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Parent & ParentList
-
- Description: Parent information which can provide adoption service.
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   04/28/09 nieyy        Initial code (F156654)
-
-****************************************************************************/
-
-#include "parent.hpp"
-#include <stdlib.h>
-#include <math.h>
-#include <assert.h>
-#include <ctype.h>
-#include <string.h>
-
-#include "packer.hpp"
-#include "log.hpp"
-
-#include "message.hpp"
-#include "topology.hpp"
-#include "ctrlblock.hpp"
-#include "routinglist.hpp"
-
-Parent::Parent(int id, const char * name, int p)
-    : nodeID(id)
-{
-    if (name) {
-        int len = ::strlen(name) + 1;
-        hostname = new char[len];
-        ::memcpy(hostname, name, len);
-    }
-    
-    port = p;
-}
-
-Parent::~Parent()
-{
-    delete [] hostname;
-}
-
-Message * Parent::packMsg(bool isUncle)
-{
-    Packer packer;
-
-    packer.packInt(nodeID);
-    packer.packStr(hostname);
-    packer.packInt(port);
-    packer.packInt(level);
-
-    char *bufs[1];
-    int sizes[1];
-    
-    bufs[0] = packer.getPackedMsg();
-    sizes[0] = packer.getPackedMsgLen();
-
-    Message *msg = new Message();
-    if (isUncle) {
-        msg->build(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes, Message::UNCLE);
-    } else {
-        msg->build(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes, Message::PARENT);
-    }
-    delete [] bufs[0];
-    return msg;
-}
-
-void Parent::unpackMsg(Message & msg)
-{
-    Packer packer(msg.getContentBuf());
-
-    nodeID = packer.unpackInt();
-
-    char *str = packer.unpackStr();
-    int len = ::strlen(str) + 1;
-    hostname = new char[len];
-    ::memcpy(hostname, str, len);
-
-    port = packer.unpackInt();
-    level = packer.unpackInt();
-}
-
-void Parent::setLevel(int l)
-{
-    level = l;
-}
-
-Stream * Parent::connect()
-{
-    Stream *stream = new Stream();   
-    try {
-        stream->init(hostname, port);
-        *stream << gCtrlBlock->getJobKey() << gCtrlBlock->getMyHandle() << endl;
-    } catch (...) {
-        delete stream;
-        stream = NULL;
-    }
-    
-    return stream;
-}
-
-int Parent::getNodeID()
-{
-    return nodeID;
-}
-
-char * Parent::getHostName()
-{
-    return hostname;
-}
-
-int Parent::getPort()
-{
-    return port;
-}
-
-int Parent::getLevel()
-{
-    return level;
-}
-
-ParentList::ParentList()
-{
-    list.clear();
-}
-
-ParentList::~ParentList()
-{
-    vector<Parent*>::iterator it = list.begin();
-    for (; it!=list.end(); ++it) {
-        delete (*it);
-    }
-    list.clear();
-}
-
-Message * ParentList::packMsg()
-{  
-    Packer packer;
-
-    int num = list.size();
-    packer.packInt(num);
-    for (int i=0; i<num; i++) {
-        packer.packInt(list[i]->getNodeID());
-        packer.packStr(list[i]->getHostName());
-        packer.packInt(list[i]->getPort());
-        packer.packInt(list[i]->getLevel());
-    }
-    packer.packInt(level);
-
-    char *bufs[1];
-    int sizes[1];
-    
-    bufs[0] = packer.getPackedMsg();
-    sizes[0] = packer.getPackedMsgLen();
-
-    Message *msg = new Message();
-    msg->build(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes, Message::UNCLE_LIST);
-    delete [] bufs[0];
-    return msg;
-}
-
-void ParentList::unpackMsg(Message & msg)
-{
-    Packer packer(msg.getContentBuf());
-
-    int num = packer.unpackInt();
-    for (int i=0; i<num; i++) {
-        int node_id = packer.unpackInt();
-        char *hostname = packer.unpackStr();
-        int port = packer.unpackInt();
-        int pLevel = packer.unpackInt();
-
-        Parent *p = new Parent(node_id, hostname, port);
-        p->setLevel(pLevel);
-        list.push_back(p);
-    }
-    level = packer.unpackInt();
-}
-
-void ParentList::add(Parent * p)
-{
-    assert(p);
-    list.push_back(p);
-}
-
-Stream * ParentList::select(int *nodeID)
-{
-    assert(nodeID);
-    Stream *stream = NULL;
-
-    ::srand((unsigned int) ::time(NULL));
-    int start = ::rand() % list.size();
-    for (int i=0; i<(int) list.size(); i++) {
-        int pos = (i + start) % list.size();
-        stream = list[pos]->connect();
-        if (stream) {
-            *nodeID = list[pos]->getNodeID();
-            break;
-        }
-    }
-
-    return stream;
-}
-
-int ParentList::numOfParents()
-{
-    return list.size();
-}
-
-bool ParentList::isAllGathered()
-{
-    if ((int) list.size() >= gRoutingList->numOfSuccessor(SCI_GROUP_ALL)) {
-        return true;
-    } else {
-        return false;
-    }
-}
-
-void ParentList::setLevel(int l)
-{
-    level = l;
-}
-
-int ParentList::getLevel()
-{
-    return level;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/parent.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/parent.hpp
deleted file mode 100644
index ddfcf4f..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/parent.hpp
+++ /dev/null
@@ -1,89 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Parent & ParentList
-
- Description: Parent information which can provide adoption service.
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   04/28/09 nieyy        Initial code (F156654)
-
-****************************************************************************/
-
-#ifndef _PARENT_HPP
-#define _PARENT_HPP
-
-#include <vector>
-
-using namespace std;
-
-#include "sci.h"
-#include "general.hpp"
-
-class Message;
-class Stream;
-
-class Parent
-{
-    private:
-        int               nodeID;
-        char              *hostname;
-        int               port;
-
-        int               level;
-
-    public:
-        Parent(int id=-1, const char *name=NULL, int p=0);
-        ~Parent();
-
-        Message * packMsg(bool isUncle = true);
-        void unpackMsg(Message &msg);
-
-        Stream * connect();
-
-        void setLevel(int l);
-
-        int getNodeID();
-        char *getHostName();
-        int getPort();
-        int getLevel();
-};
-
-class ParentList
-{      
-    private:
-        int               level;
-        vector<Parent*>   list;
-        
-    public:
-        ParentList();
-        ~ParentList();
-
-        Message * packMsg();
-        void unpackMsg(Message &msg);
-
-        void add(Parent *p);
-        Stream *select(int *nodeID);
-
-        int numOfParents();
-        bool isAllGathered();
-
-        void setLevel(int l);
-        int getLevel();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/processor.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/processor.cpp
deleted file mode 100644
index 37005d5..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/processor.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Processor
-
- Description: Properties of class 'Processor':
-    input: a. a stream 
-           b. a message queue
-    output: a. none
-            b. a stream
-            c. one or multiple message queues
-    action: any kind message processing actions
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/10/09 nieyy      Initial code (D153875)
-
-****************************************************************************/
-
-#include "processor.hpp"
-#include <assert.h>
-
-#include "log.hpp"
-#include "exception.hpp"
-#include "socket.hpp"
-
-#include "message.hpp"
-
-Processor::Processor(int hndl) 
-    : Thread(hndl)
-{
-    name = "Processor";
-
-    totalCount = 0;
-    totalSize = 0;
-}
-
-void Processor::run()
-{
-    log_debug("Processor %s: started", name.c_str());
-    
-    Message *msg = NULL;
-    while (getState() && isActive()) {
-        try {
-            // read a message
-            msg = read();
-            if (msg == NULL) {
-                log_debug("Processor %s: read a NULL message", name.c_str());
-                continue;
-            }
-
-            totalCount++;
-            totalSize += msg->getContentLen();
-            log_debug("Processor %s: processing a message, type=%d, filter ID=%d, group=%d, size=%d", 
-                name.c_str(), msg->getType(), msg->getFilterID(), msg->getGroup(), msg->getContentLen());
-
-            // process the message
-            process(msg);
-
-            // write the message
-            write(msg);
-
-            log_debug("Processor %s: finished", name.c_str());
-        } catch (Exception &e) {
-            seize();
-            log_error("Processor %s: exception %s", name.c_str(), e.getErrMsg());
-            break;
-        } catch (SocketException &e) {
-            seize();
-            log_error("Processor %s: socket exception %s", name.c_str(), e.getErrMsg().c_str());
-            break;
-        } catch (ThreadException &e) {
-            seize();
-            log_error("Processor %s: thread exception %d", e.getErrCode());
-            break;
-        } catch (std::bad_alloc) {
-            seize();
-            log_error("Processor %s: out of memory", name.c_str());
-            break;
-        } catch (...) {
-            seize();
-            log_error("Processor %s: unknown exception", name.c_str());
-            break;
-        }
-    }
-
-    // do cleanup works
-    clean();
-    
-    log_debug("Processor %s: exited", name.c_str());
-}
-
-void Processor::dump()
-{
-    log_perf("Until now, processor %s has processed %d messages, total size is %d bytes",
-        name.c_str(), totalCount, totalSize);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/processor.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/processor.hpp
deleted file mode 100644
index e9a61ab..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/processor.hpp
+++ /dev/null
@@ -1,72 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Processor
-
- Description: Properties of class 'Processor':
-    input: a. a stream 
-           b. a message queue
-    output: a. none
-            b. a stream
-            c. one or multiple message queues
-    action: any kind message processing actions
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/10/09 nieyy      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _PROCESSOR_HPP
-#define _PROCESSOR_HPP
-
-#include <string>
-
-using namespace std;
-
-#include "thread.hpp"
-
-class Message;
-
-class Processor : public Thread 
-{      
-    protected:
-        string              name;
-
-        // for performance counting
-        int                 totalCount;
-        int                 totalSize;
-        
-
-    public:
-        Processor(int hndl = -1);
-
-        virtual void run();
-
-        virtual Message * read() = 0;
-        virtual void process(Message *msg) = 0;
-        virtual void write(Message *msg) = 0;
-        virtual void seize() = 0;
-        virtual void clean() = 0;
-
-        virtual bool isActive() = 0;
-        
-        void dump();
-        void setName(string str) { name = str; }
-        string getName() { return name; }
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/purifierproc.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/purifierproc.cpp
deleted file mode 100644
index 56682ac..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/purifierproc.cpp
+++ /dev/null
@@ -1,194 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: PurifierProcessor
-
- Description: Properties of class 'PurifierProcessor':
-    input: a. a stream 
-    output: a. a message queue
-    action: purify message, discarded useless messages
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/25/09 nieyy      Initial code (D153875)
-
-****************************************************************************/
-
-#include "purifierproc.hpp"
-#include <assert.h>
-
-#include "log.hpp"
-#include "exception.hpp"
-#include "socket.hpp"
-
-#include "ctrlblock.hpp"
-#include "statemachine.hpp"
-#include "routinglist.hpp"
-#include "message.hpp"
-#include "stream.hpp"
-#include "queue.hpp"
-#include "observer.hpp"
-#include "filter.hpp"
-#include "filterlist.hpp"
-#include "errevent.hpp"
-#include "writerproc.hpp"
-
-PurifierProcessor::PurifierProcessor(int hndl) 
-    : Processor(hndl)
-{
-    name = "Purifier";
-
-    inStream = NULL;
-    outQueue = NULL;
-    
-    outErrorQueue = NULL;
-    peerProcessor = NULL;
-
-    observer = NULL;
-}
-
-Message * PurifierProcessor::read()
-{
-    assert(inStream);
-
-    Message *msg = new Message();
-    *inStream >> *msg;
-
-    return msg;
-}
-
-void PurifierProcessor::process(Message * msg)
-{
-    assert(msg);
-    isCmd = false;
-    isError = false;
-    
-    Filter *filter = NULL;
-    switch(msg->getType()) {
-        case Message::SEGMENT:
-        case Message::COMMAND:
-            isCmd = true;
-            break;
-        case Message::UNCLE:
-        case Message::UNCLE_LIST:
-        case Message::PARENT:
-        case Message::ERROR_EVENT:
-        case Message::SHUTDOWN:
-        case Message::KILLNODE:
-            isError = true;
-            msg->setID(handle);
-            break;
-        case Message::GROUP_CREATE:
-        case Message::GROUP_OPERATE:
-        case Message::GROUP_OPERATE_EXT:
-            gRoutingList->addBE(msg->getGroup(), VALIDBACKENDIDS, gCtrlBlock->getMyHandle());
-            break;
-        case Message::GROUP_FREE:
-            gRoutingList->removeGroup(msg->getGroup());
-            break;
-        case Message::FILTER_LOAD:
-            filter = new Filter();
-            filter->unpackMsg(*msg);
-            gFilterList->loadFilter(filter->getId(), filter, false);
-            break;
-        case Message::FILTER_UNLOAD:
-            gFilterList->unloadFilter(msg->getFilterID(), false);
-            break;
-        case Message::BE_REMOVE:
-        case Message::QUIT:
-            gStateMachine->parse(StateMachine::USER_QUIT);
-            break;
-        default:
-            break;
-    }
-}
-
-void PurifierProcessor::write(Message * msg)
-{
-    assert(outQueue);
-
-    if (isCmd) {
-        if (observer) {
-            observer->notify();
-        }
-        outQueue->produce(msg);
-    } else if (isError) {
-        if (outErrorQueue) {
-            outErrorQueue->produce(msg);
-        } else {
-            delete msg;
-        }
-    } else {
-        delete msg;
-    }
-}
-
-void PurifierProcessor::seize()
-{
-    gStateMachine->parse(StateMachine::PARENT_BROKEN);
-
-    // exit the peer relay processor thread related to the same socket
-    peerProcessor->stop();
-
-    if (outErrorQueue) {
-        // generate an error message and put it into error message queue
-        ErrorEvent event;
-        event.setErrCode(SCI_ERR_PARENT_BROKEN);
-        event.setNodeID(handle);
-        event.setBENum(1);
-
-        Message *msg = event.packMsg();
-        outErrorQueue->produce(msg);
-    } else {
-        // do not try to recover
-        gStateMachine->parse(StateMachine::RECOVER_FAILED);
-    }
-}
-
-void PurifierProcessor::clean()
-{
-    inStream->stopRead();
-}
-
-bool PurifierProcessor::isActive()
-{
-    return gCtrlBlock->isEnabled();
-}
-
-void PurifierProcessor::setInStream(Stream * stream)
-{
-    inStream = stream;
-}
-
-void PurifierProcessor::setOutQueue(MessageQueue * queue)
-{
-    outQueue = queue;
-}
-
-void PurifierProcessor::setOutErrorQueue(MessageQueue * queue)
-{
-    outErrorQueue = queue;
-}
-
-void PurifierProcessor::setPeerProcessor(WriterProcessor * processor)
-{
-    peerProcessor =  processor;
-}
-
-void PurifierProcessor::setObserver(Observer * ob)
-{
-    observer = ob;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/purifierproc.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/purifierproc.hpp
deleted file mode 100644
index 26eae0a..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/purifierproc.hpp
+++ /dev/null
@@ -1,74 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: PurifierProcessor
-
- Description: Properties of class 'PurifierProcessor':
-    input: a. a stream 
-    output: a. two message queues
-    action: purify message, discarded useless messages
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   04/28/09 nieyy      Initial code (F156654)
-
-****************************************************************************/
-
-#ifndef _PURIFERPROC_HPP
-#define _PURIFERPROC_HPP
-
-#include "processor.hpp"
-
-class Stream;
-class MessageQueue;
-class Observer;
-
-class WriterProcessor;
-
-class PurifierProcessor : public Processor 
-{
-    private:
-        Stream              *inStream;
-        MessageQueue        *outQueue;
-        
-        MessageQueue        *outErrorQueue;
-        WriterProcessor     *peerProcessor;
-
-        Observer            *observer;
-        bool                isCmd;
-        bool                isError;
-
-    public:
-        PurifierProcessor(int hndl = -1);
-
-        virtual Message * read();
-        virtual void process(Message *msg);
-        virtual void write(Message *msg);
-        virtual void seize();
-        virtual void clean();
-
-        virtual bool isActive();
-
-        void setInStream(Stream *stream);
-        void setOutQueue(MessageQueue *queue);
-
-        void setOutErrorQueue(MessageQueue *queue);
-        void setPeerProcessor(WriterProcessor *processor);
-
-        void setObserver(Observer *ob);
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/queue.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/queue.cpp
deleted file mode 100644
index d8e4dfe..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/queue.cpp
+++ /dev/null
@@ -1,219 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: MessageQueue
-
- Description: Messages manipulation.
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-
-****************************************************************************/
-
-#include "queue.hpp"
-#include <stdlib.h>
-#include <sys/time.h>
-#include <time.h>
-#include <errno.h>
-#include <assert.h>
-
-#include "exception.hpp"
-#include "ctrlblock.hpp"
-#include "log.hpp"
-#include "atomic.hpp"
-
-#include "message.hpp"
-
-
-const long long FLOWCTL_THRESHOLD = 1024 * 1024 * 1024 * 2LL;
-volatile long long MessageQueue::thresHold = 0;
-
-MessageQueue::MessageQueue()
-{
-    ::pthread_mutex_init(&mtx, NULL);
-    ::sem_init(&sem, 0, 0);
-}
-
-MessageQueue::~MessageQueue()
-{
-    Message *msg = NULL;
-    while (!queue.empty()) {
-        msg = queue.front();
-        queue.pop_front();
-        if (msg->decRefCount() == 0) {
-            delete msg;
-        }
-    }
-    queue.clear();
-    
-    ::pthread_mutex_destroy(&mtx);
-    ::sem_destroy(&sem);
-}
-
-int MessageQueue::flowControl(int size)
-{       
-    if ((size > 0) && (thresHold > FLOWCTL_THRESHOLD)) {
-        sleep(1);
-    }   
-
-    return 0;
-}
-
-int MessageQueue::multiProduce(Message **msgs, int num)
-{
-    assert(msgs && (num > 0));
-    int i;
-    int len = 0;
-
-    for (i = 0; i < num; i++) {
-        assert(msgs[i]);
-        len += msgs[i]->getContentLen();
-    }
-    lock();
-    for (i = 0; i < num; i++) {
-        queue.push_back(msgs[i]);
-        ::sem_post(&sem);
-    }
-    thresHold += len;
-    unlock();
-    flowControl(len);
-
-    return 0;
-}
-
-void MessageQueue::produce(Message *msg)
-{
-    int len = 0; 
-
-    if (!msg) {
-        ::sem_post(&sem);
-        return;
-    }
-    len = msg->getContentLen();
-    lock();
-    queue.push_back(msg);
-    thresHold += len;
-    unlock();
-    ::sem_post(&sem);
-    flowControl(len);
-
-    return;
-}
-
-int  MessageQueue::multiConsume(Message **msgs, int num)
-{
-    int i;
-    int len = 0;
-
-    for (i = 0; i < num; i++) {
-        if (sem_wait_i(&sem, -1) != 0) {
-            return NULL;
-        }
-    }
-    lock();
-    for (i = 0; i < num; i++) {
-        msgs[i] = queue.front();
-        queue.pop_front();
-        len += msgs[i]->getContentLen();
-    }
-    thresHold -= len;
-    unlock();
-    flowControl(-len);
-
-    return 0;
-}
-
-Message* MessageQueue::consume(int millisecs)
-{
-    int len = 0;
-
-    if (sem_wait_i(&sem, millisecs*1000) != 0) {
-        return NULL;
-    }
-
-    Message *msg = NULL;
-
-    lock();
-    if (!queue.empty()) {
-        msg = queue.front();
-        len = msg->getContentLen();
-        thresHold -= len;
-    }
-    unlock();
-    flowControl(-len);
-
-    return msg;
-}
-
-void MessageQueue::remove()
-{
-    Message *msg = NULL;
-
-    lock();
-    if (queue.empty()) {
-        unlock();
-        return;
-    }
-
-    msg = queue.front();
-    queue.pop_front();
-    unlock();
-    if (msg->decRefCount() == 0) {
-        delete msg;
-    }
-}
-
-int MessageQueue::getSize() 
-{
-    int size;
-
-    lock();
-    size = queue.size();
-    unlock();
-
-    return size;
-}
-
-int MessageQueue::sem_wait_i(sem_t *psem, int usecs)
-{
-    int rc = 0;
-
-    if (usecs < 0) {
-        while (((rc = ::sem_wait(psem)) != 0) && (errno == EINTR));
-        return rc;
-    } else { 
-        timespec ts;
-        ::clock_gettime(CLOCK_REALTIME, &ts);    // get current time
-        ts.tv_nsec += (usecs % 1000000) * 1000;
-        int ca = (ts.tv_nsec >= 1000000000) ? 1 : 0;
-        ts.tv_nsec %= 1000000000;
-        ts.tv_sec += (usecs / 1000000) + ca;
-        
-        while (((rc=::sem_timedwait(psem, &ts))!=0) && (errno == EINTR));
-        return rc;   
-    }                                                 
-}
-
-void MessageQueue::lock()
-{
-    ::pthread_mutex_lock(&mtx);
-}
-
-void MessageQueue::unlock()
-{
-    ::pthread_mutex_unlock(&mtx);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/queue.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/queue.hpp
deleted file mode 100644
index 017e745..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/queue.hpp
+++ /dev/null
@@ -1,78 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: MessageQueue
-
- Description: Messages manipulation.
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 tuhongj      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _QUEUE_HPP
-#define _QUEUE_HPP
-
-#include <deque>
-#include <string>
-
-using namespace std;
-
-#include <semaphore.h>
-#include <pthread.h>
-
-#include "sci.h"
-#include "general.hpp"
-
-#include "stream.hpp"
-
-class Message;
-
-class MessageQueue 
-{      
-    private:
-        deque<Message*>       queue;
-        pthread_mutex_t       mtx;
-        sem_t                 sem;
-
-        string                name;
-        volatile static long long      thresHold;
-
-    public:
-        MessageQueue();
-        ~MessageQueue();
-
-        void produce(Message *msg = NULL);
-        int multiProduce(Message **msgs, int num);
-        int multiConsume(Message **msgs, int num);
-        Message *consume(int millisecs=-1);
-        void remove();
-
-        int getSize();
-
-        void setName(string str) { name = str; }
-        string getName() { return name; }
-
-    private:
-        int sem_wait_i(sem_t *psem, int usecs);
-
-        void lock();
-        void unlock();
-        static int flowControl(int size);
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/readerproc.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/readerproc.cpp
deleted file mode 100644
index 0b3dab2..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/readerproc.cpp
+++ /dev/null
@@ -1,167 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: ReaderProcessor
-
- Description: Properties of class 'ReaderProcessor':
-    input: a stream
-    output: two message queues
-    action: relay messages from the stream to the queues, normal messages to a
-            queue, error handling messages to another queue
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/25/09 nieyy      Initial code (F156654)
-
-****************************************************************************/
-
-#include "readerproc.hpp"
-#include <assert.h>
-
-#include "log.hpp"
-#include "exception.hpp"
-#include "socket.hpp"
-
-#include "ctrlblock.hpp"
-#include "statemachine.hpp"
-#include "routinglist.hpp"
-#include "message.hpp"
-#include "stream.hpp"
-#include "queue.hpp"
-#include "errevent.hpp"
-#include "writerproc.hpp"
-
-ReaderProcessor::ReaderProcessor(int hndl) 
-    : Processor(hndl)
-{
-    name = "Reader";
-
-    inStream = NULL;
-    outQueue = NULL;
-
-    outErrorQueue = NULL;
-    peerProcessor = NULL;
-}
-
-Message * ReaderProcessor::read()
-{
-    assert(inStream);
-
-    Message *msg = new Message();
-    *inStream >> *msg;
-
-    return msg;
-}
-
-void ReaderProcessor::process(Message * msg)
-{
-    assert(msg);
-    // no action
-}
-
-void ReaderProcessor::write(Message * msg)
-{
-    assert(outQueue);
-
-    // normal and error messages to different queues
-    switch (msg->getType()) {
-        case Message::GROUP_MERGE:
-        case Message::ERROR_EVENT:
-            // use 'id' field to store child agent id information, and transfer this message
-            // to router processor
-            msg->setID(handle);
-        case Message::UNCLE:
-        case Message::UNCLE_LIST:
-        case Message::PARENT:
-        case Message::SHUTDOWN:
-        case Message::KILLNODE:
-            if (outErrorQueue) {
-                outErrorQueue->produce(msg);
-            } else {
-                delete msg;
-            }
-            break;
-        default:
-            outQueue->produce(msg);
-            break;
-    }
-}
-
-void ReaderProcessor::seize()
-{    
-    if (handle == gCtrlBlock->getMyHandle()) {
-        gStateMachine->parse(StateMachine::PARENT_BROKEN);
-    } else {
-        gStateMachine->parse(StateMachine::CLIENT_BROKEN);
-    }
-
-    // exit the peer relay processor thread related to the same socket
-    peerProcessor->stop();
-
-    if (gStateMachine->isToQuit(handle)) {
-        // if already got user's quit command, no need to generate error messages
-        return;
-    }
-
-    if (outErrorQueue) {
-        // generate an error message and put it into error message queue
-        ErrorEvent event;
-        if (handle == gCtrlBlock->getMyHandle()) {
-            event.setErrCode(SCI_ERR_PARENT_BROKEN);
-            event.setBENum(gRoutingList->numOfBE(SCI_GROUP_ALL));
-        } else {
-            event.setErrCode(SCI_ERR_CHILD_BROKEN);
-            event.setBENum(gRoutingList->numOfBEOfSuccessor(handle));
-        }
-        event.setNodeID(handle);
-
-        Message *msg = event.packMsg();
-        outErrorQueue->produce(msg);
-    } else if (handle == gCtrlBlock->getMyHandle()) {
-        // do not try to recover
-        gStateMachine->parse(StateMachine::RECOVER_FAILED);
-    }
-}
-
-void ReaderProcessor::clean()
-{
-    inStream->stopRead();
-}
-
-bool ReaderProcessor::isActive()
-{
-    return gCtrlBlock->isEnabled();
-}
-
-void ReaderProcessor::setInStream(Stream * stream)
-{
-    inStream = stream;
-}
-
-void ReaderProcessor::setOutQueue(MessageQueue * queue)
-{
-    outQueue = queue;
-}
-
-void ReaderProcessor::setOutErrorQueue(MessageQueue * queue)
-{
-    outErrorQueue = queue;
-}
-
-void ReaderProcessor::setPeerProcessor(WriterProcessor * processor)
-{
-    peerProcessor =  processor;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/readerproc.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/readerproc.hpp
deleted file mode 100644
index e2b4a63..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/readerproc.hpp
+++ /dev/null
@@ -1,68 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: ReaderProcessor
-
- Description: Properties of class 'ReaderProcessor':
-    input: a stream
-    output: two message queues
-    action: relay messages from the stream to the queues, normal messages to a
-            queue, error handling messages to another queue
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/25/09 nieyy      Initial code (F156654)
-
-****************************************************************************/
-
-#ifndef _READERPROC_HPP
-#define _READERPROC_HPP
-
-#include "processor.hpp"
-
-class Stream;
-class MessageQueue;
-
-class WriterProcessor;
-
-class ReaderProcessor : public Processor 
-{
-    private:
-        Stream              *inStream;
-        MessageQueue        *outQueue;
-        
-        MessageQueue        *outErrorQueue;
-        WriterProcessor     *peerProcessor;
-
-    public:
-        ReaderProcessor(int hndl = -1);
-
-        virtual Message * read();
-        virtual void process(Message *msg);
-        virtual void write(Message *msg);
-        virtual void seize();
-        virtual void clean();
-
-        virtual bool isActive();
-
-        void setInStream(Stream *stream);
-        void setOutQueue(MessageQueue *queue);
-
-        void setOutErrorQueue(MessageQueue *queue);
-        void setPeerProcessor(WriterProcessor *processor);
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/routerproc.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/routerproc.cpp
deleted file mode 100644
index fea2754..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/routerproc.cpp
+++ /dev/null
@@ -1,211 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: RouterProcessor
-
- Description: Properties of class 'RouterProcessor':
-    input: a. a stream 
-           b. a message queue
-    output: a set of message queues
-    action: route the message to the designated destination
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/10/09 nieyy      Initial code (D153875)
-
-****************************************************************************/
-
-#include "routerproc.hpp"
-#include <stdlib.h>
-#include <assert.h>
-
-#include "sci.h"
-
-#include "log.hpp"
-#include "exception.hpp"
-#include "socket.hpp"
-
-#include "ctrlblock.hpp"
-#include "statemachine.hpp"
-#include "message.hpp"
-#include "queue.hpp"
-#include "filter.hpp"
-#include "filterlist.hpp"
-#include "routinglist.hpp"
-#include "topology.hpp"
-#include "eventntf.hpp"
-
-RouterProcessor::RouterProcessor(int hndl) 
-    : Processor(hndl), curFilterID(SCI_FILTER_NULL), curGroup(SCI_GROUP_ALL)
-{
-    name = "Router";
-
-    inQueue = NULL;
-}
-
-Message * RouterProcessor::read()
-{
-    assert(inQueue);
-
-    Message *msg = NULL;
-    msg = inQueue->consume();
-    
-    if (msg && (msg->getType() == Message::SEGMENT) && (msg->getFilterID() == SCI_JOIN_SEGMENT)) {
-        int segnum = msg->getID() - 1; // exclude the SEGMENT header
-        Message **segments = (Message **)::malloc(segnum * sizeof(Message *));
-        inQueue->remove();
-
-        msg = new Message();
-        inQueue->multiConsume(segments, segnum);
-        msg->joinSegments(segments, segnum);
-        ::free(segments);
-    }
-
-    return msg;
-}
-
-void RouterProcessor::process(Message * msg)
-{
-    assert(msg);
-
-    Filter *filter = NULL;
-    Topology *topo = NULL;
-    int rc;
-    
-    switch (msg->getType()) {
-        case Message::SEGMENT:
-            gRoutingList->bcast(msg->getGroup(), msg);
-            break;
-        case Message::COMMAND:
-            if (msg->getFilterID() == SCI_FILTER_NULL) {
-                // bcast the message
-                gRoutingList->bcast(msg->getGroup(), msg);
-            } else {
-                filter = gFilterList->getFilter(msg->getFilterID());
-                if (filter != NULL) {
-                    // call user's filter handler
-                    curFilterID = msg->getFilterID();
-                    curGroup = msg->getGroup();
-                    filter->input(msg->getGroup(), msg->getContentBuf(), msg->getContentLen());
-                } else {
-                    // bcast the message
-                    gRoutingList->bcast(msg->getGroup(), msg);
-                }
-            }
-            break;
-        case Message::CONFIG:
-            topo = new Topology(-1);
-            topo->unpackMsg(*msg);
-            gCtrlBlock->setTopology(topo);
-            
-            rc = topo->deploy();
-            if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-                *(int *)gNotifier->getRetVal(msg->getID()) = rc;
-                gNotifier->notify(msg->getID());   
-            }
-            break;
-        case Message::FILTER_LOAD:
-        case Message::FILTER_UNLOAD:
-            if (msg->getType() == Message::FILTER_LOAD) {
-                filter = new Filter();
-                filter->unpackMsg(*msg);
-                rc = gFilterList->loadFilter(filter->getId(), filter);
-            } else {
-                rc = gFilterList->unloadFilter(msg->getFilterID());
-            }
-
-            if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-                *(int *)gNotifier->getRetVal(msg->getID()) = rc;
-                gNotifier->notify(msg->getID());   
-            }
-
-            gRoutingList->bcast(SCI_GROUP_ALL, msg);
-            break;
-        case Message::GROUP_CREATE:
-        case Message::GROUP_FREE:
-        case Message::GROUP_OPERATE:
-        case Message::GROUP_OPERATE_EXT:
-        case Message::GROUP_DROP:
-        case Message::GROUP_MERGE:
-            gRoutingList->parseCmd(msg);
-            break;
-        case Message::BE_ADD:
-            rc = gCtrlBlock->getTopology()->addBE(msg);
-            if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-                *(int *)gNotifier->getRetVal(msg->getID()) = rc;
-                gNotifier->notify(msg->getID());
-            }
-            break;
-        case Message::BE_REMOVE:
-            rc = gCtrlBlock->getTopology()->removeBE(msg);
-            if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-                *(int *)gNotifier->getRetVal(msg->getID()) = rc;
-                gNotifier->notify(msg->getID());
-            }
-            break;
-        case Message::QUIT:
-            gStateMachine->parse(StateMachine::USER_QUIT);
-            gRoutingList->bcast(SCI_GROUP_ALL, msg);
-            break;
-        case Message::UNCLE_LIST:
-        case Message::ERROR_EVENT:
-        case Message::SHUTDOWN:
-        case Message::KILLNODE:
-            gRoutingList->bcast(SCI_GROUP_ALL, msg);
-            break;
-        default:
-            log_error("Processor %s: received unknown command", name.c_str());
-            break;
-    }
-}
-
-void RouterProcessor::write(Message * msg)
-{
-    assert(msg);
-    
-    // almost no action
-    inQueue->remove();
-}
-
-void RouterProcessor::seize()
-{
-    gStateMachine->parse(StateMachine::FATAL_EXCEPTION);
-}
-
-void RouterProcessor::clean()
-{
-    // no action
-}
-
-bool RouterProcessor::isActive()
-{
-    return gCtrlBlock->isEnabled() || (inQueue->getSize() > 0);
-}
-
-int RouterProcessor::getCurFilterID()
-{
-    return curFilterID;
-}
-
-sci_group_t RouterProcessor::getCurGroup()
-{
-    return curGroup;
-}
-
-void RouterProcessor::setInQueue(MessageQueue * queue)
-{
-    inQueue = queue;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/routerproc.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/routerproc.hpp
deleted file mode 100644
index f9111a6..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/routerproc.hpp
+++ /dev/null
@@ -1,65 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: RouterProcessor
-
- Description: Properties of class 'RouterProcessor':
-    input: a. a stream 
-           b. a message queue
-    output: a set of message queues
-    action: route the message to the designated destination
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/10/09 nieyy      Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _ROUTERPROC_HPP
-#define _ROUTERPROC_HPP
-
-#include "sci.h"
-
-#include "processor.hpp"
-
-class MessageQueue;
-
-class RouterProcessor : public Processor 
-{
-    private:
-        MessageQueue        *inQueue;
-
-        int                 curFilterID;
-        sci_group_t         curGroup;
-
-    public:
-        RouterProcessor(int hndl = -1);
-
-        virtual Message * read();
-        virtual void process(Message *msg);
-        virtual void write(Message *msg);
-        virtual void seize();
-        virtual void clean();
-
-        virtual bool isActive();
-
-        int getCurFilterID();
-        sci_group_t getCurGroup();
-
-        void setInQueue(MessageQueue *queue);
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/routinglist.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/routinglist.cpp
deleted file mode 100644
index 163c20c..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/routinglist.cpp
+++ /dev/null
@@ -1,378 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: RoutingList
-
- Description: Provide routing services for all threads.
-   
- Author: Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/08/09 nieyy        Initial code (D156654)
-
-****************************************************************************/
-
-#include "routinglist.hpp"
-#include <stdlib.h>
-#include <assert.h>
-#include <string.h>
-
-#include <vector>
-
-using namespace std;
-
-#include "log.hpp"
-#include "packer.hpp"
-#include "group.hpp"
-#include "tools.hpp"
-#include "exception.hpp"
-#include "stream.hpp"
-
-#include "message.hpp"
-#include "queue.hpp"
-#include "ctrlblock.hpp"
-#include "eventntf.hpp"
-#include "dgroup.hpp"
-
-const int MAX_SUCCESSOR_NUM = 1024;
-const int TCP_ETHERNET_MTU = 1460;
-
-RoutingList * RoutingList::instance = NULL;
-RoutingList * RoutingList::getInstance()
-{
-    if (instance == NULL) {
-        instance = new RoutingList();
-    }
-    return instance;
-}
-
-RoutingList::RoutingList()
-    : maxSegmentSize(TCP_ETHERNET_MTU * 32)
-{
-    int hndl = gCtrlBlock->getMyHandle();
-    char *envp = ::getenv("SCI_SEGMENT_SIZE");
-    if (envp != NULL) {
-        maxSegmentSize = atoi(envp);
-        maxSegmentSize = maxSegmentSize > TCP_ETHERNET_MTU ? maxSegmentSize : TCP_ETHERNET_MTU * 32;
-    }
-
-    if (hndl == -1) {
-        // this is a front end, not parent
-        myDistriGroup = new DistributedGroup(0);
-    } else {
-        int pid = -1;
-        char *envp = ::getenv("SCI_PARENT_ID");
-        if (envp) {
-            pid = ::atoi(envp);
-        } else {
-            throw Exception(Exception::INVALID_LAUNCH);
-        }
-        myDistriGroup = new DistributedGroup(pid);
-    }
-
-    successorList = new int[MAX_SUCCESSOR_NUM];
-    
-}
-
-RoutingList::~RoutingList()
-{  
-    delete myDistriGroup;
-    delete [] successorList;
-    
-    instance = NULL;
-}
-
-void RoutingList::parseCmd(Message *msg)
-{
-    bool notify = false;
-    int rc = SCI_SUCCESS;
-    if (msg->getType() == Message::GROUP_CREATE) {
-        Packer packer(msg->getContentBuf());
-
-        int num_bes = packer.unpackInt();
-        int be_list[num_bes];
-        for (int i=0; i<num_bes; i++) {
-            be_list[i] = packer.unpackInt();
-        }
-
-        myDistriGroup->create(num_bes, be_list, msg->getGroup());
-        bcast(msg->getGroup(), msg);
-
-        if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-            notify = true;
-        }
-    } else if (msg->getType() == Message::GROUP_FREE) {
-        sci_group_t group = msg->getGroup();
-        
-        bcast(group, msg);
-        myDistriGroup->remove(group);
-
-        if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-            notify = true;
-        }
-    } else if (msg->getType() == Message::GROUP_OPERATE) {
-        Packer packer(msg->getContentBuf());
-
-        sci_op_t op = (sci_op_t) packer.unpackInt();
-        sci_group_t group1 = (sci_group_t) packer.unpackInt();
-        sci_group_t group2 = (sci_group_t) packer.unpackInt();
-
-        rc = myDistriGroup->operate(group1, group2, op, msg->getGroup());
-        if (rc == SCI_SUCCESS) {
-            bcast(msg->getGroup(), msg);
-        }
-
-        if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-            notify = true;
-        }
-    } else if (msg->getType() == Message::GROUP_OPERATE_EXT) {
-        Packer packer(msg->getContentBuf());
-
-        sci_op_t op = (sci_op_t) packer.unpackInt();
-        sci_group_t group = (sci_group_t) packer.unpackInt();
-        int num_bes = packer.unpackInt();
-        int be_list[num_bes];
-        for (int i=0; i<num_bes; i++) {
-            be_list[i] = packer.unpackInt();
-        }
-
-        rc = myDistriGroup->operateExt(group, num_bes, be_list, op, msg->getGroup());
-        if (rc == SCI_SUCCESS) {
-            bcast(msg->getGroup(), msg);
-        }
-
-        if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-            notify = true;
-        }
-    } else if (msg->getType() == Message::GROUP_DROP) {
-        myDistriGroup->dropSuccessor(msg->getID());
-    } else if (msg->getType() == Message::GROUP_MERGE) {
-        DistributedGroup subDistriGroup(-1);
-        subDistriGroup.unpackMsg(*msg);
-
-        if (subDistriGroup.getPID() == gCtrlBlock->getMyHandle()) {
-            // if this message is from my son
-            myDistriGroup->merge(msg->getID(), subDistriGroup, false);
-        } else if (isSuccessorExist(subDistriGroup.getPID())){
-            // if this message is from my grandson
-            myDistriGroup->merge(msg->getID(), subDistriGroup, false);
-        } else {
-            // if this message is from my nephew
-            myDistriGroup->merge(msg->getID(), subDistriGroup, true);
-
-            // now update its parent id to me
-            subDistriGroup.setPID(gCtrlBlock->getMyHandle());
-
-            // repack a message and send to my parent
-            Message *newmsg = subDistriGroup.packMsg();
-            gCtrlBlock->getFilterOutQueue()->produce(newmsg);
-        }
-    } else {
-        assert(!"should never be here");
-    }
-
-    if (notify) {
-        void *ret = gNotifier->getRetVal(msg->getID());
-        *((int *) ret) = rc;
-        gNotifier->notify(msg->getID());
-    }
-}
-
-void RoutingList::propagateGroupInfo()
-{
-    // propgate my group information to my parent
-    Message *msg = myDistriGroup->packMsg();
-    if (gCtrlBlock->getMyRole() == CtrlBlock::AGENT) {
-        gCtrlBlock->getFilterOutQueue()->produce(msg);
-    } else if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_END) {
-        gCtrlBlock->getUpQueue()->produce(msg);
-    } else {
-        assert(!"should not be here");
-    }
-}
-
-int RoutingList::getSegments(Message *msg, Message ***segments, int ref)
-{
-    int i = 0;
-    int segnum = (msg->getContentLen() + maxSegmentSize - 1) / maxSegmentSize + 1;
-    int size = 0;
-    char *ptr = msg->getContentBuf();
-    sci_group_t gid = msg->getGroup();
-    Message::Type typ = msg->getType();
-    int mid = msg->getID();
-    int mfid = msg->getFilterID();
-    int hfid = mfid;
-    int mlen = msg->getContentLen();
-    *segments = (Message **)::malloc(segnum * sizeof(Message *));
-    Message **segs = *segments;
-
-    if ((mfid != SCI_FILTER_NULL) || (typ != Message::COMMAND)) {
-        hfid = SCI_JOIN_SEGMENT;
-    }
-    ::memset(segs, 0, segnum * sizeof(Message *));
-    segs[0] = new Message();
-    segs[0]->build(hfid, gid, 0, NULL, NULL, Message::SEGMENT, segnum);
-    segs[0]->setRefCount(ref);
-
-    for (i = 1; i < segnum; i++) {
-        segs[i] = new Message();
-        size = (i < (segnum - 1)) ? maxSegmentSize : (mlen % maxSegmentSize);
-        segs[i]->build(mfid, gid, 1, &ptr, &size, typ, mid);
-        segs[i]->setRefCount(ref);
-        ptr += size;
-    }
-
-    return segnum;
-}
-
-int RoutingList::bcast(sci_group_t group, Message *msg)
-{
-    if (group > SCI_GROUP_ALL) {
-        int hndl = querySuccessorId((int) group);
-        if (hndl == INVLIDSUCCESSORID) {
-            return SCI_ERR_GROUP_NOTFOUND;
-        } else if (hndl == VALIDBACKENDIDS) {
-            ucast((int)group, msg);
-        } else {
-            ucast(hndl, msg);
-        }
-        return SCI_SUCCESS;
-    }
-    
-    if (!isGroupExist(group)) {
-        return SCI_ERR_GROUP_NOTFOUND;
-    }
-
-    splitBcast(group, msg);
-    
-    return SCI_SUCCESS;
-}
-
-void RoutingList::splitBcast(sci_group_t group, Message *msg)
-{
-    int numSor = numOfSuccessor(group);
-    retrieveSuccessorList(group, successorList);
-
-    if (msg->getContentLen() <= (maxSegmentSize * 3 / 2)) {
-        int i = 0;
-        // include the original queue
-        for (i = 0; i < numSor; i++) {
-            ucast(successorList[i], msg, numSor);
-        }
-    } else {
-        mcast(msg, successorList, numSor);
-    }
-}
-
-void RoutingList::mcast(Message *msg, int *sorList, int num)
-{
-    int i = 0;
-    Message **segments;
-    int segnum = getSegments(msg, &segments, num);
-    for (i = 0; i < num; i++) {
-        gCtrlBlock->queryQueue(successorList[i])->multiProduce(segments, segnum);
-    }
-    ::free(segments);
-    if (msg->decRefCount() == 0) {
-        delete msg;
-    }
-}
-
-void RoutingList::ucast(int successor_id, Message *msg, int refInc)
-{
-    log_debug("Processor Router: send msg to successor %d", successor_id);
-    if (msg->getContentLen() <= (maxSegmentSize * 3 / 2)) {
-        msg->setRefCount(msg->getRefCount() + refInc);
-        gCtrlBlock->queryQueue(successor_id)->produce(msg);
-    } else {
-        mcast(msg, &successor_id, 1);
-    }
-
-    return;
-}
-
-void RoutingList::initSubGroup(int successor_id, int start_be_id, int end_be_id)
-{
-    myDistriGroup->initSubGroup(successor_id, start_be_id, end_be_id);
-}
-
-void RoutingList::addBE(sci_group_t group, int successor_id, int be_id)
-{
-    myDistriGroup->addBE(group, successor_id, be_id);
-}
-
-void RoutingList::removeBE(int be_id)
-{
-    myDistriGroup->removeBE(be_id);
-}
-
-void RoutingList::removeGroup(sci_group_t group)
-{
-    myDistriGroup->remove(group);
-}
-
-void RoutingList::updateParentId(int pid)
-{
-    ::setenv("SCI_PARENT_ID", SysUtil::itoa(pid).c_str(), 1);
-    myDistriGroup->setPID(pid);
-}
-
-bool RoutingList::isGroupExist(sci_group_t group)
-{
-    return myDistriGroup->isGroupExist(group);
-}
-
-bool RoutingList::isSuccessorExist(int successor_id)
-{
-    return myDistriGroup->isSuccessorExist(successor_id);
-}
-
-
-int RoutingList::numOfBE(sci_group_t group)
-{
-    return myDistriGroup->numOfBE(group);
-}
-
-int RoutingList::numOfSuccessor(sci_group_t group)
-{
-    return myDistriGroup->numOfSuccessor(group);
-}
-
-int RoutingList::numOfBEOfSuccessor(int successor_id)
-{
-    if (successor_id >= 0) {
-        // if it is a back end
-        return 1;
-    }
-
-    return myDistriGroup->numOfBEOfSuccessor(successor_id);
-}
-
-int RoutingList::querySuccessorId(int be_id)
-{
-    return myDistriGroup->querySuccessorId(be_id);
-}
-
-void RoutingList::retrieveBEList(sci_group_t group, int * ret_val)
-{
-    assert(ret_val);
-    myDistriGroup->retrieveBEList(group, ret_val);
-}
-
-void RoutingList::retrieveSuccessorList(sci_group_t group, int * ret_val)
-{
-    assert(ret_val);
-    myDistriGroup->retrieveSuccessorList(group, ret_val);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/routinglist.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/routinglist.hpp
deleted file mode 100644
index 712150f..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/routinglist.hpp
+++ /dev/null
@@ -1,84 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: RoutingList
-
- Description: Provide routing services for all threads.
-   
- Author: Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/08/09 nieyy        Initial code (D156654)
-
-****************************************************************************/
-
-#ifndef _ROUTINGLIST_HPP
-#define _ROUTINGLIST_HPP
-
-#include "sci.h"
-#include "general.hpp"
-
-class Message;
-class DistributedGroup;
-class Stream;
-
-#define SCI_JOIN_SEGMENT -1001
-
-
-class RoutingList
-{      
-    private:
-        RoutingList();
-        static RoutingList    *instance;
-
-        DistributedGroup      *myDistriGroup;
-        int                   *successorList;
-        int                    maxSegmentSize;
-        
-    public:
-        ~RoutingList();
-        static RoutingList * getInstance();
-        
-        void parseCmd(Message *msg);
-        void propagateGroupInfo();
-
-        int getSegments(Message *msg, Message ***segments, int ref);
-        int bcast(sci_group_t group, Message *msg);
-        void ucast(int successor_id, Message *msg, int refInc = 1);
-        void mcast(Message *msg, int *sorList, int num);
-        void splitBcast(sci_group_t group, Message *msg);
-
-        void initSubGroup(int successor_id, int start_be_id, int end_be_id);
-        void addBE(sci_group_t group, int successor_id, int be_id);
-        void removeBE(int be_id);
-        void removeGroup(sci_group_t group);
-
-        void updateParentId(int pid);
-
-        bool isGroupExist(sci_group_t group);
-        bool isSuccessorExist(int successor_id);
-
-        int numOfBE(sci_group_t group);
-        int numOfSuccessor(sci_group_t group);
-        int numOfBEOfSuccessor(int successor_id);
-        
-        int querySuccessorId(int be_id);
-        void retrieveBEList(sci_group_t group, int *ret_val);
-        void retrieveSuccessorList(sci_group_t, int *ret_val);
-};
-
-#define gRoutingList RoutingList::getInstance()
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/statemachine.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/statemachine.cpp
deleted file mode 100644
index f52e928..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/statemachine.cpp
+++ /dev/null
@@ -1,402 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: StateMachine
-
- Description: SCI state Machine
-   
- Author: Nicole
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/25/08 nieyy         Initial code (D153875)
-
-****************************************************************************/
-
-#include "statemachine.hpp"
-#include <assert.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <string.h>
-
-#include "sci.h"
-
-#include "log.hpp"
-
-#include "ctrlblock.hpp"
-#include "routinglist.hpp"
-
-const char * StateMsg[] = {
-    "uninitialized",
-    "starting",
-    "running",
-    "idling",
-    "exiting"
-};
-
-const char * EventMsg[] = {
-    "data structures were created",
-    "data structure were cleaned",
-    "a child was connected",
-    "a child was disconnected",
-    "connected to the parent",
-    "lost connection to the parent",
-    "received a quit signal from the front end",
-    "a fatal exception occured",
-    "connection to the parent is recovered",
-    "failed recover the connection to the parent"
-};
-
-StateMachine * StateMachine::instance = NULL;
-
-StateMachine::StateMachine()
-{
-    ::pthread_mutex_init(&mtx, NULL);
-    reset();
-}
-
-StateMachine::~StateMachine()
-{
-    ::pthread_mutex_destroy(&mtx);
-
-    instance = NULL;
-}
-
-void StateMachine::parse(StateMachine::EVENT e)
-{
-    lock();
-    history.push_back(e);
-    if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-        parseFE(e);
-        if ((gCtrlBlock->getEndInfo()->fe_info.mode==SCI_POLLING) && 
-            (state==IDLING)) {
-            // if polling mode, need notify SCI_Poll in idling state
-            gCtrlBlock->notifyPollQueue();
-        }
-    } else if (gCtrlBlock->getMyRole() == CtrlBlock::AGENT) {
-        parseAgent(e);
-    } else if (gCtrlBlock->getMyRole() == CtrlBlock::BACK_END) {
-        parseBE(e);
-        if ((gCtrlBlock->getEndInfo()->be_info.mode==SCI_POLLING) &&
-            (state==EXITING)) {
-            // if polling mode, need notify SCI_Poll in exiting state
-            gCtrlBlock->notifyPollQueue();
-        }
-    }
-
-    log_debug("StateMachine: current state is %s", StateMsg[state]);
-
-    if (state == EXITING) {
-        gCtrlBlock->disable();
-    } else if (state != UNINITIALIZED) {
-        gCtrlBlock->enable();
-    }
-    unlock();
-}
-
-void StateMachine::reset()
-{
-    lock();
-    state = UNINITIALIZED;
-    connected = 0;
-    disconnected = 0;
-    toQuit = false;
-    history.clear();
-    unlock();
-}
-
-StateMachine::STATE StateMachine::getState()
-{
-    STATE s;
-
-    lock();
-    s = state;
-    unlock();
-    
-    return s;
-}
-
-bool StateMachine::isToQuit(int handle)
-{
-    bool ret;
-
-    lock();
-    if (toQuit) {
-        ret = true;
-    } else {
-        if (handle == gCtrlBlock->getMyHandle()) {
-            ret = false;
-        } else {
-            if (gRoutingList->isSuccessorExist(handle)) {
-                ret = false;
-            } else {
-                ret = true;
-            }
-        }
-    }
-    unlock();
-
-    return ret;
-}
-
-void StateMachine::dump()
-{
-    char outFile[256];
-    int hndl = gCtrlBlock->getMyHandle();
-    if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-        ::sprintf(outFile, "fe.state");
-    } else if (gCtrlBlock->getMyRole() == CtrlBlock::AGENT) {
-        ::sprintf(outFile, "scia.state.%d", hndl);
-    } else {
-        ::sprintf(outFile, "be.state.%d", hndl);
-    }
-
-    FILE *fp = ::fopen(outFile, "w");
-    if (fp) {
-        int size = history.size();
-        for (int i=0; i<size; i++) {
-            ::fprintf(fp, "Event %d: %s\n", i, EventMsg[history[i]]);
-        }
-        
-        ::fclose(fp);
-    }
-}
-
-void StateMachine::doAssert(bool expression)
-{
-    if (!expression) {
-        dump();
-        assert(!"Should not be here");
-    }
-}
-
-void StateMachine::parseFE(StateMachine::EVENT e)
-{
-    switch (e) {
-        case USER_QUIT:
-            log_debug("StateMachine: user called SCI_Terminate");
-            if (state == IDLING) {
-                state = EXITING;
-            }
-            toQuit = true;
-            break;
-        case FATAL_EXCEPTION:
-            log_debug("StateMachine: fatal exception");
-            if (state != EXITING) {
-                state = EXITING;
-            }
-            break;
-        case CLIENT_CONNECTED:
-            log_debug("StateMachine: a client is connected");
-            connected++;
-            if (state == STARTING) {
-                if (connected >= gRoutingList->numOfSuccessor(SCI_GROUP_ALL)) {
-                    state = RUNNING;
-                }
-            } else if (state == IDLING) {
-                state = RUNNING;
-            }
-            break;
-        case CLIENT_BROKEN:
-            log_debug("StateMachine: a client is disconnected");
-            disconnected++;
-            if (state == RUNNING) {
-                int numSuccessors = gRoutingList->numOfSuccessor(SCI_GROUP_ALL);
-                int max = connected > numSuccessors ? connected : numSuccessors;
-                if (disconnected >= max) {
-                    state = IDLING;
-                    if (toQuit) {
-                        state = EXITING;
-                    }
-                }
-            }
-            break;
-        case DATASTRUC_CREATED:
-            log_debug("StateMachine: data structure created");
-            if (state == UNINITIALIZED) {
-                state = STARTING;
-            } else {
-                doAssert();
-            }
-            break;
-        case DATASTUCT_CLEANED:
-            log_debug("StateMachine: data structure cleaned");
-            if (state == EXITING) {
-                state = UNINITIALIZED;
-            } else {
-                doAssert();
-            }
-            break;
-        default:
-            log_error("StateMachine: unexpected event");
-            break;
-    }
-}
-
-void StateMachine::parseAgent(StateMachine::EVENT e)
-{
-    switch (e) {
-        case PARENT_CONNECTED:
-            log_debug("StateMachine: connected to the parent");
-            if (state == UNINITIALIZED) {
-                state = STARTING;
-            } else {
-                doAssert();
-            }
-            break;
-        case USER_QUIT:
-            log_debug("StateMachine: got a quit command");
-            toQuit = true;
-            if (gRoutingList->numOfSuccessor(SCI_GROUP_ALL) == 0) {
-                state = EXITING;
-            }
-            break;
-        case FATAL_EXCEPTION:
-            log_debug("StateMachine: parent broken or fatal exception");
-            if (state != EXITING) {
-                state = EXITING;
-            }
-            break;
-        case CLIENT_CONNECTED:
-            log_debug("StateMachine: a client is connected");
-            connected++;
-            if (state == STARTING) {
-                if (connected >= gRoutingList->numOfSuccessor(SCI_GROUP_ALL)) {
-                    state = RUNNING;
-                }
-            }
-            break;
-        case CLIENT_BROKEN:
-            log_debug("StateMachine: a client is disconnected");
-            disconnected++;
-            if (state == RUNNING) {
-                int numSuccessors = gRoutingList->numOfSuccessor(SCI_GROUP_ALL);
-                int max = connected > numSuccessors ? connected : numSuccessors;
-                if ((disconnected>=max) && toQuit) {
-                    state = EXITING;
-                }
-            }
-            break;
-        case DATASTRUC_CREATED:
-            log_debug("StateMachine: data structure created");
-            doAssert(state == STARTING);
-            break;
-        case DATASTUCT_CLEANED:
-            log_debug("StateMachine: data structure cleaned");
-            if (state == EXITING) {
-                state = UNINITIALIZED;
-            } else {
-                doAssert();
-            }
-            break;
-        case PARENT_BROKEN:
-            log_debug("StateMachine: parent broken");
-            if (state == RUNNING) {
-                state = IDLING;
-            } else {
-                state = EXITING;
-            }
-            break;
-        case RECOVER_OK:
-            log_debug("StateMachine: recover okay");
-            if (state == IDLING) {
-                state = RUNNING;
-            } else {
-                doAssert();
-            }
-            break;
-        case RECOVER_FAILED:
-            log_debug("StateMachine: recover failed");
-            if (state == IDLING) {
-                state = EXITING;
-            } else if (state != EXITING) {
-                doAssert();
-            }
-            break;
-        default:
-            log_error("StateMachine: unexpected event");
-            break;
-    }
-}
-
-void StateMachine::parseBE(StateMachine::EVENT e)
-{
-    switch (e) {
-        case PARENT_CONNECTED:
-            log_debug("StateMachine: connected to the parent");
-            if (state == UNINITIALIZED) {
-                state = STARTING;
-            } else {
-                doAssert();
-            }
-            break;
-        case USER_QUIT:
-            log_debug("StateMachine: got a quit command");
-            if (state == RUNNING) {
-                state = EXITING;
-            } else if (state != EXITING) {
-                doAssert();
-            }
-            break;
-        case FATAL_EXCEPTION:
-            log_debug("StateMachine: fatal exception");
-            if (state != EXITING) {
-                state = EXITING;
-            }
-            break;
-        case DATASTRUC_CREATED:
-            log_debug("StateMachine: data structure created");
-            if (state == STARTING) {
-                state = RUNNING;
-            } else {
-                doAssert();
-            }
-            break;
-        case DATASTUCT_CLEANED:
-            log_debug("StateMachine: data structure cleaned");
-            if (state == EXITING) {
-                state = UNINITIALIZED;
-            } else {
-                doAssert();
-            }
-            break;
-        case PARENT_BROKEN:
-            log_debug("StateMachine: parent broken");
-            if (state == RUNNING) {
-                state = IDLING;
-            } else {
-                state = EXITING;
-            }
-            break;
-        case RECOVER_OK:
-            log_debug("StateMachine: recover okay");
-            if (state == IDLING) {
-                state = RUNNING;
-            } else {
-                doAssert();
-            }
-            break;
-        case RECOVER_FAILED:
-            log_debug("StateMachine: recover failed");
-            if (state == IDLING) {
-                state = EXITING;
-            } else if (state != EXITING) {
-                doAssert();
-            }
-            break;
-        default:
-            log_error("StateMachine: unexpected event");
-            break;
-    }
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/statemachine.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/statemachine.hpp
deleted file mode 100644
index 6febb2e..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/statemachine.hpp
+++ /dev/null
@@ -1,101 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: StateMachine
-
- Description: SCI state Machine
-   
- Author: Nicole
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/25/08 nieyy         Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _STATEMACHINE_HPP
-#define _STATEMACHINE_HPP
-
-#include <pthread.h>
-
-#include <vector>
-
-using namespace std;
-
-class StateMachine
-{
-    public:
-        enum STATE {
-            UNINITIALIZED,
-            STARTING,
-            RUNNING,
-            IDLING,
-            EXITING
-        };
-
-        enum EVENT {
-            DATASTRUC_CREATED,
-            DATASTUCT_CLEANED,
-            CLIENT_CONNECTED,
-            CLIENT_BROKEN,
-            PARENT_CONNECTED,
-            PARENT_BROKEN,
-            USER_QUIT,
-            FATAL_EXCEPTION,
-            RECOVER_OK,
-            RECOVER_FAILED
-        };
-
-        typedef vector<EVENT> EVENT_VEC;
-        
-    private:
-        static StateMachine *instance;
-        StateMachine();
-        
-        pthread_mutex_t     mtx;
-        STATE               state;
-        int                 connected;
-        int                 disconnected;
-        bool                toQuit;
-
-        EVENT_VEC           history;
-
-    public:
-        ~StateMachine();
-        static StateMachine * getInstance() {
-            if (instance == NULL)
-                instance = new StateMachine();
-            return instance;
-        }
-
-        void parse(EVENT e);
-        void reset();
-        STATE getState();
-        bool isToQuit(int handle);
-
-        void dump();
-        void doAssert(bool epxression = false);
-
-    private:
-        void lock() { ::pthread_mutex_lock(&mtx); }
-        void unlock() { ::pthread_mutex_unlock(&mtx);}
-
-        void parseFE(EVENT e);
-        void parseAgent(EVENT e);
-        void parseBE(EVENT e);
-};
-
-#define gStateMachine StateMachine::getInstance()
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/topology.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/topology.cpp
deleted file mode 100644
index 03b1ecb..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/topology.cpp
+++ /dev/null
@@ -1,838 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: BEMap, Topology, Launcher
-
- Description: Runtime topology manipulation.
-   
- Author: Nicole Nie, Liu Wei, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#include "topology.hpp"
-#include <stdlib.h>
-#include <math.h>
-#include <assert.h>
-#include <ctype.h>
-#include <string.h>
-#include <unistd.h>
-#include <pwd.h>
-#include <errno.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-
-#include "log.hpp"
-#include "tools.hpp"
-#include "packer.hpp"
-#include "socket.hpp"
-#include "exception.hpp"
-#include "ipconverter.hpp"
-
-#include "ctrlblock.hpp"
-#include "message.hpp"
-#include "queue.hpp"
-#include "routinglist.hpp"
-#include "processor.hpp"
-#include "eventntf.hpp"
-#include "listener.hpp"
-#include "parent.hpp"
-
-const int ONE_KK = 1024 * 1024;
-const int MAX_FD = 1024;
-const int SCI_DAEMON_PORT = 6688;
-
-int BEMap::input(const char * filename, int num)
-{
-    FILE *fp = NULL;
-    fp = ::fopen(filename,"r");
-    if (NULL == fp) {
-        return SCI_ERR_INVALID_HOSTFILE;
-    }
-    int rc = ::fseek(fp, 0, SEEK_END); //go to end
-    if (rc != 0) {
-        return SCI_ERR_INVALID_HOSTFILE;
-    }
-    long len = ::ftell(fp); //get position at end (length)
-    if (len <= 0) {
-        return SCI_ERR_INVALID_HOSTFILE;
-    }
-    rc = ::fseek(fp, 0, SEEK_SET); //go to begin
-    if (rc != 0) {
-        return SCI_ERR_INVALID_HOSTFILE;
-    }
-    char *text = new char[len+1]; //allocate buffer
-    ::fread(text, len, 1, fp); //read into buffer
-    ::fclose(fp);
-
-    // mark end with '\n\0'
-    text[len-1] = '\n'; // mark end
-    text[len] = '\0';
-
-    map<string, string> hostCache;
-    map<string, string>::iterator it;
-    
-    log_debug("Hostlist is: ");
-    int index = 0;
-    char *pPrev = text, *pNext = text;
-    while (pNext <= (text + len)) {
-        if (index >= num) {
-            break;
-        }
-        pNext++;
-        if ((*pNext) == '\n') {
-            *pNext = '\0';
-            // ignore tabs
-            while (((*pPrev) == ' ') || ((*pPrev) == '\t')) {
-                pPrev++;
-            }
-            // ignore line with '#' as its first char
-            if (((*pPrev) != '\0') && ((*pPrev) != '\n') && ((*pPrev) != '#')) {
-                log_debug("%s", pPrev);
-                string key = pPrev;
-                it = hostCache.find(key);
-                if (it == hostCache.end()) {
-                    hostCache[key] = pPrev;
-                    (*this)[index++] = pPrev;
-                } else {
-                    (*this)[index++] = (*it).second;
-                }
-            }
-            
-            pPrev = pNext+1;
-        }
-    }
-    
-    hostCache.clear();
-    delete [] text;
-    
-    return SCI_SUCCESS;
-}
-
-Topology::Topology(int id)
-    : agentID(id)
-{
-    beMap.clear();
-    weightMap.clear();
-}
-
-Topology::~Topology()
-{
-    beMap.clear();
-    weightMap.clear();
-}
-
-Message * Topology::packMsg()
-{   
-    Packer packer;
-    packer.packInt(agentID);
-    packer.packInt(fanOut);
-    packer.packInt(level);
-    packer.packInt(height);
-    packer.packStr(bePath);
-    packer.packStr(agentPath);
-
-    BEMap::iterator it;
-    packer.packInt(beMap.size());    
-    for (it = beMap.begin(); it != beMap.end(); ++it) {
-        packer.packInt((*it).first);
-        packer.packStr((*it).second);
-    }
-
-    char *bufs[1];
-    int sizes[1];
-
-    bufs[0] = packer.getPackedMsg();
-    sizes[0] = packer.getPackedMsgLen();
-
-    Message *msg = new Message(Message::CONFIG);
-    msg->build(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes, Message::CONFIG);
-    delete [] bufs[0];
-
-    return msg;
-}
-
-Topology & Topology::unpackMsg(Message &msg) 
-{
-    int i, id, size;
-    Packer packer(msg.getContentBuf());
-
-    agentID = packer.unpackInt();
-    fanOut = packer.unpackInt();
-    level = packer.unpackInt();
-    height = packer.unpackInt();
-    bePath = packer.unpackStr();
-    agentPath = packer.unpackStr();
-
-    size = packer.unpackInt();
-    for (i = 0; i < size; i++) {
-        id = packer.unpackInt();
-        beMap[id] = packer.unpackStr();
-    }
-
-    return *this;
-}
-
-int Topology::init()
-{
-    int rc;
-    char *envp = NULL;
-
-    // check host file & num of be
-    char *hostfile = gCtrlBlock->getEndInfo()->fe_info.hostfile;
-    if ((envp = ::getenv("SCI_HOST_FILE")) != NULL) {
-        hostfile = envp;
-    }
-    if (hostfile == NULL) {
-        hostfile = "host.list";
-    }
-
-    int numItem = ONE_KK;
-    if ((envp = ::getenv("SCI_BACKEND_NUM")) != NULL) {
-        numItem = ::atoi(envp);
-    }
-    rc = beMap.input(hostfile, numItem);
-    
-    if (rc != SCI_SUCCESS) {
-        return rc;
-    }
-
-    // check fanout
-    fanOut = 32;
-    if ((envp = ::getenv("SCI_DEBUG_FANOUT")) != NULL) {
-        fanOut = ::atoi(envp);
-    }
-    
-    level = 0;
-    height = (int) ::ceil(::log((double)beMap.size()) / ::log((double)fanOut));
-
-    // check be path
-    if ((envp = ::getenv("SCI_BACKEND_PATH")) != NULL) {
-        bePath = envp;
-    } else {
-        if (gCtrlBlock->getEndInfo()->fe_info.bepath != NULL) {
-            bePath = gCtrlBlock->getEndInfo()->fe_info.bepath;
-        } else {
-            return SCI_ERR_UNKNOWN_INFO;
-        }
-    }
-
-    // check agent path
-#ifdef __64BIT__
-    const char *agentName = "scia64";
-#else
-    const char *agentName = "scia";
-#endif
-
-    if ((envp = ::getenv("SCI_AGENT_PATH")) != NULL) {
-        agentPath = envp;
-        agentPath += "/";
-        agentPath += agentName;
-    } else {
-        agentPath = SysUtil::get_path_name(agentName);
-    }
-
-    return SCI_SUCCESS;
-}
-
-int Topology::deploy()
-{
-    Launcher launcher(*this);
-    nextAgentID = (agentID + 1) * fanOut - 2; // A formular to calculate the agentID of the first child
-    
-    int rc = launcher.launch();
-    if (rc == SCI_SUCCESS) {
-        // upload my hostname & port info to my parent for uncle collection purpose
-        if (gCtrlBlock->getMyRole() == CtrlBlock::AGENT) {
-            gCtrlBlock->genSelfInfo(gCtrlBlock->getFilterOutQueue(), true);
-        }
-    }
-    rc = launcher.syncWaiting(getBENum());
-
-    return rc;
-}
-
-int Topology::addBE(Message *msg)
-{
-    assert(msg);
-
-    Packer packer(msg->getContentBuf());
-    char *host = packer.unpackStr();
-    int id = (int) msg->getGroup();
-
-    // find the first child agent with weight < fanOut
-    int aID = INVLIDSUCCESSORID;
-    map<int, int>::iterator it = weightMap.begin();
-    for (; it!=weightMap.end(); ++it) {
-        int weight = (*it).second;
-        if (!isFullTree(weight)) {
-            aID = (*it).first;
-            break;
-        }
-    }
-
-    int rc = SCI_SUCCESS;
-    if (aID == INVLIDSUCCESSORID) {
-        // if do not find
-        Launcher launcher(*this);
-        if (weightMap.size() == 0) { // if this agent does not have any child agents, launch a back end
-            rc = launcher.launchBE(id, host);
-        } else { // if this agent has child agent(s), launch an agent
-            rc = launcher.launchAgent(id, host);
-        }
-        launcher.syncWaiting(1);
-    } else {
-        // otherwise delegate this command
-        gRoutingList->addBE(SCI_GROUP_ALL, aID, id);
-        gRoutingList->ucast(aID, msg);
-        incWeight(aID);
-    }
-
-    if (rc == SCI_SUCCESS) {
-        beMap[id] = host;
-    }
-
-    return rc;
-}
-
-int Topology::removeBE(Message *msg)
-{
-    assert(msg);
-
-    int id = (int) msg->getGroup();
-    if (!hasBE(id)) {
-        return SCI_ERR_BACKEND_NOTFOUND;
-    }
-
-    int aID = gRoutingList->querySuccessorId(id);
-    assert(aID != INVLIDSUCCESSORID);
-
-    gRoutingList->removeBE(id);
-    if (aID == VALIDBACKENDIDS) {
-        gRoutingList->ucast(id, msg);
-    } else {
-        gRoutingList->ucast(aID, msg);
-        decWeight(aID);
-    }
-    
-    beMap.erase(id);
-    return SCI_SUCCESS;
-}
-
-int Topology::getBENum()
-{
-    return beMap.size();
-}
-
-int Topology::getLevel()
-{
-    return level;
-}
-
-bool Topology::hasBE(int beID)
-{
-    if (beMap.find(beID) != beMap.end())
-        return true;
-    else
-        return false;
-}
-
-void Topology::incWeight(int id)
-{
-    if (weightMap.find(id) == weightMap.end()) {
-        weightMap[id] = 1;
-    } else {
-        weightMap[id] = weightMap[id] + 1;
-    }
-}
-
-void Topology::decWeight(int id)
-{
-    assert(weightMap.find(id) != weightMap.end());
-
-    weightMap[id] = weightMap[id] - 1;
-    if (weightMap[id] == 0) {
-        weightMap.erase(id);
-    }
-}
-
-bool Topology::isFullTree(int beNum)
-{ 
-    int h = (int)(::log((double)beNum) / ::log((double)fanOut)); 	
-    if (h == 0)
-        return false;
-
-    if ((int)(::pow((double)fanOut, (double)h)) == beNum)
-        return true;
-
-    return false;
-}
-
-Launcher::Launcher(Topology &topo)
-	: topology(topo), shell(""), mode(INTERNAL), sync(false), ackID(-1)
-{
-    char *envp = NULL;
-    char tmp[256] = {0};
-    string envStr;
-
-    envp = ::getenv("SCI_DEVICE_NAME");
-    if (envp) {
-        IPConverter converter;
-        string ifname = envp;
-        converter.getIP(ifname, true, localName);
-
-        env.set("SCI_DEVICE_NAME", envp);
-    } else {
-        ::gethostname(tmp, sizeof(tmp));
-        localName = SysUtil::get_hostname(tmp);
-    }
-    int jobKey = gCtrlBlock->getJobKey();
-
-    env.set("SCI_JOB_KEY", jobKey);
-    if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-        env.set("SCI_WORK_DIRECTORY", ::getenv("PWD"));
-    } else {
-        env.set("SCI_WORK_DIRECTORY", ::getenv("SCI_WORK_DIRECTORY"));
-    }
-
-    envp = ::getenv("SCI_AGENT_PATH");
-    if (envp) {
-        env.set("SCI_AGENT_PATH", envp);
-    }
-    envp = ::getenv("SCI_LIB_PATH");
-    if (envp) {
-        env.set("SCI_LIB_PATH", envp);
-        envStr = envp;
-    }
-#ifdef _SCI_LINUX
-    char *library_path = "LD_LIBRARY_PATH";
-#else
-    char *library_path = "LIBPATH";
-#endif
-    envp = ::getenv(library_path);
-    if (envp) {
-        if (envStr.length()) {
-            envStr += ":";
-            envStr += envp;
-        } else {
-            envStr = envp;
-        }
-    }
-    if (envStr.length()) {
-        env.set(library_path, envStr);
-    }
-    
-    env.set("SCI_LOG_DIRECTORY", Log::getInstance()->getLogDir());
-    env.set("SCI_LOG_LEVEL", Log::getInstance()->getLogLevel());
-    envp = ::getenv("SCI_REMOTE_SHELL");
-    if (envp) {
-        shell = envp;
-    }
-    env.set("SCI_USE_EXTLAUNCHER", "no");
-    envp = ::getenv("SCI_USE_EXTLAUNCHER");
-    if (envp && (::strcasecmp(envp, "yes") == 0)) {
-        mode = REGISTER;
-        env.set("SCI_USE_EXTLAUNCHER", "yes");
-    }
-    env.set("SCI_SYNC_INIT", "no");
-    envp = ::getenv("SCI_SYNC_INIT");
-    if (envp && (::strcasecmp(envp, "yes") == 0)) {
-        char *ev = ::getenv("SCI_INIT_ACKID");
-        sync = true;
-        env.set("SCI_SYNC_INIT", "yes");
-        if (ev != NULL) {
-            ackID = atoi(ev);
-            env.set("SCI_INIT_ACKID", ev); 
-        } else {
-            ackID = gNotifier->allocate();
-            env.set("SCI_INIT_ACKID", SysUtil::itoa(ackID).c_str()); 
-        }
-    }
-    env.set("SCI_ENABLE_FAILOVER", "no");
-    envp = ::getenv("SCI_ENABLE_FAILOVER");
-    if (envp && (::strcasecmp(envp, "yes") == 0)) {
-        env.set("SCI_ENABLE_FAILOVER", "yes");
-    }
-    env.set("SCI_REMOTE_SHELL", shell);
-    envp = ::getenv("SCI_DEBUG_TREE");
-    if (envp) {
-        env.set("SCI_DEBUG_TREE", envp);
-    }
-    envp = ::getenv("SCI_SEGMENT_SIZE");
-    if (envp) {
-        env.set("SCI_SEGMENT_SIZE", envp);
-    }
-
-    // add any tool specific environment variables
-    char **tool_envp = NULL;
-    if (gCtrlBlock->getMyRole() == CtrlBlock::FRONT_END) {
-        tool_envp = gCtrlBlock->getEndInfo()->fe_info.beenvp;
-    } else if (gCtrlBlock->getMyRole() == CtrlBlock::AGENT) {
-        // In <unistd.h>, the following variable:
-        //     extern char **environ;
-        // is initialized as a pointer to an array of character pointers 
-        // to the environment strings
-        tool_envp = environ;
-    }
-    if (tool_envp) {
-        while (*tool_envp) {
-            // filter out SCI_ and library path.
-            if (::strncmp(*tool_envp, "SCI_", 4) && 
-                ::strncmp(*tool_envp, library_path, ::strlen(library_path))) 
-            {
-                char *value = ::strchr(*tool_envp, '=');
-                if (value) {
-                    *value = '\0';
-                    env.set(*tool_envp, value+1);
-                    *value = '=';
-                }
-            }
-            tool_envp++;
-        }
-    }
-    log_debug("Launcher: env(%s)", env.getEnvString().c_str());
-}
-
-Launcher::~Launcher()
-{
-    env.unsetAll();
-}
-
-int Launcher::launch()
-{
-    int tree = 1;
-    int rc = 0;
-
-    char *envp = ::getenv("SCI_DEBUG_TREE");
-    if (envp) {
-        tree = ::atoi(envp);
-    }
-
-    if (tree != 2) {
-        // use tree 1 when default
-        rc = launch_tree1();
-    } else {
-        rc = launch_tree2();
-    }
-
-    return rc;
-}
-
-int Launcher::syncWaiting(int beNum)
-{
-    struct {
-        int num;
-        int count;
-    } rc;
-
-    if (!sync || (gCtrlBlock->getMyRole() != CtrlBlock::FRONT_END))
-        return 0;
-
-    rc.num = beNum;
-    rc.count = 0;
-    gNotifier->freeze(ackID, &rc);
-
-    return 0;
-}
-
-int Launcher::launchBE(int beID, const char * hostname)
-{
-    int rc;
-    char queueName[32];
-
-    gRoutingList->addBE(SCI_GROUP_ALL, VALIDBACKENDIDS, beID);
-
-    MessageQueue *queue = new MessageQueue();
-    ::sprintf(queueName, "BE%d_inQ", beID);
-    queue->setName(string(queueName));
-    gCtrlBlock->registerQueue(queue);
-    gCtrlBlock->mapQueue(beID, queue);
-
-    rc = launchClient(beID, topology.bePath, hostname, mode);
-    if (rc == SCI_SUCCESS) {
-        gCtrlBlock->genSelfInfo(queue, false);
-    } else {
-        gRoutingList->removeBE(beID);
-    }
-
-    return rc;
-}
-
-int Launcher::launchAgent(int beID, const char * hostname)
-{
-    int rc;
-    char queueName[32];
-    
-    Topology *childTopo = new Topology(topology.nextAgentID--);
-    childTopo->fanOut = topology.fanOut;
-    childTopo->level = topology.level + 1;
-    childTopo->height =  topology.height + 1;
-    childTopo->bePath = topology.bePath;
-    childTopo->agentPath = topology.agentPath;
-    childTopo->beMap[beID] = hostname;
-
-    gRoutingList->addBE(SCI_GROUP_ALL, childTopo->agentID, beID);
-
-    MessageQueue *queue = new MessageQueue();
-    ::sprintf(queueName, "Agent%d_inQ", childTopo->agentID);
-    queue->setName(string(queueName));
-    gCtrlBlock->registerQueue(queue);
-    gCtrlBlock->mapQueue(childTopo->agentID, queue);
-
-    rc = launchClient(childTopo->agentID, childTopo->agentPath, hostname);
-    if (rc == SCI_SUCCESS) {
-        Message *topoMsg = childTopo->packMsg();
-        queue->produce(topoMsg);
-        gCtrlBlock->genSelfInfo(queue, false);
-        
-        topology.incWeight(childTopo->agentID);
-    } else {
-        gRoutingList->removeBE(beID);
-    }
-    
-    delete childTopo;
-    return rc;
-}
-
-int Launcher::launchClient(int ID, string &path, string host, Launcher::MODE m)
-{
-    int rc = 0;
-    assert(!path.empty());
-    env.set("SCI_PARENT_HOSTNAME", localName);
-    env.set("SCI_PARENT_PORT", gCtrlBlock->getListener()->getBindPort());
-    env.set("SCI_CLIENT_ID", ID);
-    env.set("SCI_PARENT_ID", topology.agentID);
-
-    log_debug("Launch client: %s: %s", host.c_str(), path.c_str());
-    
-    if (shell.empty()) {
-        struct passwd *pwd = ::getpwuid(::getuid());
-        string usernam = pwd->pw_name;
-        try {
-            Stream stream;
-            stream.init(host.c_str(), SCI_DAEMON_PORT);
-            int jobKey = gCtrlBlock->getJobKey();
-            stream << usernam << (int)m << jobKey << ID << path << env.getEnvString() << endl;
-            stream.stop();
-        } catch (SocketException &e) {
-            rc = -1;
-            log_error("Launcher: socket exception: %s", e.getErrMsg().c_str());
-        }
-    } else {
-        string cmd = shell + " " + host + " -n '" + env.getExportcmd() + path + " >&- 2>&- <&- &'";
-        rc = system(cmd.c_str());
-    }
-
-    if (rc != SCI_SUCCESS)
-        rc = SCI_ERR_LAUNCH_FAILED;
-
-    return rc;
-}
-
-int Launcher::launch_tree1()
-{
-    int rc;
-    
-    // this tree will have minimum agents
-    int totalSize = (int) topology.beMap.size();
-    char queueName[32];
-   
-    if (totalSize <= topology.fanOut) {
-        // no need to generate agent
-        BEMap::iterator it = topology.beMap.begin();
-
-        int initID = (*it).first;
-        int startID = initID;
-        int endID = initID + totalSize - 1;
-        gRoutingList->initSubGroup(VALIDBACKENDIDS, startID, endID);
-        
-        for ( ; it != topology.beMap.end(); ++it) {
-            MessageQueue *queue = new MessageQueue();
-            ::sprintf(queueName, "BE%d_inQ", (*it).first);
-            queue->setName(string(queueName));
-            gCtrlBlock->registerQueue(queue);
-            gCtrlBlock->mapQueue((*it).first, queue);
-
-            rc = launchClient((*it).first, topology.bePath, (*it).second, mode);
-            if (rc == SCI_SUCCESS) {
-                gCtrlBlock->genSelfInfo(queue, false);
-            } else {
-                return rc;
-            }
-        }
-
-        return SCI_SUCCESS;
-    }
-
-    int stride = (int) ::ceil (::pow(double(topology.fanOut), topology.height - topology.level - 1));
-    int divf;
-    if ((totalSize % stride) == 0) {
-        divf = totalSize / stride;
-    } else {
-        divf = (totalSize - totalSize%stride) / stride + 1;
-    }
-    int step;
-    if ((totalSize % divf) == 0) {
-        step = totalSize / divf;
-    } else {
-        step = (totalSize - (totalSize % divf)) / divf + 1;
-    }
-    ::srand((unsigned int) ::time(NULL));
-    BEMap::iterator it = topology.beMap.begin();
-    int initID = (*it).first;
-    for (int i = 0; i < totalSize; i += step) {
-        it = topology.beMap.begin();
-        for (int j = 0; j < i; j++) {
-            ++it;
-        }
-
-        // generate an agent
-        Topology *childTopo = new Topology(topology.nextAgentID--);
-        childTopo->fanOut  = topology.fanOut;
-        childTopo->level = topology.level + 1;
-        childTopo->height = topology.height;
-        childTopo->bePath = topology.bePath;
-        childTopo->agentPath = topology.agentPath;
-        
-        int min = (totalSize - i) < step ? (totalSize - i) : step;
-
-        int startID = initID + i;
-        int endID = initID + i + min - 1;
-        gRoutingList->initSubGroup(childTopo->agentID, startID, endID);
-
-        string hostname;
-        
-        int pos = ::rand() % min;
-        for (int j = 0; j < min; j++) {
-            if (pos == j) {
-                hostname = (*it).second;
-            }
-            childTopo->beMap[(*it).first] = (*it).second;
-            topology.incWeight(childTopo->agentID);
-            ++it;
-        }
-        
-        MessageQueue *queue = new MessageQueue();
-        ::sprintf(queueName, "Agent%d_inQ", childTopo->agentID);
-        queue->setName(string(queueName));
-        gCtrlBlock->registerQueue(queue);
-        gCtrlBlock->mapQueue(childTopo->agentID, queue);
-
-        rc = launchClient(childTopo->agentID, topology.agentPath, hostname);
-        if (rc == SCI_SUCCESS) {
-            Message *msg = childTopo->packMsg();
-            queue->produce(msg);
-            gCtrlBlock->genSelfInfo(queue, false);
-            delete childTopo;
-        } else {
-            delete childTopo;
-            return rc;
-        }
-    }
-   
-    return SCI_SUCCESS;
-}
-
-int Launcher::launch_tree2()
-{
-    // this tree will have maximum agents but supposed to have better performance
-    // after evaluated by HongJun
-    int i, rc;
-    int left = 0;
-    int totalSize = topology.beMap.size();
-    int step;
-    int size = 0;
-    int out = topology.fanOut;
-    char queueName[32];
-
-    if (totalSize == 0)
-        return SCI_SUCCESS;
-
-    // launch all of my back ends
-    BEMap::iterator it = topology.beMap.begin();
-    int initID = (*it).first;
-    while (size < totalSize) {
-        left = totalSize - size; 
-        step = (left + out - 1) / out;
-        out--;
-        if (step == 1) {
-            MessageQueue *queue = new MessageQueue();
-            ::sprintf(queueName, "BE%d_inQ", (*it).first);
-            queue->setName(string(queueName));
-            gCtrlBlock->registerQueue(queue);
-            gCtrlBlock->mapQueue((*it).first, queue);
-        
-            gRoutingList->addBE(SCI_GROUP_ALL, VALIDBACKENDIDS, (*it).first);
-
-            rc = launchClient((*it).first, topology.bePath, (*it).second, mode);
-            if (rc == SCI_SUCCESS) {
-                gCtrlBlock->genSelfInfo(queue, false);
-            } else {
-                return rc;
-            }
-            it++;
-        } else {
-            string hostname;
-            BEMap::iterator fh = it;
-            Topology *childTopo = new Topology(topology.nextAgentID--);
-            childTopo->fanOut  = topology.fanOut;
-            childTopo->level = topology.level + 1;
-            childTopo->height = topology.height;
-            childTopo->bePath = topology.bePath;
-            childTopo->agentPath = topology.agentPath;
-
-            int startID = initID + size;
-            int endID = initID + size + step - 1;
-            gRoutingList->initSubGroup(childTopo->agentID, startID, endID);
-
-            for (i = 0; i < step; i++) {
-                childTopo->beMap[(*it).first] = (*it).second;
-                topology.incWeight(childTopo->agentID);
-                it++;
-            }
-
-            MessageQueue *queue = new MessageQueue();
-            ::sprintf(queueName, "Agent%d_inQ", childTopo->agentID);
-            queue->setName(string(queueName));
-            gCtrlBlock->registerQueue(queue);
-            gCtrlBlock->mapQueue(childTopo->agentID, queue);
-            
-            int pos = ::rand() % step;
-            for (i = 0; i < step; i++) {
-                if (pos == i) {
-                    hostname = fh->second;
-                    break;
-                }
-                fh++;
-            }
-
-            rc = launchClient(childTopo->agentID, topology.agentPath, hostname);
-            if (rc == SCI_SUCCESS) {
-                Message *msg = childTopo->packMsg();
-                queue->produce(msg);
-                gCtrlBlock->genSelfInfo(queue, false);
-                delete childTopo;
-            } else {
-                delete childTopo;
-                return rc;
-            }
-        }
-        size += step;
-    }
-
-    return SCI_SUCCESS;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/topology.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/topology.hpp
deleted file mode 100644
index 07ea563..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/topology.hpp
+++ /dev/null
@@ -1,129 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: BEMap, Topology, Launcher
-
- Description: Runtime topology manipulation.
-   
- Author: Nicole Nie, Liu Wei, Tu HongJ
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#ifndef _TOPOLOGY_HPP
-#define _TOPOLOGY_HPP
-
-#include <vector>
-#include <map>
-#include <string>
-
-using namespace std;
-
-#include "sci.h"
-#include "general.hpp"
-
-#include "envvar.hpp"
-
-class Message;
-class Launcher;
-
-class BEMap : public map<int, string> 
-{
-    public:
-        int input(const char *filename, int num);
-};
-
-class Topology 
-{        
-    private:
-        // primary members
-        int                  agentID;
-        int                  fanOut;
-        int                  level;
-        int                  height;
-        string               bePath;
-        string               agentPath;
-        BEMap                beMap;
-
-        // other members
-        int                  nextAgentID;
-
-        // weight factors
-        map<int, int> weightMap;
-
-    public: 
-        Topology(int id);
-        ~Topology();
-
-        Message * packMsg();
-        Topology & unpackMsg(Message &msg);
-
-        int init(); // only called by FE
-        int deploy();
-
-        int addBE(Message *msg);
-        int removeBE(Message *msg);
-
-        bool hasBE(int beID);
-        int getBENum();
-        int getLevel();
-
-        void incWeight(int id);
-        void decWeight(int id);
-
-        friend class Launcher;
-
-    private:
-        bool isFullTree(int beNum);
-};
-
-class Launcher 
-{
-    public:
-        enum MODE {
-            INTERNAL,
-            REGISTER,
-            REQUEST
-        };
-        
-    private:
-        Topology        &topology;
-        EnvVar          env;
-        string          shell;
-        string          localName;
-        MODE            mode;
-        bool            sync;
-        int             ackID;
-
-    public:    
-        Launcher(Topology &topy);
-        ~Launcher();
-        
-        int launch();
-        
-        int launchBE(int beID, const char *hostname);
-        int launchAgent(int beID, const char *hostname);
-        int syncWaiting(int beNum);
-
-    private:
-        int launchClient(int ID, string &path, string host, MODE m = INTERNAL);
-
-        int launch_tree1(); // mininum agents
-        int launch_tree2(); // maximum agents
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/writerproc.cpp b/tools/sci/org.eclipse.ptp.sci/libsci/writerproc.cpp
deleted file mode 100644
index 72b3c4f..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/writerproc.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: WriterProcessor
-
- Description: Properties of class 'WriterProcessor':
-    input: a message queue
-    output: a stream
-    action: relay messages from the queue to the stream.
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/25/09 nieyy      Initial code (F156654)
-
-****************************************************************************/
-
-#include "writerproc.hpp"
-#include <assert.h>
-
-#include "log.hpp"
-#include "exception.hpp"
-#include "socket.hpp"
-
-#include "ctrlblock.hpp"
-#include "message.hpp"
-#include "stream.hpp"
-#include "queue.hpp"
-
-WriterProcessor::WriterProcessor(int hndl) 
-    : Processor(hndl)
-{
-    name = "Writer";
-
-    inQueue = NULL;
-    outStream = NULL;
-}
-
-Message * WriterProcessor::read()
-{
-    assert(inQueue);
-
-    Message *msg = NULL;
-
-    msg = inQueue->consume();
-
-    return msg;
-}
-
-void WriterProcessor::process(Message * msg)
-{
-    assert(msg);
-    // no action
-}
-
-void WriterProcessor::write(Message * msg)
-{
-    assert(outStream);
-        
-    *outStream << *msg;
-    inQueue->remove();
-}
-
-void WriterProcessor::seize()
-{
-    // do nothing
-}
-
-void WriterProcessor::clean()
-{
-    outStream->stopWrite();
-}
-
-bool WriterProcessor::isActive()
-{
-    return gCtrlBlock->isEnabled() || (inQueue->getSize() > 0);
-}
-
-void WriterProcessor::setInQueue(MessageQueue * queue)
-{
-    inQueue = queue;
-}
-
-void WriterProcessor::setOutStream(Stream * stream)
-{
-    outStream = stream;
-}
-
-void WriterProcessor::stop()
-{
-    setState(false);
-    inQueue->produce();
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/libsci/writerproc.hpp b/tools/sci/org.eclipse.ptp.sci/libsci/writerproc.hpp
deleted file mode 100644
index 04edcd9..0000000
--- a/tools/sci/org.eclipse.ptp.sci/libsci/writerproc.hpp
+++ /dev/null
@@ -1,61 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: WriterProcessor
-
- Description: Properties of class 'WriterProcessor':
-    input: a message queue
-    output: a stream
-    action: relay messages from the queue to the stream.
-   
- Author: Nicole Nie
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   05/25/09 nieyy      Initial code (F156654)
-
-****************************************************************************/
-
-#ifndef _WRITERPROC_HPP
-#define _WRITERPROC_HPP
-
-#include "processor.hpp"
-
-class Stream;
-class MessageQueue;
-
-class WriterProcessor : public Processor 
-{
-    private:
-        MessageQueue        *inQueue;
-        Stream              *outStream;
-
-    public:
-        WriterProcessor(int hndl = -1);
-
-        virtual Message * read();
-        virtual void process(Message *msg);
-        virtual void write(Message *msg);
-        virtual void seize();
-        virtual void clean();
-
-        virtual bool isActive();
-
-        void setInQueue(MessageQueue *queue);
-        void setOutStream(Stream *stream);
-
-        void stop();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/makefile.define b/tools/sci/org.eclipse.ptp.sci/makefile.define
deleted file mode 100644
index ffb95ee..0000000
--- a/tools/sci/org.eclipse.ptp.sci/makefile.define
+++ /dev/null
@@ -1,81 +0,0 @@
-#------------------------------------------------------------
-#
-#	makefile    : General definitions for makefile
-#
-# 	Description: 
-# 	Common definition for makefile 
-#
-#------------------------------------------------------------
-
-ARCH := $(shell uname -m)
-OS := $(shell uname)
-AR = ar
-
-SRCS := $(wildcard *.c) $(wildcard *.cpp) $(wildcard *.cxx) 
-
-# Machine dependent flags
-ifeq ($(OS), AIX)
-    # power architecture
-    M_DEP_FLAGS = -DPOWER_ARCH
-else
-    ifeq ($(ARCH), i686)
-        # intel architecture
-        M_DEP_FLAGS = -DINTEL_ARCH
-    endif
-    ifeq ($(ARCH), x86_64)
-        # intel architecture
-        M_DEP_FLAGS = -DINTEL_ARCH
-    endif
-    ifeq ($(ARCH), ppc64)
-        # power architecture
-        M_DEP_FLAGS = -DPOWER_ARCH
-    endif
-endif
-
-# OS dependent flags
-ifeq ($(OS), AIX) 
-    OS_DEP_FLAGS =
-    CC32 = xlC_r -q32
-    CC64 = xlC_r -q64
-    MPCC32 = mpCC_r -q32
-    MPCC64 = mpCC_r -q64
-    WARN_OPTIONS =
-    ARFLAGS = -X32 -rv
-    AR64FLAGS = -X64 -rv
-    SCI_FLAGS = -lsci_r
-else
-    OS_DEP_FLAGS = -D_SCI_LINUX
-    CC32 = g++ -m32
-    CC64 = g++ -m64 -D__64BIT__
-    MPCC32 = mpCC -q32
-    MPCC64 = mpCC -q64 -D__64BIT__
-    WARN_OPTIONS = -Wall
-    ARFLAGS = -rv
-    AR64FLAGS = -rv 
-    SCI_FLAGS = -lsci
-endif
-
-OBJS := $(addsuffix .o, $(basename $(SRCS)))
-ifeq ($(ARCH), i686)
-    OBJS64 =
-else
-    OBJS64 := $(addsuffix .64o, $(basename $(SRCS)))
-endif
-
-MISSING_DEPS := $(filter-out $(wildcard $(DEPS)),$(DEPS) )
-
-.PHONY : all install
-
-MY_FLAGS = -g $(WARN_OPTIONS) $(M_DEP_FLAGS) $(OS_DEP_FLAGS) -DREENTRANT -D_SCI_DEBUG -I../include \
-    -I../common
-
-INC_DIR = /opt/sci/include
-BIN_DIR = /opt/sci/bin
-LIB_DIR = /opt/sci/lib
-
-%.o: %.cpp
-	$(CC32) -c $(CPPFLAGS) -o $@ $< 
-
-%.64o: %.cpp
-	$(CC64) -c $(CPPFLAGS) -o $@ $< 
-
diff --git a/tools/sci/org.eclipse.ptp.sci/man/Makefile b/tools/sci/org.eclipse.ptp.sci/man/Makefile
deleted file mode 100644
index d072a0b..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/Makefile
+++ /dev/null
@@ -1,39 +0,0 @@
-# Makefile for MMSC common library
-include ../makefile.define
-#=========================== DISPLAY SETTING ===================================
-esc	=	\033[
-fore 	= 	33
-back	=	41
-
-#light:1m non-light:m
-light	=	1m
-
-#			echo "${esc}${back};${fore};${light}making all in $$i${esc}m";
-#			echo "${esc}${back};${fore};${light}installing all in $$i${esc}m";
-#			echo "${esc}${back};${fore};${light}cleaning all in $$i${esc}m";
-#			echo "${esc}${back};${fore};${light}verycleaningall in $$i${esc}m";
-#================================================================================
-ifeq ($(OS), AIX)
-SUBDIRS =	aix
-else
-SUBDIRS =	linux
-endif
-
-all:
-	@for i in $(SUBDIRS); do\
-	    echo -e "${esc}0;37;44;1mmaking ${esc}0;32;43;1m all ${esc}0;33;41;1m in $$i ${esc}0m";\
-	    (cd $$i && $(MAKE) all) || exit 1; \
-	done
-
-install:
-	@for i in $(SUBDIRS); do \
-	    echo -e "${esc}0;37;44;1mmaking ${esc}0;32;43;1m installing ${esc}0;33;41;1m in $$i ${esc}0m";\
-	    (cd $$i && $(MAKE) install) || exit 1; \
-	done
-
-clean:
-	@for i in $(SUBDIRS); do \
-	    echo -e "${esc}0;37;44;1mmaking ${esc}0;32;43;1m cleaning ${esc}0;33;41;1m in $$i ${esc}0m";\
-	    (cd $$i && $(MAKE) clean) || exit 1;\
-	done
-
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/Makefile b/tools/sci/org.eclipse.ptp.sci/man/aix/Makefile
deleted file mode 100644
index ec05783..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-include ../../makefile.define
-
-install:
-	cp -p *.3 /usr/share/man/cat3/
-
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI.3
deleted file mode 100644
index c531dc1..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI.3
+++ /dev/null
@@ -1,63 +0,0 @@
-NAME
-    SCI - General information SCI 1.0.0
-
-SCI
-    SCI (Scalable Communication Infrastructure) is an open source project 
-    under the terms of the Eclipse Public License v1.0s, its aim is to 
-    provide a common, light-weight, scalable, portable, and extensible
-    run-time and communication infrastructure for the deployment of 
-    developer tools on the emerging peta- and exa-scale high performance
-    computing systems.
-
-    For more information about EPL, see the following URL:
-        http://www.eclipse.org/legal/epl-v10.html
-
-MAN PAGE SYNTAX
-    Man pages for SCI routines are named according to C syntax, that is, 
-    they begin with the prefix "SCI_",  all in uppercase, and the first 
-    letter following the "SCI_" prefix is also uppercase. The rest of the
-    letters in the routine are all lowercase, for example, "SCI_Group_create".
-
-GETTING STARTED
-    To compile and link SCI programs:
-    % gcc -o test test.c -lsci (Linux)
-    or
-    % xlc_r -o test test.c -lsci_r (AIX)
-
-    % g++ -o test test.cxx -lsci (Linux)
-    or
-    % xlC_r -o test test.cxx -lsci_r (AIX)
-
-DOCUMENTATION
-    TBD
-
-VERSION
-    SCI version 1.0.0
-
-LICENSE
-    TBD
-
-ERRORS
-    All SCI routines return an error value.
-    
-    For more information on SCI error codes, see \fIsci.h\fP in the include 
-    directory.
-
-SEE ALSO
-    SCI_Initialize(3)
-    SCI_Terminate(3)
-    SCI_Query(3)
-    SCI_Bcast(3)
-    SCI_Upload(3)
-    SCI_Poll(3)
-    SCI_Group_create(3)
-    SCI_Group_free(3)
-    SCI_Group_operate(3)
-    SCI_Group_operate_ext(3)
-    SCI_Group_query(3)
-    SCI_Filter_load(3)
-    SCI_Filter_unload(3)
-    SCI_Filter_bcast(3)
-    SCI_Filter_upload(3)
-    SCI_BE_add(3)
-    SCI_BE_remove(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_BE_add.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_BE_add.3
deleted file mode 100644
index ef368e6..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_BE_add.3
+++ /dev/null
@@ -1,57 +0,0 @@
-NAME
-    SCI_BE_add - Add a new back end at runtime
-
-C Syntax
-    #include <sci.h>
-    int SCI_BE_add(sci_be_t *be)
-
-INPUT PARAMETERS
-    be
-        The information of the back end to be added (INOUT).
-
-DESCRIPTION
-    This subroutine is used to add a new back end at runtime, once added,
-    the id of the new back end id will be added to the predefined group
-    SCI_GROUP_ALL.
-
-    In sci_be_t:
-
-        typedef struct {
-                int              id;
-                char             *hostname;
-        } sci_be_t;
-
-    id indicates the id of the new back end, it can be -1 (means its id 
-    will be assigned by SCI) or a postive value, hostname specified the 
-    host to launch this new back end.
-
-    Together with SCI_BE_remove, these two functions can be used to 
-    add/remove back ends dynamically at runtime.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                sci_be_t be;
-                be.id = -1;
-                be.hostname = "c890f1ec01.ppd.pok.ibm.com";
-                ...
-                SCI_BE_add(&be);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the front end
-    SCI_ERR_BACKEND_EXISTED
-        The back id already existed
-    SCI_ERR_LAUNCH_FAILED
-        Unable to launch the back end
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_BE_remove(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_BE_remove.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_BE_remove.3
deleted file mode 100644
index 74f857e..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_BE_remove.3
+++ /dev/null
@@ -1,41 +0,0 @@
-NAME
-    SCI_BE_remove - Remove an existed back end at runtime
-
-C Syntax
-    #include <sci.h>
-    int SCI_BE_remove(int be_id)
-
-INPUT PARAMETERS
-    be_id
-        The id of the back end to be removed (IN).
-
-DESCRIPTION
-    This subroutine is used to remove an existed back end at runtime, once
-    removed, this back end id will be removed from all existed groups.
-
-    Together with SCI_BE_add, these two functions can be used to add/remove
-    back ends dynamically at runtime.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                int be_id = 0;
-                ...
-                SCI_BE_remove(be_id);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the front end
-    SCI_ERR_BACKEND_NOTFOUND
-        The back end specified by id does not exist
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_BE_add(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Bcast.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Bcast.3
deleted file mode 100644
index b28f949..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Bcast.3
+++ /dev/null
@@ -1,60 +0,0 @@
-NAME
-    SCI_Bcast - Broadcasts messages from the front end to some back ends
-
-C Syntax
-    #include <sci.h>
-    int SCI_Bcast(int filter_id, sci_group_t group, int num_bufs, void *bufs[], int sizes[])
-
-INPUT PARAMETERS
-    filter_id
-        The id of the message filter (IN).
-    group
-        The group which the message belongs to (IN).
-    num_bufs
-        The number of buffers of current message segment (IN).
-    bufs
-        The array of buffer locations of current message segment (IN).
-    sizes
-        The array of buffer sizes of current message segment (IN).
-
-DESCRIPTION
-    This subroutine is used to broadcast messages from the front end to all 
-    or part of back ends. The receivers can be determined by group if set
-    filter_id to SCI_FILTER_NULL, which means do not use message filter,
-    and a predefined group named SCI_GROUP_ALL means all back ends, or can 
-    be determined by filter_id if a new message filter is loaded by 
-    SCI_Filter_load.
-
-    This is a non-blocking call. The caller cannot assume that message transfer
-    has completed upon the return of the function. Instead, the handler function
-    defined in sci_info_t should be used to ensure the message arrival in the 
-    destination sides.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                char msg[256];
-                int sizes[1];
-                void *bufs[1];
-                ...
-                bufs[0] = msg;
-                sizes[0] = strlen(msg) + 1;
-                SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the front end
-    SCI_ERR_GROUP_NOTFOUND
-        Undefined group
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_Upload(3)
-    SCI_Poll(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_bcast.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_bcast.3
deleted file mode 100644
index 5cb9d13..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_bcast.3
+++ /dev/null
@@ -1,70 +0,0 @@
-NAME
-    SCI_Filter_bcast - Used in a message filter to broadcasts messages to some successors
-
-C Syntax
-    #include <sci.h>
-    int SCI_Filter_bcast(int filter_id, int num_successors, int *successor_list, int num_bufs, void *bufs[], int sizes[])
-
-INPUT PARAMETERS
-    filter_id
-        The filter id of the messages to be broadcasted (IN).
-    num_successors
-        Number of successors (IN).
-    successor_list
-        The successor id list (IN).
-    num_bufs
-        The number of buffers of current message segment (IN).
-    bufs
-        The array of buffer locations of current message segment (IN).
-    sizes
-        The array of buffer sizes of current message segment (IN).
-
-DESCRIPTION
-    This subroutine is used to broadcast messages to all or part of successors 
-    in a message filter. A successor id can be an agent id or a back end id, 
-    because a SCI execution environment is organized in a tree style, successor
-    means children.
-
-    The agent id can be queried by SCI_Query using query type AGENT_ID, and the
-    successor id list can be queried using query type NUM_SUCCESSORS and
-    SUCCESSOR_IDLIST.
-
-    The filter_id can be set to SCI_FILTER_NULL, means the downward messages will
-    use the current filter id, otherwise the new filter id will be used.
-
-    This is a non-blocking call. The caller cannot assume that message transfer
-    has completed upon the return of the function. Instead, the handler function
-    defined in sci_info_t should be used to ensure the message arrival in the 
-    destination sides.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                char msg[256];
-                int num_successors, *successor_list, sizes[1];
-                void *bufs[1];
-                ...
-                SCI_Query(NUM_SUCCESSORS, &num_successors);
-                successor_list = (int *)malloc(sizeof(int)*num_successors);
-                SCI_Query(SUCCESSOR_IDLIST, successor_list);
-                ...
-                bufs[0] = msg;
-                sizes[0] = strlen(msg) + 1;
-                SCI_Filter_bcast(SCI_FILTER_NULL, num_successors, successor_list, 1, bufs, sizes);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the filter
-    SCI_ERR_INVALID_SUCCESSOR
-        The successor id list contains non-existed successor id
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_Filter_upload(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_load.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_load.3
deleted file mode 100644
index 641c264..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_load.3
+++ /dev/null
@@ -1,94 +0,0 @@
-NAME
-    SCI_Filter_load - Load a new message filter
-
-C Syntax
-    #include <sci.h>
-    int SCI_Filter_load(sci_filter_info_t *filter_info)
-
-INPUT PARAMETERS
-    filter_info
-        The information of the filter to be loaded (IN).
-
-DESCRIPTION
-    This subroutine is used to load a new message with id specifed by filter_id,
-    if success, the initialization handler defined in the filter will be called.
-
-    In sci_filter_info_t:
-
-        typedef struct {
-                int              filter_id;
-                char             *so_file;
-        } sci_filter_info_t;
-
-    filter_id indicates the id of the new filter, and filter_id can be any positive
-    integers. so_file indicates the absolute path of the filter library.
-
-    In SCI, a message filter is specified by a shared library, in this shared 
-    library, at least the following three functions (name fixed) should be defined:
-    
-        // initialization handler
-        int filter_initialize(void **user_param);
-        // termination handler
-        int filter_terminate(void *user_param);
-        // message handler
-        int filter_input(void *user_param, sci_group_t group, void *buf, int size);
-        
-    The user-defined function filter_input will be called each time when a new
-    message is arrived. The filter_id can be used for SCI_Bcast, SCI_Upload or
-    SCI_Filter_upload once the filter has been loaded successfully.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        int filter_initialize(void **user_param)
-        {
-                ...
-                return SCI_SUCCESS;
-        }
-
-        int filter_terminate(void *user_param) 
-        {
-                ...
-                return SCI_SUCCESS;
-        }
-
-        int filter_input(void *user_param, sci_group_t group, void *buf, int size) 
-        {
-                void *bufs[1];
-                int sizes[1];
-                int rc;
-        
-                bufs[0] = buf;
-                sizes[0] = size;
-    
-                rc = SCI_Filter_upload(SCI_FILTER_NULL, group, 1, bufs, sizes);
-                if (rc != SCI_SUCCESS) {
-                        ...
-                } 
-    
-                return SCI_SUCCESS;
-        }
-
-        {
-                sci_filter_info_t filter_info;
-                filter_info.filter_id = 1;
-                filter_info.so_file = "/usr/lib/myfilter.so";
-                SCI_Filter_load(&filter_info);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the front end
-    SCI_ERR_FILTER_PREDEFINED
-        Can't load predefined filter SCI_FILTER_NULL
-    SCI_ERR_FILTER_ID
-        Can't set negative filter_id
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_Filter_unload(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_unload.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_unload.3
deleted file mode 100644
index 8bd47db..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_unload.3
+++ /dev/null
@@ -1,43 +0,0 @@
-NAME
-    SCI_Filter_unload - Unload a previously loaded filter
-
-C Syntax
-    #include <sci.h>
-    int SCI_Filter_unload(int filter_id)
-
-INPUT PARAMETERS
-    filter_id
-        The id of the filter to be unloaded (IN).
-
-DESCRIPTION
-    This subroutine is used to unload a previously loaded filter specifed by
-    filter_id, if success, the termination handler defined in the filter will
-    be called.
-
-    Usually cleanup works can be performed in the termination handler.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                int filter_id = 1;
-                ...
-                SCI_Filter_unload(filter_id);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the front end
-    SCI_ERR_FILTER_PREDEFINED
-        Can't unload predefined filter SCI_FILTER_NULL
-    SCI_ERR_FILTER_ID
-        Unknown filter id or the filter is not loaded previously
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_Filter_load(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_upload.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_upload.3
deleted file mode 100644
index 59c5367..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Filter_upload.3
+++ /dev/null
@@ -1,53 +0,0 @@
-NAME
-    SCI_Filter_upload - Used in a message filter to uploads messages to another message filter or the parent
-
-C Syntax
-    #include <sci.h>
-    int SCI_Filter_upload(int filter_id, sci_group_t group, int num_bufs, void *bufs[], int sizes[])
-
-INPUT PARAMETERS
-    filter_id
-        The message filter id, set to SCI_FILTER_NULL means send to the parent directly (IN).
-    group
-        The group information of current message segment (IN).
-    num_bufs
-        The number of buffers of current message segment (IN).
-    bufs
-        The array of buffer locations of current message segment (IN).
-    sizes
-        The array of buffer sizes of current message segment (IN).
-
-DESCRIPTION
-    This subroutine is used to upload messages to another message filter or the parent. 
-    Set filter_id to SCI_FILTER_NULL means send the message to the parent directly, 
-    otherwise message filters can be used in a cascaded style.
-
-    This is a non-blocking call. The caller cannot assume that message transfer has 
-    completed upon the return of the function. Instead, the handler function defined in
-    sci_info_t should be used to ensure the message arrival in the destination sides.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                char msg[256];
-                int sizes[1];
-                void *bufs[1];
-                ...
-                bufs[0] = msg;
-                sizes[0] = strlen(msg) + 1;
-                SCI_Filter_upload(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-    
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the filter
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_Filter_bcast(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_create.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_create.3
deleted file mode 100644
index 6bb98a9..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_create.3
+++ /dev/null
@@ -1,64 +0,0 @@
-NAME
-    SCI_Group_create - Create a new group from a back end list
-
-C Syntax
-    #include <sci.h>
-    int SCI_Group_create(int num_bes, int *be_list, sci_group_t *group)
-
-INPUT PARAMETERS
-    num_bes
-        Number of back ends in the new group (IN).
-    be_list
-        The back end id list of the new group (IN).
-    group
-        The output group (OUT).
-
-DESCRIPTION
-    This subroutine is used to create a new group from a back end list, the list
-    contains existed back end ids. The new group can be used for SCI_Bcast to 
-    specify destination receivers.
-
-    This is a blocking call. The caller can assume group is ready to use upon the
-    return of the function.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                    int i, num_bes;
-                    sci_group_t odd_group, even_group;
-                    int odd_size, even_size;
-                    ...
-                    SCI_Query(NUM_BACKENDS, &num_bes);
-
-                    odd_size = (num_bes - num_bes%2) / 2;
-                    odd_list = (int *)malloc(sizeof(int) * odd_size);
-                    for (i=0; i<odd_size; i++) {
-                        odd_list[i] = i*2 + 1;
-                    }
-                    SCI_Group_create(odd_size, odd_list, &odd_group);
-
-                    even_size = (num_bes + num_bes%2) / 2;
-                    even_list = (int *)malloc(sizeof(int) * even_size);
-                    for (i=0; i<even_size; i++) {
-                        even_list[i] = i*2;
-                    }
-                    SCI_Group_create(even_size, even_list, &even_group);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the front end
-    SCI_ERR_BACKEND_NOTFOUND
-        The back end id list contains non-existed back end id
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_Group_free(3)
-    SCI_Group_operate(3)
-    SCI_Group_operate_ext(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_free.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_free.3
deleted file mode 100644
index 0cd75f9..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_free.3
+++ /dev/null
@@ -1,46 +0,0 @@
-NAME
-    SCI_Group_free - Free an existed group
-
-C Syntax
-    #include <sci.h>
-    int SCI_Group_free(sci_group_t group)
-
-INPUT PARAMETERS
-    group
-        The group to be freed (IN).
-
-DESCRIPTION
-    This subroutine is used to free an existed group which was previously created by
-    SCI_Group_create, SCI_Group_operate or SCI_Group_operate_ext.
-
-    This is a blocking call. The caller can assume group can't be used again upon the
-    return of the function.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                    sci_group_t odd_group, even_group;
-                    ...
-                    SCI_Group_free(odd_group);
-                    SCI_Group_free(even_group);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the front end
-    SCI_ERR_GROUP_PREDEFINED
-        Can't free predefined group SCI_GROUP_ALL
-    SCI_ERR_GROUP_NOTFOUND
-        The group to be freed does not exist
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_Group_create(3)
-    SCI_Group_operate(3)
-    SCI_Group_operate_ext(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_operate.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_operate.3
deleted file mode 100644
index bd2f203..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_operate.3
+++ /dev/null
@@ -1,55 +0,0 @@
-NAME
-    SCI_Group_operate - Create a new group from two existed groups
-
-C Syntax
-    #include <sci.h>
-    int SCI_Group_operate(sci_group_t group1, sci_group_t group2, sci_op_t op, sci_group_t *newgroup)
-
-INPUT PARAMETERS
-    group1
-        Existed group 1 (IN).
-    group2
-        Existed group 2 (IN).
-    op
-        Indicates how to create the new group from two existed groups (IN).
-    newgroup
-        The output new group (OUT).
-
-DESCRIPTION
-    This subroutine is used to create a new group from two existed groups, group1 and group2
-    can be SCI_GROUP_ALL, and op can be SCI_UNION, SCI_INTERSECTION and SCI_DIFFERENCE. The 
-    new newgroup can be used for SCI_Bcast to specify destination receivers.
-
-    This is a blocking call. The caller can assume newgroup is ready to use upon the return
-    of the function.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                    int i, num_bes;
-                    sci_group_t group1, group2, newgroup;
-                    ...
-                    SCI_Group_operate(group1, group2, SCI_UNION, &newgroup);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the front end
-    SCI_ERR_GROUP_NOTFOUND
-        The group to be freed does not exist
-    SCI_ERR_INVALID_OPERATOR
-        Incorrect op specified
-    SCI_ERR_GROUP_EMPTY
-        The new group is an empty group
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_Group_create(3)
-    SCI_Group_free(3)
-    SCI_Group_operate_ext(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_operate_ext.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_operate_ext.3
deleted file mode 100644
index f29d587..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_operate_ext.3
+++ /dev/null
@@ -1,64 +0,0 @@
-NAME
-    SCI_Group_operate_ext - Create a new group from an existed group and a back end list
-
-C Syntax
-    #include <sci.h>
-    int SCI_Group_operate(sci_group_t group, int num_bes, int *be_list, sci_op_t op, sci_group_t *newgroup)
-
-INPUT PARAMETERS
-    group
-        An existed group (IN).
-    num_bes
-        Number of back ends in another group (IN).
-    be_list
-        The back end id list of another group (IN).
-    op
-        Indicates how to create the new group (IN).
-    newgroup
-        The output new group (OUT).
-
-DESCRIPTION
-    This subroutine is used to create a new group from an existed group and a back end list, 
-    group can be SCI_GROUP_ALL, and op can be SCI_UNION, SCI_INTERSECTION and SCI_DIFFERENCE.
-    The new newgroup can be used for SCI_Bcast to specify destination receivers.
-
-    This is a blocking call. The caller can assume newgroup is ready to use upon the return
-    of the function.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                    int i, num_bes, *be_list;
-                    sci_group_t group, newgroup;
-                    ...
-                    num_bes = 3;
-                    be_list = (int *)malloc(sizeof(int)*num_bes);
-                    for (i=0; i<num_bes; i++) {
-                            be_list[i] = i;
-                    }
-                    SCI_Group_operate_ext(group, num_bes, be_list, SCI_UNION, &newgroup);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the front end
-    SCI_ERR_GROUP_NOTFOUND
-        The group to be freed does not exist
-    SCI_ERR_BACKEND_NOTFOUND
-        The back end id list contains non-existed back end id
-    SCI_ERR_INVALID_OPERATOR
-        Incorrect op specified
-    SCI_ERR_GROUP_EMPTY
-        The new group is an empty group
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_Group_create(3)
-    SCI_Group_free(3)
-    SCI_Group_operate(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_query.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_query.3
deleted file mode 100644
index efc072c..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Group_query.3
+++ /dev/null
@@ -1,60 +0,0 @@
-NAME
-    SCI_Group_query - Queries runtime information of an existed group
-
-C Syntax
-    #include <sci.h>
-    int SCI_Group_query(sci_group_t group, sci_group_query_t query, void *ret_val)
-
-INPUT PARAMETERS
-    group
-        The group to be queried (IN).
-    query
-        Specifies the type of query you want to request (IN).
-    ret_val
-        Specifies the reference parameter for SCI to store as the result of the query. 
-        The value of this parameter cannot be NULL (OUT).
-
-DESCRIPTION
-    This subroutine is used to query runtime statistics of an existed group. SCI defines
-    a set of query types as an enumeration in sci.h.
-
-    For example, you can query the number of back ends in a group using the query value 
-    of GROUP_MEMBER_NUM: SCI_Group_query(group, GROUP_MEMBER_NUM, &ret_val);
-
-    In SCI, sci_group_query_t defines the following valid query types:
-
-    GROUP_MEMBER_NUM
-        Query the number of back ends in the group
-    GROUP_MEMBER
-        Query the back end id list in the group
-    GROUP_SUCCESSOR_NUM
-        Query the number of successors in the group
-    GROUP_SUCCESSOR
-        Query the successor id list in the group
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                int be_num, *be_list;
-                sci_group_t group;
-                ...
-                SCI_Group_query(group, GROUP_MEMBER_NUM, &be_num);
-                be_list = (int *)malloc(sizeof(int)*be_num);
-                SCI_Group_query(group, GROUP_MEMBER, be_list);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_UNKNOWN_INFO
-        Can't set NULL to ret_val
-    SCI_ERR_INVALID_CALLER
-        Can't be called from back end
-    SCI_ERR_GROUP_NOTFOUND
-        The group to be freed does not exist
-
-SEE ALSO
-    SCI_Query(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Initialize.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Initialize.3
deleted file mode 100644
index 615e860..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Initialize.3
+++ /dev/null
@@ -1,147 +0,0 @@
-NAME
-    SCI_Initialize - Initializes the SCI execution environment
-
-C Syntax
-    #include <sci.h>
-    int SCI_Initialize(sci_info_t *info)
-
-INPUT PARAMETERS
-    info
-        Pointer to the SCI startup information (IN).
-
-DESCRIPTION
-    This routine must be called before any other SCI routines are called. SCI
-    can be initialized more than once; subsequent calls to SCI_Initialize are
-    erroneous unless SCI_Terminate be called.
-
-    All SCI programs must contain a call to SCI_Initialize. SCI_Initialize 
-    accepts info as its argument:
-
-        typedef union {
-                sci_end_type_t   type;
-                sci_fe_info_t    fe_info;
-                sci_be_info_t    be_info;
-        } sci_info_t;
-
-    type can be SCI_FRONT_END or SCI_BACK_END.
-
-    In sci_fe_info_t:
-
-        typedef struct {
-                sci_end_type_t   type;
-                sci_mode_t       mode;
-                SCI_msg_hndlr    *hndlr;
-                void             *param;
-                SCI_err_hndlr    *err_hndlr;
-                char             *hostfile;
-                char             *bepath;
-                char             **beenvp;
-                char             reserve[64];
-        } sci_fe_info_t;
-
-    mode indicates the working mode of the front end, can be interrupt mode
-    (SCI_INTERRUPT) or polling mode (SCI_POLLING), hndlr specified the message 
-    handler and it can't be NULL, param specifies user-defined parameter in the 
-    message handler, err_hndlr specifies the error handler when errors occur and
-    it can be NULL, hostfile specifies the host list to initialize back ends, 
-    bepath specifies the command to run a back end, beenvp specifies any additional
-    environment variables user wants to pass to back ends and it should be ended 
-    with a NULL sign.
-
-    In sci_be_info_t:
-
-        typedef struct {
-                sci_end_type_t   type;
-                sci_mode_t       mode;
-                SCI_msg_hndlr    *hndlr;
-                void             *param;
-                SCI_err_hndlr    *err_hndlr;
-                char             reserve[64];
-        } sci_be_info_t;
-
-    mode indicates the working mode of the front end, can be interrupt mode
-    (SCI_INTERRUPT) or polling mode (SCI_POLLING), hndlr specified the message 
-    handler and it can't be NULL, param specifies user-defined parameter in the 
-    message handler, err_hndlr specifies the error handler when errors occur and 
-    it can be NULL.
-
-    Each program can be started as a front end or a back end, and can work in 
-    polling mode or interrupt mode, furthermore, besides sci_info_t, the following
-    environment variables begin with the prefix "SCI_" can be used to tune SCI 
-    programs (if a data field in sci_info_t indicates the same attribute as an 
-    environment variable, it will be overwritten):
-
-    SCI_HOST_FILE
-        host file, same as fe_info.hostfile in sci_info_t
-    SCI_BACKEND_NUM
-        number of back ends when startup
-    SCI_DEBUG_FANOUT
-        fanout of the SCI tree structure, the default value is 32
-    SCI_BACKEND_PATH
-        command to start a back end, same as fe_info.bepath in sci_info_t, can 
-        contain arguments, e.g., "/usr/bin/pdb_be 2"
-    SCI_USE_EXTLAUNCHER
-        set to "yes" to indicate all back ends are started by an external launcher, 
-        the default value is "no"
-    SCI_ENABLE_FAILOVER
-        set to "yes" to indicate SCI will try to recover connections when facing 
-        connection problems, the default value is "no"
-    SCI_REMOTE_SHELL
-        can be "rsh", "ssh" or "", indicates how underlying SCI processes (agents, 
-        back ends) will be started, "rsh" means using rshell, "ssh" means using ssh, 
-        "" means using sci daemon, it's the default value
-    SCI_DEVICE_NAME
-        can be "" or an ifconfig interface name, e.g., "ib0", if set to "", the 
-        connection path indicated by the first interface will be used, otherwise the 
-        specified connection path will be used, the default value is the first ifconfig 
-        device name
-    SCI_SEGMENT_SIZE
-        message segment size used in SCI pipeline mechanism, when the size of downstream
-        messages exceed a threshold (1.5 * size), this mechanism will be enabled
-        automatically by splitting the large message into smaller segments to 
-        increase the overall bandwidth, the default size is 46720 (bytes)
-    SCI_SYNC_INIT
-        if set to yes, the SCI_Initilize will block until all the backends are launched, 
-        otherwise it will return immediately. The default value is no.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        void handler(void *user_param, sci_group_t group, void *buffer, int size)
-        {
-                ...
-        }
-        
-        {
-                sci_info_t info;
-                info.type = SCI_FRONT_END;
-                info.fe_info.mode = SCI_INTERRUPT;
-                info.fe_info.hostfile = "./host.list";
-                info.fe_info.bepath = "/usr/bin/pdb_be";
-                info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-                info.fe_info.param = NULL;
-                SCI_Initialize(&info);
-                ... 
-                SCI_Terminate();
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_INVALID_ENDTYPE
-        Invalid end type, can only be SCI_FRONT_END or SCI_BACK_END
-    SCI_ERR_NO_MEM
-        Out of memory
-    SCI_ERR_INVALID_JOBKEY
-        Invalid job key specified by SCI_JOB_KEY (only for BE)
-    SCI_ERR_INVALID_HOSTFILE
-        Invalid host file (only for FE)
-    SCI_ERR_UNKNOWN_INFO
-        Unknown back end info (only for FE)
-    SCI_ERR_LAUNCH_FAILED
-        Failed to launch client(s) (only for FE)
-    SCI_ERR_INITIALIZE_FAILED
-        Initialization failed
-
-SEE ALSO
-    SCI_Terminate(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Poll.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Poll.3
deleted file mode 100644
index b50526c..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Poll.3
+++ /dev/null
@@ -1,57 +0,0 @@
-NAME
-    SCI_Poll - Check for arriving messages in polling mode
-
-C Syntax
-    #include <sci.h>
-    int SCI_Poll(int timeout)
-
-INPUT PARAMETERS
-    timeout
-        Timeout if no message arrives in timeout milliseconds, <0 means no timeout (IN).
-
-DESCRIPTION
-    This subroutine is used to check for arriving messages in polling mode. If a new
-    message is arrived, user-registered handler in sci_info_t will be called to handle 
-    the message, otherwise a timeout will occur after timeout milliseconds elapsed.
-
-    If timeout is set to a negative value, no timeout will occur, and SCI_Poll can only
-    return when a new message arrived or errors occurred.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                int pollFd, extFd, maxFd;
-                fd_set fdSet;
-                SCI_Query(POLLING_FD, &pollFd);
-                ...
-                FD_ZERO(&fdSet);
-                FD_SET(pollFd, &fdSet);
-                FD_SET(extFd, &fdSet);
-                maxFd = (pollFd > extFd) ? pollFd : extFd;
-                select(maxFd+1, &fdSet, 0, 0, NULL);
-                if (FD_ISSET(pollFd, &fdSet)) {
-                        SCI_Poll(-1);
-                }
-                if (FD_ISSET(extFd, &fdSet)) {
-                        ...
-                }
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the front end
-    SCI_ERR_MODE
-        Can only be used in polling mode
-    SCI_ERR_POLL_INVALID
-        Invalid polling calls
-    SCI_ERR_POLL_TIMEOUT
-        A polling timeout occurs after timeout milliseconds elapsed
-
-SEE ALSO
-    SCI_Bcast(3)
-    SCI_Upload(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Query.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Query.3
deleted file mode 100644
index 52159ef..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Query.3
+++ /dev/null
@@ -1,70 +0,0 @@
-NAME
-    SCI_Query - Queries runtime information of the SCI execution environment
-
-C Syntax
-    #include <sci.h>
-    int SCI_Query(sci_query_t query, void *ret_val)
-
-INPUT PARAMETERS
-    query
-        Specifies the type of query you want to request (IN).
-    ret_val
-        Specifies the reference parameter for SCI to store as the result of the 
-        query. The value of this parameter cannot be NULL (OUT).
-
-DESCRIPTION
-    This subroutine is used to query runtime settings and statistics from SCI.
-    SCI defines a set of query types as an enumeration in sci.h.
-
-    For example, you can query the backend id using the query value of BACKEND_ID: 
-    SCI_Query(BACKEND_ID, &ret_val);
-
-    In SCI, sci_query_t defines the following valid query types:
-
-    JOB_KEY
-        Query the job key of the current job
-    NUM_BACKENDS
-        Query the number of back ends in the job
-    BACKEND_ID
-        Query the back end id of current back end in the job
-    POLLING_FD
-        Query the external polling file descriptor in polling mode of the current job
-    NUM_FILTERS
-        Query the number of loaded filters in the current job
-    FILTER_IDLIST
-        Query the loaded filter id list of the current job
-    AGENT_ID
-        Query the agent id of current agent in the job
-    NUM_SUCCESSORS
-        Query the number of successors of current entity in the job
-    SUCCESSOR_IDLIST
-        Query the successor id list of current entity in the job
-    HEALTH_STATUS
-        Query the running status of current entity in the job, can be 0 (normal) or
-        1 (exited)
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                int my_id;
-                SCI_Query(BACKEND_ID, &my_id);
-                int be_num;
-                SCI_Query(NUM_BACKENDS, &be_num);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_UNKNOWN_INFO
-        Can't set NULL to ret_val
-    SCI_ERR_INVALID_CALLER
-        Invalid query type for current entity. e.g., BACKEND_NUM can only be used
-        for back end
-    SCI_ERR_MODE
-        For POLLING_FD only, can only be used in polling mode
-
-SEE ALSO
-    SCI_Group_query(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Terminate.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Terminate.3
deleted file mode 100644
index 3524d49..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Terminate.3
+++ /dev/null
@@ -1,40 +0,0 @@
-NAME
-    SCI_Terminate - Terminates the SCI execution environment
-
-C Syntax
-    #include <sci.h>
-    int SCI_Terminate()
-
-INPUT PARAMETERS
-    none
-
-DESCRIPTION
-    Make sure this routine is the last SCI call. Any SCI calls made after
-    SCI_Terminate raise an error. You must be sure that all pending communications
-    have completed before calls SCI_Terminate.
-
-    Although SCI_Terminate terminates SCI processing, it does not terminate the
-    front end or back end. It is possible to continue with non-SCI processing
-    after calling SCI_Terminate, but no other SCI calls can be made unless
-    SCI_Initialize be called again.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                /* declare variables */
-                SCI_Initialize(&info);
-                ...
-                SCI_Terminate();
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_Initialize(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Upload.3 b/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Upload.3
deleted file mode 100644
index 0a53018..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/aix/SCI_Upload.3
+++ /dev/null
@@ -1,55 +0,0 @@
-NAME
-    SCI_Upload - Uploads messages from a back end to the front end
-
-C Syntax
-    #include <sci.h>
-    int SCI_Upload(int filter_id, sci_group_t group, int num_bufs, void *bufs[], int sizes[])
-
-INPUT PARAMETERS
-    filter_id
-        The id of the message filter (IN).
-    group
-        The group which the message belongs to (IN).
-    num_bufs
-        The number of buffers of current message segment (IN).
-    bufs
-        The array of buffer locations of current message segment (IN).
-    sizes
-        The array of buffer sizes of current message segment (IN).
-
-DESCRIPTION
-    This subroutine is used to upload message from a back end to the front end. The
-    message can be sent directly to the front end if set filter_id to SCI_FILTER_NULL,
-    or can be sent to the filter indicated by filter_id if a new message filter is loaded 
-    by SCI_Filter_load.
-
-    This is a non-blocking call. The caller cannot assume that message transfer has 
-    completed upon the return of the function. Instead, the handler function defined in 
-    sci_info_t should be used to ensure the message arrival in the destination sides.
-
-    For more information, please refer to SCI's online documents.
-
-EXAMPLE
-        {
-                char msg[256];
-                int sizes[1];
-                void *bufs[1];
-                ...
-                bufs[0] = msg;
-                sizes[0] = strlen(msg) + 1;
-                SCI_Upload(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        }
-
-ERRORS
-    All SCI routines return an error value.
-
-    SCI_ERR_UNINTIALIZED
-        Uninitialized SCI execution environment
-    SCI_ERR_INVALID_CALLER
-        Can only be called in the front end
-    SCI_ERR_NO_MEM
-        Out of memory
-
-SEE ALSO
-    SCI_Bcast(3)
-    SCI_Poll(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/Makefile b/tools/sci/org.eclipse.ptp.sci/man/linux/Makefile
deleted file mode 100644
index ec05783..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/Makefile
+++ /dev/null
@@ -1,5 +0,0 @@
-include ../../makefile.define
-
-install:
-	cp -p *.3 /usr/share/man/cat3/
-
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI.3
deleted file mode 100644
index 90dc2f9..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI.3
+++ /dev/null
@@ -1,80 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI\fP \- General information SCI 1.0.0
-
-.SH SCI
-.ft R
-SCI (Scalable Communication Infrastructure) is an open source project under
-under the terms of the Eclipse Public License v1.0s, its aim is to provide
-a common, light-weight, scalable, portable, and extensible run-time and
-communication infrastructure for the deployment of developer tools on the
-emerging peta- and exa-scale high performance computing systems.
-.sp
-For more information about EPL, see the following URL:
-.sp
-    http://www.eclipse.org/legal/epl-v10.html
-
-.SH MAN PAGE SYNTAX
-.ft R
-Man pages for SCI routines are named according to C syntax, that is, they 
-begin with the prefix "SCI_",  all in uppercase, and the first letter following
-the "SCI_" prefix is also uppercase. The rest of the letters in the routine are
-all lowercase, for example, "SCI_Group_create".
-
-.SH GETTING STARTED
-.ft R
-To compile and link SCI programs:
-.sp
-% gcc -o test test.c -lsci (Linux)
-.nf
-    or
-.nf
-% xlc_r -o test test.c -lsci_r (AIX)
-.sp
-% g++ -o test test.cxx -lsci (Linux)
-.nf
-    or
-.nf
-% xlC_r -o test test.cxx -lsci_r (AIX)
-
-.SH DOCUMENTATION
-.ft R
-TBD
-
-.SH VERSION
-.ft R
-SCI version 1.0.0
-
-.SH LICENSE
-.ft R
-TBD
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-For more information on SCI error codes, see \fIsci.h\fP in the include 
-directory.
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Initialize\fP(3)
-\fBSCI_Terminate\fP(3)
-\fBSCI_Query\fP(3)
-\fBSCI_Bcast\fP(3)
-\fBSCI_Upload\fP(3)
-\fBSCI_Poll\fP(3)
-\fBSCI_Group_create\fP(3)
-\fBSCI_Group_free\fP(3)
-\fBSCI_Group_operate\fP(3)
-\fBSCI_Group_operate_ext\fP(3)
-\fBSCI_Group_query\fP(3)
-\fBSCI_Filter_load\fP(3)
-\fBSCI_Filter_unload\fP(3)
-\fBSCI_Filter_bcast\fP(3)
-\fBSCI_Filter_upload\fP(3)
-\fBSCI_BE_add\fP(3)
-\fBSCI_BE_remove\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_BE_add.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_BE_add.3
deleted file mode 100644
index 362b4fb..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_BE_add.3
+++ /dev/null
@@ -1,80 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_BE_add 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_BE_add\fP \- Add a new back end at runtime
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_BE_add(sci_be_t *\fIbe\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-be
-The information of the back end to be added (INOUT).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to add a new back end at runtime, once added,
-the id of the new back end id will be added to the predefined group
-\fBSCI_GROUP_ALL\fP.
-.sp
-In \fIsci_be_t\fP:
-.sp
-.nf
-        typedef struct {
-                int              id;
-                char             *hostname;
-        } sci_be_t;
-.fi
-.sp
-\fIid\fP indicates the id of the new back end, it can be -1 (means its id will be
-assigned by SCI) or a postive value, \fIhostname\fP specified the host to launch
-this new back end.
-.sp
-Together with \fBSCI_BE_remove\fP, these two functions can be used to add/remove
-back ends dynamically at runtime.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                sci_be_t be;
-                be.id = -1;
-                be.hostname = "c890f1ec01.ppd.pok.ibm.com";
-                ...
-                SCI_BE_add(&be);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the front end
-.TP 1i
-SCI_ERR_BACKEND_EXISTED
-The back id already existed
-.TP 1i
-SCI_ERR_LAUNCH_FAILED
-Unable to launch the back end
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_BE_remove\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_BE_remove.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_BE_remove.3
deleted file mode 100644
index c722879..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_BE_remove.3
+++ /dev/null
@@ -1,61 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_BE_remove 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_BE_remove\fP \- Remove an existed back end at runtime
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_BE_remove(int \fIbe_id\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-be_id
-The id of the back end to be removed (IN).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to remove an existed back end at runtime, once removed,
-this back end id will be removed from all existed groups.
-.sp
-Together with \fBSCI_BE_add\fP, these two functions can be used to add/remove
-back ends dynamically at runtime.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                int be_id = 0;
-                ...
-                SCI_BE_remove(be_id);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the front end
-.TP 1i
-SCI_ERR_BACKEND_NOTFOUND
-The back end specified by \fIid\fP does not exist
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_BE_add\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Bcast.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Bcast.3
deleted file mode 100644
index 80ed073..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Bcast.3
+++ /dev/null
@@ -1,82 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Bcast 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Bcast\fP \- Broadcasts messages from the front end to some back ends
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Bcast(int \fIfilter_id\fP, sci_group_t \fIgroup\fP, int \fInum_bufs\fP, void *\fIbufs\fP[], int \fIsizes\fP[])
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-filter_id
-The id of the message filter (IN).
-.TP 1i
-group
-The group which the message belongs to (IN).
-.TP 1i
-num_bufs
-The number of buffers of current message segment (IN).
-.TP 1i
-bufs
-The array of buffer locations of current message segment (IN).
-.TP 1i
-sizes
-The array of buffer sizes of current message segment (IN).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to broadcast messages from the front end to all or part of back
-ends. The receivers can be determined by \fIgroup\fP if set \fIfilter_id\fP to
-\fBSCI_FILTER_NULL\fP, which means do not use message filter, and a predefined
-group named \fBSCI_GROUP_ALL\fP means all back ends, or can be determined
-by \fIfilter_id\fP if a new message filter is loaded by \fBSCI_Filter_load\fP.
-.sp
-This is a non-blocking call. The caller cannot assume that message transfer has completed
-upon the return of the function. Instead, the handler function defined in \fIsci_info_t\fP
-should be used to ensure the message arrival in the destination sides.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                char msg[256];
-                int sizes[1];
-                void *bufs[1];
-                ...
-                bufs[0] = msg;
-                sizes[0] = strlen(msg) + 1;
-                SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the front end
-.TP 1i
-SCI_ERR_GROUP_NOTFOUND
-Undefined \fIgroup\fP
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Upload\fP(3)
-\fBSCI_Poll\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_bcast.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_bcast.3
deleted file mode 100644
index e0312cd..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_bcast.3
+++ /dev/null
@@ -1,93 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Filter_bcast 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Filter_bcast\fP \- Used in a message filter to broadcasts messages to some successors
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Filter_bcast(int \fIfilter_id\fP, int \fInum_successors\fP, int *\fIsuccessor_list\fP, int \fInum_bufs\fP, void *\fIbufs\fP[], int \fIsizes\fP[])
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-filter_id
-The filter id of the messages to be broadcasted (IN).
-.TP 1i
-num_successors
-Number of successors (IN).
-.TP 1i
-successor_list
-The successor id list (IN).
-.TP 1i
-num_bufs
-The number of buffers of current message segment (IN).
-.TP 1i
-bufs
-The array of buffer locations of current message segment (IN).
-.TP 1i
-sizes
-The array of buffer sizes of current message segment (IN).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to broadcast messages to all or part of successors in a message
-filter. A \fBsuccessor\fP id can be an agent id or a back end id, because a SCI execution
-environment is organized in a tree style, \fBsuccessor\fP means children.
-.sp
-The agent id can be queried by \fBSCI_Query\fP using query type \fBAGENT_ID\fP, and
-the successor id list can be queried using query type \fBNUM_SUCCESSORS\fP and
-\fBSUCCESSOR_IDLIST\fP.
-.sp
-The \fIfilter_id\fP can be set to SCI_FILTER_NULL, means the downward messages will use
-the current filter id, otherwise the new filter id will be used.
-.sp
-This is a non-blocking call. The caller cannot assume that message transfer has completed
-upon the return of the function. Instead, the handler function defined in \fIsci_info_t\fP
-should be used to ensure the message arrival in the destination sides.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                char msg[256];
-                int num_successors, *successor_list, sizes[1];
-                void *bufs[1];
-                ...
-                SCI_Query(NUM_SUCCESSORS, &num_successors);
-                successor_list = (int *)malloc(sizeof(int)*num_successors);
-                SCI_Query(SUCCESSOR_IDLIST, successor_list);
-                ...
-                bufs[0] = msg;
-                sizes[0] = strlen(msg) + 1;
-                SCI_Filter_bcast(SCI_FILTER_NULL, num_successors, successor_list, 1, bufs, sizes);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the filter
-.TP 1i
-SCI_ERR_INVALID_SUCCESSOR
-The successor id list contains non-existed successor id
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Filter_upload\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_load.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_load.3
deleted file mode 100644
index 8ca5e8d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_load.3
+++ /dev/null
@@ -1,119 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Filter_load 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Filter_load\fP \- Load a new message filter
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Filter_load(sci_filter_info_t *\fIfilter_info\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-filter_info
-The information of the filter to be loaded (IN).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to load a new message with id specifed by \fIfilter_id\fP,
-if success, the initialization handler defined in the filter will be called.
-.sp
-In \fIsci_filter_info_t\fP:
-.sp
-.nf
-        typedef struct {
-                int              filter_id;
-                char             *so_file;
-        } sci_filter_info_t;
-.fi
-.sp
-\fIfilter_id\fP indicates the id of the new filter, and \fIfilter_id\fP can be any positive
-integers. \fIso_file\fP indicates the absolute path of the filter library.
-.sp
-In SCI, a message filter is specified by a shared library, in this shared library,
-at least the following three functions (name fixed) should be defined:
-.sp
-.nf
-        // initialization handler
-        int filter_initialize(void **user_param);
-        // termination handler
-        int filter_terminate(void *user_param);
-        // message handler
-        int filter_input(void *user_param, sci_group_t group, void *buf, int size);
-.fi
-.sp
-The user-defined function \fBfilter_input\fP will be called each time when a new
-message is arrived. The \fIfilter_id\fP can be used for \fBSCI_Bcast\fP, \fBSCI_Upload\fP
-or \fBSCI_Filter_upload\fP once the filter has been loaded successfully.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        int filter_initialize(void **user_param)
-        {
-                ...
-                return SCI_SUCCESS;
-        }
-
-        int filter_terminate(void *user_param) 
-        {
-                ...
-                return SCI_SUCCESS;
-        }
-
-        int filter_input(void *user_param, sci_group_t group, void *buf, int size) 
-        {
-                void *bufs[1];
-                int sizes[1];
-                int rc;
-        
-                bufs[0] = buf;
-                sizes[0] = size;
-    
-                rc = SCI_Filter_upload(SCI_FILTER_NULL, group, 1, bufs, sizes);
-                if (rc != SCI_SUCCESS) {
-                        ...
-                } 
-    
-                return SCI_SUCCESS;
-        }
-
-        {
-                sci_filter_info_t filter_info;
-                filter_info.filter_id = 1;
-                filter_info.so_file = "/usr/lib/myfilter.so";
-                SCI_Filter_load(&filter_info);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the front end
-.TP 1i
-SCI_ERR_FILTER_PREDEFINED
-Can't load predefined filter SCI_FILTER_NULL
-.TP 1i
-SCI_ERR_FILTER_ID
-Can't set negative \fIfilter_id\fP
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Filter_unload\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_unload.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_unload.3
deleted file mode 100644
index 92a3198..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_unload.3
+++ /dev/null
@@ -1,63 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Filter_unload 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Filter_unload\fP \- Unload a previously loaded filter
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Filter_unload(int \fIfilter_id\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-filter_id
-The id of the filter to be unloaded (IN).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to unload a previously loaded filter specifed by \fIfilter_id\fP,
-if success, the termination handler defined in the filter will be called.
-.sp
-Usually cleanup works can be performed in the termination handler.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                int filter_id = 1;
-                ...
-                SCI_Filter_unload(filter_id);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the front end
-.TP 1i
-SCI_ERR_FILTER_PREDEFINED
-Can't unload predefined filter SCI_FILTER_NULL
-.TP 1i
-SCI_ERR_FILTER_ID
-Unknown filter id or the filter is not loaded previously
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Filter_load\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_upload.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_upload.3
deleted file mode 100644
index fab2e9a..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Filter_upload.3
+++ /dev/null
@@ -1,76 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Filter_upload 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Filter_upload\fP \- Used in a message filter to uploads messages to another message filter or the parent
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Filter_upload(int \fIfilter_id\fP, sci_group_t \fIgroup\fP, int \fInum_bufs\fP, void *\fIbufs\fP[], int \fIsizes\fP[])
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-filter_id
-The message filter id, set to \fBSCI_FILTER_NULL\fP means send to the parent directly (IN).
-.TP 1i
-group
-The group information of current message segment (IN).
-.TP 1i
-num_bufs
-The number of buffers of current message segment (IN).
-.TP 1i
-bufs
-The array of buffer locations of current message segment (IN).
-.TP 1i
-sizes
-The array of buffer sizes of current message segment (IN).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to upload messages to another message filter or the parent. 
-Set \fIfilter_id\fP to \fBSCI_FILTER_NULL\fP means send the message to the parent
-directly, otherwise message filters can be used in a cascaded style.
-.sp
-This is a non-blocking call. The caller cannot assume that message transfer has completed
-upon the return of the function. Instead, the handler function defined in \fIsci_info_t\fP
-should be used to ensure the message arrival in the destination sides.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                char msg[256];
-                int sizes[1];
-                void *bufs[1];
-                ...
-                bufs[0] = msg;
-                sizes[0] = strlen(msg) + 1;
-                SCI_Filter_upload(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the filter
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Filter_bcast\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_create.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_create.3
deleted file mode 100644
index b7732d5..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_create.3
+++ /dev/null
@@ -1,86 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Group_create 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Group_create\fP \- Create a new group from a back end list
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Group_create(int \fInum_bes\fP, int *\fIbe_list\fP, sci_group_t *\fIgroup\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-num_bes
-Number of back ends in the new group (IN).
-.TP 1i
-be_list
-The back end id list of the new group (IN).
-.TP 1i
-group
-The output group (OUT).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to create a new group from a back end list, the list contains
-existed back end ids. The new \fIgroup\fP can be used for \fBSCI_Bcast\fP to specify
-destination receivers.
-.sp
-This is a blocking call. The caller can assume \fIgroup\fP is ready to use upon the return
-of the function.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                    int i, num_bes;
-                    sci_group_t odd_group, even_group;
-                    int odd_size, even_size;
-                    ...
-                    SCI_Query(NUM_BACKENDS, &num_bes);
-
-                    odd_size = (num_bes - num_bes%2) / 2;
-                    odd_list = (int *)malloc(sizeof(int) * odd_size);
-                    for (i=0; i<odd_size; i++) {
-                        odd_list[i] = i*2 + 1;
-                    }
-                    SCI_Group_create(odd_size, odd_list, &odd_group);
-
-                    even_size = (num_bes + num_bes%2) / 2;
-                    even_list = (int *)malloc(sizeof(int) * even_size);
-                    for (i=0; i<even_size; i++) {
-                        even_list[i] = i*2;
-                    }
-                    SCI_Group_create(even_size, even_list, &even_group);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the front end
-.TP 1i
-SCI_ERR_BACKEND_NOTFOUND
-The back end id list contains non-existed back end id
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Group_free\fP(3)
-\fBSCI_Group_operate\fP(3)
-\fBSCI_Group_operate_ext\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_free.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_free.3
deleted file mode 100644
index d872798..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_free.3
+++ /dev/null
@@ -1,67 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Group_free 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Group_free\fP \- Free an existed group
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Group_free(sci_group_t \fIgroup\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-group
-The group to be freed (IN).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to free an existed group which was previously created by \fBSCI_Group_create\fP,
-\fBSCI_Group_operate\fP or \fBSCI_Group_operate_ext\fP.
-.sp
-This is a blocking call. The caller can assume \fIgroup\fP can't be used again upon the return
-of the function.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                    sci_group_t odd_group, even_group;
-                    ...
-                    SCI_Group_free(odd_group);
-                    SCI_Group_free(even_group);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the front end
-.TP 1i
-SCI_ERR_GROUP_PREDEFINED
-Can't free predefined group \fBSCI_GROUP_ALL\fP
-.TP 1i
-SCI_ERR_GROUP_NOTFOUND
-The group to be freed does not exist
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Group_create\fP(3)
-\fBSCI_Group_operate\fP(3)
-\fBSCI_Group_operate_ext\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_operate.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_operate.3
deleted file mode 100644
index f810273..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_operate.3
+++ /dev/null
@@ -1,81 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Group_operate 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Group_operate\fP \- Create a new group from two existed groups
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Group_operate(sci_group_t \fIgroup1\fP, sci_group_t \fIgroup2\fP, sci_op_t \fIop\fP, sci_group_t *\fInewgroup\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-group1
-Existed group 1 (IN).
-.TP 1i
-group2
-Existed group 2 (IN).
-.TP 1i
-op
-Indicates how to create the new group from two existed groups (IN).
-.TP 1i
-newgroup
-The output new group (OUT).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to create a new group from two existed groups, \fIgroup1\fP and
-\fIgroup2\fP can be \fBSCI_GROUP_ALL\fP, and \fIop\fP can be \fBSCI_UNION\fP, 
-\fBSCI_INTERSECTION\fP and \fBSCI_DIFFERENCE\fP. The new \fInewgroup\fP can be 
-used for \fBSCI_Bcast\fP to specify destination receivers.
-.sp
-This is a blocking call. The caller can assume \fInewgroup\fP is ready to use upon the return
-of the function.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                    int i, num_bes;
-                    sci_group_t group1, group2, newgroup;
-                    ...
-                    SCI_Group_operate(group1, group2, SCI_UNION, &newgroup);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the front end
-.TP 1i
-SCI_ERR_GROUP_NOTFOUND
-The group to be freed does not exist
-.TP 1i
-SCI_ERR_INVALID_OPERATOR
-Incorrect \fIop\fP specified
-.TP 1i
-SCI_ERR_GROUP_EMPTY
-The new group is an empty group
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Group_create\fP(3)
-\fBSCI_Group_free\fP(3)
-\fBSCI_Group_operate_ext\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_operate_ext.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_operate_ext.3
deleted file mode 100644
index 4035e56..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_operate_ext.3
+++ /dev/null
@@ -1,92 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Group_operate_ext 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Group_operate_ext\fP \- Create a new group from an existed group and a back end list
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Group_operate(sci_group_t \fIgroup\fP, int \fInum_bes\fP, int *\fIbe_list\fP, sci_op_t \fIop\fP, sci_group_t *\fInewgroup\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-group
-An existed group (IN).
-.TP 1i
-num_bes
-Number of back ends in another group (IN).
-.TP 1i
-be_list
-The back end id list of another group (IN).
-.TP 1i
-op
-Indicates how to create the new group (IN).
-.TP 1i
-newgroup
-The output new group (OUT).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to create a new group from an existed group and a back end list, 
-\fIgroup\fP can be \fBSCI_GROUP_ALL\fP, and \fIop\fP can be \fBSCI_UNION\fP, 
-\fBSCI_INTERSECTION\fP and \fBSCI_DIFFERENCE\fP. The new \fInewgroup\fP can be 
-used for \fBSCI_Bcast\fP to specify destination receivers.
-.sp
-This is a blocking call. The caller can assume \fInewgroup\fP is ready to use upon the return
-of the function.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                    int i, num_bes, *be_list;
-                    sci_group_t group, newgroup;
-                    ...
-                    num_bes = 3;
-                    be_list = (int *)malloc(sizeof(int)*num_bes);
-                    for (i=0; i<num_bes; i++) {
-                            be_list[i] = i;
-                    }
-                    SCI_Group_operate_ext(group, num_bes, be_list, SCI_UNION, &newgroup);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the front end
-.TP 1i
-SCI_ERR_GROUP_NOTFOUND
-The group to be freed does not exist
-.TP 1i
-SCI_ERR_BACKEND_NOTFOUND
-The back end id list contains non-existed back end id
-.TP 1i
-SCI_ERR_INVALID_OPERATOR
-Incorrect \fIop\fP specified
-.TP 1i
-SCI_ERR_GROUP_EMPTY
-The new group is an empty group
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Group_create\fP(3)
-\fBSCI_Group_free\fP(3)
-\fBSCI_Group_operate\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_query.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_query.3
deleted file mode 100644
index 7ce4192..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Group_query.3
+++ /dev/null
@@ -1,87 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Group_query 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Group_query\fP \- Queries runtime information of an existed group
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Group_query(sci_group_t \fIgroup\fP, sci_group_query_t \fIquery\fP, void *\fIret_val\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-group
-The group to be queried (IN).
-.TP 1i
-query
-Specifies the type of query you want to request (IN).
-.TP 1i
-ret_val
-Specifies the reference parameter for SCI to store as the result of the query. 
-The value of this parameter cannot be NULL (OUT).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to query runtime statistics of an existed group.
-SCI defines a set of query types as an enumeration in \fIsci.h\fP.
-.sp
-For example, you can query the number of back ends in a group using the 
-query value of \fBGROUP_MEMBER_NUM\fP: SCI_Group_query(group, GROUP_MEMBER_NUM, &ret_val);
-.sp
-In SCI, sci_group_query_t defines the following valid query types:
-.sp
-.TP 1i
-GROUP_MEMBER_NUM
-Query the number of back ends in the \fIgroup\fP
-.TP 1i
-GROUP_MEMBER
-Query the back end id list in the \fIgroup\fP
-.TP 1i
-GROUP_SUCCESSOR_NUM
-Query the number of successors in the \fIgroup\fP
-.TP 1i
-GROUP_SUCCESSOR
-Query the successor id list in the \fIgroup\fP
-.TP 0i
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                int be_num, *be_list;
-                sci_group_t group;
-                ...
-                SCI_Group_query(group, GROUP_MEMBER_NUM, &be_num);
-                be_list = (int *)malloc(sizeof(int)*be_num);
-                SCI_Group_query(group, GROUP_MEMBER, be_list);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_UNKNOWN_INFO
-Can't set NULL to \fIret_val\fP
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can't be called from back end
-.TP 1i
-SCI_ERR_GROUP_NOTFOUND
-The group to be freed does not exist
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Query\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Initialize.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Initialize.3
deleted file mode 100644
index e6fe587..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Initialize.3
+++ /dev/null
@@ -1,186 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Initialize 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Initialize\fP \- Initializes the SCI execution environment
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Initialize(sci_info_t *\fIinfo\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-info
-Pointer to the SCI startup information (IN).
-
-.SH DESCRIPTION
-.ft R
-This routine must be called before any other SCI routines are called.
-SCI can be initialized more than once; subsequent calls to SCI_Initialize
-are erroneous unless SCI_Terminate be called.
-.sp
-All SCI programs must contain a call to SCI_Initialize. SCI_Initialize 
-accepts \fIinfo\fP as its argument:
-.sp
-.nf
-        typedef union {
-                sci_end_type_t   type;
-                sci_fe_info_t    fe_info;
-                sci_be_info_t    be_info;
-        } sci_info_t;
-.fi
-.sp
-\fItype\fP can be \fBSCI_FRONT_END\fP or \fBSCI_BACK_END\fP.
-.sp
-In \fIsci_fe_info_t\fP:
-.sp
-.nf
-        typedef struct {
-                sci_end_type_t   type;
-                sci_mode_t       mode;
-                SCI_msg_hndlr    *hndlr;
-                void             *param;
-                SCI_err_hndlr    *err_hndlr;
-                char             *hostfile;
-                char             *bepath;
-                char             **beenvp;
-                char             reserve[64];
-        } sci_fe_info_t;
-.fi
-.sp
-\fImode\fP indicates the working mode of the front end, can be interrupt mode
-(\fBSCI_INTERRUPT\fP) or polling mode (\fBSCI_POLLING\fP), \fIhndlr\fP specified
-the message handler and it can't be \fBNULL\fP, \fIparam\fP specifies user-defined 
-parameter in the message handler, \fIerr_hndlr\fP specifies the error handler when
-errors occur and it can be \fBNULL\fP, \fIhostfile\fP specifies the host list to initialize
-back ends, \fIbepath\fP specifies the command to run a back end, \fIbeenvp\fP specifies
-any additional environment variables user wants to pass to back ends and it should
-be ended with a \fBNULL\fP sign.
-.sp
-In \fIsci_be_info_t\fP:
-.sp
-.nf
-        typedef struct {
-                sci_end_type_t   type;
-                sci_mode_t       mode;
-                SCI_msg_hndlr    *hndlr;
-                void             *param;
-                SCI_err_hndlr    *err_hndlr;
-                char             reserve[64];
-        } sci_be_info_t;
-.fi
-.sp
-\fImode\fP indicates the working mode of the front end, can be interrupt mode
-(\fBSCI_INTERRUPT\fP) or polling mode (\fBSCI_POLLING\fP), \fIhndlr\fP specified
-the message handler and it can't be \fBNULL\fP, \fIparam\fP specifies user-defined 
-parameter in the message handler, \fIerr_hndlr\fP specifies the error handler when
-errors occur and it can be \fBNULL\fP.
-.sp
-Each program can be started as a front end or a back end, and can
-work in polling mode or interrupt mode, furthermore, besides sci_info_t,
-the following environment variables begin with the prefix "SCI_" can be 
-used to tune SCI programs (if a data field in sci_info_t indicates the same
-attribute as an environment variable, it will be overwritten):
-.sp
-.TP 1i
-SCI_HOST_FILE
-host file, same as fe_info.hostfile in sci_info_t
-.TP 1i
-SCI_BACKEND_NUM
-number of back ends when startup
-.TP 1i
-SCI_DEBUG_FANOUT
-fanout of the SCI tree structure, the default value is 32
-.TP 1i
-SCI_BACKEND_PATH
-command to start a back end, same as fe_info.bepath in sci_info_t, can contain 
-arguments, e.g., "/usr/bin/pdb_be 2"
-.TP 1i
-SCI_USE_EXTLAUNCHER
-set to "yes" to indicate all back ends are started by an external launcher, the
-default value is "no"
-.TP 1i
-SCI_ENABLE_FAILOVER
-set to "yes" to indicate SCI will try to recover connections when facing connection
-problems, the default value is "no"
-.TP 1i
-SCI_REMOTE_SHELL
-can be "rsh", "ssh" or "", indicates how underlying SCI processes (agents, back ends)
-will be started, "rsh" means using rshell, "ssh" means using ssh, "" means using sci
-daemon, it's the default value
-.TP 1i
-SCI_DEVICE_NAME
-can be "" or an ifconfig interface name, e.g., "ib0", if set to "", the connection path
-indicated by the first interface will be used, otherwise the specified connection path
-will be used, the default value is the first ifconfig device name
-.TP 1i
-SCI_SEGMENT_SIZE
-message segment size used in SCI pipeline mechanism, when the size of downstream
-messages exceed a threshold (1.5 * size), this mechanism will be enabled
-automatically by splitting the large message into smaller segments to 
-increase the overall bandwidth, the default size is 46720 (bytes)
-.TP 1i
-SCI_SYNC_INIT
-if set to yes, the SCI_Initilize will block until all the backends are launched, 
-otherwise it will return immediately. The default value is no.
-.TP 0i
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        void handler(void *user_param, sci_group_t group, void *buffer, int size)
-        {
-                ...
-        }
-        
-        {
-                sci_info_t info;
-                info.type = SCI_FRONT_END;
-                info.fe_info.mode = SCI_INTERRUPT;
-                info.fe_info.hostfile = "./host.list";
-                info.fe_info.bepath = "/usr/bin/pdb_be";
-                info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-                info.fe_info.param = NULL;
-                SCI_Initialize(&info);
-                ... 
-                SCI_Terminate();
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_INVALID_ENDTYPE
-Invalid end type, can only be SCI_FRONT_END or SCI_BACK_END
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-.TP 1i
-SCI_ERR_INVALID_JOBKEY
-Invalid job key specified by SCI_JOB_KEY (only for BE)
-.TP 1i
-SCI_ERR_INVALID_HOSTFILE
-Invalid host file (only for FE)
-.TP 1i
-SCI_ERR_UNKNOWN_INFO
-Unknown back end info (only for FE)
-.TP 1i
-SCI_ERR_LAUNCH_FAILED
-Failed to launch client(s) (only for FE)
-.TP 1i
-SCI_ERR_INITIALIZE_FAILED
-Initialization failed
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Terminate\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Poll.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Poll.3
deleted file mode 100644
index 0d03aa0..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Poll.3
+++ /dev/null
@@ -1,78 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Poll 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Poll\fP \- Check for arriving messages in polling mode
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Poll(int \fItimeout\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-timeout
-Timeout if no message arrives in \fItimeout\fP milliseconds, <0 means no timeout (IN).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to check for arriving messages in polling mode. If a new message
-is arrived, user-registered handler in \fIsci_info_t\fP will be called to handle the message,
-otherwise a timeout will occur after \fItimeout\fP milliseconds elapsed.
-.sp
-If \fItimeout\fP is set to a negative value, no timeout will occur, and \fBSCI_Poll\fP can only
-return when a new message arrived or errors occurred.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                int pollFd, extFd, maxFd;
-                fd_set fdSet;
-                SCI_Query(POLLING_FD, &pollFd);
-                ...
-                FD_ZERO(&fdSet);
-                FD_SET(pollFd, &fdSet);
-                FD_SET(extFd, &fdSet);
-                maxFd = (pollFd > extFd) ? pollFd : extFd;
-                select(maxFd+1, &fdSet, 0, 0, NULL);
-                if (FD_ISSET(pollFd, &fdSet)) {
-                        SCI_Poll(-1);
-                }
-                if (FD_ISSET(extFd, &fdSet)) {
-                        ...
-                }
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the front end
-.TP 1i
-SCI_ERR_MODE
-Can only be used in polling mode
-.TP 1i
-SCI_ERR_POLL_INVALID
-Invalid polling calls
-.TP 1i
-SCI_ERR_POLL_TIMEOUT
-A polling timeout occurs after \fItimeout\fP milliseconds elapsed
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Bcast\fP(3)
-\fBSCI_Upload\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Query.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Query.3
deleted file mode 100644
index c4800c9..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Query.3
+++ /dev/null
@@ -1,102 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Query 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Query\fP \- Queries runtime information of the SCI execution environment
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Query(sci_query_t \fIquery\fP, void *\fIret_val\fP)
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-query
-Specifies the type of query you want to request (IN).
-.TP 1i
-ret_val
-Specifies the reference parameter for SCI to store as the result of the query. 
-The value of this parameter cannot be NULL (OUT).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to query runtime settings and statistics from SCI.
-SCI defines a set of query types as an enumeration in \fIsci.h\fP.
-.sp
-For example, you can query the backend id using the query value of
-\fBBACKEND_ID\fP: SCI_Query(BACKEND_ID, &ret_val);
-.sp
-In SCI, sci_query_t defines the following valid query types:
-.sp
-.TP 1i
-JOB_KEY
-Query the job key of the current job
-.TP 1i
-NUM_BACKENDS
-Query the number of back ends in the job
-.TP 1i
-BACKEND_ID
-Query the back end id of current back end in the job
-.TP 1i
-POLLING_FD
-Query the external polling file descriptor in polling mode of the current job
-.TP 1i
-NUM_FILTERS
-Query the number of loaded filters in the current job
-.TP 1i
-FILTER_IDLIST
-Query the loaded filter id list of the current job
-.TP 1i
-AGENT_ID
-Query the agent id of current agent in the job
-.TP 1i
-NUM_SUCCESSORS
-Query the number of successors of current entity in the job
-.TP 1i
-SUCCESSOR_IDLIST
-Query the successor id list of current entity in the job
-.TP 1i
-HEALTH_STATUS
-Query the running status of current entity in the job, can be 0 (normal) or
-1 (exited)
-.TP 0i
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                int my_id;
-                SCI_Query(BACKEND_ID, &my_id);
-                int be_num;
-                SCI_Query(NUM_BACKENDS, &be_num);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_UNKNOWN_INFO
-Can't set NULL to \fIret_val\fP
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Invalid query type for current entity. e.g., \fBBACKEND_NUM\fP can only be
-used for back end
-.TP 1i
-SCI_ERR_MODE
-For \fBPOLLING_FD\fP only, can only be used in polling mode
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Group_query\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Terminate.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Terminate.3
deleted file mode 100644
index a89c5ec..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Terminate.3
+++ /dev/null
@@ -1,58 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Terminate 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Terminate\fP \- Terminates the SCI execution environment
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Terminate()
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-none
-
-.SH DESCRIPTION
-.ft R
-Make sure this routine is the last SCI call. Any SCI calls made after
-SCI_Terminate raise an error. You must be sure that all pending
-communications have completed before calls SCI_Terminate.
-.sp
-Although SCI_Terminate terminates SCI processing, it does not terminate
-the front end or back end. It is possible to continue with non-SCI processing
-after calling SCI_Terminate, but no other SCI calls can be made unless
-SCI_Initialize be called again.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                /* declare variables */
-                SCI_Initialize(&info);
-                ...
-                SCI_Terminate();
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Initialize\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Upload.3 b/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Upload.3
deleted file mode 100644
index 93d0c6d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/man/linux/SCI_Upload.3
+++ /dev/null
@@ -1,78 +0,0 @@
-.\"Copyright 2008-2010 IBM Corp.
-.TH SCI_Upload 3 "Dec 4, 2009" "1.0.0" "SCI"
-
-.SH NAME
-\fBSCI_Upload\fP \- Uploads messages from a back end to the front end
-
-.SH SYNTAX
-.ft R
-
-.SH C Syntax
-.nf
-#include <sci.h>
-int SCI_Upload(int \fIfilter_id\fP, sci_group_t \fIgroup\fP, int \fInum_bufs\fP, void *\fIbufs\fP[], int \fIsizes\fP[])
-
-.SH INPUT PARAMETERS
-.ft R
-.TP 1i
-filter_id
-The id of the message filter (IN).
-.TP 1i
-group
-The group which the message belongs to (IN).
-.TP 1i
-num_bufs
-The number of buffers of current message segment (IN).
-.TP 1i
-bufs
-The array of buffer locations of current message segment (IN).
-.TP 1i
-sizes
-The array of buffer sizes of current message segment (IN).
-
-.SH DESCRIPTION
-.ft R
-This subroutine is used to upload message from a back end to the front end. The message
-can be sent directly to the front end if set \fIfilter_id\fP to \fBSCI_FILTER_NULL\fP,
-or can be sent to the filter indicated by \fIfilter_id\fP if a new message filter is loaded 
-by \fBSCI_Filter_load\fP.
-.sp
-This is a non-blocking call. The caller cannot assume that message transfer has completed
-upon the return of the function. Instead, the handler function defined in \fIsci_info_t\fP
-should be used to ensure the message arrival in the destination sides.
-.sp
-For more information, please refer to SCI's online documents.
-
-.SH EXAMPLE
-.ft R
-.nf
-        {
-                char msg[256];
-                int sizes[1];
-                void *bufs[1];
-                ...
-                bufs[0] = msg;
-                sizes[0] = strlen(msg) + 1;
-                SCI_Upload(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        }
-.fi
-
-.SH ERRORS
-.ft R
-All SCI routines return an error value.
-.sp
-.TP 1i
-SCI_ERR_UNINTIALIZED
-Uninitialized SCI execution environment
-.TP 1i
-SCI_ERR_INVALID_CALLER
-Can only be called in the front end
-.TP 1i
-SCI_ERR_NO_MEM
-Out of memory
-
-.SH SEE ALSO
-.ft R
-.nf
-\fBSCI_Bcast\fP(3)
-\fBSCI_Poll\fP(3)
diff --git a/tools/sci/org.eclipse.ptp.sci/plugin.properties b/tools/sci/org.eclipse.ptp.sci/plugin.properties
deleted file mode 100644
index 5f888bf..0000000
--- a/tools/sci/org.eclipse.ptp.sci/plugin.properties
+++ /dev/null
@@ -1,11 +0,0 @@
-###############################################################################
-# Copyright (c) 2009 IBM Corporation.
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Eclipse Public License v1.0
-# which accompanies this distribution, and is available at
-# http://www.eclipse.org/legal/epl-v10.html
-#
-###############################################################################
-
-pluginName=PTP Scalable Debug Manager (SDM)
-pluginProvider=Eclipse.org
diff --git a/tools/sci/org.eclipse.ptp.sci/scia/Makefile b/tools/sci/org.eclipse.ptp.sci/scia/Makefile
deleted file mode 100644
index e7ff01d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scia/Makefile
+++ /dev/null
@@ -1,47 +0,0 @@
-include ../makefile.define
-
-ifeq ($(OS), AIX)
-    CPPFLAGS = $(MY_FLAGS) -I../libsci
-    PROG = scia
-    PROG64 = scia64
-else
-    CPPFLAGS = $(MY_FLAGS) -I../libsci -fPIC
-    ifeq ($(ARCH), i686)
-        PROG = scia
-        PROG64 = 
-    else
-        PROG = scia
-        PROG64 = scia64
-    endif
-endif
-
-all : $(PROG) $(PROG64)
-
-$(PROG) : $(OBJS) ../common/libcmn.a
-	@$(CC32) $(CPPFLAGS) -o $(PROG) $(OBJS) -L../common -lcmn -lrt -ldl
-
-$(PROG64) : $(OBJS64) ../common/libcmn64.a
-	@$(CC64) $(CPPFLAGS) -o $(PROG64) $(OBJS64) -L../common -lcmn64 -lrt -ldl
-
-install : $(PROG) $(PROG64)
-ifeq ($(OS), AIX)
-	cp -p $(PROG) $(BIN_DIR)
-	chmod 775 $(BIN_DIR)/$(PROG)
-	ln -sf $(BIN_DIR)/$(PROG) /usr/bin/$(PROG)
-	cp -p $(PROG64) $(BIN_DIR)
-	chmod 775 $(BIN_DIR)/$(PROG64)
-	ln -sf $(BIN_DIR)/$(PROG64) /usr/bin/$(PROG64)
-else
-	cp -p $(PROG) $(BIN_DIR)
-	chmod 775 $(BIN_DIR)/$(PROG)
-	ln -sf $(BIN_DIR)/$(PROG) /usr/bin/$(PROG)
-ifneq ($(ARCH), i686)
-	cp -p $(PROG64) $(BIN_DIR)
-	chmod 775 $(BIN_DIR)/$(PROG64)
-	ln -sf $(BIN_DIR)/$(PROG64) /usr/bin/$(PROG64)
-endif
-endif
-
-clean :
-	rm -f $(PROG) $(PROG64) $(OBJS) $(OBJS64) core *.d
-
diff --git a/tools/sci/org.eclipse.ptp.sci/scia/scia.cpp b/tools/sci/org.eclipse.ptp.sci/scia/scia.cpp
deleted file mode 100644
index ee1f268..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scia/scia.cpp
+++ /dev/null
@@ -1,93 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: main() function.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <string.h>
-#include <signal.h>
-#include <unistd.h>
-#include <ctype.h>
-#include <assert.h>
-#include <dlfcn.h>
-
-#include "sci.h"
-
-#ifdef _SCI_LINUX
-#define SCI_LIB_PATH "libsci.so"
-#else  // aix
-#ifdef __64BIT__
-#define SCI_LIB_PATH "libsci_r.a(libsci64_r.o)"
-#else  // 32-bit
-#define SCI_LIB_PATH "libsci_r.a(libsci_r.o)"
-#endif // 32-bit
-#endif // aix
-
-typedef int (scia_init_hndlr)(sci_info_t *);
-typedef int (scia_term_hndlr)();
-
-int main()
-{
-    void *dlopen_file = NULL;
-    char *error = NULL;
-    int rc;
-
-#ifdef _SCI_LINUX // Linux
-    dlopen_file = ::dlopen(SCI_LIB_PATH, RTLD_NOW|RTLD_GLOBAL);
-#else  // aix
-    dlopen_file = ::dlopen(SCI_LIB_PATH, RTLD_NOW|RTLD_GLOBAL|RTLD_MEMBER);
-#endif
-    if (!dlopen_file) {
-        ::fprintf (stderr, "%s\n", ::dlerror());
-        ::exit(1);
-    }
-
-    ::dlerror();    /* Clear any existing error */
-    scia_init_hndlr *init_hndlr = (scia_init_hndlr *) ::dlsym(dlopen_file, "SCI_Initialize");
-    scia_term_hndlr *term_hndlr = (scia_term_hndlr *) ::dlsym(dlopen_file, "SCI_Terminate");
-    if ((error = ::dlerror()) != NULL)  {
-        ::fprintf (stderr, "%s\n", error);
-        ::exit(1);
-    }
-    
-    rc = init_hndlr(NULL);
-    if (rc != SCI_SUCCESS) {
-        ::fprintf(stderr, "scia initialization failed\n");
-        ::exit(1);
-    }
-    rc = term_hndlr();
-    if (rc != SCI_SUCCESS) {
-        ::fprintf(stderr, "scia termination failed\n");
-        ::exit(1);
-    }
-
-    ::dlclose(dlopen_file);
-
-    return 0;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/scid/Makefile b/tools/sci/org.eclipse.ptp.sci/scid/Makefile
deleted file mode 100644
index 3e2fa12..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scid/Makefile
+++ /dev/null
@@ -1,41 +0,0 @@
-include ../makefile.define
-
-ifeq ($(OS), AIX)
-    CPPFLAGS = $(MY_FLAGS) -I../libsci
-    PROG = scidv1
-else
-    CPPFLAGS = $(MY_FLAGS) -I../libsci -fPIC
-    ifeq ($(ARCH), i686)
-        PROG = scidv1
-    else
-        PROG = scidv1
-    endif
-endif
-
-all : $(PROG)
-
-$(PROG) : $(OBJS) ../common/libcmn.a
-	@$(CC32) $(CPPFLAGS) -o $(PROG) $(OBJS) -L../common -lcmn -lrt
-
-install : $(PROG)
-ifeq ($(OS), AIX)
-	stopsrc -g sci
-	sleep 1
-	cp -p $(PROG) $(BIN_DIR)
-	chmod 775 $(BIN_DIR)/$(PROG)
-	ln -sf $(BIN_DIR)/$(PROG) /usr/sbin/$(PROG)
-	startsrc -g sci
-	sleep 1
-else
-	/etc/init.d/sciv1 stop
-	cp -p $(PROG) $(BIN_DIR)
-	chmod 775 $(BIN_DIR)/$(PROG)
-	ln -sf $(BIN_DIR)/$(PROG) /usr/sbin/$(PROG)
-	cp sciv1 /etc/init.d
-	chmod 775 /etc/init.d/sciv1
-	/etc/init.d/sciv1 start
-endif
-
-clean :
-	rm -f $(PROG) $(OBJS) core *.d
-
diff --git a/tools/sci/org.eclipse.ptp.sci/scid/extlaunch.cpp b/tools/sci/org.eclipse.ptp.sci/scid/extlaunch.cpp
deleted file mode 100644
index d44b4a9..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scid/extlaunch.cpp
+++ /dev/null
@@ -1,226 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: ExtLauncher
-
- Description: Support External Laucher such as POE
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   01/06/09 tuhongj      Initial code (D155101)
-
-****************************************************************************/
-
-#include "extlaunch.hpp"
-#include <assert.h>
-#include <signal.h>
-#include <sys/types.h>
-#include <errno.h>
-#include <string.h>
-
-#include "tools.hpp"
-#include "log.hpp"
-#include "exception.hpp"
-#include "locker.hpp"
-#include "stream.hpp"
-#include "socket.hpp"
-
-enum LAUNCH_MODE {
-    INTERNAL,
-    REGISTER,
-    REQUEST
-};
-
-const int MAX_FD = 128;
-vector<ExtLauncher *> launcherList;
-
-const int MAX_PWD_BUF_SIZE = 10000;
-const int MAX_ENV_VAR_NUM = 1024;
-
-ExtLauncher::ExtLauncher(Stream *s)
-    : stream(s)
-{
-}
-
-ExtLauncher::~ExtLauncher()
-{
-}
-
-void ExtLauncher::run()
-{
-    LAUNCH_MODE mode;
-    int id, jobKey, rc;
-    double starttm;
-    string path, envStr, usernam;
-    struct passwd pwd, *result = NULL;
-    char *pwdBuf = new char[MAX_PWD_BUF_SIZE];
-
-    try {
-        *stream >> usernam >> (int &)mode >> jobKey >> id;
-        while (1) {
-            rc = ::getpwnam_r(usernam.c_str(), &pwd, pwdBuf, MAX_PWD_BUF_SIZE, &result);
-            if ((rc == EINTR) || (rc == EMFILE)) {
-                SysUtil::sleep(1000);
-                continue;
-            }
-            if (NULL == result) {
-                throw Exception(Exception::INVALID_USER);
-            } else {
-                break;
-            }
-        }
-        switch (mode) {
-            case INTERNAL:
-                *stream >> path >> envStr >> endl;
-                log_crit("[%s] Launch %d.%d %s with %s internally", pwd.pw_name, 
-                    jobKey, id, path.c_str(), envStr.c_str());
-                rc = launchInt((char *)path.c_str(), (char *)envStr.c_str(), &pwd);
-                break;
-            case REGISTER:
-                *stream >> path >> envStr >> endl;
-                log_crit("[%s] Receive register info %d.%d %s", pwd.pw_name, jobKey, 
-                    id, envStr.c_str());
-                rc = launchReg(jobKey, id, (char *)envStr.c_str());
-                break;
-            case REQUEST:
-                *stream >> endl;
-                log_crit("[%s] Handle external launching request %d.%d", pwd.pw_name,
-                    jobKey, id);
-                rc = launchReq(jobKey, id); 
-                starttm = SysUtil::microseconds();
-                while ((rc != 0) && ((SysUtil::microseconds() - starttm) < FIVE_MINUTES)) {
-                    SysUtil::sleep(1000);
-                    rc = launchReq(jobKey, id);
-                }
-                break;
-            default:
-                break;
-        }
-    } catch (SocketException &e) {
-        log_error("socket exception %s", e.getErrMsg().c_str());
-    } catch (Exception &e) {
-        log_error("exception %s, errno = %d", e.getErrMsg(), errno);
-    } catch (...) {
-        log_error("unknown exception");
-    }
-
-    delete [] pwdBuf;
-
-    stream->stop();
-    delete stream;
-    setState(false);
-
-    Locker::getLocker()->lock();
-    launcherList.push_back(this);
-    Locker::getLocker()->unlock();
-    Locker::getLocker()->notify();
-}
-
-int ExtLauncher::launchInt(char *path, char *envStr, struct passwd *pwd)
-{
-    pid_t pid;
-    int i, len;
-    char *p = NULL, *p1 = NULL, *p2 = NULL;
-    char *exename = NULL;
-    char *params[MAX_ENV_VAR_NUM];
-
-    // get the exe name
-    p1 = path;
-    do {
-        if (((*p1)==' ') || ((*p1)=='\t')) {
-            p1++;
-        } else if ((*p1) == '\0') {
-            return -1;
-        } else {
-            break;
-        }
-    } while (1);
-    p2 = p1;
-    while (((*p2)!=' ') && ((*p2)!='\t') && ((*p2)!='\0')) {
-        p2++;
-    }
-    len = p2 - p1;
-    exename = new char[len+1];
-    ::strncpy(exename, p1, len);
-    exename[len] = '\0';
-    
-    if (::access(exename, F_OK | R_OK | X_OK) != 0) {
-        log_error("%s is not an executable file", exename);
-        return -1;
-    }
-    delete [] exename;
-
-    pid = ::fork();
-    if (pid < 0) { // fork failed
-        return -1;
-    } else if (pid == 0) { // child process
-        for (i = 0; i < MAX_FD; i++) {
-            ::close(i);
-        }
-
-        // the child process can't ignore SIGCHLD signal
-        ::sigaction(SIGCHLD, &oldSa, NULL);
-
-        p = envStr;
-        for (i = 0; i < MAX_ENV_VAR_NUM-1; i++) {
-            p = ::strchr(p, ';');
-            if (NULL == p) {
-                break;
-            }
-            *p = '\0';
-            params[i] = ++p;
-        }
-        params[i] = NULL;
-        
-        ::setgid(pwd->pw_gid);
-        ::setuid(pwd->pw_uid);
-        ::execle("/bin/sh", "/bin/sh", "-c", path, (char *)NULL, params);
-    }
-
-    return 0;
-}
-
-int ExtLauncher::launchReg(int key, int id, const char *envStr)
-{
-    Locker::getLocker()->lock();
-    jobInfo[key].config[id] = envStr;
-    jobInfo[key].timestamp = SysUtil::microseconds();
-    Locker::getLocker()->unlock();
-
-    return 0;
-}
-
-int ExtLauncher::launchReq(int key, int id)
-{
-    Locker::getLocker()->lock();
-    if (jobInfo.find(key) == jobInfo.end()) {
-        Locker::getLocker()->unlock();
-        return -1;
-    }
-    TASK_CONFIG &cfg = jobInfo[key].config;
-    if (cfg.find(id) == cfg.end()) {
-        Locker::getLocker()->unlock();
-        return -1;
-    }
-
-    *stream << cfg[id] << endl;
-    cfg.erase(id);
-    if (cfg.size() == 0)
-        jobInfo.erase(key);
-    Locker::getLocker()->unlock();
-
-    return 0;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/scid/extlaunch.hpp b/tools/sci/org.eclipse.ptp.sci/scid/extlaunch.hpp
deleted file mode 100644
index c8cafd0..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scid/extlaunch.hpp
+++ /dev/null
@@ -1,71 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: ExtLauncher
-
- Description: Support External Laucher such as POE
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   01/06/09 tuhongj      Initial code (D155101)
-
-****************************************************************************/
-
-#ifndef _EXTLAUNCH_HPP
-#define _EXTLAUNCH_HPP
-
-#include <pwd.h>
-
-#include "thread.hpp"
-
-#include <string>
-#include <map>
-
-#define FIVE_MINUTES 5000000 * 60
-
-using namespace std;
-
-class Stream;
-
-class ExtLauncher : public Thread 
-{
-    private:
-        Stream         *stream;
-
-    public:
-        ExtLauncher(Stream *s);
-        virtual ~ExtLauncher();
-
-        virtual void run();
-
-        int launchInt(char *path, char *envStr, struct passwd *pwd);
-        int launchReg(int key, int id, const char *envStr);
-        int launchReq(int key, int id);
-        int regInfo();
-};
-
-typedef map<int, string> TASK_CONFIG;
-typedef struct TASK_INFO {
-    TASK_CONFIG config;
-    double      timestamp;
-};
-typedef map<int, TASK_INFO> JOB_INFO;
-
-extern JOB_INFO jobInfo;
-extern vector<ExtLauncher *> launcherList;
-extern struct sigaction oldSa;
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/scid/extlisten.cpp b/tools/sci/org.eclipse.ptp.sci/scid/extlisten.cpp
deleted file mode 100644
index bc621eb..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scid/extlisten.cpp
+++ /dev/null
@@ -1,81 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: ExtListener
-
- Description: ...
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   01/06/09 tuhongj      Initial code (D155101)
-
-****************************************************************************/
-
-#include "extlisten.hpp"
-#include <assert.h>
-
-#include "stream.hpp"
-#include "log.hpp"
-#include "tools.hpp"
-
-#include "locker.hpp"
-#include "extlaunch.hpp"
-
-const int SCID_PORT = 6688;
-
-ExtListener::ExtListener()
-{
-}
-
-ExtListener::~ExtListener()
-{
-}
-
-void ExtListener::run()
-{
-    int child = -1;
-    int port = SCID_PORT;
-    int sockfd = socket.listen(port);
-
-    log_crit("Extended listener is running");
-    while (getState()) {
-        try {
-            child = socket.accept(sockfd);
-        } catch (SocketException &e) {
-            log_error("socket exception %s", e.getErrMsg().c_str());
-            break;
-        } catch (...) {
-            log_error("unknown exception");
-            break;
-        }
-        
-        if (child < 0)
-           continue;
-
-        Stream *stream = new Stream();
-        stream->init(child);
-        ExtLauncher *launcher = new ExtLauncher(stream);
-        launcher->start();
-
-        while (launcherList.size() > 128) {
-            log_info("Too much concurrency, need cleanup");
-            Locker::getLocker()->notify();
-        }
-    }
-
-    ::close(sockfd);
-    setState(false);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/scid/extlisten.hpp b/tools/sci/org.eclipse.ptp.sci/scid/extlisten.hpp
deleted file mode 100644
index cf96511..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scid/extlisten.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: ExtListener
-
- Description: ...
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   01/06/09 tuhongj      Initial code (D155101)
-
-****************************************************************************/
-
-#ifndef _EXTLISTEN_HPP
-#define _EXTLISTEN_HPP
-
-#include "thread.hpp"
-#include "socket.hpp"
-
-class ExtListener : public Thread 
-{
-    private:
-        Socket     socket;
-
-    public:
-        ExtListener();
-        virtual ~ExtListener();
-        
-        virtual void run();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/scid/locker.cpp b/tools/sci/org.eclipse.ptp.sci/scid/locker.cpp
deleted file mode 100644
index 1a878a3..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scid/locker.cpp
+++ /dev/null
@@ -1,96 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Locker
-
- Description: Lock Operations.
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   01/12/09 tuhongj      Initial code (D155101)
-
-****************************************************************************/
-
-#include "locker.hpp"
-#include <stdio.h>
-#include <assert.h>
-#include <sched.h>
-
-Locker * Locker::locker = NULL;
-
-Locker::Locker()
-{
-    ::pthread_mutex_init(&gMutex, NULL);
-
-    ::pthread_mutex_init(&cMutex, NULL);
-    ::pthread_cond_init(&cond, NULL);
-
-    freezed = false;
-}
-
-Locker::~Locker()
-{
-    ::pthread_mutex_destroy(&gMutex);
-
-    ::pthread_cond_destroy(&cond);
-    ::pthread_mutex_destroy(&cMutex);
-}
-
-Locker * Locker::getLocker()
-{
-    if (locker == NULL) {
-        locker = new Locker();
-    }
-    
-    return locker;
-}
-
-void Locker::lock()
-{
-    ::pthread_mutex_lock(&gMutex);
-}
-
-void Locker::unlock()
-{
-    ::pthread_mutex_unlock(&gMutex);
-}
-
-/*
-
-Warning: do not try to use freeze() & notify() function in a same thread, the style is like:
-    thread a: freeze()
-    thread b: notify()
- The freeze & notification times are unlimited.
-
-*/
-
-void Locker::freeze()
-{   
-    ::pthread_mutex_lock(&cMutex);
-    freezed= true;
-    while (freezed) {
-        ::pthread_cond_wait(&cond, &cMutex);
-    }
-    ::pthread_mutex_unlock(&cMutex);
-}
-
-void Locker::notify()
-{
-    ::pthread_mutex_lock(&cMutex);
-    ::pthread_cond_broadcast(&cond);
-    freezed= false;
-    ::pthread_mutex_unlock(&cMutex);
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/scid/locker.hpp b/tools/sci/org.eclipse.ptp.sci/scid/locker.hpp
deleted file mode 100644
index 86f68eb..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scid/locker.hpp
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Locker
-
- Description: Global lock operations.
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   01/12/09 tuhongj      Initial code (D155101)
-
-****************************************************************************/
-
-#ifndef _LOCKER_HPP
-#define _LOCKER_HPP
-
-#include <pthread.h>
-
-class Locker 
-{
-    private:
-        static Locker         *locker;
-        pthread_mutex_t       gMutex;
-
-        pthread_mutex_t       cMutex;
-        pthread_cond_t        cond;
-
-        bool                  freezed;
-
-        Locker();
-        
-    public:
-        ~Locker();
-        static Locker * getLocker();
-        
-        void lock();
-        void unlock();
-
-        void freeze();
-        void notify();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/scid/scid.cpp b/tools/sci/org.eclipse.ptp.sci/scid/scid.cpp
deleted file mode 100644
index 5e08d1f..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scid/scid.cpp
+++ /dev/null
@@ -1,195 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: SCI Service Daemon
-   
- Author: Tu HongJ, Nicole Nie, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   01/06/09 tuhongj      Initial code (D155101)
-
-****************************************************************************/
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <signal.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdlib.h>
-
-#include <fstream>
-
-#include "tools.hpp"
-#include "log.hpp"
-#include "locker.hpp"
-
-#include "extlisten.hpp"
-#include "extlaunch.hpp"
-
-const int MAXFD = 128;
-JOB_INFO jobInfo;
-string pidFile;
-
-struct sigaction oldSa;
-
-void sig_term(int sig)
-{
-    if (sig == SIGTERM) {
-        log_crit("Terminating ... ");
-        unlink(pidFile.c_str());
-        exit(0);
-    }
-}
-
-void daemonInit()
-{
-    umask(0);
-
-    ::sigaction(SIGCHLD, NULL, &oldSa);
-    
-    struct sigaction sa;
-    sa.sa_handler = SIG_IGN;
-    sa.sa_flags = 0;
-    sigemptyset(&sa.sa_mask);
-    sigaction(SIGHUP, &sa, NULL);
-    sigaction(SIGINT, &sa, NULL);
-    sigaction(SIGPIPE, &sa, NULL);
-    sigaction(SIGUSR1, &sa, NULL);
-    sigaction(SIGUSR2, &sa, NULL);
-    sigaction(SIGCHLD, &sa, NULL);
-    sa.sa_handler = sig_term;
-    sigaction(SIGTERM, &sa, NULL);
-
-#ifdef _SCI_LINUX // Linux
-    pid_t pid;
-    if ((pid = fork()) < 0)
-        exit(-1);
-    else if (pid != 0) /* parent */
-        exit(0);
-    setsid();
-#endif
-
-    chdir("/");
-    /* close off file descriptors */
-    for (int i = 0; i < MAXFD; i++)
-        close(i);
-
-    /* redirect stdin, stdout, and stderr to /dev/null */
-    open("/dev/null", O_RDONLY);
-    open("/dev/null", O_RDWR);
-    open("/dev/null", O_RDWR);
-}
-
-void writePidFile(string &pidf)
-{
-    ofstream pidfile(pidf.c_str());
-    if (!pidfile) {
-        printf("Cann't write pid file %s", pidf.c_str());
-        return;
-    }
-    pidfile << (int)getpid();
-}
-
-int checkPidFile(string &pidf)
-{
-    ifstream pidfile(pidf.c_str());
-    if (!pidfile)
-        return 0;
-
-    string line;
-    pidfile >> line;
-    if (line.size() == 0)
-        return 0;
-
-    int pid = atoi(line.c_str());
-    if (kill(pid, 0) == 0)
-        return -1;
-
-    return 0;
-}
-
-int initService(char *prog)
-{
-    char *p = strrchr(prog, '/');
-    if (p != NULL) 
-        p++;
-    else
-        p = prog;
-#ifdef _SCI_LINUX // Linux
-    pidFile = string("/var/run/") + p + ".pid";
-#else
-    pidFile = string("/var/opt/") + p + ".pid";
-#endif
-    if (checkPidFile(pidFile) < 0) {
-        printf("%s is already running...\n", p);
-        return -1;
-    }
-    if (getuid() != 0) {
-        printf("Must running as root\n");
-        return -1;
-    }
-
-    daemonInit();
-    writePidFile(pidFile);
-
-    return 0;
-}
-
-int main(int argc, char *argv[])
-{
-    if (initService(argv[0]) != 0)
-        return -1;
-
-    Log::getInstance()->init("/tmp", "scidv1.log", 6);
-    ExtListener *listener = new ExtListener();
-    listener->start();
-
-    while (1) {
-        Locker::getLocker()->freeze();
-
-        log_debug("Delete unused launcher");
-        Locker::getLocker()->lock();
-        vector<ExtLauncher *>::iterator lc;
-        for (lc = launcherList.begin(); lc != launcherList.end(); lc++) {
-            (*lc)->join();
-            delete (*lc);
-        }
-        launcherList.clear();
-        Locker::getLocker()->unlock();
-
-        log_info("Begin to cleanup the jobInfo");
-        Locker::getLocker()->lock();
-        JOB_INFO::iterator it;
-        for (it = jobInfo.begin(); it != jobInfo.end(); ) {
-            if ((SysUtil::microseconds() - it->second.timestamp) > FIVE_MINUTES) {
-                jobInfo.erase(it++);
-                log_crit("Erase jobInfo item %d", it->first);
-            } else {
-                ++it;
-            }
-        }
-        log_info("Finish cleanup the jobInfo");
-        Locker::getLocker()->unlock();
-    }
-
-    listener->join();
-    delete listener;
-    delete Log::getInstance();
-
-    return 0;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/scid/sciv1 b/tools/sci/org.eclipse.ptp.sci/scid/sciv1
deleted file mode 100755
index ca99c96..0000000
--- a/tools/sci/org.eclipse.ptp.sci/scid/sciv1
+++ /dev/null
@@ -1,184 +0,0 @@
-#!/bin/sh
-#
-# chkconfig: 2345 31 41
-# description: Scalable Communication Infrastructure (SCI) Service Daemon
-#
-### BEGIN INIT INFO
-# Provides:          IBM
-# Required-Start:    
-# Should-Start:      
-# Required-Stop:     
-# Should-Stop:       
-# Default-Start:     3 5
-# Default-Stop:      0 1 2 6
-# Short-Description: start/stop/restart scid daemon service
-# Description:       Scalable Communication Infrastructure 
-#	(SCI) Service Daemon, it's a daemon needed when initializing
-#	SCI sessions.
-#	pidfile: /var/run/scidv1.pid
-### END INIT INFO
-
-if [[ -a /etc/redhat-release ]] ; then
-    
-    # Source function library.
-    if [ -f /etc/init.d/functions ] ; then
-        . /etc/init.d/functions
-    elif [ -f /etc/rc.d/init.d/functions ] ; then
-        . /etc/rc.d/init.d/functions
-    else
-        exit 1
-    fi
-
-    # Avoid using root's TMPDIR
-    unset TMPDIR
-
-    RETVAL=0
-
-    start() {
-        KIND="SCI"
-        echo -n $"Starting $KIND services: "
-        daemon scidv1
-        RETVAL=$?
-        echo
-        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/sciv1 || \
-            RETVAL=1
-        return $RETVAL
-    }
-
-    stop() {
-        KIND="SCI"
-        echo -n $"Shutting down $KIND services: "
-        killproc scidv1
-        RETVAL=$?
-        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/sciv1
-        echo ""
-        return $RETVAL
-    }
-
-    restart() {
-        stop
-        start
-    }
-
-    rhstatus() {
-        status scidv1
-        RETVAL=$?
-        if [ $RETVAL -ne 0 ] ; then
-            return $RETVAL
-        fi
-    }
-
-    # Allow status as non-root.
-    if [ "$1" = status ]; then
-        rhstatus
-        exit $?
-    fi
-
-    case "$1" in
-    start)
-        start
-        ;;
-    stop)
-        stop
-        ;;
-    restart)
-        restart
-        ;;
-    status)
-        rhstatus
-        ;;
-    *)
-        echo $"Usage: $0 {start|stop|restart|status}"
-        exit 2
-    esac
-
-    exit $?
-
-elif [[ -a /etc/SuSE-release ]] ; then
-
-    SCID_BIN="/usr/sbin/scidv1"
-    PID_FILE="/var/run/scidv1.pid"
-    LOG_FILE="/tmp/*.scidv1.log.*"
-
-    . /etc/rc.status
-    rc_reset
-
-    # Check for missing binary
-    if [ ! -x ${SCID_BIN} ]; then
-        echo -n >&2 "SCI daemon, ${SCID_BIN} is not installed. "
-        rc_status -s
-        exit 5
-    fi
-
-    case "$1" in
-    start)
-        echo -n "Starting SCI daemon "
-        checkproc -p ${PID_FILE} ${SCID_BIN}
-        case $? in
-            0) echo -n "- Warning: daemon already running. " ;;
-            1) echo -n "- Warning: ${PID_FILE} exists. " ;;
-        esac
-        rm -f ${LOG_FILE} >/dev/null 2>&1
-        startproc -p ${PID_FILE} ${SCID_BIN}
-        rc_status -v
-        ;;
-    stop)
-        echo -n "Shutting down SCI daemon "
-        checkproc -p ${PID_FILE} ${SCID_BIN} || \
-            echo -n " Warning: daemon is not running. "
-        killproc -p ${PID_FILE} -t 10 ${SCID_BIN}
-        rc_status -v
-        ;;
-    restart)
-        $0 stop
-        $0 start
-        rc_status
-        ;;
-    status)
-        echo -n "Checking for SCI daemon "
-        checkproc -p ${PID_FILE} ${SCID_BIN}
-        rc_status -v
-        ;;
-    *)
-        echo "Usage: $0 {start|stop|restart|status}"
-        exit 1
-        ;;
-    esac
-    rc_exit
-
-elif [[ -d /usr/share/ubuntu-docs ]] ; then
-
-    test -f /usr/sbin/scidv1 || exit 0
-
-    . /lib/lsb/init-functions
-
-    case "$1" in
-    start)  
-        log_begin_msg "Starting SCI service daemon..."
-        start-stop-daemon --start --quiet --pidfile /var/run/scidv1.pid --name scidv1 --startas /usr/sbin/scidv1
-        log_end_msg $?
-        ;;
-    stop)   
-        log_begin_msg "Stopping SCI service daemon..."
-        start-stop-daemon --stop --quiet --pidfile /var/run/scidv1.pid --name scidv1
-        log_end_msg $?
-        ;;
-    restart) 
-        log_begin_msg "Restarting SCI service daemon..."
-        start-stop-daemon --stop --retry 5 --quiet --pidfile /var/run/scidv1.pid --name scidv1
-        start-stop-daemon --start --quiet --pidfile /var/run/scidv1.pid --name sci --startas /usr/sbin/scidv1
-        log_end_msg $?
-        ;;
-    *) 
-        log_success_msg "Usage: $0 start|stop|restart"
-        exit 1 
-        ;;
-    esac
-    exit 0
-
-else
-    
-    echo "Error: requires Redhat, SUSE or Ubuntu"
-    exit 1
-    
-fi
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/Makefile b/tools/sci/org.eclipse.ptp.sci/usecase/dsh/Makefile
deleted file mode 100644
index bf365ee..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/Makefile
+++ /dev/null
@@ -1,48 +0,0 @@
-CC = g++
-
-CPPFLAGS = -I../../include -L../../libsci
-
-OTHER_FLAGS = -ldl -lpthread -lsci
-
-all: all_32 all_64
-
-all_32: dsh_fe edsh_fe gdsh_fe ddsh_fe dsh_be
-all_64: dsh_fe64 edsh_fe64 gdsh_fe64 ddsh_fe64 dsh_be64
-
-dsh_fe: dsh_fe.c 
-	$(CC) -m32 -g $(CPPFLAGS) -o $@ $^ $(OTHER_FLAGS)
-
-edsh_fe: edsh_fe.cpp 
-	$(CC) -m32 -g $(CPPFLAGS) -o $@ $^ $(OTHER_FLAGS)
-
-gdsh_fe: gdsh_fe.cpp 
-	$(CC) -m32 -g $(CPPFLAGS) -o $@ $^ $(OTHER_FLAGS)
-
-ddsh_fe: ddsh_fe.c
-	$(CC) -m32 -g $(CPPFLAGS) -o $@ $^ $(OTHER_FLAGS)
-
-dsh_be: dsh_be.c 
-	$(CC) -m32 -g $(CPPFLAGS) -o $@ $^ $(OTHER_FLAGS)
-	
-dsh_fe64: dsh_fe.c 
-	$(CC) -m64 -D__64BIT__ -g $(CPPFLAGS) -o $@ $^ $(OTHER_FLAGS)
-
-edsh_fe64: edsh_fe.cpp 
-	$(CC) -m64 -D__64BIT__ -g $(CPPFLAGS) -o $@ $^ $(OTHER_FLAGS)
-
-gdsh_fe64: gdsh_fe.cpp 
-	$(CC) -m64 -D__64BIT__ -g $(CPPFLAGS) -o $@ $^ $(OTHER_FLAGS)
-
-ddsh_fe64: ddsh_fe.c
-	$(CC) -m64 -D__64BIT__ -g $(CPPFLAGS) -o $@ $^ $(OTHER_FLAGS)
-
-dsh_be64: dsh_be.c 
-	$(CC) -m64 -D__64BIT__ -g $(CPPFLAGS) -o $@ $^ $(OTHER_FLAGS)
-
-clean: clean_32 clean_64
-
-clean_32:
-	@rm -f *.o dsh_fe edsh_fe gdsh_fe ddsh_fe dsh_be
-
-clean_64:
-	@rm -f *.o dsh_fe64 edsh_fe64 gdsh_fe64 ddsh_fe64 dsh_be64
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/Makefile.aix b/tools/sci/org.eclipse.ptp.sci/usecase/dsh/Makefile.aix
deleted file mode 100644
index 155a5a7..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/Makefile.aix
+++ /dev/null
@@ -1,49 +0,0 @@
-CC = xlC_r
-
-CPPFLAGS = 
-
-OTHER_FLAGS = -ldl -lpthread -lsci_r
-
-all: all_32 all_64
-
-all_32: dsh_fe edsh_fe gdsh_fe ddsh_fe dsh_be
-
-all_32: dsh_fe64 edsh_fe64 gdsh_fe64 ddsh_fe64 dsh_be64
-
-dsh_fe: dsh_fe.c 
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ dsh_fe.c $(OTHER_FLAGS)
-
-edsh_fe: edsh_fe.cpp 
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ edsh_fe.cpp $(OTHER_FLAGS)
-
-gdsh_fe: gdsh_fe.cpp 
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ gdsh_fe.cpp $(OTHER_FLAGS)
-
-ddsh_fe: ddsh_fe.c
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ ddsh_fe.c $(OTHER_FLAGS)
-
-dsh_be: dsh_be.c 
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ dsh_be.c $(OTHER_FLAGS)
-
-dsh_fe64: dsh_fe.c 
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ dsh_fe.c $(OTHER_FLAGS)
-
-edsh_fe64: edsh_fe.cpp 
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ edsh_fe.cpp $(OTHER_FLAGS)
-
-gdsh_fe64: gdsh_fe.cpp 
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ gdsh_fe.cpp $(OTHER_FLAGS)
-
-ddsh_fe64: ddsh_fe.c
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ ddsh_fe.c $(OTHER_FLAGS)
-
-dsh_be64: dsh_be.c 
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ dsh_be.c $(OTHER_FLAGS)
-
-clean: clean_32 clean_64
-
-clean_32:
-	@rm -f *.o dsh_fe edsh_fe gdsh_fe ddsh_fe dsh_be
-	
-clean_64:
-	@rm -f *.o dsh_fe64 edsh_fe64 gdsh_fe64 ddsh_fe64 dsh_be64
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/buildit b/tools/sci/org.eclipse.ptp.sci/usecase/dsh/buildit
deleted file mode 100755
index d92b14d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/buildit
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/sh -x
-
-OS_TYPE=$(uname)
-if [[ ${OS_TYPE} = "AIX" ]]
-then
-    make -f Makefile.aix clean
-    make -f Makefile.aix all
-else
-    CURR_CHIP=$(arch)
-    if [[ ${CURR_CHIP} == 'ppc64' ]]
-    then
-        make clean
-        make all
-    else
-        if [[ ${CURR_CHIP} == 'i386' || ${CURR_CHIP} == 'i686' ]]
-        then
-            make clean_32
-            make all_32
-        else
-            if [[ ${CURR_CHIP} == 'x86_64' ]]
-            then
-                make all
-            fi
-        fi
-    fi
-fi
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/ddsh_fe.c b/tools/sci/org.eclipse.ptp.sci/usecase/dsh/ddsh_fe.c
deleted file mode 100644
index cc37882..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/ddsh_fe.c
+++ /dev/null
@@ -1,130 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include "sci.h"
-
-int num_resp;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int be_id = ((int *) buffer)[0];
-    char *msg = (char *)((char *) buffer + sizeof(int));
-    char *pos = NULL;
-
-    while (1) {
-        pos = strstr(msg, "\n");
-        if (pos == NULL) {
-            break;
-        } else {
-            pos[0] = '\0';
-        }
-        printf("%d: %s\n", be_id, msg);
-        msg = pos + 1;
-    }
-    
-    num_resp++;
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    sci_filter_info_t filter_info;
-    sci_be_t be;
-
-    char msg[256];
-    char *s;
-    int i, rc, num_bes, job_key, sizes[1];
-    void *bufs[1];
-
-    char pwd[256];
-    char hfile[256], bpath[256], fpath[256], hostname[256];
-
-    getcwd(pwd, 256);
-    sprintf(hfile, "%s/host.list", pwd);
-#ifdef __64BIT__
-    sprintf(bpath, "%s/dsh_be64", pwd);
-#else
-    sprintf(bpath, "%s/dsh_be", pwd);
-#endif
-
-    bzero(&info, sizeof(info));
-    info.type = SCI_FRONT_END;
-    info.fe_info.mode = SCI_INTERRUPT;
-    info.fe_info.hostfile = hfile;
-    info.fe_info.bepath = bpath;
-    info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.fe_info.param = NULL;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    rc = SCI_Query(NUM_BACKENDS, &num_bes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    ::gethostname(hostname, sizeof(hostname));
-
-    be.id = num_bes;
-    be.hostname = hostname;
-    rc = SCI_BE_add(&be);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    while (1) {
-        printf(">>> ");
-        fflush(stdout);
-        memset(msg, 0 , sizeof(msg));
-        fgets(msg, sizeof(msg), stdin);
-        msg[strlen(msg) - 1] = '\0';
-
-        if (0 == strcmp(msg, "quit"))
-            break;
-        
-        num_resp = 0;
-        
-        bufs[0] = msg;
-        sizes[0] = strlen(msg) + 1;
-        rc = SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        if (rc != SCI_SUCCESS) {
-            exit(1);
-        }
-        
-        while (num_resp < num_bes + 1) {
-            usleep(500);
-        } 
-    }
-    
-    rc = SCI_Terminate();
-    
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/dsh_be.c b/tools/sci/org.eclipse.ptp.sci/usecase/dsh/dsh_be.c
deleted file mode 100644
index f16bfe7..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/dsh_be.c
+++ /dev/null
@@ -1,86 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <assert.h>
-#include "sci.h"
-
-#define RST_SIZE 4096
-
-char *result = NULL;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int bytes, my_id, rc;
-    FILE *fp = NULL;
-    int sizes[2];
-    void *bufs[2];
-
-    rc = SCI_Query(BACKEND_ID, &my_id);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    bufs[0] = &my_id;
-    sizes[0] = sizeof(my_id);
-    
-    fp = popen((const char *)buffer, "r");
-    assert(result != NULL);
-    memset(result, 0, RST_SIZE);
-    bytes = fread(result, sizeof(char), RST_SIZE, fp);
-    bufs[1] = result;
-    sizes[1] = strlen(result) + 1;
-    pclose(fp);
-    
-    rc = SCI_Upload(SCI_FILTER_NULL, group, 2, bufs, sizes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    int rc;
-
-    result = (char *)malloc(RST_SIZE * sizeof(char));
-    bzero(&info, sizeof(info));
-    info.type = SCI_BACK_END;
-    info.be_info.mode = SCI_INTERRUPT;
-    info.be_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.be_info.param = NULL;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    rc = SCI_Terminate();
-    free(result);
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/dsh_fe.c b/tools/sci/org.eclipse.ptp.sci/usecase/dsh/dsh_fe.c
deleted file mode 100644
index 23987ef..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/dsh_fe.c
+++ /dev/null
@@ -1,120 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include "sci.h"
-
-int num_resp;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int be_id = ((int *) buffer)[0];
-    char *msg = (char *)((char *) buffer + sizeof(int));
-    char *pos = NULL;
-
-    while (1) {
-        pos = strstr(msg, "\n");
-        if (pos == NULL) {
-            break;
-        } else {
-            pos[0] = '\0';
-        }
-        printf("%d: %s\n", be_id, msg);
-        msg = pos + 1;
-    }
-    
-    num_resp++;
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    sci_filter_info_t filter_info;
-
-    char msg[256];
-    char *s;
-    int i, rc, num_bes, job_key, sizes[1];
-    void *bufs[1];
-
-    char pwd[256];
-    char hfile[256], bpath[256], fpath[256];
-
-    getcwd(pwd, 256);
-    sprintf(hfile, "%s/host.list", pwd);
-#ifdef __64BIT__
-    sprintf(bpath, "%s/dsh_be64", pwd);
-#else
-    sprintf(bpath, "%s/dsh_be", pwd);
-#endif
-
-    bzero(&info, sizeof(info));
-    info.type = SCI_FRONT_END;
-    info.fe_info.mode = SCI_INTERRUPT;
-    info.fe_info.hostfile = hfile;
-    info.fe_info.bepath = bpath;
-    info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.fe_info.param = NULL;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    rc = SCI_Query(NUM_BACKENDS, &num_bes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    while (1) {
-        printf(">>> ");
-        fflush(stdout);
-        memset(msg, 0 , sizeof(msg));
-        fgets(msg, sizeof(msg), stdin);
-        msg[strlen(msg) - 1] = '\0';
-
-        if (0 == strcmp(msg, "quit"))
-            break;
-        
-        num_resp = 0;
-        
-        bufs[0] = msg;
-        sizes[0] = strlen(msg) + 1;
-        rc = SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        if (rc != SCI_SUCCESS) {
-            exit(1);
-        }
-        
-        while (num_resp < num_bes) {
-            usleep(500);
-        } 
-    }
-    
-    rc = SCI_Terminate();
-    
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/edsh_fe.cpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh/edsh_fe.cpp
deleted file mode 100644
index d50db1b..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/edsh_fe.cpp
+++ /dev/null
@@ -1,194 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Enhanced Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/22/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <assert.h>
-#include <strings.h>
-#include "sci.h"
-
-#include <string>
-
-using namespace std;
-
-int num_resp;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int be_id = ((int *) buffer)[0];
-    char *msg = (char *)((char *) buffer + sizeof(int));
-    char *pos = NULL;
-
-    while (1) {
-        pos = strstr(msg, "\n");
-        if (pos == NULL) {
-            break;
-        } else {
-            pos[0] = '\0';
-        }
-        printf("%d: %s\n", be_id, msg);
-        msg = pos + 1;
-    }
-    
-    num_resp++;
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    sci_filter_info_t filter_info;
-
-    char msg[256];
-    char *s;
-    int i, rc, num_bes, sizes[1];
-    void *bufs[1];
-
-    sci_group_t odd_group, even_group;
-    int odd_size, even_size;
-    int *odd_list = NULL, *even_list = NULL;
-
-    char pwd[256];
-    char hfile[256], bpath[256], fpath[256];
-
-    getcwd(pwd, 256);
-    sprintf(hfile, "%s/host.list", pwd);
-#ifdef __64BIT__
-    sprintf(bpath, "%s/dsh_be64", pwd);
-#else
-    sprintf(bpath, "%s/dsh_be", pwd);
-#endif
-
-    bzero(&info, sizeof(info));
-    info.type = SCI_FRONT_END;
-    info.fe_info.mode = SCI_INTERRUPT;
-    info.fe_info.hostfile = hfile;
-    info.fe_info.bepath = bpath;
-    info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.fe_info.param = NULL;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    
-    rc = SCI_Query(NUM_BACKENDS, &num_bes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    odd_size = (num_bes - num_bes%2) / 2;
-    odd_list = (int *)malloc(sizeof(int) * odd_size);
-    for (i=0; i<odd_size; i++) {
-        odd_list[i] = i*2 + 1;
-    }
-    rc = SCI_Group_create(odd_size, odd_list, &odd_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    even_size = (num_bes + num_bes%2) / 2;
-    even_list = (int *)malloc(sizeof(int) * even_size);
-    for (i=0; i<even_size; i++) {
-        even_list[i] = i*2;
-    }
-    rc = SCI_Group_create(even_size, even_list, &even_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    string cur_grp = "all";
-    int exp_resp = num_bes;
-    while (1) {
-        printf("(%s) ", cur_grp.c_str());
-        fflush(stdout);
-        memset(msg, 0 , sizeof(msg));
-        fgets(msg, sizeof(msg), stdin);
-        msg[strlen(msg) - 1] = '\0';
-
-        if (strcmp(msg, "help") == 0) {
-            printf("Commands:\n");
-            printf("\t\thelp -- show help topics\n");
-            printf("\t\tall -- send commands to all back ends\n");
-            printf("\t\teven -- send commands to back ends with even id\n");
-            printf("\t\todd -- send commands to back ends with odd id\n");
-            printf("\t\tquit -- exit this program\n");
-            continue;
-        } else if (strcmp(msg, "all") == 0) {
-            cur_grp = "all";
-            exp_resp = num_bes;
-            continue;
-        } else if (strcmp(msg, "odd") == 0) {
-            cur_grp = "odd";
-            exp_resp = odd_size;
-            continue;
-        } else if (strcmp(msg, "even") == 0) {
-            cur_grp = "even";
-            exp_resp = even_size;
-            continue;
-        } else if (strcmp(msg, "quit") == 0) {
-            break;
-        }
-        
-        num_resp = 0;
-        
-        bufs[0] = msg;
-        sizes[0] = strlen(msg) + 1;
-        if (cur_grp == "all") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        } else if (cur_grp == "odd") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, odd_group, 1, bufs, sizes);
-        } else if (cur_grp == "even") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, even_group, 1, bufs, sizes);
-        } else {
-            assert(!"Unknown group");
-        }
-        if (rc != SCI_SUCCESS) {
-            exit(1);
-        }
-        
-        while (num_resp < exp_resp) {
-            usleep(500);
-        } 
-    }
-
-    rc = SCI_Group_free(odd_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    rc = SCI_Group_free(even_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    free(odd_list);
-    free(even_list);
-    
-    rc = SCI_Terminate();
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/gdsh_fe.cpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh/gdsh_fe.cpp
deleted file mode 100644
index 8981f15..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/gdsh_fe.cpp
+++ /dev/null
@@ -1,233 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Enhanced Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/13/09 chensuih        Initial code
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <assert.h>
-#include <strings.h>
-#include "sci.h"
-
-#include <string>
-
-using namespace std;
-
-int num_resp;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int be_id = ((int *) buffer)[0];
-    char *msg = (char *)((char *) buffer + sizeof(int));
-    char *pos = NULL;
-
-    while (1) {
-        pos = strstr(msg, "\n");
-        if (pos == NULL) {
-            break;
-        } else {
-            pos[0] = '\0';
-        }
-        printf("%d: %s\n", be_id, msg);
-        msg = pos + 1;
-    }
-    
-    num_resp++;
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    sci_filter_info_t filter_info;
-
-    char msg[256];
-    char *s;
-    int i, rc, num_bes, sizes[1];
-    void *bufs[1];
-
-    sci_group_t odd_group, even_group;
-    int odd_size, even_size;
-    int *odd_list = NULL, *even_list = NULL;
-
-    char pwd[256];
-    char hfile[256], bpath[256], fpath[256];
-
-    getcwd(pwd, 256);
-    sprintf(hfile, "%s/host.list", pwd);
-#ifdef __64BIT__
-    sprintf(bpath, "%s/dsh_be64", pwd);
-#else
-    sprintf(bpath, "%s/dsh_be", pwd);
-#endif
-
-    bzero(&info, sizeof(info));
-    info.type = SCI_FRONT_END;
-    info.fe_info.mode = SCI_INTERRUPT;
-    info.fe_info.hostfile = hfile;
-    info.fe_info.bepath = bpath;
-    info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.fe_info.param = NULL;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    
-    rc = SCI_Query(NUM_BACKENDS, &num_bes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    //=========odd list===================
-    odd_size = (num_bes - num_bes%2) / 2;
-    odd_list = (int *)malloc(sizeof(int) * odd_size);
-    for (i=0; i<odd_size; i++) {
-        odd_list[i] = i*2 + 1;
-    }
-    rc = SCI_Group_create(odd_size, odd_list, &odd_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    int odd_list_benum;
-    rc = SCI_Group_query(odd_group, GROUP_MEMBER_NUM, &odd_list_benum);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    printf("The Be Num of odd list is: %d\r\n", odd_list_benum);
-    
-    int* oddlist_query_res = (int *)malloc(sizeof(int)*odd_list_benum);
-    rc = SCI_Group_query(odd_group, GROUP_MEMBER, oddlist_query_res);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-	
-    for(i=0; i<odd_list_benum; i++)
-    {
-        printf("the group member %d of oddlist_query_res is: %d\r\n", i, oddlist_query_res[i]);
-    }
-    //===========even list====================
-    even_size = (num_bes + num_bes%2) / 2;
-    even_list = (int *)malloc(sizeof(int) * even_size);
-    for (i=0; i<even_size; i++) {
-        even_list[i] = i*2;
-    }
-    rc = SCI_Group_create(even_size, even_list, &even_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-	
-    int even_list_benum;
-    rc = SCI_Group_query(even_group, GROUP_MEMBER_NUM, &even_list_benum);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    printf("The Be Num of even list is: %d\r\n", even_list_benum);
-
-    int* evenlist_query_res = (int *)malloc(sizeof(int)*even_list_benum);
-    rc = SCI_Group_query(even_group, GROUP_MEMBER, evenlist_query_res);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-	
-    for(i=0; i<even_list_benum; i++)
-    {
-        printf("the group member %d of evenlist_query_res is: %d\r\n", i, evenlist_query_res[i]);
-    }
-    //=====================================
-    string cur_grp = "all";
-    int exp_resp = num_bes;
-    while (1) {
-        printf("(%s) ", cur_grp.c_str());
-        fflush(stdout);
-        memset(msg, 0 , sizeof(msg));
-        fgets(msg, sizeof(msg), stdin);
-        msg[strlen(msg) - 1] = '\0';
-
-        if (strcmp(msg, "help") == 0) {
-            printf("Commands:\n");
-            printf("\t\thelp -- show help topics\n");
-            printf("\t\tall -- send commands to all back ends\n");
-            printf("\t\teven -- send commands to back ends with even id\n");
-            printf("\t\todd -- send commands to back ends with odd id\n");
-            printf("\t\tquit -- exit this program\n");
-            continue;
-        } else if (strcmp(msg, "all") == 0) {
-            cur_grp = "all";
-            exp_resp = num_bes;
-            continue;
-        } else if (strcmp(msg, "odd") == 0) {
-            cur_grp = "odd";
-            exp_resp = odd_size;
-            continue;
-        } else if (strcmp(msg, "even") == 0) {
-            cur_grp = "even";
-            exp_resp = even_size;
-            continue;
-        } else if (strcmp(msg, "quit") == 0) {
-            break;
-        }
-        
-        num_resp = 0;
-        
-        bufs[0] = msg;
-        sizes[0] = strlen(msg) + 1;
-        if (cur_grp == "all") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        } else if (cur_grp == "odd") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, odd_group, 1, bufs, sizes);
-        } else if (cur_grp == "even") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, even_group, 1, bufs, sizes);
-        } else {
-            assert(!"Unknown group");
-        }
-        if (rc != SCI_SUCCESS) {
-            exit(1);
-        }
-        
-        while (num_resp < exp_resp) {
-            usleep(500);
-        } 
-    }
-
-    rc = SCI_Group_free(odd_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    rc = SCI_Group_free(even_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    free(odd_list);
-    free(even_list);
-    free(oddlist_query_res);
-    free(evenlist_query_res);
-    
-    rc = SCI_Terminate();
-    return rc;
-}
-
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/use_ext_launcher b/tools/sci/org.eclipse.ptp.sci/usecase/dsh/use_ext_launcher
deleted file mode 100755
index 802cab4..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/use_ext_launcher
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/usr/bin/perl -w
-
-my $hostlist = `cat ./host.list`;
-chomp($hostlist);
-my $key = `echo \$RANDOM`;
-chomp($key);
-
-print "Start back ends ...\n";
-
-my @hosts = split(/\n/, $hostlist);
-my $id = 0;
-foreach my $host (@hosts) {
-    print "export SCI_JOB_KEY=$key; export SCI_USE_EXTLAUNCHER=yes; export SCI_CLIENT_ID=$id; ./dsh_be\n";
-    system("export SCI_JOB_KEY=$key; export SCI_USE_EXTLAUNCHER=yes; export SCI_CLIENT_ID=$id; ./dsh_be &");
-    $id = $id + 1;
-}
-
-print "Wait 5 seconds ...\n";
-sleep(5);
-
-print "Start front end ...\n";
-print "export SCI_JOB_KEY=$key; export SCI_USE_EXTLAUNCHER=yes; ./dsh_fe\n";
-system("export SCI_JOB_KEY=$key; export SCI_USE_EXTLAUNCHER=yes; ./dsh_fe");
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/use_ext_launcher2 b/tools/sci/org.eclipse.ptp.sci/usecase/dsh/use_ext_launcher2
deleted file mode 100755
index 11d7e76..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh/use_ext_launcher2
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/usr/bin/perl -w
-
-my $hostlist = `cat ./host.list`;
-chomp($hostlist);
-my $key = `echo \$RANDOM`;
-chomp($key);
-
-print "Start back ends ...\n";
-
-my @hosts = split(/\n/, $hostlist);
-my $id = 0;
-foreach my $host (@hosts) {
-    print "export SCI_JOB_KEY=$key; export SCI_USE_EXTLAUNCHER=yes; export SCI_CLIENT_ID=$id; ./dsh_be\n";
-    system("export SCI_JOB_KEY=$key; export SCI_USE_EXTLAUNCHER=yes; export SCI_CLIENT_ID=$id; ./dsh_be &");
-    $id = $id + 1;
-}
-
-print "export SCI_JOB_KEY=$key; export SCI_USE_EXTLAUNCHER=yes; export SCI_CLIENT_ID=$id; ./dsh_be\n";
-system("export SCI_JOB_KEY=$key; export SCI_USE_EXTLAUNCHER=yes; export SCI_CLIENT_ID=$id; ./dsh_be &");
-
-print "Wait 5 seconds ...\n";
-sleep(5);
-
-print "Start front end ...\n";
-print "export SCI_JOB_KEY=$key; export SCI_USE_EXTLAUNCHER=yes; ./ddsh_fe\n";
-system("export SCI_JOB_KEY=$key; export SCI_USE_EXTLAUNCHER=yes; ./ddsh_fe");
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/Makefile b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/Makefile
deleted file mode 100644
index d873ab4..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/Makefile
+++ /dev/null
@@ -1,48 +0,0 @@
-CC = g++
-
-CPPFLAGS = 
-
-OTHER_FLAGS = -ldl -lpthread -lsci
-
-all: all_32 all_64
-
-all_32: dsh_fe edsh_fe gdsh_fe sdsh_fe dsh_be
-all_64: dsh_fe64 edsh_fe64 gdsh_fe64 sdsh_fe64 dsh_be64
-
-dsh_fe: dsh_fe.c 
-	$(CC) -m32 -g $(CPPFLAGS) -o $@ $^ $(OTHER_FLAGS)
-
-edsh_fe: edsh_fe.cpp 
-	$(CC) -m32 -g $(CPPFLAGS) -o $@ $^ $(OTHER_FLAGS)
-
-gdsh_fe: gdsh_fe.cpp 
-	$(CC) -m32 -g $(CPPFLAGS) -o $@ $^ $(OTHER_FLAGS)
-
-sdsh_fe: sdsh_fe.cpp 
-	$(CC) -m32 -g $(CPPFLAGS) -o $@ $^ $(OTHER_FLAGS)
-
-dsh_be: dsh_be.c 
-	$(CC) -m32 -g $(CPPFLAGS) -o $@ $^ $(OTHER_FLAGS)
-	
-dsh_fe64: dsh_fe.c 
-	$(CC) -m64 -D__64BIT__ -g $(CPPFLAGS) -o $@ $^ $(OTHER_FLAGS)
-
-edsh_fe64: edsh_fe.cpp 
-	$(CC) -m64 -D__64BIT__ -g $(CPPFLAGS) -o $@ $^ $(OTHER_FLAGS)
-
-gdsh_fe64: gdsh_fe.cpp 
-	$(CC) -m64 -D__64BIT__ -g $(CPPFLAGS) -o $@ $^ $(OTHER_FLAGS)
-
-sdsh_fe64: sdsh_fe.cpp 
-	$(CC) -m64 -D__64BIT__ -g $(CPPFLAGS) -o $@ $^ $(OTHER_FLAGS)
-
-dsh_be64: dsh_be.c 
-	$(CC) -m64 -D__64BIT__ -g $(CPPFLAGS) -o $@ $^ $(OTHER_FLAGS)
-
-clean: clean_32 clean_64
-
-clean_32:
-	@rm -f *.o dsh_fe edsh_fe gdsh_fe sdsh_fe dsh_be
-
-clean_64:
-	@rm -f *.o dsh_fe64 edsh_fe64 gdsh_fe64 sdsh_fe64 dsh_be64
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/Makefile.aix b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/Makefile.aix
deleted file mode 100644
index 045f967..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/Makefile.aix
+++ /dev/null
@@ -1,49 +0,0 @@
-CC = xlC_r
-
-CPPFLAGS = 
-
-OTHER_FLAGS = -ldl -lpthread -lsci_r
-
-all: all_32 all_64
-
-all_32: dsh_fe edsh_fe gdsh_fe sdsh_fe dsh_be
-
-all_32: dsh_fe64 edsh_fe64 gdsh_fe64 sdsh_fe64 dsh_be64
-
-dsh_fe: dsh_fe.c 
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ dsh_fe.c $(OTHER_FLAGS)
-
-edsh_fe: edsh_fe.cpp 
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ edsh_fe.cpp $(OTHER_FLAGS)
-
-gdsh_fe: gdsh_fe.cpp 
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ gdsh_fe.cpp $(OTHER_FLAGS)
-
-sdsh_fe: sdsh_fe.cpp 
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ sdsh_fe.cpp $(OTHER_FLAGS)
-
-dsh_be: dsh_be.c 
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ dsh_be.c $(OTHER_FLAGS)
-
-dsh_fe64: dsh_fe.c 
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ dsh_fe.c $(OTHER_FLAGS)
-
-edsh_fe64: edsh_fe.cpp 
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ edsh_fe.cpp $(OTHER_FLAGS)
-
-gdsh_fe64: gdsh_fe.cpp 
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ gdsh_fe.cpp $(OTHER_FLAGS)
-
-sdsh_fe64: sdsh_fe.cpp 
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ sdsh_fe.cpp $(OTHER_FLAGS)
-
-dsh_be64: dsh_be.c 
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ dsh_be.c $(OTHER_FLAGS)
-
-clean: clean_32 clean_64
-
-clean_32:
-	@rm -f *.o dsh_fe edsh_fe gdsh_fe sdsh_fe dsh_be
-	
-clean_64:
-	@rm -f *.o dsh_fe64 edsh_fe64 gdsh_fe64 sdsh_fe64 dsh_be64
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/buildit b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/buildit
deleted file mode 100755
index 667621c..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/buildit
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/bin/sh -x
-
-OS_TYPE=$(uname)
-if [[ ${OS_TYPE} = "AIX" ]]
-then
-    make -f Makefile.aix clean
-    make -f Makefile.aix all
-else
-    CURR_CHIP=$(arch)
-    if [[ ${CURR_CHIP} == 'ppc64' ]]
-    then
-        make clean
-        make all
-    else
-        if [[ ${CURR_CHIP} == 'i386' || ${CURR_CHIP} == 'i686' ]]
-        then
-            make clean_32
-            make all_32
-        else
-            if [[ ${CURR_CHIP} == 'x86_64' ]]
-            then
-                make clean
-                make all
-            fi
-        fi
-    fi
-fi
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/dsh_be.c b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/dsh_be.c
deleted file mode 100644
index 6e85222..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/dsh_be.c
+++ /dev/null
@@ -1,90 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <assert.h>
-#include "sci.h"
-
-#define RST_SIZE 4096
-
-char *result = NULL;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int bytes, my_id, rc;
-    FILE *fp = NULL;
-    int sizes[2];
-    void *bufs[2];
-
-    rc = SCI_Query(BACKEND_ID, &my_id);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    bufs[0] = &my_id;
-    sizes[0] = sizeof(my_id);
-    
-    fp = popen((const char *)buffer, "r");
-    assert(result != NULL);
-    memset(result, 0, RST_SIZE);
-    bytes = fread(result, sizeof(char), RST_SIZE, fp);
-    bufs[1] = result;
-    sizes[1] = strlen(result) + 1;
-    pclose(fp);
-    
-    rc = SCI_Upload(SCI_FILTER_NULL, group, 2, bufs, sizes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    int rc;
-
-    result = (char *)malloc(RST_SIZE * sizeof(char));
-    bzero(&info, sizeof(info));
-    info.type = SCI_BACK_END;
-    info.be_info.mode = SCI_POLLING;
-    info.be_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.be_info.param = NULL;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    do {
-        rc = SCI_Poll(-1);
-    } while (rc == SCI_SUCCESS);
-
-    rc = SCI_Terminate();
-    free(result);
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/dsh_fe.c b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/dsh_fe.c
deleted file mode 100644
index d7f29e4..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/dsh_fe.c
+++ /dev/null
@@ -1,127 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include "sci.h"
-
-int num_resp;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int be_id = ((int *) buffer)[0];
-    char *msg = (char *)((char *) buffer + sizeof(int));
-    char *pos = NULL;
-
-    while (1) {
-        pos = strstr(msg, "\n");
-        if (pos == NULL) {
-            break;
-        } else {
-            pos[0] = '\0';
-        }
-        printf("%d: %s\n", be_id, msg);
-        msg = pos + 1;
-    }
-    
-    num_resp++;
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    sci_filter_info_t filter_info;
-
-    char msg[256];
-    char *s;
-    int i, rc, num_bes, job_key, sizes[1];
-    void *bufs[1];
-
-    char pwd[256];
-    char hfile[256], bpath[256], fpath[256];
-
-    getcwd(pwd, 256);
-    sprintf(hfile, "%s/host.list", pwd);
-#ifdef __64BIT__
-    sprintf(bpath, "%s/dsh_be64", pwd);
-#else
-    sprintf(bpath, "%s/dsh_be", pwd);
-#endif
-
-    bzero(&info, sizeof(info));
-    info.type = SCI_FRONT_END;
-    info.fe_info.mode = SCI_POLLING;
-    info.fe_info.hostfile = hfile;
-    info.fe_info.bepath = bpath;
-    info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.fe_info.param = NULL;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    rc = SCI_Query(NUM_BACKENDS, &num_bes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    while (1) {
-        printf(">>> ");
-        fflush(stdout);
-        memset(msg, 0 , sizeof(msg));
-        fgets(msg, sizeof(msg), stdin);
-        msg[strlen(msg) - 1] = '\0';
-
-        if (0 == strcmp(msg, "quit"))
-            break;
-        
-        num_resp = 0;
-        
-        bufs[0] = msg;
-        sizes[0] = strlen(msg) + 1;
-        rc = SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        if (rc != SCI_SUCCESS) {
-            exit(1);
-        }
-
-        do {
-            rc = SCI_Poll(-1);
-            if (rc != SCI_SUCCESS) {
-                break;
-            }
-        } while (num_resp < num_bes);
-
-        if (rc != SCI_SUCCESS) {
-            break;
-        }
-    }
-    
-    rc = SCI_Terminate();
-    
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/edsh_fe.cpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/edsh_fe.cpp
deleted file mode 100644
index 234440d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/edsh_fe.cpp
+++ /dev/null
@@ -1,197 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Enhanced Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/22/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <assert.h>
-#include <strings.h>
-#include "sci.h"
-
-#include <string>
-
-using namespace std;
-
-int num_resp;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int be_id = ((int *) buffer)[0];
-    char *msg = (char *)((char *) buffer + sizeof(int));
-    char *pos = NULL;
-
-    while (1) {
-        pos = strstr(msg, "\n");
-        if (pos == NULL) {
-            break;
-        } else {
-            pos[0] = '\0';
-        }
-        printf("%d: %s\n", be_id, msg);
-        msg = pos + 1;
-    }
-    
-    num_resp++;
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    sci_filter_info_t filter_info;
-
-    char msg[256];
-    char *s;
-    int i, rc, num_bes, sizes[1];
-    void *bufs[1];
-
-    sci_group_t odd_group, even_group;
-    int odd_size, even_size;
-    int *odd_list = NULL, *even_list = NULL;
-
-    char pwd[256];
-    char hfile[256], bpath[256], fpath[256];
-
-    getcwd(pwd, 256);
-    sprintf(hfile, "%s/host.list", pwd);
-#ifdef __64BIT__
-    sprintf(bpath, "%s/dsh_be64", pwd);
-#else
-    sprintf(bpath, "%s/dsh_be", pwd);
-#endif
-
-    bzero(&info, sizeof(info));
-    info.type = SCI_FRONT_END;
-    info.fe_info.mode = SCI_POLLING;
-    info.fe_info.hostfile = hfile;
-    info.fe_info.bepath = bpath;
-    info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.fe_info.param = NULL;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    
-    rc = SCI_Query(NUM_BACKENDS, &num_bes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    odd_size = (num_bes - num_bes%2) / 2;
-    odd_list = (int *)malloc(sizeof(int) * odd_size);
-    for (i=0; i<odd_size; i++) {
-        odd_list[i] = i*2 + 1;
-    }
-    rc = SCI_Group_create(odd_size, odd_list, &odd_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    even_size = (num_bes + num_bes%2) / 2;
-    even_list = (int *)malloc(sizeof(int) * even_size);
-    for (i=0; i<even_size; i++) {
-        even_list[i] = i*2;
-    }
-    rc = SCI_Group_create(even_size, even_list, &even_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    string cur_grp = "all";
-    int exp_resp = num_bes;
-    while (1) {
-        printf("(%s) ", cur_grp.c_str());
-        fflush(stdout);
-        memset(msg, 0 , sizeof(msg));
-        fgets(msg, sizeof(msg), stdin);
-        msg[strlen(msg) - 1] = '\0';
-
-        if (strcmp(msg, "help") == 0) {
-            printf("Commands:\n");
-            printf("\t\thelp -- show help topics\n");
-            printf("\t\tall -- send commands to all back ends\n");
-            printf("\t\teven -- send commands to back ends with even id\n");
-            printf("\t\todd -- send commands to back ends with odd id\n");
-            printf("\t\tquit -- exit this program\n");
-            continue;
-        } else if (strcmp(msg, "all") == 0) {
-            cur_grp = "all";
-            exp_resp = num_bes;
-            continue;
-        } else if (strcmp(msg, "odd") == 0) {
-            cur_grp = "odd";
-            exp_resp = odd_size;
-            continue;
-        } else if (strcmp(msg, "even") == 0) {
-            cur_grp = "even";
-            exp_resp = even_size;
-            continue;
-        } else if (strcmp(msg, "quit") == 0) {
-            break;
-        }
-        
-        num_resp = 0;
-        
-        bufs[0] = msg;
-        sizes[0] = strlen(msg) + 1;
-        if (cur_grp == "all") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        } else if (cur_grp == "odd") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, odd_group, 1, bufs, sizes);
-        } else if (cur_grp == "even") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, even_group, 1, bufs, sizes);
-        } else {
-            assert(!"Unknown group");
-        }
-        if (rc != SCI_SUCCESS) {
-            exit(1);
-        }
-
-        do {
-            rc = SCI_Poll(-1);
-            if (num_resp >= exp_resp) {
-                break;
-            }
-        } while (rc == SCI_SUCCESS);
-    }
-
-    rc = SCI_Group_free(odd_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    rc = SCI_Group_free(even_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    free(odd_list);
-    free(even_list);
-    
-    rc = SCI_Terminate();
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/gdsh_fe.cpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/gdsh_fe.cpp
deleted file mode 100644
index eb2e024..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/gdsh_fe.cpp
+++ /dev/null
@@ -1,234 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Enhanced Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   02/13/08  chensuih        Initial code
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <assert.h>
-#include <strings.h>
-#include "sci.h"
-
-#include <string>
-
-using namespace std;
-
-int num_resp;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int be_id = ((int *) buffer)[0];
-    char *msg = (char *)((char *) buffer + sizeof(int));
-    char *pos = NULL;
-
-    while (1) {
-        pos = strstr(msg, "\n");
-        if (pos == NULL) {
-            break;
-        } else {
-            pos[0] = '\0';
-        }
-        printf("%d: %s\n", be_id, msg);
-        msg = pos + 1;
-    }
-    
-    num_resp++;
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    sci_filter_info_t filter_info;
-
-    char msg[256];
-    char *s;
-    int i, rc, num_bes, sizes[1];
-    void *bufs[1];
-
-    sci_group_t odd_group, even_group;
-    int odd_size, even_size;
-    int *odd_list = NULL, *even_list = NULL;
-
-    char pwd[256];
-    char hfile[256], bpath[256], fpath[256];
-
-    getcwd(pwd, 256);
-    sprintf(hfile, "%s/host.list", pwd);
-#ifdef __64BIT__
-    sprintf(bpath, "%s/dsh_be64", pwd);
-#else
-    sprintf(bpath, "%s/dsh_be", pwd);
-#endif
-
-    bzero(&info, sizeof(info));
-    info.type = SCI_FRONT_END;
-    info.fe_info.mode = SCI_POLLING;
-    info.fe_info.hostfile = hfile;
-    info.fe_info.bepath = bpath;
-    info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.fe_info.param = NULL;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    
-    rc = SCI_Query(NUM_BACKENDS, &num_bes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    //=============odd list===============
-    odd_size = (num_bes - num_bes%2) / 2;
-    odd_list = (int *)malloc(sizeof(int) * odd_size);
-    for (i=0; i<odd_size; i++) {
-        odd_list[i] = i*2 + 1;
-    }
-    rc = SCI_Group_create(odd_size, odd_list, &odd_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    int odd_list_benum;
-    rc = SCI_Group_query(odd_group, GROUP_MEMBER_NUM, &odd_list_benum);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    printf("The Be Num of odd list is: %d\r\n", odd_list_benum);
-    
-    int* oddlist_query_res = (int *)malloc(sizeof(int)*odd_list_benum);
-    rc = SCI_Group_query(odd_group, GROUP_MEMBER, oddlist_query_res);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-	
-    for(i=0; i<odd_list_benum; i++)
-    {
-        printf("the group member %d of oddlist_query_res is: %d\r\n", i, oddlist_query_res[i]);
-    }
-    //===============even list ============
-    even_size = (num_bes + num_bes%2) / 2;
-    even_list = (int *)malloc(sizeof(int) * even_size);
-    for (i=0; i<even_size; i++) {
-        even_list[i] = i*2;
-    }
-    rc = SCI_Group_create(even_size, even_list, &even_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    int even_list_benum;
-    rc = SCI_Group_query(even_group, GROUP_MEMBER_NUM, &even_list_benum);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    printf("The Be Num of even list is: %d\r\n", even_list_benum);
-
-    int* evenlist_query_res = (int *)malloc(sizeof(int)*even_list_benum);
-    rc = SCI_Group_query(even_group, GROUP_MEMBER, evenlist_query_res);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-	
-    for(i=0; i<even_list_benum; i++)
-    {
-        printf("the group member %d of evenlist_query_res is: %d\r\n", i, evenlist_query_res[i]);
-    }
-    //===============================
-    string cur_grp = "all";
-    int exp_resp = num_bes;
-    while (1) {
-        printf("(%s) ", cur_grp.c_str());
-        fflush(stdout);
-        memset(msg, 0 , sizeof(msg));
-        fgets(msg, sizeof(msg), stdin);
-        msg[strlen(msg) - 1] = '\0';
-
-        if (strcmp(msg, "help") == 0) {
-            printf("Commands:\n");
-            printf("\t\thelp -- show help topics\n");
-            printf("\t\tall -- send commands to all back ends\n");
-            printf("\t\teven -- send commands to back ends with even id\n");
-            printf("\t\todd -- send commands to back ends with odd id\n");
-            printf("\t\tquit -- exit this program\n");
-            continue;
-        } else if (strcmp(msg, "all") == 0) {
-            cur_grp = "all";
-            exp_resp = num_bes;
-            continue;
-        } else if (strcmp(msg, "odd") == 0) {
-            cur_grp = "odd";
-            exp_resp = odd_size;
-            continue;
-        } else if (strcmp(msg, "even") == 0) {
-            cur_grp = "even";
-            exp_resp = even_size;
-            continue;
-        } else if (strcmp(msg, "quit") == 0) {
-            break;
-        }
-        
-        num_resp = 0;
-        
-        bufs[0] = msg;
-        sizes[0] = strlen(msg) + 1;
-        if (cur_grp == "all") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        } else if (cur_grp == "odd") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, odd_group, 1, bufs, sizes);
-        } else if (cur_grp == "even") {
-            rc = SCI_Bcast(SCI_FILTER_NULL, even_group, 1, bufs, sizes);
-        } else {
-            assert(!"Unknown group");
-        }
-        if (rc != SCI_SUCCESS) {
-            exit(1);
-        }
-
-        do {
-            rc = SCI_Poll(-1);
-            if (num_resp >= exp_resp) {
-                break;
-            }
-        } while (rc == SCI_SUCCESS);
-    }
-
-    rc = SCI_Group_free(odd_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    rc = SCI_Group_free(even_group);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    free(odd_list);
-    free(even_list);
-    free(oddlist_query_res);
-    free(evenlist_query_res);
-    
-    rc = SCI_Terminate();
-    return rc;
-}
-
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/sdsh_fe.cpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/sdsh_fe.cpp
deleted file mode 100644
index 7b2f2f4..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_2/sdsh_fe.cpp
+++ /dev/null
@@ -1,133 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/06/08 nieyy        Initial code (D153875)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <strings.h>
-#include <unistd.h>
-#include "sci.h"
-
-int num_resp;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int be_id = ((int *) buffer)[0];
-    char *msg = (char *)((char *) buffer + sizeof(int));
-    char *pos = NULL;
-
-    while (1) {
-        pos = strstr(msg, "\n");
-        if (pos == NULL) {
-            break;
-        } else {
-            pos[0] = '\0';
-        }
-        printf("%d: %s\n", be_id, msg);
-        msg = pos + 1;
-    }
-    
-    num_resp++;
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    sci_filter_info_t filter_info;
-
-    char msg[256];
-    char *s;
-    int i, rc, num_bes, job_key, sizes[1];
-    int pollfd;
-    void *bufs[1];
-
-    char pwd[256];
-    char hfile[256], bpath[256], fpath[256];
-
-    fd_set  fdSet;
-    
-    getcwd(pwd, 256);
-    sprintf(hfile, "%s/host.list", pwd);
-#ifdef __64BIT__
-    sprintf(bpath, "%s/dsh_be64", pwd);
-#else
-    sprintf(bpath, "%s/dsh_be", pwd);
-#endif
-
-    bzero(&info, sizeof(info));
-    info.type = SCI_FRONT_END;
-    info.fe_info.mode = SCI_POLLING;
-    info.fe_info.hostfile = hfile;
-    info.fe_info.bepath = bpath;
-    info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.fe_info.param = NULL;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    rc = SCI_Query(NUM_BACKENDS, &num_bes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    rc = SCI_Query(POLLING_FD, &pollfd);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    
-    FD_ZERO(&fdSet);
-    FD_SET(pollfd, &fdSet);
-
-    while (1) {
-        printf(">>> ");
-        fflush(stdout);
-        memset(msg, 0 , sizeof(msg));
-        fgets(msg, sizeof(msg), stdin);
-        msg[strlen(msg) - 1] = '\0';
-
-        if (0 == strcmp(msg, "quit"))
-            break;
-        
-        num_resp = 0;
-        
-        bufs[0] = msg;
-        sizes[0] = strlen(msg) + 1;
-        rc = SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 1, bufs, sizes);
-        if (rc != SCI_SUCCESS) {
-            exit(1);
-        }
-        
-        do {
-            int rc = ::select(pollfd+1, &fdSet, 0, 0, NULL);
-            if (rc > 0) {
-                SCI_Poll(-1);
-            }
-        } while (num_resp < num_bes);
-    }
-    
-    rc = SCI_Terminate();
-    
-    return rc;
-}
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/Makefile b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/Makefile
deleted file mode 100644
index 49c466e..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/Makefile
+++ /dev/null
@@ -1,43 +0,0 @@
-CC = g++
-
-CPPFLAGS = 
-
-OTHER_FLAGS = -ldl -lpthread -lsci
-
-all: all_32 all_64
-
-all_32: dsh_fe dsh_be dsh_filter.so dsh_tests
-
-all_64: dsh_fe64 dsh_be64 dsh_filter64.so dsh_tests64
-
-dsh_fe: dsh_fe.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -m32 $(CPPFLAGS) -o $@ dsh_fe.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-dsh_be: dsh_be.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -m32 $(CPPFLAGS) -o $@ dsh_be.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-dsh_filter.so: dsh_filter.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -m32 $(CPPFLAGS) -fpic -shared -o $@ dsh_filter.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-dsh_tests: dsh_tests.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -m32 $(CPPFLAGS) -o $@ dsh_tests.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-dsh_fe64: dsh_fe.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -m64 -D__64BIT__ $(CPPFLAGS) -o $@ dsh_fe.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-dsh_be64: dsh_be.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -m64 -D__64BIT__ $(CPPFLAGS) -o $@ dsh_be.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-dsh_filter64.so: dsh_filter.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -m64 -D__64BIT__ $(CPPFLAGS) -fpic -shared -o $@ dsh_filter.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-dsh_tests64: dsh_tests.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -m64 -D__64BIT__ $(CPPFLAGS) -o $@ dsh_tests.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-clean: clean_32 clean_64
-
-clean_32:
-	@rm -f *.o dsh_fe dsh_be dsh_filter.so dsh_tests
-
-clean_64:
-	@rm -f *.o dsh_fe64 dsh_be64 dsh_filter64.so dsh_tests64
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/Makefile.aix b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/Makefile.aix
deleted file mode 100644
index 953ca23..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/Makefile.aix
+++ /dev/null
@@ -1,43 +0,0 @@
-CC = xlC_r
-
-CPPFLAGS =
-
-OTHER_FLAGS = -ldl -lpthread -lsci_r
-
-all: all_32 all_64
-
-all_32: dsh_fe dsh_be dsh_filter.so dsh_tests
-
-all_64: dsh_fe64 dsh_be64 dsh_filter64.so dsh_tests64
-
-dsh_fe: dsh_fe.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ dsh_fe.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-dsh_be: dsh_be.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ dsh_be.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-dsh_filter.so: dsh_filter.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -q32 $(CPPFLAGS) -qmkshrobj -o $@ dsh_filter.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-dsh_tests: dsh_tests.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -q32 $(CPPFLAGS) -o $@ dsh_tests.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-dsh_fe64: dsh_fe.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ dsh_fe.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-dsh_be64: dsh_be.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ dsh_be.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-dsh_filter64.so: dsh_filter.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -q64 $(CPPFLAGS) -qmkshrobj -o $@ dsh_filter.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-dsh_tests64: dsh_tests.cpp levenshtein.cpp dsh_packer.cpp dsh_header.hpp dsh_aggregator.hpp
-	$(CC) -g -q64 $(CPPFLAGS) -o $@ dsh_tests.cpp levenshtein.cpp dsh_packer.cpp $(OTHER_FLAGS)
-
-clean: clean_32 clean_64
-
-clean_32:
-	@rm -f *.o dsh_fe dsh_be dsh_filter.so dsh_tests
-
-clean_64:
-	@rm -f *.o dsh_fe64 dsh_be64 dsh_filter64.so dsh_tests64
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/buildit b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/buildit
deleted file mode 100755
index d92b14d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/buildit
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/sh -x
-
-OS_TYPE=$(uname)
-if [[ ${OS_TYPE} = "AIX" ]]
-then
-    make -f Makefile.aix clean
-    make -f Makefile.aix all
-else
-    CURR_CHIP=$(arch)
-    if [[ ${CURR_CHIP} == 'ppc64' ]]
-    then
-        make clean
-        make all
-    else
-        if [[ ${CURR_CHIP} == 'i386' || ${CURR_CHIP} == 'i686' ]]
-        then
-            make clean_32
-            make all_32
-        else
-            if [[ ${CURR_CHIP} == 'x86_64' ]]
-            then
-                make all
-            fi
-        fi
-    fi
-fi
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_aggregator.hpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_aggregator.hpp
deleted file mode 100644
index a3bbbd8..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_aggregator.hpp
+++ /dev/null
@@ -1,227 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: DshAggregator
-
- Description: Aggregation functions.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/29/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#ifndef _DSHAGGREGATOR_HPP
-#define _DSHAGGREGATOR_HPP
-
-#include <stdio.h>
-#include <assert.h>
-
-#include "dsh_header.hpp"
-#include "levenshtein.hpp"
-
-#include <string>
-#include <vector>
-#include <algorithm>
-
-using namespace std;
-
-class DshAggregator
-{
-    private:
-        vector<DshMessage*> messages;
-        
-    public:        
-        void addMsg(DshMessage *msg) {
-            assert(msg);
-
-            messages.push_back(msg);
-        }
-
-        void deleteAll() {
-            messages.clear();
-        }
-
-        void freeMemory(bool incStr = false) {
-            for (int i=0; i<messages.size(); i++) {
-                if (messages[i]) {
-                    messages[i]->freeMemory(incStr);
-                }
-            }
-            deleteAll();
-        }
-
-        DshMessage * getAggregatedMsg() {
-            if (messages.size() == 0)
-                return NULL;
-
-            DshMessage *msg = new DshMessage(messages[0]->getSeqNo());
-            for (int i=0; i<messages.size(); i++) {
-                aggregateMsg(msg, messages[i]);
-            }
-
-            calcMsgState(msg);
-
-            return msg;
-        }
-
-        int numOfBEs() {
-            int num = 0;
-            for (int i=0; i<messages.size(); i++) {
-                num += messages[i]->getMaxLineSize();
-            }
-            return num;
-        }
-
-    private:
-        void aggregateMsg(DshMessage *base_msg, DshMessage *new_msg) {
-            assert((base_msg!=NULL) && (new_msg!=NULL));
-            assert(base_msg->getSeqNo() == new_msg->getSeqNo());
-
-            int newly = 0, base = 0;
-            while ((base < base_msg->getSize()) && (newly < new_msg->getSize())) {
-                DshLine *base_line = base_msg->getLine(base);
-                DshLine *new_line = new_msg->getLine(newly);
-
-                if (base_line->getLineNo() < new_line->getLineNo()) {
-                    base++;
-                    continue;
-                }
-
-                if (base_line->getLineNo() > new_line->getLineNo()) {
-                    base_msg->addLine(new_line);
-                    base++;
-                } else {
-                    int pos = base;
-                    bool exists = false;
-                    while (base_msg->getLine(pos)->getLineNo() == base_line->getLineNo()) {
-                        if (isEqual(base_msg->getLine(pos)->getLine(), new_line->getLine())) {
-                            for (int i=0; i<new_line->getSize(); i++) {
-                                base_msg->getLine(pos)->addBE(new_line->getBE(i));
-                            }
-                            exists = true;
-                            break;
-                        }
-                        pos++;
-                        if (pos >= base_msg->getSize())
-                            break;
-                    }
-                    if (!exists) {
-                        base_msg->addLine(new_line);
-                        if ((*new_line) < (*base_line)) {
-                            base++;
-                        }
-                    }
-                }
-                newly++;
-            }
-
-            for (int i=newly; i<new_msg->getSize(); i++) {
-                base_msg->addLine(new_msg->getLine(i));
-            }
-        }
-
-        void calcMsgState(DshMessage *msg) {
-            int start = 0, base_pos, num_equal;
-
-            while (start < msg->getSize()) {
-                base_pos = findBasePos(msg, start, &num_equal);
-
-                bool hasSimilar = false;
-                bool hasDiff = false;
-                for (int i=start; i<start+num_equal; i++) {
-                    if (i == base_pos)
-                        continue;
-                    
-                    int state = compare(msg->getLine(base_pos)->getLine(), msg->getLine(i)->getLine());
-                    if (state == EQUAL_STATE) {
-                        printf("\n");
-                        msg->print();
-                        assert(!"Should not be equal state");
-                    } else if (state == SIMILAR_STATE) {
-                        hasSimilar = true;
-                        msg->getLine(i)->setState(SIMILAR_STATE);
-                    } else {
-                        hasDiff = true;
-                        msg->getLine(i)->setState(DIFFERENT_STATE);
-                    }
-                }
-                if (hasSimilar && (base_pos == start)) {
-                    if (msg->getLine(base_pos)->getSize() == 1)
-                        msg->getLine(base_pos)->setState(SIMILAR_STATE);
-                } else if (hasDiff && (base_pos == start)) {
-                    if (msg->getLine(base_pos)->getSize() == 1)
-                        msg->getLine(base_pos)->setState(DIFFERENT_STATE);
-                }
-                
-                start += num_equal;
-            }
-        }
-
-        int findBasePos(DshMessage *msg, int start, int *num_equal) {
-            assert(msg);
-            assert(start < msg->getSize());
-
-            int pos = start, maxPos = start;
-            int maxBEs = 0;
-            *num_equal = 0;
-            while (msg->getLine(pos)->getLineNo() == msg->getLine(start)->getLineNo()) {
-                if (maxBEs < msg->getLine(pos)->getSize()) {
-                    maxBEs = msg->getLine(pos)->getSize();
-                    maxPos = pos;
-                }
-                *num_equal = *num_equal + 1;
-                pos++;
-                if (pos >= msg->getSize())
-                    break;
-            }
-
-            return maxPos;
-        }
-        
-        int compare(char *str1, char *str2) {
-            assert(str1 && str2);
-
-            string string1(str1);
-            string string2(str2);
-
-            int cost = Levenshtein::Distance(string1, string2);
-            if (cost == 0)
-                return EQUAL_STATE;
-            else if (cost * 5 < max(string1.length(), string2.length()))
-                return SIMILAR_STATE;
-            else
-                return DIFFERENT_STATE;
-        }
-
-        int isEqual(char *str1, char *str2) {
-            assert(str1 && str2);
-
-            string string1(str1);
-            string string2(str2);
-
-            if (string1 == string2)
-                return 1;
-            else {
-                if (compare(str1, str2) == EQUAL_STATE)
-                    return 1;
-                else
-                    return 0;
-            }
-        }
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_be.cpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_be.cpp
deleted file mode 100644
index 4d90a07..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_be.cpp
+++ /dev/null
@@ -1,89 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Back End.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/29/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <strings.h>
-#include <unistd.h>
-#include "sci.h"
-
-#include "dsh_header.hpp"
-
-#define DSH_FILTER 1
-#define RST_SIZE 4096
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int seq_no = ((int *) buffer)[0];
-    char *cmd = (char *)((char *) buffer + sizeof(int));
-
-    int my_id;
-    int rc = SCI_Query(BACKEND_ID, &my_id);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    char result[RST_SIZE] = {0};
-    FILE *fp = popen((const char *)cmd, "r");
-    memset(result, 0, RST_SIZE);
-    int bytes = fread(result, sizeof(char), RST_SIZE, fp);
-    pclose(fp);
-
-    DshMessage msg;
-    msg.readFromString(result, my_id);
-    msg.setSeqNo(seq_no);
-
-    int sizes[1];
-    void *bufs[1];
-    bufs[0] = msg.pack(&sizes[0]);
-
-    rc = SCI_Upload(DSH_FILTER, group, 1, bufs, sizes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    for (int i=0; i<msg.getSize(); i++)
-        delete msg.getLine(i)->getLine();
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    int rc;
-
-    bzero(&info, sizeof(info));
-    info.type = SCI_BACK_END;
-    info.be_info.hndlr = (SCI_msg_hndlr *)&handler;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    rc = SCI_Terminate();
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_fe.cpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_fe.cpp
deleted file mode 100644
index 4ff6c2a..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_fe.cpp
+++ /dev/null
@@ -1,142 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Front End.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/29/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <strings.h>
-#include <unistd.h>
-#include "sci.h"
-
-#include "dsh_header.hpp"
-
-#define DSH_FILTER 1
-
-bool finished;
-bool expand;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    DshMessage msg;
-    msg.unpack(buffer);
-
-    msg.print(expand);
-    
-    finished = true;
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    sci_filter_info_t filter_info;
-
-    char msg[256];
-    char *s;
-    int i, rc, num_bes, seq, sizes[2];
-    void *bufs[2];
-
-    char pwd[256];
-    char hfile[256], bpath[256], apath[256], fpath[256];
-
-    getcwd(pwd, 256);
-    sprintf(hfile, "%s/host.list", pwd);
-#ifdef __64BIT__
-    sprintf(bpath, "%s/dsh_be64", pwd);
-#else
-    sprintf(bpath, "%s/dsh_be", pwd);
-#endif
-
-    bzero(&info, sizeof(info));
-    info.type = SCI_FRONT_END;
-    info.fe_info.hostfile = hfile;
-    info.fe_info.bepath = bpath;
-    info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    
-    rc = SCI_Query(NUM_BACKENDS, &num_bes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-#ifdef __64BIT__
-    sprintf(fpath, "%s/dsh_filter64.so", pwd);
-#else
-    sprintf(fpath, "%s/dsh_filter.so", pwd);
-#endif
-    bzero(&filter_info, sizeof(filter_info));
-    filter_info.filter_id = DSH_FILTER;
-    filter_info.so_file = fpath;
-    rc = SCI_Filter_load(&filter_info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    expand = false;
-
-    seq = 0;
-    while (1) {
-        printf("(all) ");
-        fflush(stdout);
-        memset(msg, 0 , sizeof(msg));
-        fgets(msg, sizeof(msg), stdin);
-        msg[strlen(msg) - 1] = '\0';
-
-        if (strcmp(msg, "quit") == 0)
-            break;
-        else if (strcmp(msg, "expand") == 0) {
-            expand = !expand;
-            if (expand)
-                printf("Expand the output.\n");
-            else
-                printf("Do not expand the output.\n");
-            continue;
-        }
-        
-        finished = false;
-
-        bufs[0] = &seq;
-        sizes[0] = sizeof(seq);
-        bufs[1] = msg;
-        sizes[1] = strlen(msg) + 1;
-        rc = SCI_Bcast(SCI_FILTER_NULL, SCI_GROUP_ALL, 2, bufs, sizes);
-        if (rc != SCI_SUCCESS) {
-            exit(1);
-        }
-        seq++;
-       
-        while (!finished) {
-            usleep(500);
-        } 
-    }
-    
-    rc = SCI_Terminate();
-    
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_filter.cpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_filter.cpp
deleted file mode 100644
index 075d307..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_filter.cpp
+++ /dev/null
@@ -1,145 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Filter.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/29/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#include "sci.h"
-#include "dsh_header.hpp"
-#include "dsh_aggregator.hpp"
-
-#include <vector>
-#include <map>
-
-using namespace std;
-
-// typedefs
-typedef map<int, DshAggregator *> DSHAGGRAGATOR_MAP;
-typedef vector<void *> MEM_VEC;
-typedef map<int, MEM_VEC> MEM_VEC_MAP;
-
-// global structures
-DSHAGGRAGATOR_MAP gDshAggregatorMap;
-MEM_VEC_MAP gMemoryMap;
-
-extern "C" {
-
-int filter_initialize(void **user_param);
-int filter_terminate(void *user_param);
-int filter_input(void *user_param, sci_group_t group, void *buf, int size);
-
-} /* extern "C" */
-
-bool isDataAvailable(int seq_no);
-void removeData(int seq_no);
-int outputData(sci_group_t group, DshMessage *msg);
-
-int filter_initialize(void **user_param)
-{
-    gDshAggregatorMap.clear();
-    gMemoryMap.clear();
-    
-    return SCI_SUCCESS;
-}
-
-int filter_terminate(void *user_param)
-{
-    for (int i=0; i<gDshAggregatorMap.size(); i++) {
-        gDshAggregatorMap[i]->freeMemory();
-    }
-    gDshAggregatorMap.clear();
-    gMemoryMap.clear();
-    
-    return SCI_SUCCESS;
-}
-
-int filter_input(void *user_param, sci_group_t group, void *buf, int size)
-{
-    int rc = SCI_SUCCESS;
-
-    DshMessage *msg = new DshMessage();
-    assert(msg);
-
-    void *new_buf = malloc(size);
-    memcpy(new_buf, buf, size);
-    gMemoryMap[msg->getSeqNo()].push_back(new_buf);
-    
-    msg->unpack(new_buf);
-    if (gDshAggregatorMap.find(msg->getSeqNo()) == gDshAggregatorMap.end()) {
-        gDshAggregatorMap[msg->getSeqNo()] = new DshAggregator();
-    }
-    gDshAggregatorMap[msg->getSeqNo()]->addMsg(msg);
-
-    if (isDataAvailable(msg->getSeqNo())) {
-        DshMessage *new_msg = gDshAggregatorMap[msg->getSeqNo()]->getAggregatedMsg();
-        rc = outputData(group, new_msg);
-        removeData(msg->getSeqNo());
-        delete new_msg;
-    }
-
-    return rc;
-}
-
-// functions
-bool isDataAvailable(int seq_no)
-{
-    assert(gDshAggregatorMap.find(seq_no) != gDshAggregatorMap.end());
-    
-    int rc, ret_val;
-    rc = SCI_Group_query(SCI_GROUP_ALL, GROUP_MEMBER_NUM, &ret_val);
-    if (rc != SCI_SUCCESS) {
-        assert(!"SCI_Query_info_ext did not work!");
-    }
-
-    if (ret_val <= gDshAggregatorMap[seq_no]->numOfBEs())
-        return true;
-
-    return false;
-}
-
-void removeData(int seq_no)
-{
-    assert(gDshAggregatorMap.find(seq_no) != gDshAggregatorMap.end());
-    
-    gDshAggregatorMap[seq_no]->freeMemory();
-    delete gDshAggregatorMap[seq_no];
-    gDshAggregatorMap.erase(seq_no);
-
-    for (int i=0; i<gMemoryMap[seq_no].size(); i++) {
-        free(gMemoryMap[seq_no][i]);
-    }
-    gMemoryMap.erase(seq_no);
-}
-
-int outputData(sci_group_t group, DshMessage *msg)
-{
-    assert(msg);
-
-    void *bufs[1];
-    int rc, sizes[1];
-
-    bufs[0] = msg->pack(&sizes[0]);
-    rc = SCI_Filter_upload(SCI_FILTER_NULL, group, 1, bufs, sizes);
-    
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_header.hpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_header.hpp
deleted file mode 100644
index cb76f4a..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_header.hpp
+++ /dev/null
@@ -1,439 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: DshLine, DshMessage
-
- Description: Common definitions.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/29/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#ifndef _DSHHEADER_HPP
-#define _DSHHEADER_HPP
-
-#include <stdio.h>
-#include <assert.h>
-
-#include "dsh_packer.hpp"
-
-#include <vector>
-#include <algorithm>
-
-using namespace std;
-
-const int EQUAL_STATE  = 0;
-const int SIMILAR_STATE = 1;
-const int DIFFERENT_STATE = 2;
-
-const char *EQUAL_COLOR = "\x1b[1;32m"; // green
-const char *SIMILAR_COLOR = "\x1b[2;32m"; // dark green
-const char *DIFFERENT_COLOR = "\x1b[1;31m"; // red
-const char *END_COLOR = "\x1b[00m"; // end sign
-
-class DshLine 
-{
-    private:
-        vector<int>     be_ids;
-        int             state;
-        int             min_id;
-        int             max_id;
-        int             line_no;
-        char            *line;
-
-    public:
-        DshLine(int st = EQUAL_STATE) {
-            be_ids.clear();
-            line_no = 0;
-            line = NULL;
-            state = st;
-            min_id = max_id = 0;
-        }
-
-        void addBE(int be_id) {
-            if (find(be_ids.begin(), be_ids.end(), be_id) == be_ids.end()) {
-                be_ids.push_back(be_id);
-                sort(be_ids.begin(), be_ids.end());
-                if (be_id > max_id)
-                    max_id = be_id;
-                else if (be_id < min_id)
-                    min_id = be_id;
-            }
-        }
-
-        void deleteAll() {
-            be_ids.clear();
-        }
-        
-        void print() {
-            int first, last;
-
-            if (state == EQUAL_STATE)
-                printf("%s", EQUAL_COLOR);
-            else if (state == SIMILAR_STATE)
-                printf("%s", SIMILAR_COLOR);
-            else if (state == DIFFERENT_STATE)
-                printf("%s", DIFFERENT_COLOR);
-            else
-                assert(!"Undefined message state");
-            
-            first = last = 0;
-            for (int i=0; i<be_ids.size(); i++) {
-                if (be_ids[i] == be_ids[first] + (i - first)) {
-                    last = i;
-                } else {
-                    if (first == last)
-                        printf("%d ", be_ids[first]);
-                    else
-                        printf("%d:%d ", be_ids[first], be_ids[last]);
-                    first = last = i;
-                }
-            }
-            if (first == last)
-                printf("%d ", be_ids[first]);
-            else
-                printf("%d:%d ", be_ids[first], be_ids[last]);
-            printf("| %s%s\n", line, END_COLOR);
-        }
-
-        void print(int be_id) {
-            if (find(be_ids.begin(), be_ids.end(), be_id) == be_ids.end())
-                return;
-
-            if (state == EQUAL_STATE)
-                printf("%s", EQUAL_COLOR);
-            else if (state == SIMILAR_STATE)
-                printf("%s", SIMILAR_COLOR);
-            else if (state == DIFFERENT_STATE)
-                printf("%s", DIFFERENT_COLOR);
-            else
-                assert(!"Undefined message state");
-
-            printf("%d | %s%s\n", be_id, line, END_COLOR);
-        }
-        
-        void setState(int st) {
-            state = st;
-        }
-        
-        int getState() {
-            return state;
-        }
-
-        void setLineNo(int no) {
-            line_no = no;
-        }
-
-        int getLineNo() {
-            return line_no;
-        }
-
-        void setLine(char *str) {
-            line = str;
-        }
-
-        char * getLine() {
-            return line;
-        }
-
-        int getBE(int index) {
-            assert(index>=0 || index<getSize());
-
-            return be_ids[index];
-        }
-        
-        int getSize() {
-            return be_ids.size();
-        }
-
-        int getMinBEId() {
-            return min_id;
-        }
-
-        int getMaxBEId() {
-            return max_id;
-        }
-
-        bool  operator > (DshLine &dl) {
-            assert((be_ids.size()>0) && (dl.be_ids.size()>0));
-            
-            if (line_no > dl.line_no)
-                return true;
-
-            if (line_no < dl.line_no)
-                return false;
-
-            if (be_ids[be_ids.size()-1] <= dl.be_ids[dl.be_ids.size()-1])
-                return false;
-
-            return true;
-        }
-
-        bool  operator < (DshLine &dl) {
-            assert((be_ids.size()>0) && (dl.be_ids.size()>0));
-            
-            if (line_no < dl.line_no)
-                return true;
-
-            if (line_no > dl.line_no)
-                return false;
-
-            if (be_ids[0] >= dl.be_ids[0])
-                return false;
-
-            return true;
-        }
-
-        bool  operator == (DshLine &dl) {
-            assert((be_ids.size()>0) && (dl.be_ids.size()>0));
-            
-            if (line_no != dl.line_no)
-                return false;
-
-            if (be_ids.size() != dl.be_ids.size())
-                return false;
-
-            for (int i=0; i<be_ids.size(); i++) {
-                if (be_ids[i] != dl.be_ids[i])
-                    return false;
-            }
-
-            return true;
-        }
-};
-
-class DshMessage 
-{
-    private:
-        int                seq_no;
-        vector<DshLine*>   lines;
-        int                max_id;
-        int                min_id;
-
-    public:
-        DshMessage(int seq = 0) {
-            seq_no = seq;
-            lines.clear();
-            max_id = min_id = 0;
-        }
-
-        DshMessage & readFromString(const char *str, int be_id = 0) {
-            char *from = (char *) str, *to = NULL;
-
-            lines.clear();
-            int line_no = 0;
-            while (1) {
-                to = strstr(from, "\n");
-                if (to == NULL) {
-                    if (strlen(from) > 0) {
-                        int len = strlen(from);
-                        char *text = new char[len + 1];
-                        strncpy(text, from, len);
-                        text[len] = '\0';
-                        chomp(text);
-
-                        DshLine *line = new DshLine();
-                        line->setLineNo(line_no++);
-                        line->setLine(text);
-                        line->addBE(be_id);
-                        lines.push_back(line);
-                    }
-                    break;
-                } else {
-                    int len = strlen(from) - strlen(to);
-                    char *text = new char[len + 1];
-                    strncpy(text, from, len);
-                    text[len] = '\0';
-                    chomp(text);
-
-                    DshLine *line = new DshLine();
-                    line->setLineNo(line_no++);
-                    line->setLine(text);
-                    line->addBE(be_id);
-                    lines.push_back(line);
-                }
-                from = to + 1;
-            }
-
-            max_id = min_id = be_id;
-            
-            return *this;
-        }
-
-        void addLine(DshLine *line) {
-            assert(line);
-
-            if (line->getMaxBEId() > max_id)
-                max_id = line->getMaxBEId();
-            else if (line->getMinBEId() < min_id)
-                min_id = line->getMinBEId();
-
-            vector<DshLine*>::iterator it = lines.begin();
-            for (; it!=lines.end(); ++it) {
-                DshLine *tmp = (*it);
-                if ((*line) < (*tmp)) {
-                    lines.insert(it, line);
-                    return;
-                }
-            }
-            
-            lines.push_back(line);
-        }
-        
-        void freeMemory(bool incStr = false) {
-            for (int i=0; i<lines.size(); i++) {
-                if (lines[i]) {
-                    if (incStr)
-                        delete [] lines[i]->getLine();
-                    delete lines[i];
-                }
-            }
-            deleteAll();
-        }
-
-        void deleteAll() {
-            lines.clear();
-        }
-
-        DshLine * getLine(int index) {
-            assert(index>=0 && index<lines.size());
-            if (lines.size() == 0)
-                return NULL;
-
-            return lines[index];
-        }
-
-        void print(bool expand = false) {
-            if (!expand) {
-                for (int i=0; i<lines.size(); i++) {
-                    lines[i]->print();
-                }
-            } else {
-                for (int i=min_id; i<=max_id; i++) {
-                    for (int j=0; j<lines.size(); j++) {
-                        lines[j]->print(i);
-                    }
-                }
-            }
-        }
-
-        void setSeqNo(int seq) {
-            seq_no = seq;
-        }
-
-        int getSeqNo() {
-            return seq_no;
-        }
-
-        void setLineState(int index, int state) {
-            assert(index>=0 || index<lines.size());
-            assert((state==EQUAL_STATE) || (state==SIMILAR_STATE) || (state==DIFFERENT_STATE));
-
-            lines[index]->setState(state);
-        }
-
-        int getLineState(int index) {
-            assert(index>=0 || index<lines.size());
-
-            return lines[index]->getState();
-        }
-
-        int getLineNo(int index) {
-            assert(index>=0 || index<lines.size());
-
-            return lines[index]->getLineNo();
-        }
-
-        int getSize() {
-            return lines.size();
-        }
-
-        int getMaxLineSize() {
-            int size = 1;
-            for (int i=0; i<lines.size(); i++) {
-                if (lines[i]->getSize() > size)
-                    size = lines[i]->getSize();
-            }
-
-            return size;
-        }
-
-        int getMaxBEId() {
-            return max_id;
-        }
-
-        int getMinBEId() {
-            return min_id;
-        }
-
-        void * pack(int *size = NULL) {
-            DshPacker packer;
-            int line_size;
-
-            packer.packInt(seq_no);
-            packer.packInt(lines.size());
-            for (int i=0; i<lines.size(); i++) {
-                packer.packInt(lines[i]->getSize());
-                for (int j=0; j<lines[i]->getSize(); j++)
-                    packer.packInt(lines[i]->getBE(j));
-                packer.packInt(lines[i]->getState());
-                packer.packInt(lines[i]->getLineNo());
-                packer.packStr(lines[i]->getLine());
-            }
-
-            if (size)
-                *size = packer.getPackedMsgLen();
-            return packer.getPackedMsg();
-        }
-    
-        DshMessage & unpack(void *buf) {
-            DshPacker packer;
-            packer.setPackedMsg((char *)buf);
-        
-            seq_no = packer.unpackInt();
-            int num_lines = packer.unpackInt();
-            for (int i=0; i<num_lines; i++) {
-                DshLine *li = new DshLine();
-
-                int num_bes = packer.unpackInt();
-                for (int j=0; j<num_bes; j++)
-                    li->addBE(packer.unpackInt());
-                li->setState(packer.unpackInt());
-                li->setLineNo(packer.unpackInt());
-                li->setLine(packer.unpackStr());
-        
-                addLine(li);
-            }
-
-            return *this;
-        }
-
-    private:
-        void chomp(char* str) {
-            int end = strlen(str);
-            while (end >= 0) {
-                if ((str[end]==' ') || (str[end]=='\t'))
-                    str[end] = '\0';
-                else
-                    break;
-                end--;
-            }
-        }
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_packer.cpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_packer.cpp
deleted file mode 100644
index 4d4a7bf..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_packer.cpp
+++ /dev/null
@@ -1,103 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: DshPacker
-
- Description: Wrapper for various kind of information.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/29/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#include "dsh_packer.hpp"
-#include <stdlib.h>
-#include <arpa/inet.h>
-#include <string.h>
-
-DshPacker::DshPacker()
-{
-    msgBuf = (char *)malloc(1);
-    msgPtr = msgBuf;
-    msgLen = 0;
-}
-
-char* DshPacker::getPackedMsg()
-{
-    return msgBuf;
-}
-
-int DshPacker::getPackedMsgLen()
-{
-    return msgLen;
-}
-
-void DshPacker::packInt(int value)
-{
-    int size = htonl(value);
-
-    int oldLen = msgLen;
-    msgLen += sizeof(size);
-    msgBuf = (char *)realloc(msgBuf, msgLen);
-    msgPtr = msgBuf + oldLen;
-
-    memcpy(msgPtr, &size, sizeof(size));
-    msgPtr += sizeof(size);
-}
-
-void DshPacker::packStr(char *value)
-{
-    int len = strlen(value) + 1;
-    packInt(len);
-
-    int oldLen = msgLen;
-    msgLen += len;
-    msgBuf = (char *)realloc(msgBuf, msgLen);
-    msgPtr = msgBuf + oldLen;
-
-    memcpy(msgPtr, value, len);
-    msgPtr += len;
-}
-
-void DshPacker::setPackedMsg(char * msg)
-{
-    msgBuf = msg;
-    msgPtr = msgBuf;
-}
-
-int DshPacker::unpackInt()
-{
-    int size, value;
-    memcpy(&size, msgPtr, sizeof(size));
-
-    value = ntohl(size);
-    msgPtr += sizeof(size);
-
-    return value;
-}
-
-char* DshPacker::unpackStr()
-{
-    int len;
-    char *value;
-
-    len = unpackInt();
-    value = msgPtr;
-    msgPtr += len;
-
-    return value;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_packer.hpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_packer.hpp
deleted file mode 100644
index 2ffe930..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_packer.hpp
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: DshPacker
-
- Description: Wrapper for various kind of information.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/29/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#ifndef _DSHPACKER_HPP
-#define _DSHPACKER_HPP
-
-#include <vector>
-#include <map>
-#include <string>
-
-using namespace std;
-
-class DshPacker {
-    private:
-        char *msgBuf;
-        char *msgPtr;
-        int     msgLen;
-        
-    public:
-        DshPacker();
-
-        // for message packing usage
-        void packInt(int value);
-        void packStr(char *value);
-        char* getPackedMsg();
-        int getPackedMsgLen();
-
-        // for message unpacking usage
-        void setPackedMsg(char *msg);
-        int unpackInt();
-        char *unpackStr();
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_tests.cpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_tests.cpp
deleted file mode 100644
index 4cc4ca5..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/dsh_tests.cpp
+++ /dev/null
@@ -1,357 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Unit tests.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/29/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#include <string.h>
-
-#include "levenshtein.hpp"
-#include "dsh_header.hpp"
-#include "dsh_aggregator.hpp"
-
-#include <string>
-
-using namespace std;
-
-void Levenshtein_Test()
-{
-    string str1 = "This is a test";
-    string str2 = "This is a test";
-
-    int cost = Levenshtein::Distance(str1, str2);
-    printf("Distance of [%s] and [%s] is %d\n", str1.c_str(), str2.c_str(), cost);
-    if (cost == 0)
-        printf("Passed\n");
-    else
-        printf("Failed\n");
-
-    str1 = "This is a test";
-    str2 = "This is a test!";
-    cost = Levenshtein::Distance(str1, str2);
-    printf("Distance of [%s] and [%s] is %d\n", str1.c_str(), str2.c_str(), cost);
-    if (cost == 1)
-        printf("Passed\n");
-    else
-        printf("Failed\n");
-
-    str1 = "-rwxr-xr-x 1 nicole nicole 1060380 2008-10-29 13:21 dsh_be";
-    str2 = "-rwxr-xr-x 1 nicole nicole 1234567 2008-10-29 13:21 dsh_be";
-    cost = Levenshtein::Distance(str1, str2);
-    printf("Distance of [%s] and [%s] is %d\n", str1.c_str(), str2.c_str(), cost);
-    if (cost == 6)
-        printf("Passed\n");
-    else
-        printf("Failed\n");
-}
-
-void DshLine_Test()
-{
-    DshLine line;
-    char *str = new char[256];
-    strcpy(str, "This is a test");
-    line.setLine(str);
-
-    line.addBE(0);
-    line.print();
-
-    line.addBE(1);
-    line.print();
-
-    for (int i=3; i<10; i++)
-        line.addBE(i);
-    line.print();
-
-    for (int i=5; i<20; i++)
-        line.addBE(i);
-    line.print();
-
-    line.addBE(30);
-    line.addBE(50);
-    line.addBE(70);
-    line.addBE(90);
-    line.print();
-
-    delete [] str;
-}
-
-void DshLine_Test_Ext()
-{
-    DshLine line1, line2;
-
-    line1.addBE(0);
-    line2.addBE(0);
-    if (line1 == line2)
-        printf("[%d] 0 = [%d] 0\n", line1.getLineNo(), line2.getLineNo());
-    else
-        printf("Failed\n");
-
-    line1.addBE(1);
-    if (line1 > line2)
-        printf("[%d] 0:1 > [%d] 0\n", line1.getLineNo(), line2.getLineNo());
-    else
-        printf("Failed\n");
-
-    line2.setLineNo(line1.getLineNo() + 1);
-    if (line1 < line2)
-        printf("[%d] 0:1 < [%d] 0\n", line1.getLineNo(), line2.getLineNo());
-    else
-        printf("Failed\n");
-}
-
-void DshMessage_Test()
-{
-    DshMessage msg;
-
-    for (int i=0; i<50; i++) {
-        DshLine *line = new DshLine();
-        if (i%2 == 0)
-            line->setLine("Mary is a women");
-        else
-            line->setLine("Robert is a man");
-
-        for (int j=i; j<i+5; j++)
-            line->addBE(j);
-
-        if (i%3 == 0)
-            line->setState(EQUAL_STATE);
-        else if (i%3 == 1)
-            line->setState(SIMILAR_STATE);
-        else
-            line->setState(DIFFERENT_STATE);
-
-        msg.addLine(line);
-    }
-
-    msg.print();
-    msg.freeMemory();
-}
-
-void DshMessage_Test_Ext()
-{
-    DshMessage msg;
-
-    for (int i=0; i<10; i++) {
-        DshLine *line = new DshLine();
-        line->addBE(i);
-        if (i%2 == 0)
-            line->setLine("I am Nicole Nie");
-        else
-            line->setLine("My wife is Awa Wang");
-        msg.addLine(line);
-    }
-    msg.print();
-    msg.freeMemory();
-    
-    for (int i=10; i>0; i--) {
-        DshLine *line = new DshLine();
-        line->addBE(0);
-        line->setLineNo(i);
-        if (i%2 == 0)
-            line->setLine("Nicole loves Awa");
-        else
-            line->setLine("Awa loves Nicole");
-        msg.addLine(line);
-    }
-    msg.print();
-    msg.freeMemory();
-}
-
-void DshMessage_Test_Pack()
-{
-    DshMessage msg1, msg2;
-
-    for (int i=0; i<10; i++) {
-        DshLine *line = new DshLine();
-        line->addBE(i);
-        if (i%2 == 0)
-            line->setLine("I am Nicole Nie");
-        else
-            line->setLine("My wife is Awa Wang");
-        msg1.addLine(line);
-    }
-
-    printf("\n");
-    msg1.print();
-
-    msg2.unpack(msg1.pack());
-    printf("\n");
-    msg2.print();
-
-    msg1.freeMemory();
-}
-
-void DshMessage_Test_ReadStr()
-{
-    DshMessage msg;
-
-    msg.readFromString("This is a test 1\nThis is a test 2\nThis is a test 3\nThis is a test 4\nThis is a test 5\n");
-
-    msg.print();
-    for (int i=0; i<msg.getSize(); i++)
-        delete msg.getLine(i)->getLine();
-}
-
-void DshAggregator_Test()
-{
-    DshAggregator aggregator;
-    DshMessage *aggregatedMsg = NULL;
-
-    const int NUM_MSG = 10;
-    const int NUM_LINE = 10;
-
-    // test 1
-    printf("\n");
-    for (int i=0; i<NUM_MSG; i++) {
-        DshMessage *msg = new DshMessage();
-        for (int j=0; j<NUM_LINE; j++) {
-            DshLine *line = new DshLine();
-            line->setLineNo(j);
-            if (j%2 == 0)
-                line->setLine("I am a man");
-            else
-                line->setLine("I am a women");
-            line->addBE(i);
-            msg->addLine(line);
-        }
-        aggregator.addMsg(msg);
-    }
-    
-    aggregatedMsg = aggregator.getAggregatedMsg();
-    aggregatedMsg->print();
-    delete aggregatedMsg;
-
-    aggregator.freeMemory();
-
-    // test 2
-    printf("\n");
-    for (int i=0; i<NUM_MSG; i++) {
-        DshMessage *msg = new DshMessage();
-        for (int j=0; j<NUM_LINE; j++) {
-            DshLine *line = new DshLine();
-            line->setLineNo(j);
-            if (i == (NUM_MSG - 1))
-                line->setLine("I am a man");
-            else
-                line->setLine("Who are you");
-            line->addBE(i);
-            msg->addLine(line);
-        }
-        aggregator.addMsg(msg);
-    }
-    
-    aggregatedMsg = aggregator.getAggregatedMsg();
-    aggregatedMsg->print();
-    delete aggregatedMsg;
-
-    aggregator.freeMemory();
-
-    // test 3
-    printf("\n");
-    for (int i=0; i<NUM_MSG; i++) {
-        DshMessage *msg = new DshMessage();
-        for (int j=0; j<NUM_LINE; j++) {
-            DshLine *line = new DshLine();
-            line->setLineNo(j);
-            if (i == (NUM_MSG - 1))
-                line->setLine("Who are you");
-            else if (i == (NUM_MSG - 2))
-                line->setLine("I am a women");
-            else
-                line->setLine("I am a woman");
-            line->addBE(i);
-            msg->addLine(line);
-        }
-        aggregator.addMsg(msg);
-    }
-    
-    aggregatedMsg = aggregator.getAggregatedMsg();
-    aggregatedMsg->print();
-    delete aggregatedMsg;
-
-    aggregator.freeMemory();
-}
-
-void DshAggregator_Test_Ext()
-{
-    DshAggregator aggregator;
-    DshMessage *aggregatedMsg = NULL;
-
-    const int NUM_MSG = 10;
-    const int NUM_LINE = 10;
-
-    // test 1
-    printf("\n");
-    for (int i=NUM_MSG-1; i>=0; i--) {
-        DshMessage *msg = new DshMessage();
-        for (int j=0; j<NUM_LINE; j++) {
-            DshLine *line = new DshLine();
-            line->setLineNo(j);
-            if (j%2 == 0)
-                line->setLine("I am a man");
-            else
-                line->setLine("I am a women");
-            line->addBE(i);
-            msg->addLine(line);
-        }
-        aggregator.addMsg(msg);
-    }
-    
-    aggregatedMsg = aggregator.getAggregatedMsg();
-    aggregatedMsg->print();
-    delete aggregatedMsg;
-
-    aggregator.freeMemory();
-}
-
-int main(int argc, char **argv)
-{
-    // Test Levenshtein class
-    Levenshtein_Test();
-
-    // Test DshLine class
-    DshLine_Test();
-
-    // Test DshLine class
-    DshLine_Test_Ext();
-
-    // Test DshMessage class
-    DshMessage_Test();
-
-    // Test DshMessage class
-    DshMessage_Test_Ext();
-
-    // Test DshMessage class
-    DshMessage_Test_Pack();
-
-    // Test DshMessage class
-    DshMessage_Test_ReadStr();
-
-    // Test DshAggregator class
-    DshAggregator_Test();
-
-    // Test DshAggregator class
-    DshAggregator_Test_Ext();
-    
-    return 0;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/levenshtein.cpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/levenshtein.cpp
deleted file mode 100644
index 6235d68..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/levenshtein.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Levenshtein
-
- Description: Levenshtein algorithm.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/29/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#include "levenshtein.hpp"
-
-#include <algorithm>
-
-int Levenshtein::Distance(const string &s1, const string &s2)
-{
-    int i, j, cost;
-    int n = s1.length(), m = s2.length();
-    int *matrix = new int[(m + 1) * (n + 1)]; 
-
-    if (m == 0) 
-        return n;
-    if (n == 0) 
-        return m;
-
-    m++;
-    n++;
-
-    for (i = 0; i < n; i ++)    
-        matrix[i] = i;
-    for (i = 0; i < m; i ++)    
-        matrix[i * n] = i;
-    
-    for (i = 1; i < n; i ++) {
-        for (j = 1; j < m; j ++) {
-            if (s1[i - 1] == s2[j - 1])
-                cost = 0;
-            else
-                cost = 1;
-            matrix[j * n + i] = Minimum(matrix[(j-1)*n+i]+1, matrix[j*n+i-1]+1, matrix[(j-1)*n+i-1]+cost);
-        }
-    }
-
-    cost = matrix[n * m - 1];
-    delete [] matrix;
-
-    return cost;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/levenshtein.hpp b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/levenshtein.hpp
deleted file mode 100644
index 638c118..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter/levenshtein.hpp
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: Levenshtein
-
- Description: Levenshtein algorithm.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   10/29/08 nieyy        Initial code (D154050)
-
-****************************************************************************/
-
-#ifndef _LEVENSHTEIN_HPP
-#define _LEVENSHTEIN_HPP
-
-#include <string>
-
-using namespace std;
-
-class Levenshtein
-{
-    public:
-        static int Distance(const string &s1, const string &s2);
-        
-    private:
-        static inline int Minimum(int a, int b, int c)
-        {
-            return min(min(a, b), c);
-        };
-};
-
-#endif
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/Makefile b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/Makefile
deleted file mode 100644
index 7abc147..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/Makefile
+++ /dev/null
@@ -1,54 +0,0 @@
-CC = g++
-
-CFLAGS =
-
-OTHER_FLAGS = -ldl -lpthread -lsci
-
-all: all_32 all_64
-
-all_32: dsh_fe dsh_be downfilter.so upfilter.so upfiltera.so upfilterb.so
-all_64: dsh_fe64 dsh_be64 downfilter64.so upfilter64.so upfiltera64.so upfilterb64.so
-
-dsh_fe: dsh_fe.c 
-	$(CC) -g -m32 $(CFLAGS) -o $@ $^ $(OTHER_FLAGS)
-
-dsh_be: dsh_be.c 
-	$(CC) -g -m32 $(CFLAGS) -o $@ $^ $(OTHER_FLAGS)
-
-downfilter.so: downfilter.c
-	$(CC) -g -m32 $(CFLAGS) -fpic -shared -o $@ $^ $(OTHER_FLAGS)
-
-upfilter.so: upfilter.c
-	$(CC) -g -m32 $(CFLAGS) -fpic -shared -o $@ $^ $(OTHER_FLAGS)
-
-upfiltera.so: upfiltera.c
-	$(CC) -g -m32 $(CFLAGS) -fpic -shared -o $@ $^ $(OTHER_FLAGS)
-
-upfilterb.so: upfilterb.c
-	$(CC) -g -m32 $(CFLAGS) -fpic -shared -o $@ $^ $(OTHER_FLAGS)
-	
-dsh_fe64: dsh_fe.c 
-	$(CC) -m64 -D__64BIT__ -g $(CFLAGS) -o $@ $^ $(OTHER_FLAGS)
-
-dsh_be64: dsh_be.c 
-	$(CC) -m64 -D__64BIT__ -g $(CFLAGS) -o $@ $^ $(OTHER_FLAGS)
-
-downfilter64.so: downfilter.c
-	$(CC) -m64 -D__64BIT__ -g $(CFLAGS) -fpic -shared -o $@ $^ $(OTHER_FLAGS)
-
-upfilter64.so: upfilter.c
-	$(CC) -m64 -D__64BIT__ -g $(CFLAGS) -fpic -shared -o $@ $^ $(OTHER_FLAGS)
-
-upfiltera64.so: upfiltera.c
-	$(CC) -m64 -D__64BIT__ -g $(CFLAGS) -fpic -shared -o $@ $^ $(OTHER_FLAGS)
-
-upfilterb64.so: upfilterb.c
-	$(CC) -m64 -D__64BIT__ -g $(CFLAGS) -fpic -shared -o $@ $^ $(OTHER_FLAGS)
-
-clean: clean_32 clean_64
-
-clean_32:
-	@rm -f *.o dsh_fe dsh_be downfilter.so upfilter.so upfiltera.so upfilterb.so
-
-clean_64:
-	@rm -f *.o dsh_fe64 dsh_be64 downfilter64.so upfilter64.so upfiltera64.so upfilterb64.so
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/Makefile.aix b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/Makefile.aix
deleted file mode 100644
index 87c0f90..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/Makefile.aix
+++ /dev/null
@@ -1,54 +0,0 @@
-CC = xlC_r
-
-CFLAGS = -+ # treat .c file as c++ source code
-
-OTHER_FLAGS = -ldl -lpthread -lsci_r
-
-all: all_32 all_64
-
-all_32: dsh_fe dsh_be downfilter.so upfilter.so upfiltera.so upfilterb.so
-all_64: dsh_fe64 dsh_be64 downfilter64.so upfilter64.so upfiltera64.so upfilterb64.so
-
-dsh_fe: dsh_fe.c 
-	$(CC) -g -q32 $(CFLAGS) -o $@ dsh_fe.c $(OTHER_FLAGS)
-
-dsh_be: dsh_be.c 
-	$(CC) -g -q32 $(CFLAGS) -o $@ dsh_be.c $(OTHER_FLAGS)
-
-downfilter.so: downfilter.c
-	$(CC) -g -q32 $(CFLAGS) -qmkshrobj -o $@ downfilter.c $(OTHER_FLAGS)
-
-upfilter.so: upfilter.c
-	$(CC) -g -q32 $(CFLAGS) -qmkshrobj -o $@ upfilter.c $(OTHER_FLAGS)
-
-upfiltera.so: upfiltera.c
-	$(CC) -g -q32 $(CFLAGS) -qmkshrobj -o $@ upfiltera.c $(OTHER_FLAGS)
-
-upfilterb.so: upfilterb.c
-	$(CC) -g -q32 $(CFLAGS) -qmkshrobj -o $@ upfilterb.c $(OTHER_FLAGS)
-
-dsh_fe64: dsh_fe.c 
-	$(CC) -g -q64 $(CFLAGS) -o $@ dsh_fe.c $(OTHER_FLAGS)
-
-dsh_be64: dsh_be.c 
-	$(CC) -g -q64 $(CFLAGS) -o $@ dsh_be.c $(OTHER_FLAGS)
-
-downfilter64.so: downfilter.c
-	$(CC) -g -q64 $(CFLAGS) -qmkshrobj -o $@ downfilter.c $(OTHER_FLAGS)
-
-upfilter64.so: upfilter.c
-	$(CC) -g -q64 $(CFLAGS) -qmkshrobj -o $@ upfilter.c $(OTHER_FLAGS)
-
-upfiltera64.so: upfiltera.c
-	$(CC) -g -q64 $(CFLAGS) -qmkshrobj -o $@ upfiltera.c $(OTHER_FLAGS)
-
-upfilterb64.so: upfilterb.c
-	$(CC) -g -q64 $(CFLAGS) -qmkshrobj -o $@ upfilterb.c $(OTHER_FLAGS)
-
-clean: clean_32 clean_64
-
-clean_32:
-	@rm -f *.o dsh_fe dsh_be downfilter.so upfilter.so upfiltera.so upfilterb.so
-
-clean_64:
-	@rm -f *.o dsh_fe64 dsh_be64 downfilter64.so upfilter64.so upfiltera64.so upfilterb64.so
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/buildit b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/buildit
deleted file mode 100755
index d92b14d..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/buildit
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/sh -x
-
-OS_TYPE=$(uname)
-if [[ ${OS_TYPE} = "AIX" ]]
-then
-    make -f Makefile.aix clean
-    make -f Makefile.aix all
-else
-    CURR_CHIP=$(arch)
-    if [[ ${CURR_CHIP} == 'ppc64' ]]
-    then
-        make clean
-        make all
-    else
-        if [[ ${CURR_CHIP} == 'i386' || ${CURR_CHIP} == 'i686' ]]
-        then
-            make clean_32
-            make all_32
-        else
-            if [[ ${CURR_CHIP} == 'x86_64' ]]
-            then
-                make all
-            fi
-        fi
-    fi
-fi
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/downfilter.c b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/downfilter.c
deleted file mode 100644
index 6cd86df..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/downfilter.c
+++ /dev/null
@@ -1,70 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   03/10/08 nieyy        Initial code (D156332)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include "sci.h"
-
-extern "C" {
-
-int filter_initialize(void **user_param)
-{
-    // do nothing
-    return SCI_SUCCESS;
-}
-
-int filter_terminate(void *user_param) 
-{
-    // do nothing
-    return SCI_SUCCESS;
-}
-
-int filter_input(void *user_param, sci_group_t group, void *buf, int size) 
-{
-    void *bufs[1];
-    int sizes[1];
-    int rc;
-
-    int num_successors;
-    rc = SCI_Query(NUM_SUCCESSORS, &num_successors);
-    if (rc != SCI_SUCCESS) {
-        // do something
-    }
-    int successor_ids[num_successors];
-    rc = SCI_Query(SUCCESSOR_IDLIST, successor_ids);
-    
-    bufs[0] = buf;
-    sizes[0] = size;
-
-    rc = SCI_Filter_bcast(SCI_FILTER_NULL, num_successors, successor_ids, 1, bufs, sizes);
-    if (rc != SCI_SUCCESS) {
-        // do something
-    } 
-
-    return SCI_SUCCESS;
-}
-
-}
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/dsh_be.c b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/dsh_be.c
deleted file mode 100644
index faf81c0..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/dsh_be.c
+++ /dev/null
@@ -1,92 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   03/10/08 nieyy        Initial code (D156332)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <strings.h>
-#include <unistd.h>
-#include <assert.h>
-#include "sci.h"
-
-#define DOWN_FILTER 1
-#define UP_FILTER 2
-#define UP_FILTER_A 3
-#define UP_FILTER_B 4
-
-#define RST_SIZE 4096
-
-char *result = NULL;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int bytes, my_id, rc;
-    FILE *fp = NULL;
-    int sizes[2];
-    void *bufs[2];
-
-    rc = SCI_Query(BACKEND_ID, &my_id);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    bufs[0] = &my_id;
-    sizes[0] = sizeof(my_id);
-    
-    fp = popen((const char *)buffer, "r");
-    assert(result != NULL);
-    memset(result, 0, RST_SIZE);
-    bytes = fread(result, sizeof(char), RST_SIZE, fp);
-    bufs[1] = result;
-    sizes[1] = strlen(result) + 1;
-    pclose(fp);
-    
-    rc = SCI_Upload(UP_FILTER, group, 2, bufs, sizes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    int rc;
-
-    result = (char *)malloc(RST_SIZE * sizeof(char));
-    bzero(&info, sizeof(info));
-    info.type = SCI_BACK_END;
-    info.be_info.mode = SCI_INTERRUPT;
-    info.be_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.be_info.param = NULL;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    rc = SCI_Terminate();
-    free(result);
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/dsh_fe.c b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/dsh_fe.c
deleted file mode 100644
index bec83ce..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/dsh_fe.c
+++ /dev/null
@@ -1,178 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   03/10/08 nieyy        Initial code (D156332)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <strings.h>
-#include <unistd.h>
-#include "sci.h"
-
-#define DOWN_FILTER 1
-#define UP_FILTER 2
-#define UP_FILTER_A 3
-#define UP_FILTER_B 4
-
-int num_resp;
-
-void handler(void *user_param, sci_group_t group, void *buffer, int size)
-{
-    int be_id = ((int *) buffer)[0];
-    char *msg = (char *)((char *) buffer + sizeof(int));
-    char *pos = NULL;
-
-    while (1) {
-        pos = strstr(msg, "\n");
-        if (pos == NULL) {
-            break;
-        } else {
-            pos[0] = '\0';
-        }
-        printf("%d: %s\n", be_id, msg);
-        msg = pos + 1;
-    }
-    
-    num_resp++;
-}
-
-int main(int argc, char **argv)
-{
-    sci_info_t info;
-    sci_filter_info_t filter_info;
-
-    char msg[256];
-    char *s;
-    int i, rc, num_bes, job_key, sizes[1];
-    void *bufs[1];
-
-    char pwd[256];
-    char hfile[256], bpath[256], fpath[256];
-
-    getcwd(pwd, 256);
-    sprintf(hfile, "%s/host.list", pwd);
-#ifdef __64BIT__
-    sprintf(bpath, "%s/dsh_be64", pwd);
-#else
-    sprintf(bpath, "%s/dsh_be", pwd);
-#endif
-
-    bzero(&info, sizeof(info));
-    info.type = SCI_FRONT_END;
-    info.fe_info.mode = SCI_INTERRUPT;
-    info.fe_info.hostfile = hfile;
-    info.fe_info.bepath = bpath;
-    info.fe_info.hndlr = (SCI_msg_hndlr *)&handler;
-    info.fe_info.param = NULL;
-    
-    rc = SCI_Initialize(&info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    rc = SCI_Query(NUM_BACKENDS, &num_bes);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-    
-#ifdef __64BIT__
-    sprintf(fpath, "%s/downfilter64.so", pwd);
-#else
-    sprintf(fpath, "%s/downfilter.so", pwd);
-#endif
-    bzero(&filter_info, sizeof(filter_info));
-    filter_info.filter_id = DOWN_FILTER;
-    filter_info.so_file = fpath;
-    rc = SCI_Filter_load(&filter_info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-#ifdef __64BIT__
-    sprintf(fpath, "%s/upfilter64.so", pwd);
-#else
-    sprintf(fpath, "%s/upfilter.so", pwd);
-#endif
-    bzero(&filter_info, sizeof(filter_info));
-    filter_info.filter_id = UP_FILTER;
-    filter_info.so_file = fpath;
-    rc = SCI_Filter_load(&filter_info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-#ifdef __64BIT__
-    sprintf(fpath, "%s/upfiltera64.so", pwd);
-#else
-    sprintf(fpath, "%s/upfiltera.so", pwd);
-#endif
-    bzero(&filter_info, sizeof(filter_info));
-    filter_info.filter_id = UP_FILTER_A;
-    filter_info.so_file = fpath;
-    rc = SCI_Filter_load(&filter_info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-#ifdef __64BIT__
-    sprintf(fpath, "%s/upfilterb64.so", pwd);
-#else
-    sprintf(fpath, "%s/upfilterb.so", pwd);
-#endif
-    bzero(&filter_info, sizeof(filter_info));
-    filter_info.filter_id = UP_FILTER_B;
-    filter_info.so_file = fpath;
-    rc = SCI_Filter_load(&filter_info);
-    if (rc != SCI_SUCCESS) {
-        exit(1);
-    }
-
-    while (1) {
-        printf(">>> ");
-        fflush(stdout);
-        memset(msg, 0 , sizeof(msg));
-        fgets(msg, sizeof(msg), stdin);
-        msg[strlen(msg) - 1] = '\0';
-
-        if (0 == strcmp(msg, "quit"))
-            break;
-        
-        num_resp = 0;
-        
-        bufs[0] = msg;
-        sizes[0] = strlen(msg) + 1;
-        rc = SCI_Bcast(DOWN_FILTER, SCI_GROUP_ALL, 1, bufs, sizes);
-        if (rc != SCI_SUCCESS) {
-            exit(1);
-        }
-        
-        while (num_resp < num_bes) {
-            usleep(500);
-        } 
-    }
-    
-    rc = SCI_Terminate();
-    
-    return rc;
-}
-
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/upfilter.c b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/upfilter.c
deleted file mode 100644
index 982a9e6..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/upfilter.c
+++ /dev/null
@@ -1,67 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   03/10/08 nieyy        Initial code (D156332)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include "sci.h"
-
-#define DOWN_FILTER 1
-#define UP_FILTER 2
-#define UP_FILTER_A 3
-#define UP_FILTER_B 4
-
-extern "C" {
-
-int filter_initialize(void **user_param)
-{
-    // do nothing
-    return SCI_SUCCESS;
-}
-
-int filter_terminate(void *user_param) 
-{
-    // do nothing
-    return SCI_SUCCESS;
-}
-
-int filter_input(void *user_param, sci_group_t group, void *buf, int size) 
-{
-    void *bufs[1];
-    int sizes[1];
-    int rc;
-    
-    bufs[0] = buf;
-    sizes[0] = size;
-
-    rc = SCI_Filter_upload(UP_FILTER_A, group, 1, bufs, sizes);
-    if (rc != SCI_SUCCESS) {
-        // do something
-    } 
-
-    return SCI_SUCCESS;
-}
-
-}
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/upfiltera.c b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/upfiltera.c
deleted file mode 100644
index b9659ee..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/upfiltera.c
+++ /dev/null
@@ -1,67 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   03/10/08 nieyy        Initial code (D156332)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include "sci.h"
-
-#define DOWN_FILTER 1
-#define UP_FILTER 2
-#define UP_FILTER_A 3
-#define UP_FILTER_B 4
-
-extern "C" {
-
-int filter_initialize(void **user_param)
-{
-    // do nothing
-    return SCI_SUCCESS;
-}
-
-int filter_terminate(void *user_param) 
-{
-    // do nothing
-    return SCI_SUCCESS;
-}
-
-int filter_input(void *user_param, sci_group_t group, void *buf, int size) 
-{
-    void *bufs[1];
-    int sizes[1];
-    int rc;
-    
-    bufs[0] = buf;
-    sizes[0] = size;
-
-    rc = SCI_Filter_upload(UP_FILTER_B, group, 1, bufs, sizes);
-    if (rc != SCI_SUCCESS) {
-        // do something
-    } 
-
-    return SCI_SUCCESS;
-}
-
-}
diff --git a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/upfilterb.c b/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/upfilterb.c
deleted file mode 100644
index e57a00b..0000000
--- a/tools/sci/org.eclipse.ptp.sci/usecase/dsh_filter2/upfilterb.c
+++ /dev/null
@@ -1,67 +0,0 @@
-#ifndef _PRAGMA_COPYRIGHT_
-#define _PRAGMA_COPYRIGHT_
-#pragma comment(copyright, "%Z% %I% %W% %D% %T%\0")
-#endif /* _PRAGMA_COPYRIGHT_ */
-/****************************************************************************
-
-* Copyright (c) 2008, 2010 IBM Corporation.
-* All rights reserved. This program and the accompanying materials
-* are made available under the terms of the Eclipse Public License v1.0s
-* which accompanies this distribution, and is available at
-* http://www.eclipse.org/legal/epl-v10.html
-
- Classes: None
-
- Description: Distributed Shell.
-   
- Author: Nicole Nie, Tu HongJ, Liu Wei
-
- History:
-   Date     Who ID    Description
-   -------- --- ---   -----------
-   03/10/08 nieyy        Initial code (D156332)
-
-****************************************************************************/
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include "sci.h"
-
-#define DOWN_FILTER 1
-#define UP_FILTER 2
-#define UP_FILTER_A 3
-#define UP_FILTER_B 4
-
-extern "C" {
-
-int filter_initialize(void **user_param)
-{
-    // do nothing
-    return SCI_SUCCESS;
-}
-
-int filter_terminate(void *user_param) 
-{
-    // do nothing
-    return SCI_SUCCESS;
-}
-
-int filter_input(void *user_param, sci_group_t group, void *buf, int size) 
-{
-    void *bufs[1];
-    int sizes[1];
-    int rc;
-    
-    bufs[0] = buf;
-    sizes[0] = size;
-
-    rc = SCI_Filter_upload(SCI_FILTER_NULL, group, 1, bufs, sizes);
-    if (rc != SCI_SUCCESS) {
-        // do something
-    } 
-
-    return SCI_SUCCESS;
-}
-
-}
