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 cbfdb7b..0000000
--- a/core/org.eclipse.ptp.core.tests/src/org/eclipse/ptp/core/tests/AttributeIndexSetTests.java
+++ /dev/null
@@ -1,402 +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.setIndicesOfAttribute(attr, indices);
-			
-			attr = definition.create(3);
-			indices.clear();
-			indices.set(200, 205);
-			indices.set(300, 305);
-			testingIndexSet.setIndicesOfAttribute(attr, indices);
-			
-			attr = definition.create(5);
-			indices.clear();
-			set(indices, new int[]{1,101,201,301,401});
-			testingIndexSet.setIndicesOfAttribute(attr, indices);
-			
-		} catch (IllegalValueException e) {
-			fail(e.getMessage());
-		}
-	}
-	
-	@Override
-	public void tearDown() {
-		testingIndexSet = null;
-		definition = null;
-	}
-	
-	public void testAndAttrs() throws IllegalValueException {
-		IntegerAttribute attr = definition.create(1);
-		BitSet newIndices = new BitSet();
-		newIndices.set(99, 103);
-		testingIndexSet.addIndicesToAttribute(attr, newIndices);
-		
-		assertDisjoint(testingIndexSet);
-		assertComplete(testingIndexSet);
-
-		BitSet expected;
-		BitSet actual;
-
-		expected = new BitSet();
-		set(expected, new int[]{0, 1, 2, 3, 4, 99, 100, 101, 102, 103, 104, 200, 201, 202, 203, 204, 300, 301, 302, 303, 304, 401});
-		actual = testingIndexSet.getIndexSet();
-		assertEquals(expected, actual);
-
-		expected = new BitSet();
-		set(expected, new int[]{0, 2, 3, 4, 99, 100, 101, 102, 103, 104});
-		actual = getIndexSet(testingIndexSet, 1);
-		assertEquals(expected, actual);
-
-		expected = new BitSet();
-		set(expected, new int[]{200, 202, 203, 204, 300, 302, 303, 304});
-		actual = getIndexSet(testingIndexSet, 3);
-		assertEquals(expected, actual);
-
-		expected = new BitSet();
-		set(expected, new int[]{1,201,301,401});
-		actual = getIndexSet(testingIndexSet, 5);
-		assertEquals(expected, actual);		
-	}
-	
-	public void testClearIndices() throws IllegalValueException {
-		BitSet clearedSet = new BitSet();
-		set(clearedSet, new int[]{2,102,202,302,402,1000});
-		testingIndexSet.clearIndices(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.clearIndices(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 testClearIndicesForAttribute() throws IllegalValueException {
-		IntegerAttribute attr = definition.create(1);
-		BitSet clearedSet = new BitSet();
-		// 300 is not part of attr 1's set, so it shouldn't be cleared
-		set(clearedSet, new int[]{3, 4, 100, 102, 300, 1000});
-		testingIndexSet.clearIndicesForAttribute(attr, clearedSet);
-		
-		assertDisjoint(testingIndexSet);
-		assertComplete(testingIndexSet);
-
-		BitSet expected;
-		BitSet actual;
-
-		expected = new BitSet();
-		// notice 300 is still here
-		set(expected, new int[]{0, 1, 2, 101, 103, 104, 200, 201, 202, 203, 204, 300, 301, 302, 303, 304, 401});
-		actual = testingIndexSet.getIndexSet();
-		assertEquals(expected, actual);
-
-		expected = new BitSet();
-		set(expected, new int[]{0, 2, 103, 104});
-		actual = getIndexSet(testingIndexSet, 1);
-		assertEquals(expected, actual);
-
-		actual = getIndexSet(testingIndexSet, 2);
-		assertTrue(actual.isEmpty());
-
-		expected = new BitSet();
-		// notice 300 is still here
-		set(expected, new int[]{200, 202, 203, 204, 300, 302, 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);		
-	}
-	
-	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 testSetAttrsSubset() throws IllegalValueException {
-		IntegerAttribute attr = definition.create(1);
-		BitSet newIndices = new BitSet();
-		newIndices.set(101, 103);
-		testingIndexSet.setIndicesOfAttribute(attr, newIndices);
-		
-		assertDisjoint(testingIndexSet);
-		assertComplete(testingIndexSet);
-
-		BitSet expected;
-		BitSet actual;
-
-		expected = new BitSet();
-		set(expected, new int[]{1, 101, 102, 200, 201, 202, 203, 204, 300, 301, 302, 303, 304, 401});
-		actual = testingIndexSet.getIndexSet();
-		assertEquals(expected, actual);
-
-		expected = new BitSet();
-		set(expected, new int[]{101, 102});
-		actual = getIndexSet(testingIndexSet, 1);
-		assertEquals(expected, actual);
-
-		expected = new BitSet();
-		set(expected, new int[]{200, 202, 203, 204, 300, 302, 303, 304});
-		actual = getIndexSet(testingIndexSet, 3);
-		assertEquals(expected, actual);
-
-		expected = new BitSet();
-		set(expected, new int[]{1,201,301,401});
-		actual = getIndexSet(testingIndexSet, 5);
-		assertEquals(expected, actual);		
-	}
-
-	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 testTotalClearAttribute() throws IllegalValueException {
-		IntegerAttribute attr = definition.create(1);
-		testingIndexSet.clearAttribute(attr);
-		
-		assertDisjoint(testingIndexSet);
-		assertComplete(testingIndexSet);
-
-		BitSet expected;
-		BitSet actual;
-
-		expected = new BitSet();
-		set(expected, new int[]{1, 101, 200, 201, 202, 203, 204, 300, 301, 302, 303, 304, 401});
-		actual = testingIndexSet.getIndexSet();
-		assertEquals(expected, actual);
-
-		actual = getIndexSet(testingIndexSet, 1);
-		assertTrue(actual.isEmpty());
-
-		expected = new BitSet();
-		set(expected, new int[]{200, 202, 203, 204, 300, 302, 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);		
-	}
-
-	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 53747a1..0000000
--- a/core/org.eclipse.ptp.remote.core.tests/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,16 +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.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 c8959a9..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 3e1a5eb..0000000
--- a/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/core/tests/FileStoreTests.java
+++ /dev/null
@@ -1,148 +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 junit.framework.TestCase;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.runtime.CoreException;
-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 TestCase {
-	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 (Exception e) {
-			fail(e.getLocalizedMessage());
-		}
-		
-		for (int i = 0; i < 5; i++) {
-			assertFalse(store1.fetchInfo().exists());
-			try {
-				store1.mkdir(EFS.NONE, null);
-			} catch (CoreException e) {
-				e.getLocalizedMessage();
-			}
-			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) {
-				e.getLocalizedMessage();
-			}
-			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) {
-				e.getLocalizedMessage();
-			}
-	
-			try {
-				store2.delete(EFS.NONE, null);
-			} catch (CoreException e) {
-				e.getLocalizedMessage();
-			}
-			assertFalse(store2.fetchInfo().exists());
-	
-			try {
-				store1.delete(EFS.NONE, null);
-			} catch (CoreException e) {
-				e.getLocalizedMessage();
-			}
-			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 4d116d0..0000000
--- a/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/core/tests/RemoteConnectionTests.java
+++ /dev/null
@@ -1,164 +0,0 @@
-package org.eclipse.ptp.core.tests;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.util.HashMap;
-import java.util.Map;
-
-import junit.framework.TestCase;
-
-import org.eclipse.core.filesystem.EFS;
-import org.eclipse.core.filesystem.IFileInfo;
-import org.eclipse.core.filesystem.IFileStore;
-import org.eclipse.core.filesystem.IFileSystem;
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.core.runtime.Path;
-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.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$
-				if (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(e.getLocalizedMessage());
-		}
-	}
-	
-	public void testCopy() {
-		final IRemoteFileManager fileManager = fRemoteServices.getFileManager(fRemoteConnection);
-
-		final IFileSystem fileSystem = EFS.getLocalFileSystem();
-		final IFileStore srcFileStore = fileSystem.getStore(new Path("/tmp/log_src.txt"));
-		final IFileStore dstFileStore = fileManager.getResource("/tmp").getChild("log_dst.txt");
-		try {
-			srcFileStore.delete(EFS.NONE, new NullProgressMonitor());
-			dstFileStore.delete(EFS.NONE, new NullProgressMonitor());
-			OutputStream stream = srcFileStore.openOutputStream(EFS.NONE, new NullProgressMonitor());
-			stream.write(new byte[]{'f', 'o', 'o', '\n'});
-			stream.close();
-			srcFileStore.copy(dstFileStore, EFS.NONE, new NullProgressMonitor());
-		} catch (CoreException e) {
-			fail(e.getLocalizedMessage());
-		} catch (IOException e) {
-			fail(e.getLocalizedMessage());
-		}
-		IFileInfo srcInfo = srcFileStore.fetchInfo();
-		IFileInfo dstInfo = dstFileStore.fetchInfo();
-		assertTrue(dstInfo.exists());
-		assertTrue(srcInfo.getLength() == dstInfo.getLength());
-		try {
-			InputStream stream = dstFileStore.openInputStream(EFS.NONE, new NullProgressMonitor());
-			byte[] b = new byte[4];
-			stream.read(b);
-			stream.close();
-			assertTrue(b[0] == 'f');
-			assertTrue(b[1] == 'o');
-			assertTrue(b[2] == 'o');
-			assertTrue(b[3] == '\n');
-		} catch (CoreException e) {
-			fail(e.getLocalizedMessage());
-		} catch (IOException e) {
-			fail(e.getLocalizedMessage());
-		}
-		
-//		try {
-//			srcFileStore.delete(EFS.NONE, new NullProgressMonitor());
-//			dstFileStore.delete(EFS.NONE, new NullProgressMonitor());
-//		} catch (CoreException 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/RemoteToolsTests.java b/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/core/tests/RemoteToolsTests.java
deleted file mode 100644
index ad393fa..0000000
--- a/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/core/tests/RemoteToolsTests.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 RemoteToolsTests 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/RemoteCoreTestSuite.java b/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/remote/core/tests/suite/RemoteCoreTestSuite.java
deleted file mode 100644
index ba33661..0000000
--- a/core/org.eclipse.ptp.remote.core.tests/src/org/eclipse/ptp/remote/core/tests/suite/RemoteCoreTestSuite.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 RemoteCoreTestSuite {
-	public static Test suite() {
-		TestSuite suite = new TestSuite(RemoteCoreTestSuite.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/debug/org.eclipse.ptp.debug.core.tests/.classpath b/debug/org.eclipse.ptp.debug.core.tests/.classpath
deleted file mode 100644
index 16d067f..0000000
--- a/debug/org.eclipse.ptp.debug.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/debug/org.eclipse.ptp.debug.core.tests/.project b/debug/org.eclipse.ptp.debug.core.tests/.project
deleted file mode 100644
index 9034eb0..0000000
--- a/debug/org.eclipse.ptp.debug.core.tests/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.ptp.debug.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/debug/org.eclipse.ptp.debug.core.tests/.settings/org.eclipse.jdt.core.prefs b/debug/org.eclipse.ptp.debug.core.tests/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index d830758..0000000
--- a/debug/org.eclipse.ptp.debug.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/debug/org.eclipse.ptp.debug.core.tests/META-INF/MANIFEST.MF b/debug/org.eclipse.ptp.debug.core.tests/META-INF/MANIFEST.MF
deleted file mode 100644
index fa60f30..0000000
--- a/debug/org.eclipse.ptp.debug.core.tests/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,12 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.ptp.debug.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,
- org.eclipse.ptp.debug.core
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Import-Package: org.eclipse.ptp.debug.core
diff --git a/debug/org.eclipse.ptp.debug.core.tests/build.properties b/debug/org.eclipse.ptp.debug.core.tests/build.properties
deleted file mode 100644
index 34d2e4d..0000000
--- a/debug/org.eclipse.ptp.debug.core.tests/build.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .
diff --git a/debug/org.eclipse.ptp.debug.core.tests/plugin.properties b/debug/org.eclipse.ptp.debug.core.tests/plugin.properties
deleted file mode 100644
index b3cca65..0000000
--- a/debug/org.eclipse.ptp.debug.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/debug/org.eclipse.ptp.debug.core.tests/src/org/eclipse/ptp/debug/core/tests/AIFTests.java b/debug/org.eclipse.ptp.debug.core.tests/src/org/eclipse/ptp/debug/core/tests/AIFTests.java
deleted file mode 100644
index df81d4a..0000000
--- a/debug/org.eclipse.ptp.debug.core.tests/src/org/eclipse/ptp/debug/core/tests/AIFTests.java
+++ /dev/null
@@ -1,156 +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.debug.core.tests;
-
-import junit.framework.TestCase;
-
-import org.eclipse.ptp.debug.core.pdi.model.aif.AIFFactory;
-import org.eclipse.ptp.debug.core.pdi.model.aif.AIFFormatException;
-import org.eclipse.ptp.debug.core.pdi.model.aif.IAIFType;
-import org.eclipse.ptp.debug.core.pdi.model.aif.IAIFTypeAddress;
-import org.eclipse.ptp.debug.core.pdi.model.aif.IAIFTypeAggregate;
-import org.eclipse.ptp.debug.core.pdi.model.aif.IAIFTypeArray;
-import org.eclipse.ptp.debug.core.pdi.model.aif.IAIFTypeBool;
-import org.eclipse.ptp.debug.core.pdi.model.aif.IAIFTypeChar;
-import org.eclipse.ptp.debug.core.pdi.model.aif.IAIFTypeCharPointer;
-import org.eclipse.ptp.debug.core.pdi.model.aif.IAIFTypeEnum;
-import org.eclipse.ptp.debug.core.pdi.model.aif.IAIFTypeFloat;
-import org.eclipse.ptp.debug.core.pdi.model.aif.IAIFTypeFunction;
-import org.eclipse.ptp.debug.core.pdi.model.aif.IAIFTypeInt;
-import org.eclipse.ptp.debug.core.pdi.model.aif.IAIFTypeNamed;
-import org.eclipse.ptp.debug.core.pdi.model.aif.IAIFTypePointer;
-import org.eclipse.ptp.debug.core.pdi.model.aif.IAIFTypeRange;
-import org.eclipse.ptp.debug.core.pdi.model.aif.IAIFTypeReference;
-import org.eclipse.ptp.debug.core.pdi.model.aif.IAIFTypeString;
-import org.eclipse.ptp.debug.core.pdi.model.aif.IAIFTypeUnion;
-import org.eclipse.ptp.debug.core.pdi.model.aif.IAIFTypeVoid;
-
-public class AIFTests extends TestCase {
-	public void testTypes() {
-		IAIFType t;
-		try {
-			t = AIFFactory.getAIFType("a8"); //$NON-NLS-1$
-			assertTrue(t instanceof IAIFTypeAddress);
-		} catch (AIFFormatException e) {
-			fail(e.getMessage());
-		}
-		try {
-			t = AIFFactory.getAIFType("{|;;;}"); //$NON-NLS-1$
-			assertTrue(t instanceof IAIFTypeAggregate);
-			t = AIFFactory.getAIFType("{a|x=is4,y=f4;;v=pa4;}"); //$NON-NLS-1$
-			assertTrue(t instanceof IAIFTypeAggregate);
-		} catch (AIFFormatException e) {
-			fail(e.getMessage());
-		}
-		try {
-			t = AIFFactory.getAIFType("[r0,2is4][r-1,3is4][r10,4is4][r-10,5is4][r0,6is4]is4"); //$NON-NLS-1$
-			assertTrue(t instanceof IAIFTypeArray);
-		} catch (AIFFormatException e) {
-			fail(e.getMessage());
-		}
-		try {
-			t = AIFFactory.getAIFType("b1"); //$NON-NLS-1$
-			assertTrue(t instanceof IAIFTypeBool);
-		} catch (AIFFormatException e) {
-			fail(e.getMessage());
-		}
-		try {
-			t = AIFFactory.getAIFType("c"); //$NON-NLS-1$
-			assertTrue(t instanceof IAIFTypeChar);
-		} catch (AIFFormatException e) {
-			fail(e.getMessage());
-		}
-		try {
-			t = AIFFactory.getAIFType("pa4"); //$NON-NLS-1$
-			assertTrue(t instanceof IAIFTypeCharPointer);
-		} catch (AIFFormatException e) {
-			fail(e.getMessage());
-		}
-		try {
-			t = AIFFactory.getAIFType("<|>is4"); //$NON-NLS-1$
-			assertTrue(t instanceof IAIFTypeEnum);
-			t = AIFFactory.getAIFType("<a|x=-1,y=0,z=1>is4"); //$NON-NLS-1$
-			assertTrue(t instanceof IAIFTypeEnum);
-		} catch (AIFFormatException e) {
-			fail(e.getMessage());
-		}
-		try {
-			t = AIFFactory.getAIFType("f4"); //$NON-NLS-1$
-			assertTrue(t instanceof IAIFTypeFloat);
-		} catch (AIFFormatException e) {
-			fail(e.getMessage());
-		}
-		try {
-			t = AIFFactory.getAIFType("&is4,f8/f8"); //$NON-NLS-1$
-			assertTrue(t instanceof IAIFTypeFunction);
-		} catch (AIFFormatException e) {
-			fail(e.getMessage());
-		}
-		try {
-			t = AIFFactory.getAIFType("iu8"); //$NON-NLS-1$
-			assertTrue(t instanceof IAIFTypeInt);
-		} catch (AIFFormatException e) {
-			fail(e.getMessage());
-		}
-		try {
-			t = AIFFactory.getAIFType("%1/^a4{s1|a=is4,b=>1/;;;}"); //$NON-NLS-1$
-			assertTrue(t instanceof IAIFTypeNamed);
-		} catch (AIFFormatException e) {
-			fail(e.getMessage());
-		}
-		try {
-			t = AIFFactory.getAIFType("^a4{s1|a=is4,b=f4,c=c;;;}"); //$NON-NLS-1$
-			assertTrue(t instanceof IAIFTypePointer);
-			t = AIFFactory.getAIFType("^a4^a4c"); //$NON-NLS-1$
-			assertTrue(t instanceof IAIFTypePointer);
-		} catch (AIFFormatException e) {
-			fail(e.getMessage());
-		}
-		try {
-			t = AIFFactory.getAIFType("r-4,10is4"); //$NON-NLS-1$
-			assertTrue(t instanceof IAIFTypeRange);
-		} catch (AIFFormatException e) {
-			fail(e.getMessage());
-		}
-		try {
-			t = AIFFactory.getAIFType("r-4,10is4"); //$NON-NLS-1$
-			assertTrue(t instanceof IAIFTypeRange);
-		} catch (AIFFormatException e) {
-			fail(e.getMessage());
-		}
-		try {
-			t = AIFFactory.getAIFType(">3/"); //$NON-NLS-1$
-			assertTrue(t instanceof IAIFTypeReference);
-		} catch (AIFFormatException e) {
-			fail(e.getMessage());
-		}
-		try {
-			t = AIFFactory.getAIFType("s"); //$NON-NLS-1$
-			assertTrue(t instanceof IAIFTypeString);
-		} catch (AIFFormatException e) {
-			fail(e.getMessage());
-		}
-		try {
-			t = AIFFactory.getAIFType("(|)"); //$NON-NLS-1$
-			assertTrue(t instanceof IAIFTypeUnion);
-			t = AIFFactory.getAIFType("(u|a=is4,b=f8)"); //$NON-NLS-1$
-			assertTrue(t instanceof IAIFTypeUnion);
-		} catch (AIFFormatException e) {
-			fail(e.getMessage());
-		}
-		try {
-			t = AIFFactory.getAIFType("v0"); //$NON-NLS-1$
-			assertTrue(t instanceof IAIFTypeVoid);
-		} catch (AIFFormatException e) {
-			fail(e.getMessage());
-		}
-	}
-}
diff --git a/debug/org.eclipse.ptp.debug.core.tests/src/org/eclipse/ptp/debug/core/tests/TaskSetTests.java b/debug/org.eclipse.ptp.debug.core.tests/src/org/eclipse/ptp/debug/core/tests/TaskSetTests.java
deleted file mode 100644
index a68b91b..0000000
--- a/debug/org.eclipse.ptp.debug.core.tests/src/org/eclipse/ptp/debug/core/tests/TaskSetTests.java
+++ /dev/null
@@ -1,43 +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.debug.core.tests;
-
-import junit.framework.TestCase;
-
-import org.eclipse.ptp.debug.core.TaskSet;
-
-public class TaskSetTests extends TestCase {
-	public void testToString() {
-		TaskSet b = new TaskSet();
-		b.set(3, 13);
-		b.set(15, 22);
-		String str = b.toHexString().toUpperCase();
-
-		assertEquals(str, "00000000003F9FF8"); //$NON-NLS-1$
-
-		assertEquals(b.toString(), "{3-12,15-21}"); //$NON-NLS-1$
-	}
-
-	public void testFromString() {
-		String str = "06411eda"; //$NON-NLS-1$
-		TaskSet b = new TaskSet(28, str);
-
-		String res = b.toHexString();
-
-		assertEquals(str, res);
-
-		str = "07"; //$NON-NLS-1$
-		b = new TaskSet(3, str);
-		res = b.toHexString();
-
-		assertEquals(str, res);
-	}
-}
diff --git a/debug/org.eclipse.ptp.debug.core.tests/src/org/eclipse/ptp/debug/core/tests/suite/DebugCoreTestSuite.java b/debug/org.eclipse.ptp.debug.core.tests/src/org/eclipse/ptp/debug/core/tests/suite/DebugCoreTestSuite.java
deleted file mode 100644
index 6e52cf8..0000000
--- a/debug/org.eclipse.ptp.debug.core.tests/src/org/eclipse/ptp/debug/core/tests/suite/DebugCoreTestSuite.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.debug.core.tests.suite;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-
-import org.eclipse.ptp.debug.core.tests.AIFTests;
-import org.eclipse.ptp.debug.core.tests.TaskSetTests;
-
-public class DebugCoreTestSuite {
-	public static Test suite() {
-		TestSuite suite = new TestSuite(DebugCoreTestSuite.class.getName());
-
-		suite.addTestSuite(TaskSetTests.class);
-		suite.addTestSuite(AIFTests.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 718dedc..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/.project
+++ /dev/null
@@ -1,34 +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>
-		<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/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 05497bd..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,27 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-Localization: plugin
-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,
- org.eclipse.core.filesystem,
- org.eclipse.dstore.core,
- org.eclipse.jface,
- org.eclipse.ui,
- org.eclipse.cdt.core,
- org.eclipse.ptp.remote.core,
- org.eclipse.ptp.services.core,
- org.eclipse.ptp.rdt.core,
- org.eclipse.ptp.remote.ui,
- org.eclipse.ptp.services.ui,
- org.eclipse.ptp.rdt.ui,
- org.eclipse.rse.connectorservice.dstore,
- org.eclipse.rse.core
-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 42979be..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/build.properties
+++ /dev/null
@@ -1,18 +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
-###############################################################################
-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 1235c25..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 Remote Tools DStore Server
-pluginProvider=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 a598531..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.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 8354c0d..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/Activator.java
+++ /dev/null
@@ -1,68 +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.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 af0a992..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/core/DStoreServer.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2009, 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
- *******************************************************************************/
-package org.eclipse.ptp.rdt.server.dstore.core;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.SubMonitor;
-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();
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.remote.launch.core.AbstractRemoteServerRunner#doFinishServer
-	 * ()
-	 */
-	@Override
-	protected void doFinishServer(IProgressMonitor monitor) {
-		try {
-			if (fDStoreConnection != null) {
-				fDStoreConnection.disconnect();
-				fDStoreConnection = null;
-			}
-		} finally {
-			if (monitor != null) {
-				monitor.done();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.remote.launch.core.AbstractRemoteServerRunner#doRestartServer
-	 * ()
-	 */
-	@Override
-	protected boolean doRestartServer(IProgressMonitor monitor) {
-		try {
-			fState = DStoreState.STARTING;
-			return true;
-		} finally {
-			if (monitor != null) {
-				monitor.done();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see
-	 * org.eclipse.ptp.remote.launch.core.AbstractRemoteServerRunner#doStartServer
-	 * ()
-	 */
-	@Override
-	protected boolean doStartServer(IProgressMonitor monitor) {
-		SubMonitor subMon = SubMonitor.convert(monitor, 100);
-		try {
-			int port;
-			try {
-				port = getRemoteConnection().forwardLocalPort("localhost", fDStorePort, subMon.newChild(10)); //$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();
-		} finally {
-			if (monitor != null) {
-				monitor.done();
-			}
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.remote.launch.core.AbstractRemoteServerRunner#
-	 * doVerifyServerRunningFromStderr(java.lang.String)
-	 */
-	@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;
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.ptp.remote.launch.core.AbstractRemoteServerRunner#
-	 * doVerifyServerRunningFromStdout(java.lang.String)
-	 */
-	@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 dfee446..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, 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.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 f499be8..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/core/RemoteToolsCIndexSubsystem.java
+++ /dev/null
@@ -1,1216 +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 - 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.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.cdt.utils.EFSExtensionManager;
-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.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.core.runtime.SubMonitor;
-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.osgi.util.NLS;
-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) {
-		checkAllProjects(new NullProgressMonitor());
-		String path = EFSExtensionManager.getDefault().getPathFromURI(unit.getLocationURI());
-		DataStore dataStore = getDataStore(null);
-		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));
-
-		// path to translation unit
-		dataElement = dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, path);
-		args.add(dataElement);
-
-		// 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) {
-		String path = EFSExtensionManager.getDefault().getPathFromURI(input.getLocationURI());
-		Object result = sendRequest(CDTMiner.C_TYPE_HIERARCHY_COMPUTE_TYPE_GRAPH,
-				new Object[] { scope, getHostName(), input, path }, 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, getHostName(), 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, getHostName(), 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, getHostName(), 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) {
-		String path = EFSExtensionManager.getDefault().getPathFromURI(memberInput.getLocationURI());
-		Object result = sendRequest(CDTMiner.C_TYPE_HIERARCHY_FIND_INPUT1,
-				new Object[] { scope, getHostName(), memberInput, path }, 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) {
-		String path = EFSExtensionManager.getDefault().getPathFromURI(unit.getLocationURI());
-		Object result = sendRequest(CDTMiner.C_TYPE_HIERARCHY_FIND_INPUT2, new Object[] { scope, getHostName(), 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$
-		String path = EFSExtensionManager.getDefault().getPathFromURI(subject.getLocationURI());
-		Object result = sendRequest(CDTMiner.C_CALL_HIERARCHY_GET_CALLS, new Object[] { scope, getHostName(), subject, path }, 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$
-		String path = EFSExtensionManager.getDefault().getPathFromURI(subject.getLocationURI());
-		Object result = sendRequest(CDTMiner.C_CALL_HIERARCHY_GET_CALLERS, new Object[] { scope, getHostName(), subject, path },
-				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$
-		String path = EFSExtensionManager.getDefault().getPathFromURI(subject.getLocationURI());
-		Object result = sendRequest(CDTMiner.C_CALL_HIERARCHY_GET_DEFINITIONS_FROM_ELEMENT, new Object[] { scope, getHostName(),
-				subject, path }, 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$
-		String path = EFSExtensionManager.getDefault().getPathFromURI(unit.getLocationURI());
-		Object result = sendRequest(CDTMiner.C_CALL_HIERARCHY_GET_DEFINITIONS_FROM_WORKING_COPY, new Object[] { scope,
-				getHostName(), unit, path, 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(monitor);
-		if (dataStore == null)
-			return Status.OK_STATUS;
-
-		DataElement result = getDataStore(monitor).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()));
-			args.add(dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, scope.getScheme()));
-			args.add(dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, scope.getRootPath()));
-			args.add(dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, scope.getMappedPath()));
-			args.add(dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, scope.getHost()));
-
-			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, getHostName(), 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$
-		String path = EFSExtensionManager.getDefault().getPathFromURI(unit.getLocationURI());
-		Object result = sendRequest(CDTMiner.C_NAVIGATION_OPEN_DECLARATION, new Object[] { scope, unit, path, 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(monitor);
-
-		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);
-
-				// scheme for scope
-				DataElement dataElement = dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, scope.getScheme());
-				args.add(dataElement);
-
-				// host
-				DataElement hostElement = dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, scope.getHost());
-				args.add(hostElement);
-
-				// root path for scope on server
-				DataElement rootPath = dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, scope.getRootPath());
-				args.add(rootPath);
-
-				// mapped path for scope on local machine
-				DataElement mappedPath = dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, scope.getMappedPath());
-				args.add(mappedPath);
-
-				// 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(monitor);
-		if (dataStore == null)
-			return Status.OK_STATUS;
-
-		DataElement result = getDataStore(monitor).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()));
-			args.add(dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, scope.getScheme()));
-			args.add(dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, scope.getRootPath()));
-			args.add(dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, scope.getMappedPath()));
-			args.add(dataStore.createObject(null, CDTMiner.T_SCOPE_CONFIG_LOCATION, indexLocation));
-
-			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));
-
-			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, getHostName(), 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(monitor);
-
-		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);
-
-		// 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(monitor);
-		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);
-
-				dataElement = dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR, ((Scope) argument).getScheme());
-				args.add(dataElement);
-
-				// root path for scope on server
-				DataElement rootPath = dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR,
-						((Scope) argument).getRootPath());
-				args.add(rootPath);
-
-				// path mappings for scope
-				DataElement pathElement = dataStore.createObject(null, CDTMiner.T_INDEX_STRING_DESCRIPTOR,
-						((Scope) argument).getMappedPath());
-				args.add(pathElement);
-			} 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) {
-		String path = EFSExtensionManager.getDefault().getPathFromURI(locationURI);
-		return path;
-	}
-
-	protected String getHostName() {
-		return fProvider.getConnectionName();
-	}
-
-	protected DataStore getDataStore(IProgressMonitor monitor) {
-		SubMonitor subMon = SubMonitor.convert(monitor, 10);
-		try {
-			if (fDStoreServer == null) {
-				fDStoreServer = (DStoreServer) RemoteServerManager.getServer(DStoreServer.SERVER_ID, fProvider.getConnection());
-			}
-			fDStoreServer.setWorkDir(fProvider.getIndexLocation());
-			DataStore dataStore = fDStoreServer.getDataStore();
-			if (!dataStore.isConnected()) {
-				try {
-					fDStoreServer.startServer(subMon.newChild(5));
-				} catch (IOException e) {
-					return null;
-				}
-				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, subMon.newChild(5));
-				} catch (InterruptedException e) {
-					// Data store will be disconnected if error occurs
-				}
-			}
-			return dataStore;
-		} finally {
-			if (monitor != null) {
-				monitor.done();
-			}
-		}
-	}
-
-	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 = NLS.bind(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 33acfe6..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, 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.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 f025f35..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/messages/Messages.java
+++ /dev/null
@@ -1,35 +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.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 12af963..0000000
--- a/rdt/org.eclipse.ptp.rdt.server.dstore/src/org/eclipse/ptp/rdt/server/dstore/messages/messages.properties
+++ /dev/null
@@ -1,21 +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
-###############################################################################
-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 4208673..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, 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
- *******************************************************************************/
-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 61e673c..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, 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
- *******************************************************************************/
-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 104ac39..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, 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.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 e98e699..0000000
--- a/rdt/org.eclipse.ptp.rdt.ui.tests/build.properties
+++ /dev/null
@@ -1,15 +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
-###############################################################################
-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 cb40be5..0000000
--- a/rdt/org.eclipse.ptp.rdt.ui.tests/suite/org/eclipse/ptp/rdt/ui/tests/RDTUITestPlugin.java
+++ /dev/null
@@ -1,28 +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
- *******************************************************************************/
-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 9682617..0000000
--- a/rdt/org.eclipse.ptp.rdt.ui.tests/test/org/eclipse/ptp/rdt/ui/tests/navigation/NavigationTests.java
+++ /dev/null
@@ -1,192 +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
- *******************************************************************************/
-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 4a3f06a..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 Parallel Performance Wizard (PPW)
-
-# "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=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 72ec456..0000000
--- a/releng/org.eclipse.ptp.etfw.ppw-feature/feature.xml
+++ /dev/null
@@ -1,43 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<feature
-      id="org.eclipse.ptp.etfw.ppw"
-      label="%featureName"
-      version="4.0.0.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://download.eclipse.org/tools/ptp/updates/helios"/>
-   </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="0.0.0"
-         unpack="false"/>
-
-</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.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 19b89d1..0000000
--- a/releng/org.eclipse.ptp.rdt.sdk-feature/build.properties
+++ /dev/null
@@ -1,17 +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
-###############################################################################
-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 10a5104..0000000
--- a/releng/org.eclipse.ptp.rdt.sdk-feature/feature.properties
+++ /dev/null
@@ -1,162 +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, 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.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 c184ca3..0000000
--- a/releng/org.eclipse.ptp.rdt.sdk-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/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 cf23664..0000000
--- a/releng/org.eclipse.ptp.rdt.sdk-feature/sourceTemplateFeature/feature.properties
+++ /dev/null
@@ -1,162 +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\
-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.sdk-feature/sourceTemplateFeature/license.html b/releng/org.eclipse.ptp.rdt.sdk-feature/sourceTemplateFeature/license.html
deleted file mode 100644
index c184ca3..0000000
--- a/releng/org.eclipse.ptp.rdt.sdk-feature/sourceTemplateFeature/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.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 41852f1..0000000
--- a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/build.properties
+++ /dev/null
@@ -1,16 +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
-###############################################################################
-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 36ce45f..0000000
--- a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/feature.properties
+++ /dev/null
@@ -1,162 +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, 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.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 c184ca3..0000000
--- a/releng/org.eclipse.ptp.rdt.xlc.sdk-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.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 0ae2960..0000000
--- a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/sourceTemplateFeature/feature.properties
+++ /dev/null
@@ -1,162 +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\
-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.xlc.sdk-feature/sourceTemplateFeature/license.html b/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/sourceTemplateFeature/license.html
deleted file mode 100644
index c184ca3..0000000
--- a/releng/org.eclipse.ptp.rdt.xlc.sdk-feature/sourceTemplateFeature/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.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/addDownloadStats.xsl b/releng/org.eclipse.ptp.releng/addDownloadStats.xsl
deleted file mode 100644
index 7efdcca..0000000
--- a/releng/org.eclipse.ptp.releng/addDownloadStats.xsl
+++ /dev/null
@@ -1,57 +0,0 @@
-<!--
-Copyright (c) 2010 Mia-Software
-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:
-Gregoire Dupe
--->
-<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
-	version="1.0">
-	<xsl:output encoding="UTF-8" method="xml" indent="yes" />
-	<xsl:strip-space elements="*" />
-
-	<xsl:template match="/">
-		<xsl:processing-instruction name="artifactRepository">version='1.1.0'</xsl:processing-instruction>
-
-		<xsl:apply-templates />
-	</xsl:template>
-
-	<xsl:template match="repository/properties">
-		<properties size='{@size+1}'>
-			<xsl:copy-of select="property" />
-			<property name='p2.statsURI' value='http://download.eclipse.org/stats/helios' />
-		</properties>
-	</xsl:template>
-
-	<xsl:template match="artifact[@classifier='org.eclipse.update.feature' and @id='org.eclipse.ptp.core']/properties">
-		<xsl:call-template name="artifact_properties"/>
-	</xsl:template>
-	
-	<xsl:template match="artifact[@classifier='org.eclipse.update.feature' and @id='org.eclipse.ptp.rdt']/properties">
-		<xsl:call-template name="artifact_properties"/>
-	</xsl:template>
-
-	<xsl:template match="artifact[@classifier='org.eclipse.update.feature' and @id='org.eclipse.photran']/properties">
-		<xsl:call-template name="artifact_properties"/>
-	</xsl:template>
- 
- 	<xsl:template name="artifact_properties">
- 		<properties size='{@size+1}'>
-			<xsl:copy-of select="property" />
-			<property name='download.stats' value='{../@id}_{substring(../@version, 1, string-length(../@version)-15)}' />
-		</properties>
-	</xsl:template>
-
-	<xsl:template match="*">
-		<xsl:copy>
-			<xsl:for-each select="@*">
-				<xsl:copy-of select="." />
-			</xsl:for-each>
-			<xsl:apply-templates />
-		</xsl:copy>
-	</xsl:template>
-
-</xsl:stylesheet>
diff --git a/releng/org.eclipse.ptp.releng/build.sh b/releng/org.eclipse.ptp.releng/build.sh
deleted file mode 100644
index c77c5c1..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 v20100423 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 8dce5f8..0000000
--- a/releng/org.eclipse.ptp.releng/build.xml
+++ /dev/null
@@ -1,891 +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/>
-		<!-- Update for new simultaneous release -->
-		<property name="eclipseRelease" value="helios"/>
-		<!-- Update for new PTP branch -->
-		<property name="ptpBranchVersion" value="4.0.0"/>
-		<!-- The following properties need to be updated to reflect the version we are building against. -->
-		<!-- NOTE: changing any of these will require corresponding changes in org.eclipse.ptp.rdt.core.remotejars/build.xml -->
-		<!-- Update for new Eclipse version -->
-		<property name="eclipseDist" value="/home/data/httpd/download.eclipse.org/eclipse/downloads/drops/I20100608-0911/eclipse-SDK-I20100608-0911-linux-gtk-ppc.tar.gz"/>
-		<!-- Update for new CDT version -->
-		<property name="cdtDist" value="/home/data/httpd/download.eclipse.org/tools/cdt/builds/7.0.0/I.I201006071606/cdt-master-7.0.0-I201006071606.zip"/>
-		<!-- Update for new RSE version -->
-		<property name="rseDist" value="/home/data/httpd/download.eclipse.org/dsdp/tm/downloads/drops/S-3.2RC4-201006051820/RSE-SDK-3.2RC4.zip"/>
-		<!-- Update for new Mylyn version -->
-		<property name="mylynDist" value="/home/data/httpd/download.eclipse.org/tools/mylyn/update-archive/3.4.0/I20100604-2200/mylyn-3.4.0.I20100604-2200-e3.4.zip"/>
-		<!-- Properties below here shouldn't need to be changed -->
-		<property name="timestamp" value="${DSTAMP}${TSTAMP}" />
-		<property name="buildType" value="I" />
-		<property name="buildId" value="${buildType}${timestamp}"/>
-		<property name="forceContextQualifier" value="${timestamp}"/>
-		<property name="buildingOSGi" value="true"/>
-		<property name="buildDirectory" value="${basedir}/results"/>
-		<property name="releaseDir" value="/home/www/tools/ptp/builds/${eclipseRelease}"/>
-		<property name="copyToDir" value="${releaseDir}/${buildType}.${buildId}"/>
-		<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="zipsdir" value="${buildDirectory}/${buildType}.${buildId}"/>
-		<property name="masterFile" value="ptp-master-${ptpBranchVersion}-${buildId}.zip"/>
-		<property name="masterFeature" value="org.eclipse.ptp.master_${ptpBranchVersion}.${timestamp}.jar"/>
-		<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="**/*@dot.log"/>
-		</concat>
-		<loadfile property="compileLog" srcFile="${zipsdir}/compilelog.txt"/>
-		<condition property="hasErrors">
-			<contains string="${compileLog}" substring=" ERROR"/>
-		</condition>
-		<move file="${zipsdir}/${masterFile}" todir="${buildDirectory}"/>
-		
-		<unzip src="${buildDirectory}/${masterFile}" 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"/>
-
-		<!-- remove the master feature from the update site -->
-		<delete verbose="true" file="${buildDirectory}/site/eclipse/features/${masterFeature}"/>
-
-		<zip destfile="${zipsdir}/${masterFile}"
-			basedir="${buildDirectory}/site/eclipse"/>
-	</target>
-
-	<target name="sign" depends="init" unless="hasErrors">
-		<exec executable="sign">
-			<arg value="${buildDirectory}/${buildType}.${buildId}/${masterFile}"/>
-			<arg value="nomail"/>
-			<arg value="${buildDirectory}/signed"/>
-		</exec>
-		<waitfor maxwait="60" maxwaitunit="minute">
-			<available file="${buildDirectory}/signed/${masterFile}"/>
-		</waitfor>
-		<move file="${buildDirectory}/signed/${masterFile}" 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}"/>
-		<copy todir="${copyToDir}">
-			<fileset dir="${buildDirectory}/${buildType}.${buildId}"/>
-		</copy>
-		<chmod perm="g+w" dir="${copyToDir}">
-			<dirset dir="${copyToDir}"/>
-		</chmod>
-		<!-- Create symlink to latest build -->
-		<delete file="${releaseDir}/latest" followsymlinks="false" failonerror="false"/>
-		<!--symlink action="delete" link="${copyToDir}/latest" failonerror="false"/-->
-		<symlink link="${releaseDir}/latest" resource="${copyToDir}" overwrite="true"/>
-		<delete file="${releaseDir}/ptp-master-${ptpBranchVersion}-latest.zip" followsymlinks="false" failonerror="false"/>
-		<!--symlink action="delete" link="${copyToDir}/ptp-master-${ptpBranchVersion}-latest.zip" failonerror="false"/-->
-		<symlink link="${releaseDir}/ptp-master-${ptpBranchVersion}-latest.zip" resource="${copyToDir}/${masterFile}" overwrite="true"/>
-		<delete file="${releaseDir}/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="${releaseDir}/rdt-server-unix-${ptpBranchVersion}-latest.tar" resource="${copyToDir}/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}/${masterFile}"/>
-		
-		<unzip src="${destination}" dest="${p2dir}"/>
-		
-		<!-- generate p2 metadata -->
-		<antcall target="p2.metadata.generator">
-			<param name="p2site" value="${p2dir}"/>
-		</antcall>
-		
-		<!-- add download stats -->
-		<antcall target="download.stats">
-			<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 = "download.stats">
-		<echo message="Adding download stats"/>
-		<unzip src="${p2dir}/artifacts.jar" dest="${p2dir}"/>
-		<move file="${p2dir}/artifacts.xml" tofile="${p2dir}/artifacts.xml_tmp"/>
-		<xslt style="${basedir}/addDownloadStats.xsl" in="${p2dir}/artifacts.xml_tmp" out="${p2dir}/artifacts.xml" />
-		<zip destfile="${p2dir}/artifacts.jar" basedir="${p2dir}" includes="artifacts.xml"/>
-		<delete file="${p2dir}/artifacts.xml"/>
-		<delete file="${p2dir}/artifacts.xml_tmp"/>
-	</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.rdt.remotejars-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.gem-feature"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/releng/org.eclipse.ptp.sci-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.help"/>
-			<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.help"/>
-			<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.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.managedbuilder.xlupc.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/gem/org.eclipse.ptp.gem"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/sci/org.eclipse.ptp.sci"/>
-			<param name="tagbranch" value="${ptpTagBranch}"/>
-		</antcall>		
-		<antcall target="tagone">
-			<param name="tagmodule" value="org.eclipse.ptp/tools/gem/org.eclipse.ptp.gem.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 4756295..0000000
--- a/releng/org.eclipse.ptp.releng/buildsite.xml
+++ /dev/null
@@ -1,105 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<site>
-   <description url="http://download.eclipse.org/tools/ptp/updates/helios">
-      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.core_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.core" version="4.0.0.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.debug.sdm_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.debug.sdm" version="4.0.0.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.etfw_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.etfw" version="4.0.0.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.external_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.external" version="4.0.0.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.pldt_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.pldt" version="4.0.0.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.remote_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.remote" version="4.0.0.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.remote.remotetools_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.remote.remotetools" version="4.0.0.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-    <feature url="features/org.eclipse.ptp.remotetools_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.remotetools" version="4.0.0.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.rm.ibm.ll_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.rm.ibm.ll" version="4.0.0.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.rm.ibm.pe_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.rm.ibm.pe" version="4.0.0.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.rm.mpich2_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.rm.mpich2" version="4.0.0.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.rm.openmpi_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.rm.openmpi" version="4.0.0.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.rm.pbs_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.rm.pbs" version="4.0.0.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.rm.slurm_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.rm.slurm" version="4.0.0.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.services_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.services" version="4.0.0.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.utils_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.utils" version="4.0.0.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.pldt.lapi_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.pldt.lapi" version="4.0.0.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.gem_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.gem" 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.etfw.ppw_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.etfw.ppw" version="4.0.0.@timeStamp@">
-      <category name="Parallel Tools Platform"/>
-   </feature>
-   <feature url="features/org.eclipse.ptp.sci_4.0.0.@timeStamp@.jar" id="org.eclipse.ptp.sci" 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 058bda5..0000000
--- a/releng/org.eclipse.ptp.releng/maps/ptp.map
+++ /dev/null
@@ -1,164 +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
-
-! 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
-feature@org.eclipse.ptp.etfw.ppw=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.etfw.ppw-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
-
-! GEM feature
-feature@org.eclipse.ptp.gem=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.gem-feature
-
-! PPW Feature
-plugin@org.eclipse.ptp.etfw.ppw=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/ppw/org.eclipse.ptp.etfw.ppw
-
-! SCI feature
-feature@org.eclipse.ptp.sci=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/releng/org.eclipse.ptp.sci-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.help=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.pbs.help
-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.help=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rms/org.eclipse.ptp.rm.slurm.help
-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.managedbuilder.xlupc.ui=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/rdt/org.eclipse.ptp.rdt.managedbuilder.xlupc.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
-
-! GEM Plugins
-plugin@org.eclipse.ptp.gem=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/gem/org.eclipse.ptp.gem
-plugin@org.eclipse.ptp.gem.help=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/gem/org.eclipse.ptp.gem.help
-
-! PPW Plugin
-plugin@org.eclipse.ptp.etfw.ppw=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/ppw/org.eclipse.ptp.etfw.ppw
-
-! SCI Plugin
-plugin@org.eclipse.ptp.sci=@ptpTag@,:pserver:anonymous@dev.eclipse.org:/cvsroot/tools,,org.eclipse.ptp/tools/sci/org.eclipse.ptp.sci
-
-! 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 bd40fe9..0000000
--- a/releng/org.eclipse.ptp.releng/master/build.properties
+++ /dev/null
@@ -1,104 +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,cocoa,ppc \
-    & macosx,cocoa,x86 \
-    & macosx,cocoa,x86_64 \
-    & win32,win32,x86
-
-outputUpdateJars=true
-groupConfigurations=true
-
-#Arguments to send to the zip executable
-zipargs=
-
-flattenDependencies=true
-
-############# 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 9e89f3c..0000000
--- a/releng/org.eclipse.ptp.releng/ptpbuild
+++ /dev/null
@@ -1,68 +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_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 c4225dd..0000000
--- a/tools/etfw/org.eclipse.ptp.etfw.feedback.sample/src/org/eclipse/ptp/etfw/feedback/sample/SampleFeedbackItem.java
+++ /dev/null
@@ -1,100 +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;
-	}
-	public Object getObject() {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-}
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 637b6d8..0000000
--- a/tools/ppw/org.eclipse.ptp.etfw.ppw/.project
+++ /dev/null
@@ -1,34 +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>
-		<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/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 8a3db26..0000000
--- a/tools/ppw/org.eclipse.ptp.etfw.ppw/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,19 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: %pluginName
-Bundle-SymbolicName: org.eclipse.ptp.etfw.ppw;singleton:=true
-Bundle-Version: 1.0.3.qualifier
-Bundle-Vendor: %pluginProvider
-Require-Bundle: org.eclipse.ptp.etfw,
- org.eclipse.ui,
- org.eclipse.core.runtime,
- org.eclipse.debug.core,
- org.eclipse.jface.text,
- org.eclipse.ui.editors,
- org.eclipse.ui.workbench.texteditor,
- org.eclipse.ui.ide
-Bundle-ActivationPolicy: lazy
-Bundle-Activator: org.eclipse.ptp.etfw.ppw.Activator
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-Localization: plugin
-
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 2f7e699..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 de8faaa..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.class b/tools/ppw/org.eclipse.ptp.etfw.ppw/bin/org/eclipse/ptp/etfw/ppw/PPWDataManager.class
deleted file mode 100644
index 7a034f7..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 dfa3b91..0000000
--- a/tools/ppw/org.eclipse.ptp.etfw.ppw/build.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               about.html,\
-               data/,\
-               plugin.properties
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.properties b/tools/ppw/org.eclipse.ptp.etfw.ppw/plugin.properties
deleted file mode 100644
index 124b431..0000000
--- a/tools/ppw/org.eclipse.ptp.etfw.ppw/plugin.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-pluginName=PTP ETFw PPW Support
-pluginProvider=Eclipse.org
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/PPWController.java b/tools/ppw/org.eclipse.ptp.etfw.ppw/src/org/eclipse/ptp/etfw/ppw/PPWController.java
deleted file mode 100644
index 396fdf8..0000000
--- a/tools/ppw/org.eclipse.ptp.etfw.ppw/src/org/eclipse/ptp/etfw/ppw/PPWController.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/****************************************************************************
- * Parallel Performance Wizard (PPW)
- * http://ppw.hcs.ufl.edu
- * 
- * 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.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.ptp.etfw.internal.BuildLaunchUtils;
-
-public class PPWController {
-	private final ProcessBuilder ppwpb;
-	private final ProcessBuilder ppwconfigpb;
-	private final PPWDataManager ppwDataManager;
-	private String ppwVersion;
-	private boolean ppwSupportsControl;
-
-	public PPWController(PPWDataManager ppwDataManager, String[] args) {
-		this.ppwDataManager = ppwDataManager;
-
-		String ppwToolPath = BuildLaunchUtils.getToolPath("ppw"); //$NON-NLS-1$
-		String ppw = ppwToolPath + File.separator + "ppw"; //$NON-NLS-1$
-		String ppwConfig = ppwToolPath + File.separator + "ppw-config"; //$NON-NLS-1$
-
-		List<String> ppwConfigCmd = new ArrayList<String>();
-		ppwConfigCmd.add(ppwConfig);
-		ppwConfigCmd.add("--version"); //$NON-NLS-1$
-
-		ppwconfigpb = new ProcessBuilder(ppwConfigCmd);
-		Process ppwconf = null;
-		try {
-			ppwconf = ppwconfigpb.start();
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-
-		ppwVersion = null;
-		ppwSupportsControl = false;
-
-		try {
-			InputStreamReader isr = new InputStreamReader(ppwconf.getInputStream());
-			BufferedReader br = new BufferedReader(isr);
-			ppwVersion = br.readLine();
-		} catch (IOException e) {
-			// e.printStackTrace();
-		}
-
-		// Try to figure out if our PPW version supports "control mode"
-		if (ppwVersion != null) {
-			int vMajor = Integer.parseInt(ppwVersion.substring(0, 1));
-			String ppwVerRest = ppwVersion.substring(2);
-
-			// PPW versions up to 2.4 didn't support "control mode"
-			if (vMajor < 2) {
-				ppwSupportsControl = false;
-			} else if (vMajor == 2
-					&& (ppwVerRest.equals("0") || ppwVerRest.equals("1") || ppwVerRest.equals("2") || ppwVerRest.equals("4"))) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
-				ppwSupportsControl = false;
-			} else {
-				ppwSupportsControl = true;
-			}
-		}
-
-		// Build command to invoke the PPW GUI
-		List<String> ppwCmd = new ArrayList<String>();
-		ppwCmd.add(ppw);
-		if (ppwSupportsControl) {
-			ppwCmd.add("-c"); //$NON-NLS-1$
-		}
-
-		for (String s : args) {
-			ppwCmd.add(s);
-		}
-
-		ppwpb = new ProcessBuilder(ppwCmd);
-
-		Process p = null;
-		try {
-			p = ppwpb.start();
-		} catch (IOException e) {
-			e.printStackTrace();
-		}
-
-		new Thread(new IOWatcher(p.getInputStream())).start();
-	}
-
-	class IOWatcher implements Runnable {
-		InputStream is;
-
-		IOWatcher(InputStream is) {
-			this.is = is;
-		}
-
-		public void run() {
-			try {
-				InputStreamReader isr = new InputStreamReader(is);
-				BufferedReader br = new BufferedReader(isr);
-				String line = null;
-				while ((line = br.readLine()) != null) {
-					if (line.startsWith("source")) { //$NON-NLS-1$
-						String[] split = line.split(" "); //$NON-NLS-1$
-						String filename = split[1];
-						int linenum = Integer.parseInt(split[2]);
-						ppwDataManager.highlightSourceLine(filename, linenum);
-					} else if (line.startsWith("exit")) { //$NON-NLS-1$
-						break;
-					} else {
-						System.out.println(line);
-					}
-				}
-			} catch (IOException e) {
-				e.printStackTrace();
-			}
-		}
-	}
-}
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 e9676c1..0000000
--- a/tools/ppw/org.eclipse.ptp.etfw.ppw/src/org/eclipse/ptp/etfw/ppw/PPWDataManager.java
+++ /dev/null
@@ -1,232 +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;
-	}
-
-	@Override
-	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();
-				}
-			}
-
-			new PPWController(this, args);
-
-		} catch (Throwable e) {
-			e.printStackTrace();
-		}
-	}
-
-	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;
-	}
-
-	/*
-	 * 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);
-	}
-}
